@abtnode/blocklet-services 1.16.0-beta-1d6c582e → 1.16.0-beta-62b42401

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.
@@ -0,0 +1,346 @@
1
+ const { handleInvitationReceive, getApplicationInfo } = require('@abtnode/auth/lib/auth');
2
+ const { upsertToPassports } = require('@abtnode/auth/lib/passport');
3
+ const { WELLKNOWN_SERVICE_PATH_PREFIX, NODE_SERVICES, USER_TYPE } = require('@abtnode/constant');
4
+ const { parseUserAvatar, extractUserAvatar } = require('@abtnode/util/lib/user-avatar');
5
+ const { types } = require('@arcblock/did');
6
+ const { fromAppDid } = require('@arcblock/did-ext');
7
+ const get = require('lodash/get');
8
+ const head = require('lodash/head');
9
+ const pick = require('lodash/pick');
10
+ const sortBy = require('lodash/sortBy');
11
+ const joinUrl = require('url-join');
12
+
13
+ const { AuthenticationClient } = require('../libs/auth/adapters/auth0');
14
+ const { getAvatarByEmail, transferPassport } = require('../libs/auth/utils');
15
+ const { getUser } = require('../libs/jwt');
16
+ const initJwt = require('../libs/jwt');
17
+ const { sendToUser } = require('../libs/notification');
18
+ const { isInvitedUserOnly } = require('../util');
19
+
20
+ const PREFIX = WELLKNOWN_SERVICE_PATH_PREFIX;
21
+
22
+ const prefix = `${PREFIX}/oauth`;
23
+
24
+ async function getDerivedUser(derivedDid, { node, teamDid }) {
25
+ const { users } = await node.getUsers({
26
+ teamDid,
27
+ query: {
28
+ derivedDid,
29
+ },
30
+ });
31
+ let currentUser;
32
+ if (users.length > 0) {
33
+ [currentUser] = users;
34
+ }
35
+ return currentUser;
36
+ }
37
+
38
+ async function login(req, node, options) {
39
+ const { token, locale = 'en', provider, componentId } = req.body;
40
+ const blocklet = await req.getBlocklet();
41
+ if (!blocklet.settings?.owner) {
42
+ throw new Error('Cant login oauth account as owner');
43
+ }
44
+ const oauthConfig = blocklet?.settings?.oauth || {};
45
+ const authClient = new AuthenticationClient({
46
+ domain: oauthConfig.auth0.domain,
47
+ });
48
+ const { did: teamDid, wallet: blockletWallet } = await req.getBlockletInfo();
49
+ const config = await req.getServiceConfig(NODE_SERVICES.AUTH, { componentId });
50
+ const [invitedUserOnly] = await isInvitedUserOnly(config, node, teamDid);
51
+ const userInfo = await authClient.getProfile(token);
52
+ const userWallet = fromAppDid(userInfo.sub, blockletWallet.secretKey, types.RoleType.ROLE_ACCOUNT);
53
+ const userDid = userWallet.address;
54
+ let passport = { name: 'Guest', role: 'guest' };
55
+ let currentUser = await getDerivedUser(userDid, { node, teamDid });
56
+ // 当前 oauth 账户已经绑定了 wallet 账户
57
+ if (currentUser) {
58
+ const validPassports = currentUser.passports.filter((item) => item.status === 'valid');
59
+ const lastUsedPassport = head(sortBy(validPassports, 'lastLoginAt'));
60
+ if (lastUsedPassport) {
61
+ passport = pick(lastUsedPassport, ['id', 'name', 'role']);
62
+ }
63
+ await node.updateUser({
64
+ teamDid,
65
+ user: {
66
+ did: currentUser.did,
67
+ pk: currentUser.pk,
68
+ locale,
69
+ passports: upsertToPassports(
70
+ currentUser.passports || [],
71
+ lastUsedPassport && {
72
+ ...lastUsedPassport,
73
+ lastLoginAt: new Date().toISOString(),
74
+ }
75
+ ),
76
+ lastLoginAt: new Date().toISOString(),
77
+ lastLoginIp: get(req, 'headers[x-real-ip]') || '',
78
+ },
79
+ });
80
+ } else {
81
+ currentUser = {
82
+ did: userWallet.address,
83
+ };
84
+ const avatar = await getAvatarByEmail(userInfo.email);
85
+ const currentUserInfo = await getUser(node, teamDid, userDid);
86
+ // 当前 oauth 账户不存在,自动添加一个新用户
87
+ if (!currentUserInfo) {
88
+ if (invitedUserOnly) {
89
+ throw new Error('Need invited to login');
90
+ }
91
+ await node.addUser({
92
+ teamDid,
93
+ user: {
94
+ source: USER_TYPE.DERIVED,
95
+ sourceId: userInfo.sub,
96
+ sourceProvider: provider,
97
+ did: userDid,
98
+ pk: userWallet.publicKey,
99
+ fullName: userInfo.nickname,
100
+ email: userInfo.email,
101
+ avatar,
102
+ locale,
103
+ type: 'profile',
104
+ approved: true,
105
+ passports: [],
106
+ firstLoginAt: new Date().toISOString(),
107
+ lastLoginAt: new Date().toISOString(),
108
+ lastLoginIp: get(req, 'headers[x-real-ip]') || '',
109
+ },
110
+ });
111
+ } else {
112
+ const validPassports = currentUserInfo.passports.filter((item) => item.status === 'valid');
113
+ const lastUsedPassport = head(sortBy(validPassports, 'lastLoginAt'));
114
+ if (lastUsedPassport) {
115
+ passport = pick(lastUsedPassport, ['id', 'name', 'role']);
116
+ }
117
+ // 当前用户已存在,更新用户信息
118
+ await node.updateUser({
119
+ teamDid,
120
+ user: {
121
+ did: userDid,
122
+ pk: userWallet.publicKey,
123
+ locale,
124
+ passports: upsertToPassports(
125
+ currentUser.passports || [],
126
+ lastUsedPassport && {
127
+ ...lastUsedPassport,
128
+ lastLoginAt: new Date().toISOString(),
129
+ }
130
+ ),
131
+ lastLoginAt: new Date().toISOString(),
132
+ lastLoginIp: get(req, 'headers[x-real-ip]') || '',
133
+ },
134
+ });
135
+ }
136
+ }
137
+
138
+ const { createSessionToken } = initJwt(node, options);
139
+
140
+ const sessionToken = await createSessionToken(currentUser.did, {
141
+ passport,
142
+ role: passport.role,
143
+ });
144
+ return sessionToken;
145
+ }
146
+
147
+ async function invite(req, node, options) {
148
+ const { locale, inviteId, token, baseUrl } = req.body;
149
+ const { did: teamDid, wallet: blockletWallet } = await req.getBlockletInfo();
150
+
151
+ const nodeInfo = await req.getNodeInfo();
152
+ const blocklet = await req.getBlocklet();
153
+ const oauthConfig = blocklet?.settings?.oauth || {};
154
+ const authClient = new AuthenticationClient({
155
+ domain: oauthConfig.auth0.domain,
156
+ });
157
+ const userInfo = await authClient.getProfile(token);
158
+ const userWallet = fromAppDid(userInfo.sub, blockletWallet.secretKey, types.RoleType.ROLE_ACCOUNT);
159
+ let userDid = userWallet.address;
160
+ let userPk = userWallet.publicKey;
161
+
162
+ let profile;
163
+ let userSource = USER_TYPE.DERIVED;
164
+ // 如果当前 oauth 账户绑定了 wallet 账户,则需要以 wallet 为目标账户来颁发通行证
165
+ const bindUser = await getDerivedUser(userDid, { node, teamDid });
166
+ const { dataDir, name: applicationName } = await getApplicationInfo({ node, nodeInfo, teamDid });
167
+ if (bindUser) {
168
+ const avatar = await parseUserAvatar(bindUser.avatar, { did: teamDid, dataDir });
169
+ profile = {
170
+ email: bindUser.email,
171
+ fullName: bindUser.fullName,
172
+ avatar,
173
+ };
174
+ userDid = bindUser.did;
175
+ userPk = bindUser.pk;
176
+ userSource = USER_TYPE.WALLET;
177
+ } else {
178
+ const { email, nickname: fullName } = userInfo;
179
+ let avatar = await getAvatarByEmail(email);
180
+ avatar = await extractUserAvatar(avatar, { dataDir });
181
+ profile = {
182
+ email,
183
+ fullName,
184
+ avatar,
185
+ };
186
+ }
187
+
188
+ const statusEndpointBaseUrl = joinUrl(baseUrl, WELLKNOWN_SERVICE_PATH_PREFIX);
189
+ const endpoint = baseUrl;
190
+
191
+ const { passport, response, role } = await handleInvitationReceive({
192
+ node,
193
+ req,
194
+ endpoint,
195
+ inviteId,
196
+ nodeInfo,
197
+ profile,
198
+ statusEndpointBaseUrl,
199
+ teamDid,
200
+ userDid,
201
+ userPk,
202
+ userSource,
203
+ locale,
204
+ });
205
+ if (bindUser) {
206
+ // 如果已经绑定了 wallet 账户,则将 passport 发送给 wallet 账户
207
+ await sendToUser(
208
+ bindUser.did,
209
+ {
210
+ title: 'Invitation accepted',
211
+ body: `You accept an invitation to be a ${role} of ${applicationName}`,
212
+ attachments: [
213
+ {
214
+ type: 'vc',
215
+ data: {
216
+ credential: response.data,
217
+ tag: role,
218
+ },
219
+ },
220
+ ],
221
+ },
222
+ { req }
223
+ );
224
+ await node.updateUser({
225
+ teamDid,
226
+ user: {
227
+ did: bindUser.did,
228
+ connectedAccounts: [
229
+ {
230
+ provider: 'auth0',
231
+ id: userInfo.sub,
232
+ lastLoginAt: new Date().toISOString(),
233
+ },
234
+ ],
235
+ },
236
+ });
237
+ } else {
238
+ await node.updateUser({
239
+ teamDid,
240
+ user: {
241
+ did: userDid,
242
+ connectedAccounts: [
243
+ {
244
+ provider: 'auth0',
245
+ id: userInfo.sub,
246
+ lastLoginAt: new Date().toISOString(),
247
+ },
248
+ ],
249
+ },
250
+ });
251
+ }
252
+ const { createSessionToken } = initJwt(node, options);
253
+
254
+ const sessionToken = await createSessionToken(userDid, { passport, role });
255
+ return sessionToken;
256
+ }
257
+
258
+ module.exports = {
259
+ init(server, node, options) {
260
+ server.get(`${prefix}/configs`, async (req, res) => {
261
+ const blocklet = await req.getBlocklet();
262
+ const oauthConfig = blocklet?.settings?.oauth || {};
263
+ res.send(oauthConfig);
264
+ });
265
+
266
+ server.post(`${prefix}/bind`, async (req, res) => {
267
+ const userDid = req.user.did;
268
+ const { token, locale = 'en', provider } = req.body;
269
+ const blocklet = await req.getBlocklet();
270
+ const oauthConfig = blocklet?.settings?.oauth || {};
271
+ const authClient = new AuthenticationClient({
272
+ domain: oauthConfig.auth0.domain,
273
+ });
274
+ const userInfo = await authClient.getProfile(token);
275
+ const { did: teamDid, wallet: blockletWallet } = await req.getBlockletInfo();
276
+ const userWallet = fromAppDid(userInfo.sub, blockletWallet.secretKey, types.RoleType.ROLE_ACCOUNT);
277
+ let oauthUser = await node.getUser({ teamDid, user: { did: userWallet.address } });
278
+
279
+ const bindUser = await node.getUser({ teamDid, user: { did: userDid } });
280
+
281
+ const mergePassport = (oauthUser?.passports || []).reduce((sum, cur) => {
282
+ return upsertToPassports(sum, cur);
283
+ }, bindUser.passports || []);
284
+
285
+ await node.updateUser({
286
+ teamDid,
287
+ user: {
288
+ did: userDid,
289
+ locale,
290
+ source: USER_TYPE.WALLET,
291
+ derivedAccount: {
292
+ provider,
293
+ did: userWallet.address,
294
+ pk: userWallet.publicKey,
295
+ },
296
+ connectedAccounts: [
297
+ {
298
+ provider,
299
+ id: userInfo.sub,
300
+ lastLoginAt: new Date().toISOString(),
301
+ },
302
+ ],
303
+ passports: mergePassport,
304
+ },
305
+ });
306
+ if (oauthUser) {
307
+ // FIXME: @zhanghan 将来是否需要移除 derived account
308
+ // 删除 oauth 账户
309
+ // await node.removeUser({
310
+ // teamDid,
311
+ // user: {
312
+ // did: userWallet.address,
313
+ // },
314
+ // });
315
+ } else {
316
+ oauthUser = {
317
+ did: userWallet.address,
318
+ };
319
+ }
320
+ const nodeInfo = await req.getNodeInfo();
321
+ await transferPassport(oauthUser, bindUser, { req, node, teamDid, nodeInfo });
322
+ // TODO: @zhanghan 需要增加 auditLog
323
+ res.status(200).send('');
324
+ });
325
+
326
+ /**
327
+ * oauth 方式登录
328
+ * 1. 普通配置下,登录/注册是同样的流程,登录过程中会自动注册账号
329
+ * 2. 仅邀请可登录模式下,只允许登录,不允许注册
330
+ */
331
+ server.post(`${prefix}/login`, async (req, res) => {
332
+ const { action = 'login' } = req.body;
333
+ const actionMap = {
334
+ login,
335
+ invite,
336
+ };
337
+ try {
338
+ const result = await actionMap[action](req, node, options);
339
+ // TODO: @zhanghan 需要增加 auditLog
340
+ res.send(result);
341
+ } catch (err) {
342
+ res.status(400).send(err.message);
343
+ }
344
+ });
345
+ },
346
+ };
@@ -0,0 +1,56 @@
1
+ const logger = require('@abtnode/logger')(require('../../../../package.json').name);
2
+
3
+ const { bindWallet } = require('../../../libs/connect/session');
4
+
5
+ const { onConnect, onApprove } = bindWallet;
6
+
7
+ module.exports = function createRoutes(node, authenticator, createSessionToken) {
8
+ return {
9
+ action: 'bind-wallet',
10
+ onConnect: async ({ req, userDid, extraParams: { locale, passportId = '', componentId, previousUserDid } }) => {
11
+ return onConnect({
12
+ node,
13
+ request: req,
14
+ userDid,
15
+ locale,
16
+ passportId,
17
+ componentId,
18
+ previousUserDid,
19
+ });
20
+ },
21
+
22
+ onAuth: async ({
23
+ claims,
24
+ challenge,
25
+ userDid,
26
+ userPk,
27
+ updateSession,
28
+ extraParams: { locale, componentId, previousUserDid },
29
+ req,
30
+ baseUrl,
31
+ }) => {
32
+ try {
33
+ const result = await onApprove({
34
+ node,
35
+ request: req,
36
+ locale,
37
+ challenge,
38
+ userDid,
39
+ userPk,
40
+ baseUrl,
41
+ claims,
42
+ createSessionToken,
43
+ componentId,
44
+ previousUserDid,
45
+ });
46
+
47
+ await updateSession({ sessionToken: result.sessionToken }, true);
48
+
49
+ return result;
50
+ } catch (err) {
51
+ logger.error('login.error', { error: err, userDid });
52
+ throw new Error(err.message);
53
+ }
54
+ },
55
+ };
56
+ };
@@ -23,6 +23,7 @@ const initJwt = require('../../libs/jwt');
23
23
  const initAuth = require('../../libs/connect/v1');
