ankiweb-api 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
ankiweb_schema.py ADDED
@@ -0,0 +1,49 @@
1
+ """GENERATED by tools/generate_schema.py - do not edit by hand.
2
+
3
+ Recovered protobuf schema for AnkiWeb's `/svc/*` HTTP API. AnkiWeb exposes no
4
+ public API; this is reconstructed from the SvelteKit frontend bundle that the
5
+ site itself uses (protobuf-es `makeMessageType` definitions).
6
+
7
+ Field numbers and types here are authoritative *as of generation time*. If
8
+ AnkiWeb ships a breaking change, regenerate rather than patch.
9
+
10
+ Usage:
11
+ from ankiweb_schema import SCHEMA, ENDPOINTS, encode, decode
12
+
13
+ req = encode("LoginRequest", username="me", password="pw")
14
+ data = decode("LoginResponse", raw_bytes)
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ GENERATED = True
20
+
21
+
22
+ # message name -> {name, minified, fields[no,name,type,repeated,optional]}
23
+
24
+ SCHEMA: dict[str, dict] = {'AccountLoginRequest': {'name': 'AccountLoginRequest', 'minified': 'Wn', 'fields': [{'no': 1, 'name': 'username', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'password', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'AccountLoginResponse': {'name': 'AccountLoginResponse', 'minified': 'Jn', 'fields': [{'no': 1, 'name': 'status', 'kind': 'enum', 'type': 'enum', 'T': 'r.getEnumType(Gn)', 'wire': 0, 'repeated': False, 'optional': False, 'enum': {'values': {0: {'name': 'LOGIN_RESPONSE_STATUS_UNKNOWN', 'short': 'UNKNOWN'}, 1: {'name': 'LOGIN_RESPONSE_STATUS_AUTHENTICATED', 'short': 'AUTHENTICATED'}, 2: {'name': 'LOGIN_RESPONSE_STATUS_INVALID_USER', 'short': 'INVALID_USER'}, 3: {'name': 'LOGIN_RESPONSE_STATUS_INVALID_PASS', 'short': 'INVALID_PASS'}}}}, {'no': 2, 'name': 'token', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'AccountCheckTermsRequest': {'name': 'AccountCheckTermsRequest', 'minified': 'Kn', 'fields': []}, 'AccountCheckTermsResponse': {'name': 'AccountCheckTermsResponse', 'minified': 'Xn', 'fields': [{'no': 1, 'name': 'needs_to_confirm', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}]}, 'AccountConfirmTermsRequest': {'name': 'AccountConfirmTermsRequest', 'minified': 'Yn', 'fields': [{'no': 1, 'name': 'agree_to_terms', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}]}, 'AccountConfirmTermsResponse': {'name': 'AccountConfirmTermsResponse', 'minified': 'Hn', 'fields': []}, 'AccountGetSettingsRequest': {'name': 'AccountGetSettingsRequest', 'minified': 'zn', 'fields': []}, 'AccountGetSettingsResponse': {'name': 'AccountGetSettingsResponse', 'minified': 'jn', 'fields': [{'no': 1, 'name': 'current_email', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'AccountUpdateSettingsRequest': {'name': 'AccountUpdateSettingsRequest', 'minified': 'Qn', 'fields': [{'no': 1, 'name': 'current_password', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'new_password', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'new_email', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'AccountUpdateSettingsResponse': {'name': 'AccountUpdateSettingsResponse', 'minified': 'Zn', 'fields': [{'no': 1, 'name': 'result', 'kind': 'enum', 'type': 'enum', 'T': 'r.getEnumType(Cn)', 'wire': 0, 'repeated': False, 'optional': False, 'enum': {'values': {0: {'name': 'SETTINGS_RESULT_UNKNOWN', 'short': 'UNKNOWN'}, 1: {'name': 'SETTINGS_RESULT_PASSWORD_CHANGED', 'short': 'PASSWORD_CHANGED'}, 2: {'name': 'SETTINGS_RESULT_EMAIL_CHANGED', 'short': 'EMAIL_CHANGED'}, 3: {'name': 'SETTINGS_RESULT_INVALID_CURRENT_PASSWORD', 'short': 'INVALID_CURRENT_PASSWORD'}, 4: {'name': 'SETTINGS_RESULT_INVALID_EMAIL', 'short': 'INVALID_EMAIL'}, 5: {'name': 'SETTINGS_RESULT_EMAIL_UNAVAILABLE', 'short': 'EMAIL_UNAVAILABLE'}, 6: {'name': 'SETTINGS_RESULT_SPAM_REPORT', 'short': 'SPAM_REPORT'}}}}]}, 'AccountTotalMediaRequest': {'name': 'AccountTotalMediaRequest', 'minified': 'ea', 'fields': []}, 'AccountTotalMediaResponse': {'name': 'AccountTotalMediaResponse', 'minified': 'na', 'fields': [{'no': 1, 'name': 'total_bytes', 'kind': 'scalar', 'type': 'uint64', 'T': '4', 'wire': 0, 'repeated': False, 'optional': False}]}, 'AccountRemoveAccountRequest': {'name': 'AccountRemoveAccountRequest', 'minified': 'aa', 'fields': [{'no': 1, 'name': 'current_password', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'AccountRemoveAccountResponse': {'name': 'AccountRemoveAccountResponse', 'minified': 'sa', 'fields': [{'no': 1, 'name': 'status', 'kind': 'enum', 'type': 'enum', 'T': 'r.getEnumType(Vn)', 'wire': 0, 'repeated': False, 'optional': False, 'enum': {'values': {0: {'name': 'REMOVE_ACCOUNT_STATUS_UNKNOWN', 'short': 'UNKNOWN'}, 1: {'name': 'REMOVE_ACCOUNT_STATUS_VALID_PASSWORD_REQUIRED', 'short': 'VALID_PASSWORD_REQUIRED'}, 2: {'name': 'REMOVE_ACCOUNT_STATUS_IN_PROGRESS', 'short': 'IN_PROGRESS'}, 3: {'name': 'REMOVE_ACCOUNT_STATUS_FINISHED', 'short': 'FINISHED'}}}}, {'no': 2, 'name': 'media_removed', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'AccountSignupRequest': {'name': 'AccountSignupRequest', 'minified': 'ta', 'fields': [{'no': 1, 'name': 'username', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'password', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'AccountSignupResponse': {'name': 'AccountSignupResponse', 'minified': 'ra', 'fields': [{'no': 1, 'name': 'status', 'kind': 'enum', 'type': 'enum', 'T': 'r.getEnumType(xn)', 'wire': 0, 'repeated': False, 'optional': False, 'enum': {'values': {0: {'name': 'SIGNUP_STATUS_UNKNOWN', 'short': 'UNKNOWN'}, 1: {'name': 'SIGNUP_STATUS_SUCCESS', 'short': 'SUCCESS'}, 2: {'name': 'SIGNUP_STATUS_USERNAME_INVALID', 'short': 'USERNAME_INVALID'}, 3: {'name': 'SIGNUP_STATUS_USERNAME_TAKEN', 'short': 'USERNAME_TAKEN'}, 4: {'name': 'SIGNUP_STATUS_SPAM_EMAIL', 'short': 'SPAM_EMAIL'}}}}, {'no': 2, 'name': 'ankiuser_login_token', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': True}]}, 'AccountVerifyEmailResponseSendingStatus': {'name': 'AccountVerifyEmailResponseSendingStatus', 'minified': 'oa', 'fields': [{'no': 1, 'name': 'updated', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'progress', 'kind': 'enum', 'type': 'enum', 'T': 'r.getEnumType(Pn)', 'wire': 0, 'repeated': False, 'optional': False, 'enum': {'values': {0: {'name': 'SENDING_PROGRESS_UNKNOWN', 'short': 'UNKNOWN'}, 1: {'name': 'SENDING_PROGRESS_SENDING', 'short': 'SENDING'}, 2: {'name': 'SENDING_PROGRESS_DELIVERED', 'short': 'DELIVERED'}, 3: {'name': 'SENDING_PROGRESS_SPAM', 'short': 'SPAM'}, 4: {'name': 'SENDING_PROGRESS_QUOTA', 'short': 'QUOTA'}, 5: {'name': 'SENDING_PROGRESS_OTHER_DELAY', 'short': 'OTHER_DELAY'}, 6: {'name': 'SENDING_PROGRESS_FAILED', 'short': 'FAILED'}}}}, {'no': 3, 'name': 'email', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'AccountVerifyEmailRequest': {'name': 'AccountVerifyEmailRequest', 'minified': 'ia', 'fields': [{'no': 1, 'name': 'token', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': True}]}, 'AccountVerifyEmailResponse': {'name': 'AccountVerifyEmailResponse', 'minified': 'ca', 'fields': [{'no': 1, 'name': 'token_verified', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'sending_status', 'kind': 'message', 'type': 'message', 'T': 'AccountVerifyEmailResponseSendingStatus', 'wire': 2, 'repeated': False, 'optional': False}]}, 'AccountResendVerificationRequest': {'name': 'AccountResendVerificationRequest', 'minified': 'da', 'fields': [{'no': 1, 'name': 'hkey', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': True}]}, 'AccountResendVerificationResponse': {'name': 'AccountResendVerificationResponse', 'minified': 'ma', 'fields': [{'no': 1, 'name': 'throttled', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}]}, 'AccountResetPasswordRequest': {'name': 'AccountResetPasswordRequest', 'minified': 'ua', 'fields': [{'no': 1, 'name': 'email_to', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'check_token', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'new_password', 'kind': 'message', 'type': 'message', 'T': 'AccountResetPasswordRequestNewPassword', 'wire': 2, 'repeated': False, 'optional': False}]}, 'AccountResetPasswordResponse': {'name': 'AccountResetPasswordResponse', 'minified': 'la', 'fields': [{'no': 1, 'name': 'send_email', 'kind': 'enum', 'type': 'enum', 'T': 'r.getEnumType(qn)', 'wire': 0, 'repeated': False, 'optional': False, 'enum': {'values': {0: {'name': 'SEND_RESET_EMAIL_RESULT_UNKNOWN', 'short': 'UNKNOWN'}, 1: {'name': 'SEND_RESET_EMAIL_RESULT_THROTTLED', 'short': 'THROTTLED'}, 2: {'name': 'SEND_RESET_EMAIL_RESULT_INVALID_EMAIL', 'short': 'INVALID_EMAIL'}, 4: {'name': 'SEND_RESET_EMAIL_RESULT_SUCCESS', 'short': 'SUCCESS'}}}}, {'no': 2, 'name': 'token_ok', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'set_new_password', 'kind': 'enum', 'type': 'enum', 'T': 'r.getEnumType($n)', 'wire': 0, 'repeated': False, 'optional': False}]}, 'AccountResetPasswordRequestNewPassword': {'name': 'AccountResetPasswordRequestNewPassword', 'minified': 'ka', 'fields': [{'no': 1, 'name': 'token', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'new_password', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'AccountGetAccountStatusRequest': {'name': 'AccountGetAccountStatusRequest', 'minified': 'fa', 'fields': []}, 'AccountGetAccountStatusResponse': {'name': 'AccountGetAccountStatusResponse', 'minified': 'Ta', 'fields': [{'no': 1, 'name': 'logged_in', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'redirect_to', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': True}]}, 'Me': {'name': 'Me', 'minified': 'Me', 'fields': [{'no': 1, 'name': 'title', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'tags', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'support_url', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 4, 'name': 'description', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 5, 'name': 'deck_id', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 6, 'name': 'shared_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': True}]}, 'DecksDeckShareInfoRequest': {'name': 'DecksDeckShareInfoRequest', 'minified': 'ha', 'fields': [{'no': 1, 'name': 'deck_id', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}]}, 'DecksDeckShareInfoResponse': {'name': 'DecksDeckShareInfoResponse', 'minified': 'ga', 'fields': [{'no': 1, 'name': 'metadata', 'kind': 'message', 'type': 'message', 'T': 'Me', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'is_large_user', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'share_count', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'DecksDeckShareRequest': {'name': 'DecksDeckShareRequest', 'minified': 'ya', 'fields': [{'no': 1, 'name': 'metadata', 'kind': 'message', 'type': 'message', 'T': 'Me', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'confirm_copyright', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}]}, 'DecksDeckShareResponse': {'name': 'DecksDeckShareResponse', 'minified': 'wa', 'fields': []}, 'DecksDeckShareStateRequest': {'name': 'DecksDeckShareStateRequest', 'minified': '_a', 'fields': []}, 'DecksDeckShareStateResponse': {'name': 'DecksDeckShareStateResponse', 'minified': 'Na', 'fields': [{'no': 1, 'name': 'state', 'kind': 'enum', 'type': 'enum', 'T': 'r.getEnumType(pa)', 'wire': 0, 'repeated': False, 'optional': False, 'enum': {'values': {0: {'name': 'DECK_SHARE_STATE_NO_ACTIVE_SHARE', 'short': 'NO_ACTIVE_SHARE'}, 1: {'name': 'DECK_SHARE_STATE_WAITING', 'short': 'WAITING'}, 2: {'name': 'DECK_SHARE_STATE_IN_PROGRESS', 'short': 'IN_PROGRESS'}, 3: {'name': 'DECK_SHARE_STATE_SUCCESS', 'short': 'SUCCESS'}, 4: {'name': 'DECK_SHARE_STATE_TOO_LARGE', 'short': 'TOO_LARGE'}, 5: {'name': 'DECK_SHARE_STATE_UNKNOWN_ERROR', 'short': 'UNKNOWN_ERROR'}}}}, {'no': 2, 'name': 'shared_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': True}]}, 'Sa': {'name': 'Sa', 'minified': 'Sa', 'fields': [{'no': 1, 'name': 'val', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'Y': {'name': 'Y', 'minified': 'Y', 'fields': [{'no': 1, 'name': 'ord', 'kind': 'message', 'type': 'message', 'T': 'Sa', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'name', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 5, 'name': 'config', 'kind': 'message', 'type': 'message', 'T': 'Ea', 'wire': 2, 'repeated': False, 'optional': False}]}, 'Ea': {'name': 'Ea', 'minified': 'Ea', 'fields': [{'no': 1, 'name': 'sticky', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'rtl', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'font_name', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 4, 'name': 'font_size', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 5, 'name': 'description', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 6, 'name': 'plain_text', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 7, 'name': 'collapsed', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 8, 'name': 'exclude_from_search', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 9, 'name': 'id', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': True}, {'no': 10, 'name': 'tag', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': True}, {'no': 11, 'name': 'prevent_deletion', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 255, 'name': 'other', 'kind': 'scalar', 'type': 'bytes', 'T': '12', 'wire': 2, 'repeated': False, 'optional': False}]}, 'EditorGetInfoForAddingResponseNotetypes': {'name': 'EditorGetInfoForAddingResponseNotetypes', 'minified': 'Ra', 'fields': [{'no': 1, 'name': 'id', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'name', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'EditorAddOrUpdateRequest': {'name': 'EditorAddOrUpdateRequest', 'minified': 'Ia', 'fields': [{'no': 1, 'name': 'fields', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': True, 'optional': False}, {'no': 2, 'name': 'tags', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'add', 'kind': 'message', 'type': 'message', 'T': 'EditorAddOrUpdateRequestAdd', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 4, 'name': 'edit', 'kind': 'message', 'type': 'message', 'T': 'EditorAddOrUpdateRequestEdit', 'wire': 2, 'repeated': False, 'optional': False}]}, 'EditorAddOrUpdateRequestAdd': {'name': 'EditorAddOrUpdateRequestAdd', 'minified': 'ba', 'fields': [{'no': 1, 'name': 'notetype_id', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'deck_id', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}]}, 'EditorAddOrUpdateRequestEdit': {'name': 'EditorAddOrUpdateRequestEdit', 'minified': 'Ua', 'fields': [{'no': 1, 'name': 'note_id', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}]}, 'EditorAddOrUpdateResponse': {'name': 'EditorAddOrUpdateResponse', 'minified': 'Ma', 'fields': []}, 'EditorGetNoteInfoRequest': {'name': 'EditorGetNoteInfoRequest', 'minified': 'Aa', 'fields': [{'no': 1, 'name': 'note_id', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}]}, 'EditorGetNoteInfoResponse': {'name': 'EditorGetNoteInfoResponse', 'minified': 'Oa', 'fields': [{'no': 1, 'name': 'fields', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': True, 'optional': False}, {'no': 2, 'name': 'notetype_fields', 'kind': 'message', 'type': 'message', 'T': 'Y', 'wire': 2, 'repeated': True, 'optional': False}, {'no': 3, 'name': 'tags', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'RadminListMediaResponseEntries': {'name': 'RadminListMediaResponseEntries', 'minified': 'Da', 'fields': [{'no': 1, 'name': 'filename', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'size', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'modified_secs', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'Ae': {'name': 'Ae', 'minified': 'Ae', 'fields': [{'no': 1, 'name': 'deck_id', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'name', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 4, 'name': 'level', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 5, 'name': 'collapsed', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 6, 'name': 'review_count', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 7, 'name': 'learn_count', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 8, 'name': 'new_count', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 9, 'name': 'intraday_learning', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 10, 'name': 'interday_learning_uncapped', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 11, 'name': 'new_uncapped', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 12, 'name': 'review_uncapped', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 13, 'name': 'total_in_deck', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 14, 'name': 'total_including_children', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 16, 'name': 'filtered', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'children', 'kind': 'message', 'type': 'message', 'T': 'Ae', 'wire': 2, 'repeated': True, 'optional': False}]}, 'EditorGetInfoForAddingResponseDecks': {'name': 'EditorGetInfoForAddingResponseDecks', 'minified': 'La', 'fields': [{'no': 1, 'name': 'id', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'name', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'Oe': {'name': 'Oe', 'minified': 'Oe', 'fields': [{'no': 1, 'name': 'stability', 'kind': 'scalar', 'type': 'float', 'T': '2', 'wire': 5, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'difficulty', 'kind': 'scalar', 'type': 'float', 'T': '2', 'wire': 5, 'repeated': False, 'optional': False}]}, 'E': {'name': 'E', 'minified': 'E', 'fields': [{'no': 1, 'name': 'normal', 'kind': 'message', 'type': 'message', 'T': 've', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'filtered', 'kind': 'message', 'type': 'message', 'T': 'Ca', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'custom_data', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': True}]}, 'va': {'name': 'va', 'minified': 'va', 'fields': [{'no': 1, 'name': 'position', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'De': {'name': 'De', 'minified': 'De', 'fields': [{'no': 1, 'name': 'remaining_steps', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'scheduled_secs', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'elapsed_secs', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 6, 'name': 'memory_state', 'kind': 'message', 'type': 'message', 'T': 'Oe', 'wire': 2, 'repeated': False, 'optional': True}]}, 'Le': {'name': 'Le', 'minified': 'Le', 'fields': [{'no': 1, 'name': 'scheduled_days', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'elapsed_days', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'ease_factor', 'kind': 'scalar', 'type': 'float', 'T': '2', 'wire': 5, 'repeated': False, 'optional': False}, {'no': 4, 'name': 'lapses', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 5, 'name': 'leeched', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 6, 'name': 'memory_state', 'kind': 'message', 'type': 'message', 'T': 'Oe', 'wire': 2, 'repeated': False, 'optional': True}]}, 'Fa': {'name': 'Fa', 'minified': 'Fa', 'fields': [{'no': 1, 'name': 'review', 'kind': 'message', 'type': 'message', 'T': 'Le', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'learning', 'kind': 'message', 'type': 'message', 'T': 'De', 'wire': 2, 'repeated': False, 'optional': False}]}, 've': {'name': 've', 'minified': 've', 'fields': [{'no': 1, 'name': 'new', 'kind': 'message', 'type': 'message', 'T': 'va', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'learning', 'kind': 'message', 'type': 'message', 'T': 'De', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'review', 'kind': 'message', 'type': 'message', 'T': 'Le', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 4, 'name': 'relearning', 'kind': 'message', 'type': 'message', 'T': 'Fa', 'wire': 2, 'repeated': False, 'optional': False}]}, 'Ba': {'name': 'Ba', 'minified': 'Ba', 'fields': [{'no': 1, 'name': 'scheduled_secs', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'finished', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}]}, 'Ga': {'name': 'Ga', 'minified': 'Ga', 'fields': [{'no': 1, 'name': 'original_state', 'kind': 'message', 'type': 'message', 'T': 've', 'wire': 2, 'repeated': False, 'optional': False}]}, 'Ca': {'name': 'Ca', 'minified': 'Ca', 'fields': [{'no': 1, 'name': 'preview', 'kind': 'message', 'type': 'message', 'T': 'Ba', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'rescheduling', 'kind': 'message', 'type': 'message', 'T': 'Ga', 'wire': 2, 'repeated': False, 'optional': False}]}, 'StudyStudyCardsResponseCardsNextStates': {'name': 'StudyStudyCardsResponseCardsNextStates', 'minified': 'Va', 'fields': [{'no': 1, 'name': 'current', 'kind': 'message', 'type': 'message', 'T': 'E', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'again', 'kind': 'message', 'type': 'message', 'T': 'E', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'hard', 'kind': 'message', 'type': 'message', 'T': 'E', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 4, 'name': 'good', 'kind': 'message', 'type': 'message', 'T': 'E', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 5, 'name': 'easy', 'kind': 'message', 'type': 'message', 'T': 'E', 'wire': 2, 'repeated': False, 'optional': False}]}, 'DecksDeckListInfoRequest': {'name': 'DecksDeckListInfoRequest', 'minified': 'xa', 'fields': [{'no': 1, 'name': 'minutes_west_of_utc', 'kind': 'scalar', 'type': 'int32', 'T': '5', 'wire': 0, 'repeated': False, 'optional': True}]}, 'DecksDeckListInfoResponse': {'name': 'DecksDeckListInfoResponse', 'minified': 'Pa', 'fields': [{'no': 1, 'name': 'top_node', 'kind': 'message', 'type': 'message', 'T': 'Ae', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'current_deck_id', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'collection_size_bytes', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 4, 'name': 'media_size_bytes', 'kind': 'scalar', 'type': 'uint64', 'T': '4', 'wire': 0, 'repeated': False, 'optional': False}]}, 'SearchSearchRequest': {'name': 'SearchSearchRequest', 'minified': 'qa', 'fields': [{'no': 1, 'name': 'search', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'SearchSearchResponse': {'name': 'SearchSearchResponse', 'minified': '$a', 'fields': [{'no': 1, 'name': 'notes', 'kind': 'message', 'type': 'message', 'T': 'SearchSearchResponseNotes', 'wire': 2, 'repeated': True, 'optional': False}, {'no': 2, 'name': 'error', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'SearchSearchResponseNotes': {'name': 'SearchSearchResponseNotes', 'minified': 'Wa', 'fields': [{'no': 1, 'name': 'note_id', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'joined_fields', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'DecksSelectDeckRequest': {'name': 'DecksSelectDeckRequest', 'minified': 'Ja', 'fields': [{'no': 1, 'name': 'deck_id', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}]}, 'DecksSelectDeckResponse': {'name': 'DecksSelectDeckResponse', 'minified': 'Ka', 'fields': []}, 'DecksRemoveDeckRequest': {'name': 'DecksRemoveDeckRequest', 'minified': 'Xa', 'fields': [{'no': 1, 'name': 'deck_id', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}]}, 'DecksRemoveDeckResponse': {'name': 'DecksRemoveDeckResponse', 'minified': 'Ya', 'fields': []}, 'DecksRenameDeckRequest': {'name': 'DecksRenameDeckRequest', 'minified': 'Ha', 'fields': [{'no': 1, 'name': 'deck_id', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'new_name', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'DecksRenameDeckResponse': {'name': 'DecksRenameDeckResponse', 'minified': 'za', 'fields': [{'no': 1, 'name': 'error', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'StudyGetDeckLimitsRequest': {'name': 'StudyGetDeckLimitsRequest', 'minified': 'ja', 'fields': []}, 'StudyGetDeckLimitsResponse': {'name': 'StudyGetDeckLimitsResponse', 'minified': 'Qa', 'fields': [{'no': 1, 'name': 'new', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'review', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 4, 'name': 'new_cards_ignore_review_limit', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'error', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'StudySetDeckLimitsRequest': {'name': 'StudySetDeckLimitsRequest', 'minified': 'Za', 'fields': [{'no': 1, 'name': 'new', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'review', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'new_cards_ignore_review_limit', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}]}, 'StudySetDeckLimitsResponse': {'name': 'StudySetDeckLimitsResponse', 'minified': 'es', 'fields': []}, 'EditorGetNotetypeFieldsRequest': {'name': 'EditorGetNotetypeFieldsRequest', 'minified': 'ns', 'fields': [{'no': 1, 'name': 'notetype_id', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}]}, 'EditorGetNotetypeFieldsResponse': {'name': 'EditorGetNotetypeFieldsResponse', 'minified': 'as', 'fields': [{'no': 1, 'name': 'fields', 'kind': 'message', 'type': 'message', 'T': 'Y', 'wire': 2, 'repeated': True, 'optional': False}]}, 'EditorGetInfoForAddingRequest': {'name': 'EditorGetInfoForAddingRequest', 'minified': 'ss', 'fields': []}, 'EditorGetInfoForAddingResponse': {'name': 'EditorGetInfoForAddingResponse', 'minified': 'ts', 'fields': [{'no': 1, 'name': 'notetypes', 'kind': 'message', 'type': 'message', 'T': 'EditorGetInfoForAddingResponseNotetypes', 'wire': 2, 'repeated': True, 'optional': False}, {'no': 2, 'name': 'decks', 'kind': 'message', 'type': 'message', 'T': 'EditorGetInfoForAddingResponseDecks', 'wire': 2, 'repeated': True, 'optional': False}, {'no': 3, 'name': 'current_deck_id', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 4, 'name': 'current_notetype_id', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 5, 'name': 'fields', 'kind': 'message', 'type': 'message', 'T': 'Y', 'wire': 2, 'repeated': True, 'optional': False}]}, 'StudyStudyCardsRequest': {'name': 'StudyStudyCardsRequest', 'minified': 'rs', 'fields': [{'no': 1, 'name': 'answer', 'kind': 'message', 'type': 'message', 'T': 'StudyStudyCardsRequestAnswer', 'wire': 2, 'repeated': False, 'optional': True}, {'no': 2, 'name': 'next_card_id', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': True}]}, 'StudyStudyCardsResponse': {'name': 'StudyStudyCardsResponse', 'minified': 'os', 'fields': [{'no': 1, 'name': 'sched_ver', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'cards', 'kind': 'message', 'type': 'message', 'T': 'StudyStudyCardsResponseCards', 'wire': 2, 'repeated': True, 'optional': False}, {'no': 3, 'name': 'new_count', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 4, 'name': 'learn_count', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 5, 'name': 'review_count', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'StudyStudyCardsRequestAnswer': {'name': 'StudyStudyCardsRequestAnswer', 'minified': 'is', 'fields': [{'no': 1, 'name': 'card_id', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'answer_button', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'time_taken_millis', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 4, 'name': 'answered_at_millis', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 5, 'name': 'current_state', 'kind': 'message', 'type': 'message', 'T': 'E', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 6, 'name': 'next_state', 'kind': 'message', 'type': 'message', 'T': 'E', 'wire': 2, 'repeated': False, 'optional': False}]}, 'StudyStudyCardsResponseCards': {'name': 'StudyStudyCardsResponseCards', 'minified': 'cs', 'fields': [{'no': 1, 'name': 'card_id', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'question', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'answer', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 4, 'name': 'count_index', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 5, 'name': 'button_labels', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': True, 'optional': False}, {'no': 6, 'name': 'note_id', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 7, 'name': 'template_index', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 8, 'name': 'next_states', 'kind': 'message', 'type': 'message', 'T': 'StudyStudyCardsResponseCardsNextStates', 'wire': 2, 'repeated': False, 'optional': False}]}, 'DecksCreateDeckRequest': {'name': 'DecksCreateDeckRequest', 'minified': 'ds', 'fields': [{'no': 1, 'name': 'name', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'DecksCreateDeckResponse': {'name': 'DecksCreateDeckResponse', 'minified': 'ms', 'fields': []}, 'StudyUpgradeSchedulerRequest': {'name': 'StudyUpgradeSchedulerRequest', 'minified': 'us', 'fields': [{'no': 1, 'name': 'v3', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}]}, 'StudyUpgradeSchedulerResponse': {'name': 'StudyUpgradeSchedulerResponse', 'minified': 'ls', 'fields': []}, 'RadminExportRevlogsRequestOptions': {'name': 'RadminExportRevlogsRequestOptions', 'minified': 'ks', 'fields': [{'no': 1, 'name': 'min_revlogs', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'max_users', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'RadminLookupUsersRequest': {'name': 'RadminLookupUsersRequest', 'minified': 'ps', 'fields': [{'no': 1, 'name': 'search', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': True, 'optional': False}]}, 'RadminLookupUsersResponse': {'name': 'RadminLookupUsersResponse', 'minified': 'hs', 'fields': [{'no': 1, 'name': 'matched_users', 'kind': 'message', 'type': 'message', 'T': 'RadminLookupUsersResponseMatchedUsers', 'wire': 2, 'repeated': True, 'optional': False}, {'no': 2, 'name': 'first_match', 'kind': 'message', 'type': 'message', 'T': 'Fe', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'ip_match', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}]}, 'RadminLookupUsersResponseMatchedUsers': {'name': 'RadminLookupUsersResponseMatchedUsers', 'minified': 'gs', 'fields': [{'no': 1, 'name': 'id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'name', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'RadminGetUserInfoRequest': {'name': 'RadminGetUserInfoRequest', 'minified': 'ys', 'fields': [{'no': 1, 'name': 'user_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'RadminGetUserInfoResponse': {'name': 'RadminGetUserInfoResponse', 'minified': 'ws', 'fields': [{'no': 1, 'name': 'user', 'kind': 'message', 'type': 'message', 'T': 'Fe', 'wire': 2, 'repeated': False, 'optional': False}]}, 'Fe': {'name': 'Fe', 'minified': 'Fe', 'fields': [{'no': 1, 'name': 'id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'name', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'first_access', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 4, 'name': 'last_access', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 5, 'name': 'ip', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 6, 'name': 'collection_bytes', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 7, 'name': 'media_bytes', 'kind': 'scalar', 'type': 'uint64', 'T': '4', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 8, 'name': 'syncers', 'kind': 'message', 'type': 'message', 'T': '_s', 'wire': 2, 'repeated': True, 'optional': False}, {'no': 9, 'name': 'shared_items', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 10, 'name': 'shared_reviews', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 11, 'name': 'last_note', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 12, 'name': 'email_verified', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 13, 'name': 'removed_at', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 14, 'name': 'shard', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, '_s': {'name': '_s', 'minified': '_s', 'fields': [{'no': 1, 'name': 'rust_id', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'client_id', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'last_sync', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'RadminGetCollectionBackupsRequest': {'name': 'RadminGetCollectionBackupsRequest', 'minified': 'Ns', 'fields': [{'no': 1, 'name': 'user_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'RadminGetCollectionBackupsResponse': {'name': 'RadminGetCollectionBackupsResponse', 'minified': 'Ss', 'fields': [{'no': 1, 'name': 'backups', 'kind': 'message', 'type': 'message', 'T': 'RadminGetCollectionBackupsResponseBackups', 'wire': 2, 'repeated': True, 'optional': False}]}, 'RadminGetCollectionBackupsResponseBackups': {'name': 'RadminGetCollectionBackupsResponseBackups', 'minified': 'Es', 'fields': [{'no': 1, 'name': 'id', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'ts', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'size', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'RadminRestoreCollectionBackupRequest': {'name': 'RadminRestoreCollectionBackupRequest', 'minified': 'Rs', 'fields': [{'no': 1, 'name': 'user_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'version', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'RadminRestoreCollectionBackupResponse': {'name': 'RadminRestoreCollectionBackupResponse', 'minified': 'Is', 'fields': []}, 'RadminAllSharedItemsRequest': {'name': 'RadminAllSharedItemsRequest', 'minified': 'bs', 'fields': [{'no': 1, 'name': 'user_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'RadminAllSharedItemsResponse': {'name': 'RadminAllSharedItemsResponse', 'minified': 'Us', 'fields': [{'no': 1, 'name': 'items', 'kind': 'message', 'type': 'message', 'T': 'RadminAllSharedItemsResponseItems', 'wire': 2, 'repeated': True, 'optional': False}, {'no': 2, 'name': 'reviews', 'kind': 'message', 'type': 'message', 'T': 'RadminAllSharedItemsResponseReviews', 'wire': 2, 'repeated': True, 'optional': False}]}, 'RadminAllSharedItemsResponseItems': {'name': 'RadminAllSharedItemsResponseItems', 'minified': 'Ms', 'fields': [{'no': 1, 'name': 'id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'name', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'downloads', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'RadminAllSharedItemsResponseReviews': {'name': 'RadminAllSharedItemsResponseReviews', 'minified': 'As', 'fields': [{'no': 1, 'name': 'ts', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'text', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'thumbs_up', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}]}, 'RadminClearReviewsRequest': {'name': 'RadminClearReviewsRequest', 'minified': 'Os', 'fields': [{'no': 1, 'name': 'user_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'mode', 'kind': 'enum', 'type': 'enum', 'T': 'r.getEnumType(fs)', 'wire': 0, 'repeated': False, 'optional': False, 'enum': {'values': {0: {'name': 'CLEAR_REVIEWS_MODE_UNKNOWN', 'short': 'UNKNOWN'}, 1: {'name': 'CLEAR_REVIEWS_MODE_ALL_REVIEWS_BY_USER', 'short': 'ALL_REVIEWS_BY_USER'}, 2: {'name': 'CLEAR_REVIEWS_MODE_ALL_REVIEWS_ON_DECKS_OF_USER', 'short': 'ALL_REVIEWS_ON_DECKS_OF_USER'}}}}]}, 'RadminClearReviewsResponse': {'name': 'RadminClearReviewsResponse', 'minified': 'Ds', 'fields': []}, 'RadminEmailStatusRequest': {'name': 'RadminEmailStatusRequest', 'minified': 'Ls', 'fields': [{'no': 1, 'name': 'email', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'action', 'kind': 'enum', 'type': 'enum', 'T': 'r.getEnumType(Ts)', 'wire': 0, 'repeated': False, 'optional': False, 'enum': {'values': {0: {'name': 'EMAIL_STATUS_ACTION_VIEW', 'short': 'VIEW'}, 1: {'name': 'EMAIL_STATUS_ACTION_SEND_EMAIL', 'short': 'SEND_EMAIL'}, 2: {'name': 'EMAIL_STATUS_ACTION_REMOVE_SPAM_BLOCK', 'short': 'REMOVE_SPAM_BLOCK'}}}}]}, 'RadminEmailStatusResponse': {'name': 'RadminEmailStatusResponse', 'minified': 'vs', 'fields': [{'no': 1, 'name': 'sent', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'changed', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'verified', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 4, 'name': 'state', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'RadminSupportNotesRequest': {'name': 'RadminSupportNotesRequest', 'minified': 'Fs', 'fields': [{'no': 1, 'name': 'user_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'new_note', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': True}]}, 'RadminSupportNotesResponseNotes': {'name': 'RadminSupportNotesResponseNotes', 'minified': 'Bs', 'fields': [{'no': 1, 'name': 'text', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'author', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'timestamp', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}]}, 'RadminSupportNotesResponse': {'name': 'RadminSupportNotesResponse', 'minified': 'Gs', 'fields': [{'no': 1, 'name': 'notes', 'kind': 'message', 'type': 'message', 'T': 'RadminSupportNotesResponseNotes', 'wire': 2, 'repeated': True, 'optional': False}]}, 'RadminRestoreMediaRequest': {'name': 'RadminRestoreMediaRequest', 'minified': 'Cs', 'fields': [{'no': 1, 'name': 'user_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'days', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'dry_run', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}]}, 'RadminRestoreMediaResponse': {'name': 'RadminRestoreMediaResponse', 'minified': 'Vs', 'fields': [{'no': 1, 'name': 'files_processed', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'RadminFixMediaRequest': {'name': 'RadminFixMediaRequest', 'minified': 'xs', 'fields': [{'no': 1, 'name': 'user_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'dry_run', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}]}, 'RadminFixMediaResponse': {'name': 'RadminFixMediaResponse', 'minified': 'Ps', 'fields': [{'no': 1, 'name': 'files_processed', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'RadminListMediaRequest': {'name': 'RadminListMediaRequest', 'minified': 'qs', 'fields': [{'no': 1, 'name': 'user_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'RadminListMediaResponse': {'name': 'RadminListMediaResponse', 'minified': '$s', 'fields': [{'no': 1, 'name': 'entries', 'kind': 'message', 'type': 'message', 'T': 'RadminListMediaResponseEntries', 'wire': 2, 'repeated': True, 'optional': False}]}, 'RadminMoveAddonRequest': {'name': 'RadminMoveAddonRequest', 'minified': 'Ws', 'fields': [{'no': 1, 'name': 'shared_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'target_user_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'RadminMoveAddonResponse': {'name': 'RadminMoveAddonResponse', 'minified': 'Js', 'fields': []}, 'RadminDumpAllAddonsRequest': {'name': 'RadminDumpAllAddonsRequest', 'minified': 'Ks', 'fields': []}, 'RadminDumpAllAddonsResponse': {'name': 'RadminDumpAllAddonsResponse', 'minified': 'Xs', 'fields': []}, 'RadminMigrateUserRequest': {'name': 'RadminMigrateUserRequest', 'minified': 'Ys', 'fields': [{'no': 1, 'name': 'user_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'target_shard', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'RadminMigrateUserResponse': {'name': 'RadminMigrateUserResponse', 'minified': 'Hs', 'fields': []}, 'RadminMigrateUsersRequest': {'name': 'RadminMigrateUsersRequest', 'minified': 'zs', 'fields': [{'no': 1, 'name': 'source_shard', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'target_shard', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'count', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'RadminMigrateUsersResponse': {'name': 'RadminMigrateUsersResponse', 'minified': 'js', 'fields': []}, 'RadminBalanceUsersRequest': {'name': 'RadminBalanceUsersRequest', 'minified': 'Qs', 'fields': [{'no': 1, 'name': 'batch_size', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'batch_count', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'shards_to_drain', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'RadminBalanceUsersResponse': {'name': 'RadminBalanceUsersResponse', 'minified': 'Zs', 'fields': []}, 'RadminBanUserRequest': {'name': 'RadminBanUserRequest', 'minified': 'et', 'fields': [{'no': 1, 'name': 'user_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'RadminBanUserResponse': {'name': 'RadminBanUserResponse', 'minified': 'nt', 'fields': []}, 'RadminBecomeUserRequest': {'name': 'RadminBecomeUserRequest', 'minified': 'at', 'fields': [{'no': 1, 'name': 'user_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'RadminBecomeUserResponse': {'name': 'RadminBecomeUserResponse', 'minified': 'st', 'fields': [{'no': 1, 'name': 'token', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'RadminExportRevlogsRequest': {'name': 'RadminExportRevlogsRequest', 'minified': 'tt', 'fields': [{'no': 1, 'name': 'shard', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'options', 'kind': 'message', 'type': 'message', 'T': 'RadminExportRevlogsRequestOptions', 'wire': 2, 'repeated': False, 'optional': False}]}, 'RadminExportRevlogsResponse': {'name': 'RadminExportRevlogsResponse', 'minified': 'rt', 'fields': []}, 'RadminRecalculateRatingsRequest': {'name': 'RadminRecalculateRatingsRequest', 'minified': 'ot', 'fields': [{'no': 1, 'name': 'shared_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'RadminRecalculateRatingsResponse': {'name': 'RadminRecalculateRatingsResponse', 'minified': 'it', 'fields': []}, 'RadminBulkRemoveReviewsRequest': {'name': 'RadminBulkRemoveReviewsRequest', 'minified': 'ct', 'fields': [{'no': 1, 'name': 'user_ids', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': True, 'optional': False}, {'no': 2, 'name': 'reason', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'RadminBulkRemoveReviewsResponse': {'name': 'RadminBulkRemoveReviewsResponse', 'minified': 'dt', 'fields': []}, 'RadminBulkDisableSharingRequest': {'name': 'RadminBulkDisableSharingRequest', 'minified': 'mt', 'fields': [{'no': 1, 'name': 'user_ids', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': True, 'optional': False}, {'no': 2, 'name': 'reason', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'RadminBulkDisableSharingResponse': {'name': 'RadminBulkDisableSharingResponse', 'minified': 'ut', 'fields': []}, 'SharedItemInfoResponseAvailableDeckSampleNotes': {'name': 'SharedItemInfoResponseAvailableDeckSampleNotes', 'minified': 'lt', 'fields': [{'no': 1, 'name': 'fields', 'kind': 'message', 'type': 'message', 'T': 'SharedItemInfoResponseAvailableDeckSampleNotesFields', 'wire': 2, 'repeated': True, 'optional': False}]}, 'SharedItemInfoResponseAvailableDeckSampleNotesFields': {'name': 'SharedItemInfoResponseAvailableDeckSampleNotesFields', 'minified': 'kt', 'fields': [{'no': 1, 'name': 'name', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'value', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'SharedItemInfoResponse': {'name': 'SharedItemInfoResponse', 'minified': 'Tt', 'fields': [{'no': 1, 'name': 'available', 'kind': 'message', 'type': 'message', 'T': 'SharedItemInfoResponseAvailable', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'missing', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'access_denied', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}]}, 'SharedItemInfoResponseAvailable': {'name': 'SharedItemInfoResponseAvailable', 'minified': 'pt', 'fields': [{'no': 1, 'name': 'reviews', 'kind': 'message', 'type': 'message', 'T': 'Be', 'wire': 2, 'repeated': True, 'optional': False}, {'no': 4, 'name': 'is_owner', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 5, 'name': 'title', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 6, 'name': 'tags', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 7, 'name': 'size', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 8, 'name': 'last_updated', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 9, 'name': 'description', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 10, 'name': 'deck', 'kind': 'message', 'type': 'message', 'T': 'SharedItemInfoResponseAvailableDeck', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 11, 'name': 'addon', 'kind': 'message', 'type': 'message', 'T': 'SharedItemInfoResponseAvailableAddon', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 12, 'name': 'support_url', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': True}, {'no': 13, 'name': 'items_shared_by_user', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 14, 'name': 'admin_info', 'kind': 'message', 'type': 'message', 'T': 'SharedItemInfoResponseAvailableAdminInfo', 'wire': 2, 'repeated': False, 'optional': True}, {'no': 15, 'name': 'just_uploaded', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 16, 'name': 'is_suspended', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 17, 'name': 'is_copyright_holder', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 18, 'name': 'thumbs_up', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 19, 'name': 'thumbs_down', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 20, 'name': 'original_deck_name', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 21, 'name': 'too_new_for_rating', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}]}, 'SharedItemInfoResponseAvailableAdminInfo': {'name': 'SharedItemInfoResponseAvailableAdminInfo', 'minified': 'ht', 'fields': [{'no': 1, 'name': 'sharer_email', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'sharer_ip', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'downloads', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'Be': {'name': 'Be', 'minified': 'Be', 'fields': [{'no': 1, 'name': 'post_timestamp', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'thumbs_up', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 4, 'name': 'body', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 5, 'name': 'reply_text', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': True}, {'no': 6, 'name': 'reply_timestamp', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': True}, {'no': 7, 'name': 'reviewer_email_if_admin', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': True}, {'no': 8, 'name': 'reviewer_ip_if_admin', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': True}]}, 'SharedItemInfoResponseAvailableDeck': {'name': 'SharedItemInfoResponseAvailableDeck', 'minified': 'gt', 'fields': [{'no': 1, 'name': 'notes', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'audio', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'images', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 4, 'name': 'sample_notes', 'kind': 'message', 'type': 'message', 'T': 'SharedItemInfoResponseAvailableDeckSampleNotes', 'wire': 2, 'repeated': True, 'optional': False}, {'no': 5, 'name': 'download_key', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'SharedItemInfoResponseAvailableAddon': {'name': 'SharedItemInfoResponseAvailableAddon', 'minified': 'yt', 'fields': [{'no': 1, 'name': 'v2_0', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'v2_1', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'versions', 'kind': 'message', 'type': 'message', 'T': 'SharedItemInfoResponseAvailableAddonVersions', 'wire': 2, 'repeated': True, 'optional': False}]}, 'SharedItemInfoResponseAvailableAddonVersions': {'name': 'SharedItemInfoResponseAvailableAddonVersions', 'minified': 'wt', 'fields': [{'no': 1, 'name': 'description', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'updated_at_secs', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}]}, 'SharedGetOwnReviewRequest': {'name': 'SharedGetOwnReviewRequest', 'minified': '_t', 'fields': [{'no': 1, 'name': 'shared_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'SharedGetOwnReviewResponse': {'name': 'SharedGetOwnReviewResponse', 'minified': 'Nt', 'fields': [{'no': 1, 'name': 'review', 'kind': 'message', 'type': 'message', 'T': 'Ge', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'shared_item_title', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'support_page', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': True}]}, 'Ge': {'name': 'Ge', 'minified': 'Ge', 'fields': [{'no': 1, 'name': 'body', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'thumbs_up', 'kind': 'scalar', 'type': 'bool', 'T': '8', 'wire': 0, 'repeated': False, 'optional': False}]}, 'SharedSetOwnReviewRequest': {'name': 'SharedSetOwnReviewRequest', 'minified': 'St', 'fields': [{'no': 1, 'name': 'shared_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'review', 'kind': 'message', 'type': 'message', 'T': 'Ge', 'wire': 2, 'repeated': False, 'optional': False}]}, 'SharedSetOwnReviewResponse': {'name': 'SharedSetOwnReviewResponse', 'minified': 'Et', 'fields': []}, 'SharedReportCopyrightRequest': {'name': 'SharedReportCopyrightRequest', 'minified': 'Rt', 'fields': [{'no': 1, 'name': 'shared_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'SharedReportCopyrightResponse': {'name': 'SharedReportCopyrightResponse', 'minified': 'It', 'fields': []}, 'SharedItemsByAuthorRequest': {'name': 'SharedItemsByAuthorRequest', 'minified': 'bt', 'fields': [{'no': 1, 'name': 'shared_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'SharedItemsByAuthorResponse': {'name': 'SharedItemsByAuthorResponse', 'minified': 'Ut', 'fields': [{'no': 1, 'name': 'items', 'kind': 'message', 'type': 'message', 'T': 'SharedItemsByAuthorResponseItems', 'wire': 2, 'repeated': True, 'optional': False}]}, 'SharedItemsByAuthorResponseItems': {'name': 'SharedItemsByAuthorResponseItems', 'minified': 'Mt', 'fields': [{'no': 1, 'name': 'shared_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'title', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'SharedListDecksResponse': {'name': 'SharedListDecksResponse', 'minified': 'At', 'fields': [{'no': 1, 'name': 'rows', 'kind': 'message', 'type': 'message', 'T': 'SharedListDecksResponseRows', 'wire': 2, 'repeated': True, 'optional': False}]}, 'SharedListDecksResponseRows': {'name': 'SharedListDecksResponseRows', 'minified': 'Ot', 'fields': [{'no': 1, 'name': 'id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'title', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'thumbs_up', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 4, 'name': 'thumbs_down', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 5, 'name': 'mtime', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 6, 'name': 'notes', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 7, 'name': 'audio', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 8, 'name': 'images', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'SharedListAddonsResponse': {'name': 'SharedListAddonsResponse', 'minified': 'Dt', 'fields': [{'no': 1, 'name': 'rows', 'kind': 'message', 'type': 'message', 'T': 'SharedListAddonsResponseRows', 'wire': 2, 'repeated': True, 'optional': False}, {'no': 2, 'name': 'user_upload_status', 'kind': 'enum', 'type': 'enum', 'T': 'r.getEnumType(ft)', 'wire': 0, 'repeated': False, 'optional': False, 'enum': {'values': {0: {'name': 'USER_UPLOAD_STATUS_UNSPECIFIED', 'short': 'UNSPECIFIED'}, 1: {'name': 'USER_UPLOAD_STATUS_NO_USER', 'short': 'NO_USER'}, 2: {'name': 'USER_UPLOAD_STATUS_TOO_NEW', 'short': 'TOO_NEW'}, 3: {'name': 'USER_UPLOAD_STATUS_CAN_UPLOAD', 'short': 'CAN_UPLOAD'}}}}]}, 'SharedListAddonsResponseRows': {'name': 'SharedListAddonsResponseRows', 'minified': 'Lt', 'fields': [{'no': 1, 'name': 'id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'title', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'thumbs_up', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 4, 'name': 'thumbs_down', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 5, 'name': 'mtime', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 6, 'name': 'max_supported_version', 'kind': 'scalar', 'type': 'int32', 'T': '5', 'wire': 0, 'repeated': False, 'optional': False}]}, 'SharedListMineRequest': {'name': 'SharedListMineRequest', 'minified': 'vt', 'fields': []}, 'SharedListMineResponse': {'name': 'SharedListMineResponse', 'minified': 'Ft', 'fields': [{'no': 1, 'name': 'items', 'kind': 'message', 'type': 'message', 'T': 'SharedListMineResponseItems', 'wire': 2, 'repeated': True, 'optional': False}, {'no': 2, 'name': 'reviews', 'kind': 'message', 'type': 'message', 'T': 'SharedListMineResponseReviews', 'wire': 2, 'repeated': True, 'optional': False}, {'no': 3, 'name': 'expired_decks', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': True, 'optional': False}]}, 'SharedListMineResponseItems': {'name': 'SharedListMineResponseItems', 'minified': 'Bt', 'fields': [{'no': 1, 'name': 'id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'title', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'thumbs_up', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 4, 'name': 'thumbs_down', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 5, 'name': 'mtime', 'kind': 'scalar', 'type': 'int64', 'T': '3', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 6, 'name': 'downloads', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 7, 'name': 'max_supported_version', 'kind': 'scalar', 'type': 'int32', 'T': '5', 'wire': 0, 'repeated': False, 'optional': True}]}, 'SharedListMineResponseReviews': {'name': 'SharedListMineResponseReviews', 'minified': 'Gt', 'fields': [{'no': 1, 'name': 'review', 'kind': 'message', 'type': 'message', 'T': 'Be', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'item_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'hash', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'SharedReplyToReviewRequest': {'name': 'SharedReplyToReviewRequest', 'minified': 'Ct', 'fields': [{'no': 1, 'name': 'shared_Id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'hash', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'body', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}]}, 'SharedReplyToReviewResponse': {'name': 'SharedReplyToReviewResponse', 'minified': 'Vt', 'fields': []}, 'SharedGetAddonInfoRequest': {'name': 'SharedGetAddonInfoRequest', 'minified': 'xt', 'fields': [{'no': 1, 'name': 'addon_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'SharedGetAddonInfoResponse': {'name': 'SharedGetAddonInfoResponse', 'minified': 'Pt', 'fields': [{'no': 1, 'name': 'addon', 'kind': 'message', 'type': 'message', 'T': 'Ce', 'wire': 2, 'repeated': False, 'optional': False}]}, 'Ce': {'name': 'Ce', 'minified': 'Ce', 'fields': [{'no': 1, 'name': 'addon_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': True}, {'no': 2, 'name': 'title', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 3, 'name': 'tags', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 4, 'name': 'support_url', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 5, 'name': 'description', 'kind': 'scalar', 'type': 'string', 'T': '9', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 6, 'name': 'branches', 'kind': 'message', 'type': 'message', 'T': 'qt', 'wire': 2, 'repeated': True, 'optional': False}]}, 'qt': {'name': 'qt', 'minified': 'qt', 'fields': [{'no': 1, 'name': 'min_version', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'max_version', 'kind': 'scalar', 'type': 'int32', 'T': '5', 'wire': 0, 'repeated': False, 'optional': False}]}, 'SharedUploadAddonRequest': {'name': 'SharedUploadAddonRequest', 'minified': '$t', 'fields': [{'no': 1, 'name': 'info', 'kind': 'message', 'type': 'message', 'T': 'Ce', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'file', 'kind': 'message', 'type': 'message', 'T': 'SharedUploadAddonRequestFile', 'wire': 2, 'repeated': False, 'optional': True}]}, 'SharedUploadAddonRequestFile': {'name': 'SharedUploadAddonRequestFile', 'minified': 'Wt', 'fields': [{'no': 1, 'name': 'zip_data', 'kind': 'scalar', 'type': 'bytes', 'T': '12', 'wire': 2, 'repeated': False, 'optional': False}, {'no': 2, 'name': 'branch_index', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'SharedUploadAddonResponse': {'name': 'SharedUploadAddonResponse', 'minified': 'Jt', 'fields': [{'no': 1, 'name': 'addon_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'SharedRemoveItemRequest': {'name': 'SharedRemoveItemRequest', 'minified': 'Kt', 'fields': [{'no': 1, 'name': 'shared_id', 'kind': 'scalar', 'type': 'uint32', 'T': '13', 'wire': 0, 'repeated': False, 'optional': False}]}, 'SharedRemoveItemResponse': {'name': 'SharedRemoveItemResponse', 'minified': 'Xt', 'fields': []}}
25
+
26
+
27
+ # All discovered endpoints. `query` holds GET query keys.
28
+
29
+ ENDPOINTS: list[dict] = [{'path': '/svc/account/check-terms', 'method': 'POST', 'fn': 'Bo', 'req': 'Kn', 'resp': 'Xn', 'query': [], 'request': 'AccountCheckTermsRequest', 'response': 'AccountCheckTermsResponse'}, {'path': '/svc/account/confirm-terms', 'method': 'POST', 'fn': 'Go', 'req': 'Yn', 'resp': 'Hn', 'query': [], 'request': 'AccountConfirmTermsRequest', 'response': 'AccountConfirmTermsResponse'}, {'path': '/svc/account/get-account-status', 'method': 'POST', 'fn': 'vo', 'req': 'fa', 'resp': 'Ta', 'query': [], 'request': 'AccountGetAccountStatusRequest', 'response': 'AccountGetAccountStatusResponse'}, {'path': '/svc/account/get-settings', 'method': 'POST', 'fn': 'Co', 'req': 'zn', 'resp': 'jn', 'query': [], 'request': 'AccountGetSettingsRequest', 'response': 'AccountGetSettingsResponse'}, {'path': '/svc/account/login', 'method': 'POST', 'fn': 'Fo', 'req': 'Wn', 'resp': 'Jn', 'query': [], 'request': 'AccountLoginRequest', 'response': 'AccountLoginResponse'}, {'path': '/svc/account/remove-account', 'method': 'POST', 'fn': 'Po', 'req': 'aa', 'resp': 'sa', 'query': [], 'request': 'AccountRemoveAccountRequest', 'response': 'AccountRemoveAccountResponse'}, {'path': '/svc/account/resend-verification', 'method': 'POST', 'fn': 'Jo', 'req': 'da', 'resp': 'ma', 'query': [], 'request': 'AccountResendVerificationRequest', 'response': 'AccountResendVerificationResponse'}, {'path': '/svc/account/reset-password', 'method': 'POST', 'fn': 'Ko', 'req': 'ua', 'resp': 'la', 'query': [], 'request': 'AccountResetPasswordRequest', 'response': 'AccountResetPasswordResponse'}, {'path': '/svc/account/signup', 'method': 'POST', 'fn': 'qo', 'req': 'ta', 'resp': 'ra', 'query': [], 'request': 'AccountSignupRequest', 'response': 'AccountSignupResponse'}, {'path': '/svc/account/total-media', 'method': 'POST', 'fn': 'xo', 'req': 'ea', 'resp': 'na', 'query': [], 'request': 'AccountTotalMediaRequest', 'response': 'AccountTotalMediaResponse'}, {'path': '/svc/account/update-settings', 'method': 'POST', 'fn': 'Vo', 'req': 'Qn', 'resp': 'Zn', 'query': [], 'request': 'AccountUpdateSettingsRequest', 'response': 'AccountUpdateSettingsResponse'}, {'path': '/svc/account/verify-email', 'method': 'POST', 'fn': '$o', 'req': 'ia', 'resp': 'ca', 'query': [], 'request': 'AccountVerifyEmailRequest', 'response': 'AccountVerifyEmailResponse'}, {'path': '/svc/decks/create-deck', 'method': 'POST', 'fn': 'ho', 'req': 'ds', 'resp': 'ms', 'query': [], 'request': 'DecksCreateDeckRequest', 'response': 'DecksCreateDeckResponse'}, {'path': '/svc/decks/deck-list-info', 'method': 'POST', 'fn': 'To', 'req': 'xa', 'resp': 'Pa', 'query': [], 'request': 'DecksDeckListInfoRequest', 'response': 'DecksDeckListInfoResponse'}, {'path': '/svc/decks/deck-share', 'method': 'POST', 'fn': 'No', 'req': 'ya', 'resp': 'wa', 'query': [], 'request': 'DecksDeckShareRequest', 'response': 'DecksDeckShareResponse'}, {'path': '/svc/decks/deck-share-info', 'method': 'POST', 'fn': '_o', 'req': 'ha', 'resp': 'ga', 'query': [], 'request': 'DecksDeckShareInfoRequest', 'response': 'DecksDeckShareInfoResponse'}, {'path': '/svc/decks/deck-share-state', 'method': 'POST', 'fn': 'So', 'req': '_a', 'resp': 'Na', 'query': [], 'request': 'DecksDeckShareStateRequest', 'response': 'DecksDeckShareStateResponse'}, {'path': '/svc/decks/remove-deck', 'method': 'POST', 'fn': 'yo', 'req': 'Xa', 'resp': 'Ya', 'query': [], 'request': 'DecksRemoveDeckRequest', 'response': 'DecksRemoveDeckResponse'}, {'path': '/svc/decks/rename-deck', 'method': 'POST', 'fn': 'go', 'req': 'Ha', 'resp': 'za', 'query': [], 'request': 'DecksRenameDeckRequest', 'response': 'DecksRenameDeckResponse'}, {'path': '/svc/decks/select-deck', 'method': 'POST', 'fn': 'wo', 'req': 'Ja', 'resp': 'Ka', 'query': [], 'request': 'DecksSelectDeckRequest', 'response': 'DecksSelectDeckResponse'}, {'path': '/svc/editor/add-or-update', 'method': 'POST', 'fn': 'Mo', 'req': 'Ia', 'resp': 'Ma', 'query': [], 'request': 'EditorAddOrUpdateRequest', 'response': 'EditorAddOrUpdateResponse'}, {'path': '/svc/editor/get-info-for-adding', 'method': 'POST', 'fn': 'Oo', 'req': 'ss', 'resp': 'ts', 'query': [], 'request': 'EditorGetInfoForAddingRequest', 'response': 'EditorGetInfoForAddingResponse'}, {'path': '/svc/editor/get-note-info', 'method': 'POST', 'fn': 'Ao', 'req': 'Aa', 'resp': 'Oa', 'query': [], 'request': 'EditorGetNoteInfoRequest', 'response': 'EditorGetNoteInfoResponse'}, {'path': '/svc/editor/get-notetype-fields', 'method': 'POST', 'fn': 'Do', 'req': 'ns', 'resp': 'as', 'query': [], 'request': 'EditorGetNotetypeFieldsRequest', 'response': 'EditorGetNotetypeFieldsResponse'}, {'path': '/svc/radmin/all-shared-items', 'method': 'POST', 'fn': 'jo', 'req': 'bs', 'resp': 'Us', 'query': [], 'request': 'RadminAllSharedItemsRequest', 'response': 'RadminAllSharedItemsResponse'}, {'path': '/svc/radmin/balance-users', 'method': 'POST', 'fn': 'ci', 'req': 'Qs', 'resp': 'Zs', 'query': [], 'request': 'RadminBalanceUsersRequest', 'response': 'RadminBalanceUsersResponse'}, {'path': '/svc/radmin/ban-user', 'method': 'POST', 'fn': 'di', 'req': 'et', 'resp': 'nt', 'query': [], 'request': 'RadminBanUserRequest', 'response': 'RadminBanUserResponse'}, {'path': '/svc/radmin/become-user', 'method': 'POST', 'fn': 'mi', 'req': 'at', 'resp': 'st', 'query': [], 'request': 'RadminBecomeUserRequest', 'response': 'RadminBecomeUserResponse'}, {'path': '/svc/radmin/bulk-disable-sharing', 'method': 'POST', 'fn': 'fi', 'req': 'mt', 'resp': 'ut', 'query': [], 'request': 'RadminBulkDisableSharingRequest', 'response': 'RadminBulkDisableSharingResponse'}, {'path': '/svc/radmin/bulk-remove-reviews', 'method': 'POST', 'fn': 'ki', 'req': 'ct', 'resp': 'dt', 'query': [], 'request': 'RadminBulkRemoveReviewsRequest', 'response': 'RadminBulkRemoveReviewsResponse'}, {'path': '/svc/radmin/clear-reviews', 'method': 'POST', 'fn': 'Qo', 'req': 'Os', 'resp': 'Ds', 'query': [], 'request': 'RadminClearReviewsRequest', 'response': 'RadminClearReviewsResponse'}, {'path': '/svc/radmin/dump-all-addons', 'method': 'POST', 'fn': 'ri', 'req': 'Ks', 'resp': 'Xs', 'query': [], 'request': 'RadminDumpAllAddonsRequest', 'response': 'RadminDumpAllAddonsResponse'}, {'path': '/svc/radmin/email-status', 'method': 'POST', 'fn': 'Zo', 'req': 'Ls', 'resp': 'vs', 'query': [], 'request': 'RadminEmailStatusRequest', 'response': 'RadminEmailStatusResponse'}, {'path': '/svc/radmin/export-revlogs', 'method': 'POST', 'fn': 'ui', 'req': 'tt', 'resp': 'rt', 'query': [], 'request': 'RadminExportRevlogsRequest', 'response': 'RadminExportRevlogsResponse'}, {'path': '/svc/radmin/fix-media', 'method': 'POST', 'fn': 'ai', 'req': 'xs', 'resp': 'Ps', 'query': [], 'request': 'RadminFixMediaRequest', 'response': 'RadminFixMediaResponse'}, {'path': '/svc/radmin/get-collection-backups', 'method': 'POST', 'fn': 'Ho', 'req': 'Ns', 'resp': 'Ss', 'query': [], 'request': 'RadminGetCollectionBackupsRequest', 'response': 'RadminGetCollectionBackupsResponse'}, {'path': '/svc/radmin/get-user-info', 'method': 'POST', 'fn': 'Yo', 'req': 'ys', 'resp': 'ws', 'query': [], 'request': 'RadminGetUserInfoRequest', 'response': 'RadminGetUserInfoResponse'}, {'path': '/svc/radmin/list-media', 'method': 'POST', 'fn': 'si', 'req': 'qs', 'resp': '$s', 'query': [], 'request': 'RadminListMediaRequest', 'response': 'RadminListMediaResponse'}, {'path': '/svc/radmin/lookup-users', 'method': 'POST', 'fn': 'Xo', 'req': 'ps', 'resp': 'hs', 'query': [], 'request': 'RadminLookupUsersRequest', 'response': 'RadminLookupUsersResponse'}, {'path': '/svc/radmin/migrate-user', 'method': 'POST', 'fn': 'oi', 'req': 'Ys', 'resp': 'Hs', 'query': [], 'request': 'RadminMigrateUserRequest', 'response': 'RadminMigrateUserResponse'}, {'path': '/svc/radmin/migrate-users', 'method': 'POST', 'fn': 'ii', 'req': 'zs', 'resp': 'js', 'query': [], 'request': 'RadminMigrateUsersRequest', 'response': 'RadminMigrateUsersResponse'}, {'path': '/svc/radmin/move-addon', 'method': 'POST', 'fn': 'ti', 'req': 'Ws', 'resp': 'Js', 'query': [], 'request': 'RadminMoveAddonRequest', 'response': 'RadminMoveAddonResponse'}, {'path': '/svc/radmin/recalculate-ratings', 'method': 'POST', 'fn': 'li', 'req': 'ot', 'resp': 'it', 'query': [], 'request': 'RadminRecalculateRatingsRequest', 'response': 'RadminRecalculateRatingsResponse'}, {'path': '/svc/radmin/restore-collection-backup', 'method': 'POST', 'fn': 'zo', 'req': 'Rs', 'resp': 'Is', 'query': [], 'request': 'RadminRestoreCollectionBackupRequest', 'response': 'RadminRestoreCollectionBackupResponse'}, {'path': '/svc/radmin/restore-media', 'method': 'POST', 'fn': 'ni', 'req': 'Cs', 'resp': 'Vs', 'query': [], 'request': 'RadminRestoreMediaRequest', 'response': 'RadminRestoreMediaResponse'}, {'path': '/svc/radmin/support-notes', 'method': 'POST', 'fn': 'ei', 'req': 'Fs', 'resp': 'Gs', 'query': [], 'request': 'RadminSupportNotesRequest', 'response': 'RadminSupportNotesResponse'}, {'path': '/svc/search/search', 'method': 'POST', 'fn': 'Lo', 'req': 'qa', 'resp': '$a', 'query': [], 'request': 'SearchSearchRequest', 'response': 'SearchSearchResponse'}, {'path': '/svc/shared/get-addon-info', 'method': 'POST', 'fn': 'ko', 'req': 'xt', 'resp': 'Pt', 'query': [], 'request': 'SharedGetAddonInfoRequest', 'response': 'SharedGetAddonInfoResponse'}, {'path': '/svc/shared/get-own-review', 'method': 'POST', 'fn': 'to', 'req': '_t', 'resp': 'Nt', 'query': [], 'request': 'SharedGetOwnReviewRequest', 'response': 'SharedGetOwnReviewResponse'}, {'path': '/svc/shared/item-info', 'method': 'GET', 'fn': 'no', 'req': '', 'resp': 'Tt', 'query': ['no'], 'request': None, 'response': 'SharedItemInfoResponse'}, {'path': '/svc/shared/items-by-author', 'method': 'POST', 'fn': 'io', 'req': 'bt', 'resp': 'Ut', 'query': [], 'request': 'SharedItemsByAuthorRequest', 'response': 'SharedItemsByAuthorResponse'}, {'path': '/svc/shared/list-addons', 'method': 'GET', 'fn': 'mo', 'req': '', 'resp': 'Dt', 'query': [], 'request': None, 'response': 'SharedListAddonsResponse'}, {'path': '/svc/shared/list-decks', 'method': 'GET', 'fn': 'co', 'req': '', 'resp': 'At', 'query': [], 'request': None, 'response': 'SharedListDecksResponse'}, {'path': '/svc/shared/list-mine', 'method': 'POST', 'fn': 'uo', 'req': 'vt', 'resp': 'Ft', 'query': [], 'request': 'SharedListMineRequest', 'response': 'SharedListMineResponse'}, {'path': '/svc/shared/remove-item', 'method': 'POST', 'fn': 'so', 'req': 'Kt', 'resp': 'Xt', 'query': [], 'request': 'SharedRemoveItemRequest', 'response': 'SharedRemoveItemResponse'}, {'path': '/svc/shared/reply-to-review', 'method': 'POST', 'fn': 'lo', 'req': 'Ct', 'resp': 'Vt', 'query': [], 'request': 'SharedReplyToReviewRequest', 'response': 'SharedReplyToReviewResponse'}, {'path': '/svc/shared/report-copyright', 'method': 'POST', 'fn': 'oo', 'req': 'Rt', 'resp': 'It', 'query': [], 'request': 'SharedReportCopyrightRequest', 'response': 'SharedReportCopyrightResponse'}, {'path': '/svc/shared/set-own-review', 'method': 'POST', 'fn': 'ro', 'req': 'St', 'resp': 'Et', 'query': [], 'request': 'SharedSetOwnReviewRequest', 'response': 'SharedSetOwnReviewResponse'}, {'path': '/svc/shared/upload-addon', 'method': 'POST', 'fn': 'fo', 'req': '$t', 'resp': 'Jt', 'query': [], 'request': 'SharedUploadAddonRequest', 'response': 'SharedUploadAddonResponse'}, {'path': '/svc/study/get-deck-limits', 'method': 'POST', 'fn': 'bo', 'req': 'ja', 'resp': 'Qa', 'query': [], 'request': 'StudyGetDeckLimitsRequest', 'response': 'StudyGetDeckLimitsResponse'}, {'path': '/svc/study/set-deck-limits', 'method': 'POST', 'fn': 'Uo', 'req': 'Za', 'resp': 'es', 'query': [], 'request': 'StudySetDeckLimitsRequest', 'response': 'StudySetDeckLimitsResponse'}, {'path': '/svc/study/study-cards', 'method': 'POST', 'fn': 'Ro', 'req': 'rs', 'resp': 'os', 'query': [], 'request': 'StudyStudyCardsRequest', 'response': 'StudyStudyCardsResponse'}, {'path': '/svc/study/upgrade-scheduler', 'method': 'POST', 'fn': 'Io', 'req': 'us', 'resp': 'ls', 'query': [], 'request': 'StudyUpgradeSchedulerRequest', 'response': 'StudyUpgradeSchedulerResponse'}]
30
+
31
+
32
+ def schema_of(name: str) -> dict:
33
+ return SCHEMA[name]
34
+
35
+
36
+ def has_message(name: str) -> bool:
37
+ return name in SCHEMA
38
+
39
+
40
+ def endpoint(path: str) -> dict | None:
41
+ for e in ENDPOINTS:
42
+ if e["path"] == path:
43
+ return e
44
+ return None
45
+
46
+
47
+ def public_endpoints() -> list[dict]:
48
+ """Endpoints a normal user account can call (excludes /svc/radmin/*)."""
49
+ return [e for e in ENDPOINTS if "/radmin/" not in e["path"]]
make_test_addon.py ADDED
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env python3
2
+ """Build a tiny synthetic .ankiaddon for upload/download tests.
3
+
4
+ Never test with a real add-on: an upload REPLACES the file on the target
5
+ add-on id, and the old version is not recoverable from AnkiWeb.
6
+
7
+ Usage:
8
+ python3 make_test_addon.py # -> fixtures/test.ankiaddon
9
+ python3 make_test_addon.py -o out.ankiaddon
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import argparse
15
+ import json
16
+ import zipfile
17
+ from pathlib import Path
18
+
19
+ FIXTURE_DIR = Path(__file__).resolve().parent / "fixtures"
20
+ MARKER = "ANKIWEB-CLI-TEST-FIXTURE"
21
+
22
+ # Minimal add-on that loads cleanly in Anki and is obviously not a real add-on.
23
+ INIT_PY = '''"""Synthetic fixture add-on for AnkiWeb CLI tests. Not a real add-on."""
24
+ from aqt import mw
25
+
26
+
27
+ def _register():
28
+ mw.form.addon_name = addon_name # harmless attribute; confirms import ran
29
+
30
+
31
+ addon_name = "ankiweb-cli-test-fixture"
32
+ '''
33
+
34
+ MANIFEST = {
35
+ "name": "AnkiWeb CLI Test Fixture",
36
+ "package": "ankiweb_cli_test_fixture",
37
+ "version": "1.0.0",
38
+ "human_version": "1.0.0",
39
+ }
40
+
41
+
42
+ def build(dest: Path) -> Path:
43
+ dest.parent.mkdir(parents=True, exist_ok=True)
44
+ with zipfile.ZipFile(dest, "w", zipfile.ZIP_DEFLATED) as z:
45
+ # Root-level entries only, no wrapping folder, no __pycache__.
46
+ z.writestr("__init__.py", INIT_PY)
47
+ z.writestr("manifest.json", json.dumps(MANIFEST, indent=2) + "\n")
48
+ z.writestr("README.md", f"{MARKER}\n\nSynthetic add-on for upload tests.\n")
49
+ z.writestr("VERSION", "1.0.0\n")
50
+ return dest
51
+
52
+
53
+ def main() -> int:
54
+ ap = argparse.ArgumentParser(description=__doc__)
55
+ ap.add_argument("-o", "--output", default=str(FIXTURE_DIR / "test.ankiaddon"))
56
+ args = ap.parse_args()
57
+ dest = build(Path(args.output))
58
+ print(f"built {dest} ({dest.stat().st_size} bytes)")
59
+ with zipfile.ZipFile(dest) as z:
60
+ for n in z.namelist():
61
+ print(f" {n}")
62
+ return 0
63
+
64
+
65
+ if __name__ == "__main__":
66
+ raise SystemExit(main())