24
24
 
25
25
  const createLoginRoutes = require('./connect/login');
26
+ const createBindWallerRoutes = require('./connect/bind-wallet');
26
27
  const createInviteRoutes = require('./connect/invite');
27
28
  const createIssuePassportAuth = require('./connect/issue-passport');
28
29
  const createLostPassportListAuth = require('./connect/lost-passport-list');
@@ -165,6 +166,7 @@ const init = ({ node, options }) => {
165
166
  routes.attachDidAuthHandlers = (app) => {
166
167
  handlers.forEach((handler) => {
167
168
  handler.attach(Object.assign({ app }, createLoginRoutes(node, authenticator, createSessionToken)));
169
+ handler.attach(Object.assign({ app }, createBindWallerRoutes(node, authenticator, createSessionToken)));
168
170
  handler.attach(Object.assign({ app }, createInviteRoutes(node, authenticator, createSessionToken)));
169
171
  handler.attach(Object.assign({ app }, createIssuePassportAuth(node, authenticator, createSessionToken)));
170
172
  handler.attach(Object.assign({ app }, createLostPassportListAuth(node, authenticator, createSessionToken)));
package/api/util/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  const joinUrl = require('url-join');
2
2
  const get = require('lodash/get');
3
- const { ROLES } = require('@abtnode/constant');
3
+ const { ROLES, WHO_CAN_ACCESS } = require('@abtnode/constant');
4
4
  const { BlockletSource, BLOCKLET_MODES, BlockletGroup } = require('@blocklet/constant');
5
5
  const { findWebInterface } = require('@blocklet/meta/lib/util');
6
6
  const { WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/constant');
@@ -173,10 +173,32 @@ const getRedirectUrl = ({ req, pagePath }) => {
173
173
  return `${url.pathname}${url.search}`;
174
174
  };
175
175
 
176
+ /**
177
+ * @returns {Array} config
178
+ * @returns {Boolean} config[0] is invited user only
179
+ * @returns {String} config[1] default role
180
+ * @returns {Boolean} config[2] issue passport
181
+ */
182
+ const isInvitedUserOnly = async (config, node, teamDid) => {
183
+ const count = await node.getUsersCount({ teamDid });
184
+
185
+ // issue owner passport for first login user
186
+ if (count === 0) {
187
+ return [false, ROLES.OWNER, true];
188
+ }
189
+
190
+ if (config.whoCanAccess && config.whoCanAccess !== WHO_CAN_ACCESS.ALL) {
191
+ return [true];
192
+ }
193
+
194
+ return [false, ROLES.GUEST];
195
+ };
196
+
176
197
  module.exports = {
177
198
  getBlockletLogo,
178
199
  shouldGotoStartPage,
179
200
  ensureProxyUrl,
180
201
  getRedirectUrl,
181
202
  findRootWebPort,
203
+ isInvitedUserOnly,
182
204
  };
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "files": {
3
3
  "main.css": "/.blocklet/proxy/blocklet-service/static/css/main.632501d5.css",
4
- "main.js": "/.blocklet/proxy/blocklet-service/static/js/main.26769a99.js",
5
- "static/js/560.4d01281e.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/560.4d01281e.chunk.js",
4
+ "main.js": "/.blocklet/proxy/blocklet-service/static/js/main.918ec6ce.js",
5
+ "static/js/716.e1534c42.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/716.e1534c42.chunk.js",
6
6
  "static/js/255.279b1bca.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/255.279b1bca.chunk.js",
7
7
  "static/js/371.575d3b08.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/371.575d3b08.chunk.js",
8
8
  "static/js/737.14f154ca.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/737.14f154ca.chunk.js",
9
9
  "static/js/460.3026a774.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/460.3026a774.chunk.js",
10
- "static/js/868.43103624.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/868.43103624.chunk.js",
11
- "static/js/343.b10f00a4.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/343.b10f00a4.chunk.js",
10
+ "static/js/868.f2fac071.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/868.f2fac071.chunk.js",
11
+ "static/js/343.d41f9df4.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/343.d41f9df4.chunk.js",
12
12
  "static/js/682.c64ae291.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/682.c64ae291.chunk.js",
13
13
  "static/js/711.6c22b7c7.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/711.6c22b7c7.chunk.js",
14
14
  "static/js/437.d815f0c0.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/437.d815f0c0.chunk.js",
@@ -16,10 +16,10 @@
16
16
  "static/js/663.11e67b21.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/663.11e67b21.chunk.js",
17
17
  "static/js/712.f88b2e9d.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/712.f88b2e9d.chunk.js",
18
18
  "static/js/557.5f206c85.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/557.5f206c85.chunk.js",
19
- "static/css/25.4c069dc5.chunk.css": "/.blocklet/proxy/blocklet-service/static/css/25.4c069dc5.chunk.css",
20
- "static/js/25.e23e1873.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/25.e23e1873.chunk.js",
19
+ "static/css/943.60476cc0.chunk.css": "/.blocklet/proxy/blocklet-service/static/css/943.60476cc0.chunk.css",
20
+ "static/js/943.eee42740.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/943.eee42740.chunk.js",
21
21
  "static/js/199.53a84333.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/199.53a84333.chunk.js",
22
- "static/js/573.6d8891e3.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/573.6d8891e3.chunk.js",
22
+ "static/js/573.2687bb44.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/573.2687bb44.chunk.js",
23
23
  "static/media/ubuntu-mono-all-400-normal.woff": "/.blocklet/proxy/blocklet-service/static/media/ubuntu-mono-all-400-normal.c879328bc62e9c68268f.woff",
24
24
  "static/media/lato-all-400-normal.woff": "/.blocklet/proxy/blocklet-service/static/media/lato-all-400-normal.3dc1eff492ab1f598560.woff",
25
25
  "static/media/iconify.cjs": "/.blocklet/proxy/blocklet-service/static/media/iconify.32b54549e843e448ee9b.cjs",
@@ -42,14 +42,14 @@
42
42
  "router-template-styles/styles.css": "/.blocklet/proxy/blocklet-service/router-template-styles/styles.css",
43
43
  "index.html": "/.blocklet/proxy/blocklet-service/index.html",
44
44
  "main.632501d5.css.map": "/.blocklet/proxy/blocklet-service/static/css/main.632501d5.css.map",
45
- "main.26769a99.js.map": "/.blocklet/proxy/blocklet-service/static/js/main.26769a99.js.map",
46
- "560.4d01281e.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/560.4d01281e.chunk.js.map",
45
+ "main.918ec6ce.js.map": "/.blocklet/proxy/blocklet-service/static/js/main.918ec6ce.js.map",
46
+ "716.e1534c42.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/716.e1534c42.chunk.js.map",
47
47
  "255.279b1bca.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/255.279b1bca.chunk.js.map",
48
48
  "371.575d3b08.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/371.575d3b08.chunk.js.map",
49
49
  "737.14f154ca.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/737.14f154ca.chunk.js.map",
50
50
  "460.3026a774.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/460.3026a774.chunk.js.map",
51
- "868.43103624.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/868.43103624.chunk.js.map",
52
- "343.b10f00a4.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/343.b10f00a4.chunk.js.map",
51
+ "868.f2fac071.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/868.f2fac071.chunk.js.map",
52
+ "343.d41f9df4.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/343.d41f9df4.chunk.js.map",
53
53
  "682.c64ae291.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/682.c64ae291.chunk.js.map",
54
54
  "711.6c22b7c7.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/711.6c22b7c7.chunk.js.map",
55
55
  "437.d815f0c0.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/437.d815f0c0.chunk.js.map",
@@ -57,13 +57,13 @@
57
57
  "663.11e67b21.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/663.11e67b21.chunk.js.map",
58
58
  "712.f88b2e9d.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/712.f88b2e9d.chunk.js.map",
59
59
  "557.5f206c85.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/557.5f206c85.chunk.js.map",
60
- "25.4c069dc5.chunk.css.map": "/.blocklet/proxy/blocklet-service/static/css/25.4c069dc5.chunk.css.map",
61
- "25.e23e1873.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/25.e23e1873.chunk.js.map",
60
+ "943.60476cc0.chunk.css.map": "/.blocklet/proxy/blocklet-service/static/css/943.60476cc0.chunk.css.map",
61
+ "943.eee42740.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/943.eee42740.chunk.js.map",
62
62
  "199.53a84333.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/199.53a84333.chunk.js.map",
63
- "573.6d8891e3.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/573.6d8891e3.chunk.js.map"
63
+ "573.2687bb44.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/573.2687bb44.chunk.js.map"
64
64
  },
65
65
  "entrypoints": [
66
66
  "static/css/main.632501d5.css",
67
- "static/js/main.26769a99.js"
67
+ "static/js/main.918ec6ce.js"
68
68
  ]
69
69
  }
package/build/index.html CHANGED
@@ -1 +1 @@
1
- <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0"/><meta name="theme-color" content="#000000"/><title>Blocklet Service</title><script src=".well-known/service/api/env"></script><script src="/__blocklet__.js"></script><script defer="defer" src="/.blocklet/proxy/blocklet-service/static/js/main.26769a99.js"></script><link href="/.blocklet/proxy/blocklet-service/static/css/main.632501d5.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0"/><meta name="theme-color" content="#000000"/><title>Blocklet Service</title><script src=".well-known/service/api/env"></script><script src="/__blocklet__.js"></script><script defer="defer" src="/.blocklet/proxy/blocklet-service/static/js/main.918ec6ce.js"></script><link href="/.blocklet/proxy/blocklet-service/static/css/main.632501d5.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
@@ -1,4 +1,4 @@
1
1
  .xterm{font-feature-settings:"liga" 0;position:relative;-moz-user-select:none;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{height:0;left:-9999em;opacity:0;overflow:hidden;position:absolute;resize:none;top:0;white-space:nowrap;width:0;z-index:-5}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;bottom:0;cursor:default;left:0;overflow-y:scroll;position:absolute;right:0;top:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{left:0;position:absolute;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;left:-9999em;line-height:normal;position:absolute;top:0;visibility:hidden}.xterm{cursor:text}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility,.xterm .xterm-message{bottom:0;color:transparent;left:0;position:absolute;right:0;top:0;z-index:10}.xterm .live-region{height:1px;left:-9999px;overflow:hidden;position:absolute;width:1px}.xterm-dim{opacity:.5}.xterm-underline{text-decoration:underline}@media (prefers-color-scheme:dark){.wmde-markdown,.wmde-markdown-var{--color-prettylights-syntax-comment:#8b949e;--color-prettylights-syntax-constant:#79c0ff;--color-prettylights-syntax-entity:#d2a8ff;--color-prettylights-syntax-storage-modifier-import:#c9d1d9;--color-prettylights-syntax-entity-tag:#7ee787;--color-prettylights-syntax-keyword:#ff7b72;--color-prettylights-syntax-string:#a5d6ff;--color-prettylights-syntax-variable:#ffa657;--color-prettylights-syntax-brackethighlighter-unmatched:#f85149;--color-prettylights-syntax-invalid-illegal-text:#f0f6fc;--color-prettylights-syntax-invalid-illegal-bg:#8e1519;--color-prettylights-syntax-carriage-return-text:#f0f6fc;--color-prettylights-syntax-carriage-return-bg:#b62324;--color-prettylights-syntax-string-regexp:#7ee787;--color-prettylights-syntax-markup-list:#f2cc60;--color-prettylights-syntax-markup-heading:#1f6feb;--color-prettylights-syntax-markup-italic:#c9d1d9;--color-prettylights-syntax-markup-bold:#c9d1d9;--color-prettylights-syntax-markup-deleted-text:#ffdcd7;--color-prettylights-syntax-markup-deleted-bg:#67060c;--color-prettylights-syntax-markup-inserted-text:#aff5b4;--color-prettylights-syntax-markup-inserted-bg:#033a16;--color-prettylights-syntax-markup-changed-text:#ffdfb6;--color-prettylights-syntax-markup-changed-bg:#5a1e02;--color-prettylights-syntax-markup-ignored-text:#c9d1d9;--color-prettylights-syntax-markup-ignored-bg:#1158c7;--color-prettylights-syntax-meta-diff-range:#d2a8ff;--color-prettylights-syntax-brackethighlighter-angle:#8b949e;--color-prettylights-syntax-sublimelinter-gutter-mark:#484f58;--color-prettylights-syntax-constant-other-reference-link:#a5d6ff;--color-fg-default:#c9d1d9;--color-fg-muted:#8b949e;--color-fg-subtle:#484f58;--color-canvas-default:#0d1117;--color-canvas-subtle:#161b22;--color-border-default:#30363d;--color-border-muted:#21262d;--color-neutral-muted:hsla(215,8%,47%,.4);--color-accent-fg:#58a6ff;--color-accent-emphasis:#1f6feb;--color-attention-subtle:rgba(187,128,9,.15);--color-danger-fg:#f85149;color-scheme:dark}}@media (prefers-color-scheme:light){.wmde-markdown,.wmde-markdown-var{--color-prettylights-syntax-comment:#6e7781;--color-prettylights-syntax-constant:#0550ae;--color-prettylights-syntax-entity:#8250df;--color-prettylights-syntax-storage-modifier-import:#24292f;--color-prettylights-syntax-entity-tag:#116329;--color-prettylights-syntax-keyword:#cf222e;--color-prettylights-syntax-string:#0a3069;--color-prettylights-syntax-variable:#953800;--color-prettylights-syntax-brackethighlighter-unmatched:#82071e;--color-prettylights-syntax-invalid-illegal-text:#f6f8fa;--color-prettylights-syntax-invalid-illegal-bg:#82071e;--color-prettylights-syntax-carriage-return-text:#f6f8fa;--color-prettylights-syntax-carriage-return-bg:#cf222e;--color-prettylights-syntax-string-regexp:#116329;--color-prettylights-syntax-markup-list:#3b2300;--color-prettylights-syntax-markup-heading:#0550ae;--color-prettylights-syntax-markup-italic:#24292f;--color-prettylights-syntax-markup-bold:#24292f;--color-prettylights-syntax-markup-deleted-text:#82071e;--color-prettylights-syntax-markup-deleted-bg:#ffebe9;--color-prettylights-syntax-markup-inserted-text:#116329;--color-prettylights-syntax-markup-inserted-bg:#dafbe1;--color-prettylights-syntax-markup-changed-text:#953800;--color-prettylights-syntax-markup-changed-bg:#ffd8b5;--color-prettylights-syntax-markup-ignored-text:#eaeef2;--color-prettylights-syntax-markup-ignored-bg:#0550ae;--color-prettylights-syntax-meta-diff-range:#8250df;--color-prettylights-syntax-brackethighlighter-angle:#57606a;--color-prettylights-syntax-sublimelinter-gutter-mark:#8c959f;--color-prettylights-syntax-constant-other-reference-link:#0a3069;--color-fg-default:#24292f;--color-fg-muted:#57606a;--color-fg-subtle:#6e7781;--color-canvas-default:#fff;--color-canvas-subtle:#f6f8fa;--color-border-default:#d0d7de;--color-border-muted:#d8dee4;--color-neutral-muted:rgba(175,184,193,.2);--color-accent-fg:#0969da;--color-accent-emphasis:#0969da;--color-attention-subtle:#fff8c5;--color-danger-fg:#cf222e;color-scheme:light}}[data-color-mode*=dark] .wmde-markdown,[data-color-mode*=dark] .wmde-markdown-var,body[data-color-mode*=dark]{--color-prettylights-syntax-comment:#8b949e;--color-prettylights-syntax-constant:#79c0ff;--color-prettylights-syntax-entity:#d2a8ff;--color-prettylights-syntax-storage-modifier-import:#c9d1d9;--color-prettylights-syntax-entity-tag:#7ee787;--color-prettylights-syntax-keyword:#ff7b72;--color-prettylights-syntax-string:#a5d6ff;--color-prettylights-syntax-variable:#ffa657;--color-prettylights-syntax-brackethighlighter-unmatched:#f85149;--color-prettylights-syntax-invalid-illegal-text:#f0f6fc;--color-prettylights-syntax-invalid-illegal-bg:#8e1519;--color-prettylights-syntax-carriage-return-text:#f0f6fc;--color-prettylights-syntax-carriage-return-bg:#b62324;--color-prettylights-syntax-string-regexp:#7ee787;--color-prettylights-syntax-markup-list:#f2cc60;--color-prettylights-syntax-markup-heading:#1f6feb;--color-prettylights-syntax-markup-italic:#c9d1d9;--color-prettylights-syntax-markup-bold:#c9d1d9;--color-prettylights-syntax-markup-deleted-text:#ffdcd7;--color-prettylights-syntax-markup-deleted-bg:#67060c;--color-prettylights-syntax-markup-inserted-text:#aff5b4;--color-prettylights-syntax-markup-inserted-bg:#033a16;--color-prettylights-syntax-markup-changed-text:#ffdfb6;--color-prettylights-syntax-markup-changed-bg:#5a1e02;--color-prettylights-syntax-markup-ignored-text:#c9d1d9;--color-prettylights-syntax-markup-ignored-bg:#1158c7;--color-prettylights-syntax-meta-diff-range:#d2a8ff;--color-prettylights-syntax-brackethighlighter-angle:#8b949e;--color-prettylights-syntax-sublimelinter-gutter-mark:#484f58;--color-prettylights-syntax-constant-other-reference-link:#a5d6ff;--color-fg-default:#c9d1d9;--color-fg-muted:#8b949e;--color-fg-subtle:#484f58;--color-canvas-default:#0d1117;--color-canvas-subtle:#161b22;--color-border-default:#30363d;--color-border-muted:#21262d;--color-neutral-muted:hsla(215,8%,47%,.4);--color-accent-fg:#58a6ff;--color-accent-emphasis:#1f6feb;--color-attention-subtle:rgba(187,128,9,.15);--color-danger-fg:#f85149;color-scheme:dark}[data-color-mode*=light] .wmde-markdown,[data-color-mode*=light] .wmde-markdown-var,body[data-color-mode*=light]{--color-prettylights-syntax-comment:#6e7781;--color-prettylights-syntax-constant:#0550ae;--color-prettylights-syntax-entity:#8250df;--color-prettylights-syntax-storage-modifier-import:#24292f;--color-prettylights-syntax-entity-tag:#116329;--color-prettylights-syntax-keyword:#cf222e;--color-prettylights-syntax-string:#0a3069;--color-prettylights-syntax-variable:#953800;--color-prettylights-syntax-brackethighlighter-unmatched:#82071e;--color-prettylights-syntax-invalid-illegal-text:#f6f8fa;--color-prettylights-syntax-invalid-illegal-bg:#82071e;--color-prettylights-syntax-carriage-return-text:#f6f8fa;--color-prettylights-syntax-carriage-return-bg:#cf222e;--color-prettylights-syntax-string-regexp:#116329;--color-prettylights-syntax-markup-list:#3b2300;--color-prettylights-syntax-markup-heading:#0550ae;--color-prettylights-syntax-markup-italic:#24292f;--color-prettylights-syntax-markup-bold:#24292f;--color-prettylights-syntax-markup-deleted-text:#82071e;--color-prettylights-syntax-markup-deleted-bg:#ffebe9;--color-prettylights-syntax-markup-inserted-text:#116329;--color-prettylights-syntax-markup-inserted-bg:#dafbe1;--color-prettylights-syntax-markup-changed-text:#953800;--color-prettylights-syntax-markup-changed-bg:#ffd8b5;--color-prettylights-syntax-markup-ignored-text:#eaeef2;--color-prettylights-syntax-markup-ignored-bg:#0550ae;--color-prettylights-syntax-meta-diff-range:#8250df;--color-prettylights-syntax-brackethighlighter-angle:#57606a;--color-prettylights-syntax-sublimelinter-gutter-mark:#8c959f;--color-prettylights-syntax-constant-other-reference-link:#0a3069;--color-fg-default:#24292f;--color-fg-muted:#57606a;--color-fg-subtle:#6e7781;--color-canvas-default:#fff;--color-canvas-subtle:#f6f8fa;--color-border-default:#d0d7de;--color-border-muted:#d8dee4;--color-neutral-muted:rgba(175,184,193,.2);--color-accent-fg:#0969da;--color-accent-emphasis:#0969da;--color-attention-subtle:#fff8c5;--color-danger-fg:#cf222e;color-scheme:light}.wmde-markdown{-webkit-text-size-adjust:100%;word-wrap:break-word;background-color:var(--color-canvas-default);color:var(--color-fg-default);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;font-size:16px;line-height:1.5}.wmde-markdown details,.wmde-markdown figcaption,.wmde-markdown figure{display:block}.wmde-markdown summary{display:list-item}.wmde-markdown [hidden]{display:none!important}.wmde-markdown a{background-color:transparent;color:var(--color-accent-fg);text-decoration:none}.wmde-markdown a:active,.wmde-markdown a:hover{outline-width:0}.wmde-markdown abbr[title]{border-bottom:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.wmde-markdown b,.wmde-markdown strong{font-weight:600}.wmde-markdown dfn{font-style:italic}.wmde-markdown h1{border-bottom:1px solid var(--color-border-muted);font-size:2em;font-weight:600;margin:.67em 0;padding-bottom:.3em}.wmde-markdown mark{background-color:var(--color-attention-subtle);color:var(--color-text-primary)}.wmde-markdown small{font-size:90%}.wmde-markdown sub,.wmde-markdown sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.wmde-markdown sub{bottom:-.25em}.wmde-markdown sup{top:-.5em}.wmde-markdown img{background-color:var(--color-canvas-default);border-style:none;box-sizing:content-box;max-width:100%}.wmde-markdown code,.wmde-markdown kbd,.wmde-markdown pre,.wmde-markdown samp{font-family:monospace,monospace;font-size:1em}.wmde-markdown figure{margin:1em 40px}.wmde-markdown hr{background:transparent;background-color:var(--color-border-default);border:0;box-sizing:content-box;height:.25em;margin:24px 0;overflow:hidden;padding:0}.wmde-markdown input{font:inherit;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible}.wmde-markdown [type=button],.wmde-markdown [type=reset],.wmde-markdown [type=submit]{-webkit-appearance:button}.wmde-markdown [type=button]::-moz-focus-inner,.wmde-markdown [type=reset]::-moz-focus-inner,.wmde-markdown [type=submit]::-moz-focus-inner{border-style:none;padding:0}.wmde-markdown [type=button]:-moz-focusring,.wmde-markdown [type=reset]:-moz-focusring,.wmde-markdown [type=submit]:-moz-focusring{outline:1px dotted ButtonText}.wmde-markdown [type=checkbox],.wmde-markdown [type=radio]{box-sizing:border-box;padding:0}.wmde-markdown [type=number]::-webkit-inner-spin-button,.wmde-markdown [type=number]::-webkit-outer-spin-button{height:auto}.wmde-markdown [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.wmde-markdown [type=search]::-webkit-search-cancel-button,.wmde-markdown [type=search]::-webkit-search-decoration{-webkit-appearance:none}.wmde-markdown ::-webkit-input-placeholder{color:inherit;opacity:.54}.wmde-markdown ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.wmde-markdown a:hover{text-decoration:underline}.wmde-markdown hr:after,.wmde-markdown hr:before{content:"";display:table}.wmde-markdown hr:after{clear:both}.wmde-markdown table{border-collapse:collapse;border-spacing:0;display:block;max-width:100%;overflow:auto;width:-webkit-max-content;width:max-content}.wmde-markdown td,.wmde-markdown th{padding:0}.wmde-markdown details summary{cursor:pointer}.wmde-markdown details:not([open])>:not(summary){display:none!important}.wmde-markdown kbd{background-color:var(--color-canvas-subtle);border-bottom-color:var(--color-neutral-muted);border:1px solid var(--color-neutral-muted);border-radius:6px;box-shadow:inset 0 -1px 0 var(--color-neutral-muted);color:var(--color-fg-default);display:inline-block;font:11px ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;line-height:10px;padding:3px 5px;vertical-align:middle}.wmde-markdown h1,.wmde-markdown h2,.wmde-markdown h3,.wmde-markdown h4,.wmde-markdown h5,.wmde-markdown h6{font-weight:600;line-height:1.25;margin-bottom:16px;margin-top:24px}.wmde-markdown h2{border-bottom:1px solid var(--color-border-muted);font-size:1.5em;font-weight:600;padding-bottom:.3em}.wmde-markdown h3{font-size:1.25em;font-weight:600}.wmde-markdown h4{font-size:1em;font-weight:600}.wmde-markdown h5{font-size:.875em;font-weight:600}.wmde-markdown h6{color:var(--color-fg-muted);font-size:.85em;font-weight:600}.wmde-markdown p{margin-bottom:10px;margin-top:0}.wmde-markdown blockquote{border-left:.25em solid var(--color-border-default);color:var(--color-fg-muted);margin:0;padding:0 1em}.wmde-markdown ol,.wmde-markdown ul{margin-bottom:0;margin-top:0;padding-left:2em}.wmde-markdown ol ol,.wmde-markdown ul ol{list-style-type:lower-roman}.wmde-markdown ol ol ol,.wmde-markdown ol ul ol,.wmde-markdown ul ol ol,.wmde-markdown ul ul ol{list-style-type:lower-alpha}.wmde-markdown dd{margin-left:0}.wmde-markdown code,.wmde-markdown pre,.wmde-markdown tt{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px}.wmde-markdown pre{word-wrap:normal;margin-bottom:0;margin-top:0}.wmde-markdown .octicon{fill:currentColor;display:inline-block;overflow:visible!important;vertical-align:text-bottom}.wmde-markdown ::-webkit-input-placeholder{color:var(--color-fg-subtle);opacity:1}.wmde-markdown ::placeholder{color:var(--color-fg-subtle);opacity:1}.wmde-markdown input::-webkit-inner-spin-button,.wmde-markdown input::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none;margin:0}.wmde-markdown [data-catalyst]{display:block}.wmde-markdown:after,.wmde-markdown:before{content:"";display:table}.wmde-markdown:after{clear:both}.wmde-markdown>:first-child{margin-top:0!important}.wmde-markdown>:last-child{margin-bottom:0!important}.wmde-markdown a:not([href]){color:inherit;text-decoration:none}.wmde-markdown .absent{color:var(--color-danger-fg)}.wmde-markdown a.anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.wmde-markdown .anchor:focus{outline:none}.wmde-markdown blockquote,.wmde-markdown details,.wmde-markdown dl,.wmde-markdown ol,.wmde-markdown p,.wmde-markdown pre,.wmde-markdown table,.wmde-markdown ul{margin-bottom:16px;margin-top:0}.wmde-markdown blockquote>:first-child{margin-top:0}.wmde-markdown blockquote>:last-child{margin-bottom:0}.wmde-markdown sup>a:before{content:"["}.wmde-markdown sup>a:after{content:"]"}.wmde-markdown h1 .octicon-link,.wmde-markdown h2 .octicon-link,.wmde-markdown h3 .octicon-link,.wmde-markdown h4 .octicon-link,.wmde-markdown h5 .octicon-link,.wmde-markdown h6 .octicon-link{color:var(--color-fg-default);vertical-align:middle;visibility:hidden}.wmde-markdown h1:hover .anchor,.wmde-markdown h2:hover .anchor,.wmde-markdown h3:hover .anchor,.wmde-markdown h4:hover .anchor,.wmde-markdown h5:hover .anchor,.wmde-markdown h6:hover .anchor{text-decoration:none}.wmde-markdown h1:hover .anchor .octicon-link,.wmde-markdown h2:hover .anchor .octicon-link,.wmde-markdown h3:hover .anchor .octicon-link,.wmde-markdown h4:hover .anchor .octicon-link,.wmde-markdown h5:hover .anchor .octicon-link,.wmde-markdown h6:hover .anchor .octicon-link{visibility:visible}.wmde-markdown h1 code,.wmde-markdown h1 tt,.wmde-markdown h2 code,.wmde-markdown h2 tt,.wmde-markdown h3 code,.wmde-markdown h3 tt,.wmde-markdown h4 code,.wmde-markdown h4 tt,.wmde-markdown h5 code,.wmde-markdown h5 tt,.wmde-markdown h6 code,.wmde-markdown h6 tt{font-size:inherit;padding:0 .2em}.wmde-markdown ol.no-list,.wmde-markdown ul.no-list{list-style-type:none;padding:0}.wmde-markdown ol[type="1"]{list-style-type:decimal}.wmde-markdown ol[type=a]{list-style-type:lower-alpha}.wmde-markdown ol[type=i]{list-style-type:lower-roman}.wmde-markdown div>ol:not([type]){list-style-type:decimal}.wmde-markdown ol ol,.wmde-markdown ol ul,.wmde-markdown ul ol,.wmde-markdown ul ul{margin-bottom:0;margin-top:0}.wmde-markdown li>p{margin-top:16px}.wmde-markdown li+li{margin-top:.25em}.wmde-markdown dl{padding:0}.wmde-markdown dl dt{font-size:1em;font-style:italic;font-weight:600;margin-top:16px;padding:0}.wmde-markdown dl dd{margin-bottom:16px;padding:0 16px}.wmde-markdown table th{font-weight:600}.wmde-markdown table td,.wmde-markdown table th{border:1px solid var(--color-border-default);padding:6px 13px}.wmde-markdown table tr{background-color:var(--color-canvas-default);border-top:1px solid var(--color-border-muted)}.wmde-markdown table tr:nth-child(2n){background-color:var(--color-canvas-subtle)}.wmde-markdown table img{background-color:transparent}.wmde-markdown img[align=right]{padding-left:20px}.wmde-markdown img[align=left]{padding-right:20px}.wmde-markdown .emoji{background-color:transparent;max-width:none;vertical-align:text-top}.wmde-markdown span.frame{display:block;overflow:hidden}.wmde-markdown span.frame>span{border:1px solid var(--color-border-default);display:block;float:left;margin:13px 0 0;overflow:hidden;padding:7px;width:auto}.wmde-markdown span.frame span img{display:block;float:left}.wmde-markdown span.frame span span{clear:both;color:var(--color-fg-default);display:block;padding:5px 0 0}.wmde-markdown span.align-center{clear:both;display:block;overflow:hidden}.wmde-markdown span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.wmde-markdown span.align-center span img{margin:0 auto;text-align:center}.wmde-markdown span.align-right{clear:both;display:block;overflow:hidden}.wmde-markdown span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.wmde-markdown span.align-right span img{margin:0;text-align:right}.wmde-markdown span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.wmde-markdown span.float-left span{margin:13px 0 0}.wmde-markdown span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.wmde-markdown span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.wmde-markdown code,.wmde-markdown tt{background-color:var(--color-neutral-muted);border-radius:6px;font-size:85%;margin:0;padding:.2em .4em}.wmde-markdown code br,.wmde-markdown tt br{display:none}.wmde-markdown del code{text-decoration:inherit}.wmde-markdown pre code{font-size:100%}.wmde-markdown pre>code{background:transparent;border:0;margin:0;padding:0;white-space:pre;word-break:normal}.wmde-markdown pre{background-color:var(--color-canvas-subtle);border-radius:6px;font-size:85%;line-height:1.45}.wmde-markdown pre code,.wmde-markdown pre tt{word-wrap:normal;background-color:transparent;border:0;display:inline;line-height:inherit;margin:0;max-width:auto;overflow:visible;padding:0}.wmde-markdown pre>code{display:block;overflow:auto;padding:16px}.wmde-markdown .csv-data td,.wmde-markdown .csv-data th{font-size:12px;line-height:1;overflow:hidden;padding:5px;text-align:left;white-space:nowrap}.wmde-markdown .csv-data .blob-num{background:var(--color-canvas-default);border:0;padding:10px 8px 9px;text-align:right}.wmde-markdown .csv-data tr{border-top:0}.wmde-markdown .csv-data th{background:var(--color-canvas-subtle);border-top:0;font-weight:600}.wmde-markdown .footnotes{border-top:1px solid var(--color-border-default);color:var(--color-fg-muted);font-size:12px}.wmde-markdown .footnotes ol{padding-left:16px}.wmde-markdown .footnotes li{position:relative}.wmde-markdown .footnotes li:target:before{border:2px solid var(--color-accent-emphasis);border-radius:6px;bottom:-8px;content:"";left:-24px;pointer-events:none;position:absolute;right:-8px;top:-8px}.wmde-markdown .footnotes li:target{color:var(--color-fg-default)}.wmde-markdown .footnotes .data-footnote-backref g-emoji{font-family:monospace}.wmde-markdown .task-list-item{list-style-type:none}.wmde-markdown .task-list-item label{font-weight:400}.wmde-markdown .task-list-item.enabled label{cursor:pointer}.wmde-markdown .task-list-item+.wmde-markdown .task-list-item{margin-top:3px}.wmde-markdown .task-list-item .handle{display:none}.wmde-markdown .task-list-item-checkbox,.wmde-markdown input[type=checkbox]{margin:0 .2em .25em -1.6em;vertical-align:middle}.wmde-markdown .contains-task-list:dir(rtl) .task-list-item-checkbox,.wmde-markdown .contains-task-list:dir(rtl) input[type=checkbox]{margin:0 -1.6em .25em .2em}.wmde-markdown ::-webkit-calendar-picker-indicator{-webkit-filter:invert(50%);filter:invert(50%)}.wmde-markdown pre[class*=language-]{position:relative}.wmde-markdown pre .copied{background:var(--color-border-default);border-radius:5px;color:var(--color-fg-defaul);cursor:pointer;display:flex;font-size:12px;padding:6px;position:absolute;right:6px;top:6px;transition:all .3s;visibility:hidden}.wmde-markdown pre .copied .octicon-copy{display:block}.wmde-markdown pre .copied .octicon-check{display:none}.wmde-markdown pre:hover .copied{visibility:visible}.wmde-markdown pre:hover .copied:hover{background:var(--color-prettylights-syntax-entity-tag);color:var(--color-canvas-default)}.wmde-markdown pre .copied.active,.wmde-markdown pre:hover .copied:active{background:#2e9b33;color:var(--color-canvas-default)}.wmde-markdown pre .active .octicon-copy{display:none}.wmde-markdown pre .active .octicon-check{display:block}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:var(--color-prettylights-syntax-comment)}.token.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.selector,.token.symbol,.token.tag{color:var(--color-prettylights-syntax-entity-tag)}.token.maybe-class-name{color:var(--color-prettylights-syntax-variable)}.token.attr-name,.token.boolean,.token.builtin,.token.char,.token.number,.token.operator,.token.property-access,.token.selector .token.class,.token.string{color:var(--color-prettylights-syntax-constant)}.token.deleted{color:var(--color-prettylights-syntax-markup-deleted-text)}.code-line .token.deleted{background-color:var(--color-prettylights-syntax-markup-deleted-bg)}.token.inserted{color:var(--color-prettylights-syntax-markup-inserted-text)}.code-line .token.inserted{background-color:var(--color-prettylights-syntax-markup-inserted-bg)}.token.variable{color:var(--color-prettylights-syntax-constant)}.language-css .token.string,.style .token.string,.token.atrule,.token.attr-value,.token.class-name,.token.color,.token.entity,.token.function,.token.url{color:var(--color-prettylights-syntax-string)}.token.important,.token.keyword,.token.regex,.token.rule{color:var(--color-prettylights-syntax-keyword)}.token.coord{color:var(--color-prettylights-syntax-meta-diff-range)}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}
2
2
 
3
3
  /*! @algolia/autocomplete-theme-classic 1.7.4 | MIT License | © Algolia, Inc. and contributors | https://github.com/algolia/autocomplete */:root{--aa-search-input-height:44px;--aa-input-icon-size:20px;--aa-base-unit:16;--aa-spacing-factor:1;--aa-spacing:calc(var(--aa-base-unit)*var(--aa-spacing-factor)*1px);--aa-spacing-half:calc(var(--aa-spacing)/2);--aa-panel-max-height:650px;--aa-base-z-index:9999;--aa-font-size:calc(var(--aa-base-unit)*1px);--aa-font-family:inherit;--aa-font-weight-medium:500;--aa-font-weight-semibold:600;--aa-font-weight-bold:700;--aa-icon-size:20px;--aa-icon-stroke-width:1.6;--aa-icon-color-rgb:119,119,163;--aa-icon-color-alpha:1;--aa-action-icon-size:20px;--aa-text-color-rgb:38,38,39;--aa-text-color-alpha:1;--aa-primary-color-rgb:62,52,211;--aa-primary-color-alpha:0.2;--aa-muted-color-rgb:128,126,163;--aa-muted-color-alpha:0.6;--aa-panel-border-color-rgb:128,126,163;--aa-panel-border-color-alpha:0.3;--aa-input-border-color-rgb:128,126,163;--aa-input-border-color-alpha:0.8;--aa-background-color-rgb:255,255,255;--aa-background-color-alpha:1;--aa-input-background-color-rgb:255,255,255;--aa-input-background-color-alpha:1;--aa-selected-color-rgb:179,173,214;--aa-selected-color-alpha:0.205;--aa-description-highlight-background-color-rgb:245,223,77;--aa-description-highlight-background-color-alpha:0.5;--aa-detached-media-query:(max-width:680px);--aa-detached-modal-media-query:(min-width:680px);--aa-detached-modal-max-width:680px;--aa-detached-modal-max-height:500px;--aa-overlay-color-rgb:115,114,129;--aa-overlay-color-alpha:0.4;--aa-panel-shadow:0 0 0 1px rgba(35,38,59,.1),0 6px 16px -4px rgba(35,38,59,.15);--aa-scrollbar-width:13px;--aa-scrollbar-track-background-color-rgb:234,234,234;--aa-scrollbar-track-background-color-alpha:1;--aa-scrollbar-thumb-background-color-rgb:var(--aa-background-color-rgb);--aa-scrollbar-thumb-background-color-alpha:1}@media (hover:none) and (pointer:coarse){:root{--aa-spacing-factor:1.2;--aa-action-icon-size:22px}}body.dark,body[data-theme=dark]{--aa-text-color-rgb:183,192,199;--aa-primary-color-rgb:146,138,255;--aa-muted-color-rgb:146,138,255;--aa-input-background-color-rgb:0,3,9;--aa-background-color-rgb:21,24,42;--aa-selected-color-rgb:146,138,255;--aa-selected-color-alpha:0.25;--aa-description-highlight-background-color-rgb:0 255 255;--aa-description-highlight-background-color-alpha:0.25;--aa-icon-color-rgb:119,119,163;--aa-panel-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--aa-scrollbar-track-background-color-rgb:44,46,64;--aa-scrollbar-thumb-background-color-rgb:var(--aa-background-color-rgb)}.aa-Autocomplete *,.aa-DetachedFormContainer *,.aa-Panel *{box-sizing:border-box}.aa-Autocomplete,.aa-DetachedFormContainer,.aa-Panel{color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha));font-family:inherit;font-family:var(--aa-font-family);font-size:16px;font-size:var(--aa-font-size);font-weight:400;line-height:1em;margin:0;padding:0;text-align:left}.aa-Form{align-items:center;background-color:#fff;background-color:rgba(var(--aa-input-background-color-rgb),var(--aa-input-background-color-alpha));border:1px solid rgba(128,126,163,.8);border:1px solid rgba(var(--aa-input-border-color-rgb),var(--aa-input-border-color-alpha));border-radius:3px;display:flex;line-height:1em;margin:0;position:relative;width:100%}.aa-Form[focus-within]{border-color:#3e34d3;border-color:rgba(var(--aa-primary-color-rgb),1);box-shadow:0 0 0 2px rgba(62,52,211,.2),inset 0 0 0 2px rgba(62,52,211,.2);box-shadow:rgba(var(--aa-primary-color-rgb),var(--aa-primary-color-alpha)) 0 0 0 2px,inset rgba(var(--aa-primary-color-rgb),var(--aa-primary-color-alpha)) 0 0 0 2px;outline:medium none currentColor}.aa-Form:focus-within{border-color:#3e34d3;border-color:rgba(var(--aa-primary-color-rgb),1);box-shadow:0 0 0 2px rgba(62,52,211,.2),inset 0 0 0 2px rgba(62,52,211,.2);box-shadow:rgba(var(--aa-primary-color-rgb),var(--aa-primary-color-alpha)) 0 0 0 2px,inset rgba(var(--aa-primary-color-rgb),var(--aa-primary-color-alpha)) 0 0 0 2px;outline:medium none currentColor}.aa-InputWrapperPrefix{align-items:center;display:flex;flex-shrink:0;height:44px;height:var(--aa-search-input-height);order:1}.aa-Label,.aa-LoadingIndicator{cursor:auto;flex-shrink:0;height:100%;padding:0;text-align:left}.aa-Label svg,.aa-LoadingIndicator svg{stroke-width:1.6;stroke-width:var(--aa-icon-stroke-width);color:#3e34d3;color:rgba(var(--aa-primary-color-rgb),1);height:auto;max-height:20px;max-height:var(--aa-input-icon-size);width:20px;width:var(--aa-input-icon-size)}.aa-LoadingIndicator,.aa-SubmitButton{height:100%;padding-left:11px;padding-left:calc(var(--aa-spacing)*.75 - 1px);padding-right:8px;padding-right:var(--aa-spacing-half);width:47px;width:calc(var(--aa-spacing)*1.75 + var(--aa-icon-size) - 1px)}@media (hover:none) and (pointer:coarse){.aa-LoadingIndicator,.aa-SubmitButton{padding-left:3px;padding-left:calc(var(--aa-spacing-half)/2 - 1px);width:39px;width:calc(var(--aa-icon-size) + var(--aa-spacing)*1.25 - 1px)}}.aa-SubmitButton{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;margin:0}.aa-LoadingIndicator{align-items:center;display:flex;justify-content:center}.aa-LoadingIndicator[hidden]{display:none}.aa-InputWrapper{order:3;position:relative;width:100%}.aa-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha));font:inherit;height:44px;height:var(--aa-search-input-height);padding:0;width:100%}.aa-Input::-moz-placeholder{color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));opacity:1}.aa-Input::placeholder{color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));opacity:1}.aa-Input:focus{border-color:none;box-shadow:none;outline:none}.aa-Input::-webkit-search-cancel-button,.aa-Input::-webkit-search-decoration,.aa-Input::-webkit-search-results-button,.aa-Input::-webkit-search-results-decoration{-webkit-appearance:none;appearance:none}.aa-InputWrapperSuffix{align-items:center;display:flex;height:44px;height:var(--aa-search-input-height);order:4}.aa-ClearButton{align-items:center;background:none;border:0;color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));cursor:pointer;display:flex;height:100%;margin:0;padding:0 12.83333px;padding:0 calc(var(--aa-spacing)*.83333 - .5px)}@media (hover:none) and (pointer:coarse){.aa-ClearButton{padding:0 10.16667px;padding:0 calc(var(--aa-spacing)*.66667 - .5px)}}.aa-ClearButton:focus,.aa-ClearButton:hover{color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha))}.aa-ClearButton[hidden]{display:none}.aa-ClearButton svg{stroke-width:1.6;stroke-width:var(--aa-icon-stroke-width);width:20px;width:var(--aa-icon-size)}.aa-Panel{background-color:#fff;background-color:rgba(var(--aa-background-color-rgb),var(--aa-background-color-alpha));border-radius:4px;border-radius:calc(var(--aa-spacing)/4);box-shadow:0 0 0 1px rgba(35,38,59,.1),0 6px 16px -4px rgba(35,38,59,.15);box-shadow:var(--aa-panel-shadow);margin:8px 0 0;overflow:hidden;position:absolute;transition:opacity .2s ease-in,filter .2s ease-in}@media screen and (prefers-reduced-motion){.aa-Panel{transition:none}}.aa-Panel button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;margin:0;padding:0}.aa-PanelLayout{height:100%;margin:0;max-height:650px;max-height:var(--aa-panel-max-height);overflow-y:auto;padding:0;position:relative;text-align:left}.aa-PanelLayoutColumns--twoGolden{display:grid;grid-template-columns:39.2% auto;overflow:hidden;padding:0}.aa-PanelLayoutColumns--two{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));overflow:hidden;padding:0}.aa-PanelLayoutColumns--three{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));overflow:hidden;padding:0}.aa-Panel--stalled .aa-Source{filter:grayscale(1);opacity:.8}.aa-Panel--scrollable{margin:0;max-height:650px;max-height:var(--aa-panel-max-height);overflow-x:hidden;overflow-y:auto;padding:8px;padding:var(--aa-spacing-half);scrollbar-color:#fff #eaeaea;scrollbar-color:rgba(var(--aa-scrollbar-thumb-background-color-rgb),var(--aa-scrollbar-thumb-background-color-alpha)) rgba(var(--aa-scrollbar-track-background-color-rgb),var(--aa-scrollbar-track-background-color-alpha));scrollbar-width:thin}.aa-Panel--scrollable::-webkit-scrollbar{width:13px;width:var(--aa-scrollbar-width)}.aa-Panel--scrollable::-webkit-scrollbar-track{background-color:#eaeaea;background-color:rgba(var(--aa-scrollbar-track-background-color-rgb),var(--aa-scrollbar-track-background-color-alpha))}.aa-Panel--scrollable::-webkit-scrollbar-thumb{background-color:#fff;background-color:rgba(var(--aa-scrollbar-thumb-background-color-rgb),var(--aa-scrollbar-thumb-background-color-alpha));border-color:#eaeaea;border-color:rgba(var(--aa-scrollbar-track-background-color-rgb),var(--aa-scrollbar-track-background-color-alpha));border-radius:9999px;border-style:solid;border-width:3px 2px 3px 3px}.aa-Source{margin:0;padding:0;position:relative;width:100%}.aa-Source:empty{display:none}.aa-SourceNoResults{font-size:1em;margin:0;padding:16px;padding:var(--aa-spacing)}.aa-List{list-style:none;margin:0}.aa-List,.aa-SourceHeader{padding:0;position:relative}.aa-SourceHeader{margin:8px .5em 8px 0;margin:var(--aa-spacing-half) .5em var(--aa-spacing-half) 0}.aa-SourceHeader:empty{display:none}.aa-SourceHeaderTitle{background:#fff;background:rgba(var(--aa-background-color-rgb),var(--aa-background-color-alpha));color:#3e34d3;color:rgba(var(--aa-primary-color-rgb),1);display:inline-block;font-size:.8em;font-weight:600;font-weight:var(--aa-font-weight-semibold);margin:0;padding:0 8px 0 0;padding:0 var(--aa-spacing-half) 0 0;position:relative;z-index:9999;z-index:var(--aa-base-z-index)}.aa-SourceHeaderLine{border-bottom:1px solid #3e34d3;border-bottom:1px solid rgba(var(--aa-primary-color-rgb),1);display:block;height:2px;left:0;margin:0;opacity:.3;padding:0;position:absolute;right:0;top:8px;top:var(--aa-spacing-half);z-index:9998;z-index:calc(var(--aa-base-z-index) - 1)}.aa-SourceFooterSeeAll{background:linear-gradient(180deg,#fff,rgba(128,126,163,.14));background:linear-gradient(180deg,rgba(var(--aa-background-color-rgb),var(--aa-background-color-alpha)),rgba(128,126,163,.14));border:1px solid rgba(128,126,163,.6);border:1px solid rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));border-radius:5px;box-shadow:inset 0 0 2px #fff,0 2px 2px -1px rgba(76,69,88,.15);color:inherit;font-size:.95em;font-weight:500;font-weight:var(--aa-font-weight-medium);padding:.475em 1em .6em;text-decoration:none}.aa-SourceFooterSeeAll:focus,.aa-SourceFooterSeeAll:hover{border:1px solid #3e34d3;border:1px solid rgba(var(--aa-primary-color-rgb),1);color:#3e34d3;color:rgba(var(--aa-primary-color-rgb),1)}.aa-Item{align-items:center;border-radius:3px;cursor:pointer;display:grid;min-height:40px;min-height:calc(var(--aa-spacing)*2.5);padding:4px;padding:calc(var(--aa-spacing-half)/2)}.aa-Item[aria-selected=true]{background-color:rgba(179,173,214,.205);background-color:rgba(var(--aa-selected-color-rgb),var(--aa-selected-color-alpha))}.aa-Item[aria-selected=true] .aa-ActiveOnly,.aa-Item[aria-selected=true] .aa-ItemActionButton{visibility:visible}.aa-ItemIcon{stroke-width:1.6;stroke-width:var(--aa-icon-stroke-width);align-items:center;background:#fff;background:rgba(var(--aa-background-color-rgb),var(--aa-background-color-alpha));border-radius:3px;box-shadow:inset 0 0 0 1px rgba(128,126,163,.3);box-shadow:inset 0 0 0 1px rgba(var(--aa-panel-border-color-rgb),var(--aa-panel-border-color-alpha));color:#7777a3;color:rgba(var(--aa-icon-color-rgb),var(--aa-icon-color-alpha));display:flex;flex-shrink:0;font-size:.7em;height:28px;height:calc(var(--aa-icon-size) + var(--aa-spacing-half));justify-content:center;overflow:hidden;text-align:center;width:28px;width:calc(var(--aa-icon-size) + var(--aa-spacing-half))}.aa-ItemIcon img{height:auto;max-height:20px;max-height:calc(var(--aa-icon-size) + var(--aa-spacing-half) - 8px);max-width:20px;max-width:calc(var(--aa-icon-size) + var(--aa-spacing-half) - 8px);width:auto}.aa-ItemIcon svg{height:20px;height:var(--aa-icon-size);width:20px;width:var(--aa-icon-size)}.aa-ItemIcon--alignTop{align-self:flex-start}.aa-ItemIcon--noBorder{background:none;box-shadow:none}.aa-ItemIcon--picture{height:96px;width:96px}.aa-ItemIcon--picture img{max-height:100%;max-width:100%;padding:8px;padding:var(--aa-spacing-half)}.aa-ItemContent{grid-gap:8px;grid-gap:var(--aa-spacing-half);align-items:center;cursor:pointer;display:grid;gap:8px;gap:var(--aa-spacing-half);grid-auto-flow:column;line-height:1.25em;overflow:hidden}.aa-ItemContent:empty{display:none}.aa-ItemContent mark{background:none;color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha));font-style:normal;font-weight:700;font-weight:var(--aa-font-weight-bold)}.aa-ItemContent--dual{display:flex;flex-direction:column;justify-content:space-between;text-align:left}.aa-ItemContent--dual .aa-ItemContentSubtitle,.aa-ItemContent--dual .aa-ItemContentTitle{display:block}.aa-ItemContent--indented{padding-left:36px;padding-left:calc(var(--aa-icon-size) + var(--aa-spacing))}.aa-ItemContentBody{grid-gap:4px;grid-gap:calc(var(--aa-spacing-half)/2);display:grid;gap:4px;gap:calc(var(--aa-spacing-half)/2)}.aa-ItemContentTitle{display:inline-block;margin:0 .5em 0 0;max-width:100%;overflow:hidden;padding:0;text-overflow:ellipsis;white-space:nowrap}.aa-ItemContentSubtitle{font-size:.92em}.aa-ItemContentSubtitleIcon:before{border-color:rgba(128,126,163,.64);border-color:rgba(var(--aa-muted-color-rgb),.64);border-style:solid;content:"";display:inline-block;left:1px;position:relative;top:-3px}.aa-ItemContentSubtitle--inline .aa-ItemContentSubtitleIcon:before{border-width:0 0 1.5px;margin-left:8px;margin-left:var(--aa-spacing-half);margin-right:4px;margin-right:calc(var(--aa-spacing-half)/2);width:10px;width:calc(var(--aa-spacing-half) + 2px)}.aa-ItemContentSubtitle--standalone{grid-gap:8px;grid-gap:var(--aa-spacing-half);align-items:center;color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha));display:grid;gap:8px;gap:var(--aa-spacing-half);grid-auto-flow:column;justify-content:start}.aa-ItemContentSubtitle--standalone .aa-ItemContentSubtitleIcon:before{border-radius:0 0 0 3px;border-width:0 0 1.5px 1.5px;height:8px;height:var(--aa-spacing-half);width:8px;width:var(--aa-spacing-half)}.aa-ItemContentSubtitleCategory{color:#807ea3;color:rgba(var(--aa-muted-color-rgb),1);font-weight:500}.aa-ItemContentDescription{color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha));font-size:.85em;max-width:100%;overflow-x:hidden;text-overflow:ellipsis}.aa-ItemContentDescription:empty{display:none}.aa-ItemContentDescription mark{background:rgba(245,223,77,.5);background:rgba(var(--aa-description-highlight-background-color-rgb),var(--aa-description-highlight-background-color-alpha));color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha));font-style:normal;font-weight:500;font-weight:var(--aa-font-weight-medium)}.aa-ItemContentDash{color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));display:none;opacity:.4}.aa-ItemContentTag{background-color:rgba(62,52,211,.2);background-color:rgba(var(--aa-primary-color-rgb),var(--aa-primary-color-alpha));border-radius:3px;margin:0 .4em 0 0;padding:.08em .3em}.aa-ItemLink,.aa-ItemWrapper{grid-gap:4px;grid-gap:calc(var(--aa-spacing-half)/2);align-items:center;color:inherit;display:grid;gap:4px;gap:calc(var(--aa-spacing-half)/2);grid-auto-flow:column;justify-content:space-between;width:100%}.aa-ItemLink{color:inherit;text-decoration:none}.aa-ItemActions{display:grid;grid-auto-flow:column;height:100%;justify-self:end;margin:0 -5.33333px;margin:0 calc(var(--aa-spacing)/-3);padding:0 2px 0 0}.aa-ItemActionButton{align-items:center;background:none;border:0;color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));cursor:pointer;display:flex;flex-shrink:0;padding:0}.aa-ItemActionButton:focus svg,.aa-ItemActionButton:hover svg{color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha))}@media (hover:none) and (pointer:coarse){.aa-ItemActionButton:focus svg,.aa-ItemActionButton:hover svg{color:inherit}}.aa-ItemActionButton svg{stroke-width:1.6;stroke-width:var(--aa-icon-stroke-width);color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));margin:5.33333px;margin:calc(var(--aa-spacing)/3);width:20px;width:var(--aa-action-icon-size)}.aa-ActiveOnly{visibility:hidden}.aa-PanelHeader{align-items:center;background:#3e34d3;background:rgba(var(--aa-primary-color-rgb),1);color:#fff;display:grid;height:var(--aa-modal-header-height);margin:0;padding:8px 16px;padding:var(--aa-spacing-half) var(--aa-spacing);position:relative}.aa-PanelHeader:after{background-image:linear-gradient(#fff,hsla(0,0%,100%,0));background-image:linear-gradient(rgba(var(--aa-background-color-rgb),1),rgba(var(--aa-background-color-rgb),0));bottom:-8px;bottom:calc(var(--aa-spacing-half)*-1);content:"";height:8px;height:var(--aa-spacing-half);left:0;pointer-events:none;position:absolute;right:0}.aa-PanelFooter,.aa-PanelHeader:after{z-index:9999;z-index:var(--aa-base-z-index)}.aa-PanelFooter{background-color:#fff;background-color:rgba(var(--aa-background-color-rgb),var(--aa-background-color-alpha));box-shadow:inset 0 1px 0 rgba(128,126,163,.3);box-shadow:inset 0 1px 0 rgba(var(--aa-panel-border-color-rgb),var(--aa-panel-border-color-alpha));display:flex;justify-content:space-between;margin:0;padding:16px;padding:var(--aa-spacing);position:relative}.aa-PanelFooter:after{background-image:linear-gradient(hsla(0,0%,100%,0),rgba(128,126,163,.6));background-image:linear-gradient(rgba(var(--aa-background-color-rgb),0),rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha)));content:"";height:16px;height:var(--aa-spacing);left:0;opacity:.12;pointer-events:none;position:absolute;right:0;top:-16px;top:calc(var(--aa-spacing)*-1);z-index:9998;z-index:calc(var(--aa-base-z-index) - 1)}.aa-DetachedContainer{background:#fff;background:rgba(var(--aa-background-color-rgb),var(--aa-background-color-alpha));bottom:0;box-shadow:0 0 0 1px rgba(35,38,59,.1),0 6px 16px -4px rgba(35,38,59,.15);box-shadow:var(--aa-panel-shadow);display:flex;flex-direction:column;left:0;margin:0;overflow:hidden;padding:0;position:fixed;right:0;top:0;z-index:9999;z-index:var(--aa-base-z-index)}.aa-DetachedContainer:after{height:32px}.aa-DetachedContainer .aa-SourceHeader{margin:8px 0 8px 2px;margin:var(--aa-spacing-half) 0 var(--aa-spacing-half) 2px}.aa-DetachedContainer .aa-Panel{background-color:#fff;background-color:rgba(var(--aa-background-color-rgb),var(--aa-background-color-alpha));border-radius:0;box-shadow:none;flex-grow:1;margin:0;padding:0;position:relative}.aa-DetachedContainer .aa-PanelLayout{bottom:0;box-shadow:none;left:0;margin:0;max-height:none;overflow-y:auto;position:absolute;right:0;top:0;width:100%}.aa-DetachedFormContainer{border-bottom:1px solid rgba(128,126,163,.3);border-bottom:1px solid rgba(var(--aa-panel-border-color-rgb),var(--aa-panel-border-color-alpha));display:flex;flex-direction:row;justify-content:space-between;margin:0;padding:8px;padding:var(--aa-spacing-half)}.aa-DetachedCancelButton{background:none;border:0;border-radius:3px;color:inherit;color:#262627;color:rgba(var(--aa-text-color-rgb),var(--aa-text-color-alpha));cursor:pointer;font:inherit;margin:0 0 0 8px;margin:0 0 0 var(--aa-spacing-half);padding:0 8px;padding:0 var(--aa-spacing-half)}.aa-DetachedCancelButton:focus,.aa-DetachedCancelButton:hover{box-shadow:inset 0 0 0 1px rgba(128,126,163,.3);box-shadow:inset 0 0 0 1px rgba(var(--aa-panel-border-color-rgb),var(--aa-panel-border-color-alpha))}.aa-DetachedContainer--modal{border-radius:6px;bottom:inherit;height:auto;margin:0 auto;max-width:680px;max-width:var(--aa-detached-modal-max-width);position:absolute;top:3%}.aa-DetachedContainer--modal .aa-PanelLayout{max-height:500px;max-height:var(--aa-detached-modal-max-height);padding-bottom:8px;padding-bottom:var(--aa-spacing-half);position:static}.aa-DetachedSearchButton{align-items:center;background-color:#fff;background-color:rgba(var(--aa-input-background-color-rgb),var(--aa-input-background-color-alpha));border:1px solid rgba(128,126,163,.8);border:1px solid rgba(var(--aa-input-border-color-rgb),var(--aa-input-border-color-alpha));border-radius:3px;color:rgba(128,126,163,.6);color:rgba(var(--aa-muted-color-rgb),var(--aa-muted-color-alpha));cursor:pointer;display:flex;font:inherit;font-family:inherit;font-family:var(--aa-font-family);font-size:16px;font-size:var(--aa-font-size);height:44px;height:var(--aa-search-input-height);margin:0;padding:0 5.5px;padding:0 calc(var(--aa-search-input-height)/8);position:relative;text-align:left;width:100%}.aa-DetachedSearchButton:focus{border-color:#3e34d3;border-color:rgba(var(--aa-primary-color-rgb),1);box-shadow:0 0 0 3px rgba(62,52,211,.2),inset 0 0 0 2px rgba(62,52,211,.2);box-shadow:rgba(var(--aa-primary-color-rgb),var(--aa-primary-color-alpha)) 0 0 0 3px,inset rgba(var(--aa-primary-color-rgb),var(--aa-primary-color-alpha)) 0 0 0 2px;outline:medium none currentColor}.aa-DetachedSearchButtonIcon{align-items:center;color:#3e34d3;color:rgba(var(--aa-primary-color-rgb),1);cursor:auto;display:flex;height:100%;justify-content:center;width:36px;width:calc(var(--aa-icon-size) + var(--aa-spacing))}.aa-Detached{height:100vh;overflow:hidden}.aa-DetachedOverlay{background-color:hsla(244,6%,48%,.4);background-color:rgba(var(--aa-overlay-color-rgb),var(--aa-overlay-color-alpha));height:100vh;left:0;margin:0;padding:0;position:fixed;right:0;top:0;z-index:9998;z-index:calc(var(--aa-base-z-index) - 1)}.aa-GradientBottom,.aa-GradientTop{height:8px;height:var(--aa-spacing-half);left:0;pointer-events:none;position:absolute;right:0;z-index:9999;z-index:var(--aa-base-z-index)}.aa-GradientTop{background-image:linear-gradient(#fff,hsla(0,0%,100%,0));background-image:linear-gradient(rgba(var(--aa-background-color-rgb),1),rgba(var(--aa-background-color-rgb),0));top:0}.aa-GradientBottom{background-image:linear-gradient(hsla(0,0%,100%,0),#fff);background-image:linear-gradient(rgba(var(--aa-background-color-rgb),0),rgba(var(--aa-background-color-rgb),1));border-bottom-left-radius:4px;border-bottom-left-radius:calc(var(--aa-spacing)/4);border-bottom-right-radius:4px;border-bottom-right-radius:calc(var(--aa-spacing)/4);bottom:0}@media (hover:none) and (pointer:coarse){.aa-DesktopOnly{display:none}}@media (hover:hover){.aa-TouchOnly{display:none}}
4
- /*# sourceMappingURL=25.4c069dc5.chunk.css.map*/
4
+ /*# sourceMappingURL=943.60476cc0.chunk.css.map*/