@oh-my-pi/pi-coding-agent 15.1.2 โ†’ 15.1.4

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.
Files changed (155) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/dist/types/async/job-manager.d.ts +3 -2
  3. package/dist/types/cli/auth-broker-cli.d.ts +25 -0
  4. package/dist/types/cli/auth-gateway-cli.d.ts +18 -0
  5. package/dist/types/cli/grievances-cli.d.ts +12 -0
  6. package/dist/types/commands/auth-broker.d.ts +54 -0
  7. package/dist/types/commands/auth-gateway.d.ts +32 -0
  8. package/dist/types/commands/grievances.d.ts +1 -1
  9. package/dist/types/commit/agentic/tools/propose-commit.d.ts +9 -1
  10. package/dist/types/commit/agentic/tools/schemas.d.ts +9 -1
  11. package/dist/types/commit/agentic/tools/split-commit.d.ts +9 -1
  12. package/dist/types/config/model-registry.d.ts +3 -0
  13. package/dist/types/config/models-config-schema.d.ts +1 -0
  14. package/dist/types/config/settings-schema.d.ts +46 -0
  15. package/dist/types/discovery/agents.d.ts +12 -1
  16. package/dist/types/edit/renderer.d.ts +3 -0
  17. package/dist/types/eval/index.d.ts +0 -2
  18. package/dist/types/goals/tools/goal-tool.d.ts +10 -2
  19. package/dist/types/index.d.ts +0 -1
  20. package/dist/types/internal-urls/index.d.ts +1 -1
  21. package/dist/types/internal-urls/{pi-protocol.d.ts โ†’ omp-protocol.d.ts} +3 -3
  22. package/dist/types/internal-urls/types.d.ts +1 -1
  23. package/dist/types/main.d.ts +11 -2
  24. package/dist/types/modes/acp/acp-agent.d.ts +2 -1
  25. package/dist/types/modes/acp/acp-event-mapper.d.ts +13 -1
  26. package/dist/types/modes/acp/acp-mode.d.ts +3 -1
  27. package/dist/types/modes/emoji-autocomplete.d.ts +16 -0
  28. package/dist/types/modes/interactive-mode.d.ts +1 -1
  29. package/dist/types/modes/prompt-action-autocomplete.d.ts +4 -0
  30. package/dist/types/plan-mode/approved-plan.d.ts +10 -4
  31. package/dist/types/sdk.d.ts +10 -3
  32. package/dist/types/session/agent-session.d.ts +7 -3
  33. package/dist/types/session/auth-broker-config.d.ts +13 -0
  34. package/dist/types/session/auth-storage.d.ts +1 -1
  35. package/dist/types/session/client-bridge.d.ts +3 -0
  36. package/dist/types/tools/eval.d.ts +41 -7
  37. package/dist/types/tools/irc.d.ts +8 -2
  38. package/dist/types/tools/report-tool-issue.d.ts +118 -1
  39. package/dist/types/tools/resolve.d.ts +8 -2
  40. package/examples/custom-tools/README.md +3 -12
  41. package/examples/extensions/README.md +2 -15
  42. package/examples/extensions/api-demo.ts +1 -7
  43. package/package.json +7 -7
  44. package/src/async/job-manager.ts +111 -13
  45. package/src/autoresearch/tools/init-experiment.ts +11 -33
  46. package/src/autoresearch/tools/log-experiment.ts +10 -24
  47. package/src/autoresearch/tools/run-experiment.ts +1 -1
  48. package/src/autoresearch/tools/update-notes.ts +2 -9
  49. package/src/cli/auth-broker-cli.ts +746 -0
  50. package/src/cli/auth-gateway-cli.ts +342 -0
  51. package/src/cli/grievances-cli.ts +109 -16
  52. package/src/cli/update-cli.ts +1 -5
  53. package/src/cli.ts +4 -2
  54. package/src/commands/auth-broker.ts +96 -0
  55. package/src/commands/auth-gateway.ts +61 -0
  56. package/src/commands/grievances.ts +13 -8
  57. package/src/commands/launch.ts +1 -1
  58. package/src/commit/agentic/agent.ts +2 -0
  59. package/src/commit/agentic/tools/analyze-file.ts +2 -2
  60. package/src/commit/agentic/tools/git-file-diff.ts +2 -2
  61. package/src/commit/agentic/tools/git-hunk.ts +3 -3
  62. package/src/commit/agentic/tools/git-overview.ts +2 -2
  63. package/src/commit/agentic/tools/propose-changelog.ts +1 -3
  64. package/src/commit/agentic/tools/recent-commits.ts +1 -1
  65. package/src/commit/agentic/tools/schemas.ts +1 -9
  66. package/src/config/model-equivalence.ts +279 -174
  67. package/src/config/model-registry.ts +37 -6
  68. package/src/config/model-resolver.ts +13 -8
  69. package/src/config/models-config-schema.ts +8 -0
  70. package/src/config/settings-schema.ts +52 -0
  71. package/src/cursor.ts +1 -1
  72. package/src/debug/log-formatting.ts +1 -1
  73. package/src/debug/log-viewer.ts +1 -1
  74. package/src/debug/profiler.ts +4 -0
  75. package/src/debug/raw-sse-buffer.ts +100 -59
  76. package/src/debug/raw-sse.ts +1 -1
  77. package/src/discovery/agents.ts +15 -4
  78. package/src/edit/modes/apply-patch.ts +1 -5
  79. package/src/edit/modes/patch.ts +5 -5
  80. package/src/edit/modes/replace.ts +5 -5
  81. package/src/edit/renderer.ts +2 -1
  82. package/src/edit/streaming.ts +1 -1
  83. package/src/eval/index.ts +0 -2
  84. package/src/eval/js/shared/runtime.ts +107 -2
  85. package/src/eval/py/kernel.ts +1 -1
  86. package/src/exa/researcher.ts +4 -4
  87. package/src/exa/search.ts +10 -22
  88. package/src/exa/websets.ts +33 -33
  89. package/src/extensibility/typebox.ts +44 -17
  90. package/src/goals/tools/goal-tool.ts +3 -3
  91. package/src/index.ts +0 -3
  92. package/src/internal-urls/docs-index.generated.ts +21 -18
  93. package/src/internal-urls/index.ts +1 -1
  94. package/src/internal-urls/{pi-protocol.ts โ†’ omp-protocol.ts} +10 -10
  95. package/src/internal-urls/router.ts +3 -3
  96. package/src/internal-urls/types.ts +1 -1
  97. package/src/lsp/types.ts +8 -11
  98. package/src/main.ts +216 -146
  99. package/src/mcp/tool-bridge.ts +3 -3
  100. package/src/modes/acp/acp-agent.ts +203 -57
  101. package/src/modes/acp/acp-client-bridge.ts +2 -1
  102. package/src/modes/acp/acp-event-mapper.ts +208 -32
  103. package/src/modes/acp/acp-mode.ts +11 -3
  104. package/src/modes/components/bash-execution.ts +1 -1
  105. package/src/modes/components/diff.ts +1 -2
  106. package/src/modes/components/eval-execution.ts +1 -1
  107. package/src/modes/components/oauth-selector.ts +38 -2
  108. package/src/modes/components/tool-execution.ts +1 -2
  109. package/src/modes/components/tree-selector.ts +26 -7
  110. package/src/modes/controllers/command-controller.ts +95 -34
  111. package/src/modes/controllers/input-controller.ts +4 -3
  112. package/src/modes/data/emojis.json +1 -0
  113. package/src/modes/emoji-autocomplete.ts +285 -0
  114. package/src/modes/interactive-mode.ts +92 -19
  115. package/src/modes/print-mode.ts +3 -3
  116. package/src/modes/prompt-action-autocomplete.ts +14 -0
  117. package/src/plan-mode/approved-plan.ts +30 -9
  118. package/src/prompts/system/system-prompt.md +1 -1
  119. package/src/prompts/system/ttsr-tool-reminder.md +5 -0
  120. package/src/prompts/tools/ask.md +4 -3
  121. package/src/prompts/tools/eval.md +25 -26
  122. package/src/prompts/tools/read.md +1 -1
  123. package/src/prompts/tools/resolve.md +1 -1
  124. package/src/prompts/tools/search.md +1 -1
  125. package/src/prompts/tools/web-search.md +1 -1
  126. package/src/sdk.ts +81 -8
  127. package/src/session/agent-session.ts +362 -131
  128. package/src/session/agent-storage.ts +7 -2
  129. package/src/session/auth-broker-config.ts +102 -0
  130. package/src/session/auth-storage.ts +7 -1
  131. package/src/session/client-bridge.ts +3 -0
  132. package/src/session/streaming-output.ts +1 -1
  133. package/src/task/types.ts +10 -35
  134. package/src/tools/bash-interactive.ts +4 -1
  135. package/src/tools/bash-pty-selection.ts +2 -2
  136. package/src/tools/browser.ts +12 -20
  137. package/src/tools/eval.ts +77 -100
  138. package/src/tools/gh.ts +21 -45
  139. package/src/tools/hindsight-recall.ts +1 -1
  140. package/src/tools/hindsight-reflect.ts +2 -2
  141. package/src/tools/hindsight-retain.ts +3 -7
  142. package/src/tools/index.ts +8 -1
  143. package/src/tools/inspect-image.ts +4 -1
  144. package/src/tools/irc.ts +4 -12
  145. package/src/tools/job.ts +3 -11
  146. package/src/tools/report-tool-issue.ts +462 -17
  147. package/src/tools/resolve.ts +2 -7
  148. package/src/tools/todo-write.ts +8 -15
  149. package/src/utils/title-generator.ts +3 -0
  150. package/src/web/search/index.ts +6 -6
  151. package/dist/types/eval/parse.d.ts +0 -28
  152. package/dist/types/eval/sniff.d.ts +0 -11
  153. package/src/eval/eval.lark +0 -36
  154. package/src/eval/parse.ts +0 -407
  155. package/src/eval/sniff.ts +0 -28
@@ -374,10 +374,15 @@ export class CommandController {
374
374
  const openaiWebsocketSetting = this.ctx.settings.get("providers.openaiWebsockets") ?? "auto";
375
375
  const preferOpenAICodexWebsockets =
376
376
  openaiWebsocketSetting === "on" ? true : openaiWebsocketSetting === "off" ? false : undefined;
377
+ const credentialSource = this.ctx.session.modelRegistry.authStorage.describeCredentialSource(
378
+ model.provider,
379
+ stats.sessionId,
380
+ );
377
381
  const providerDetails = getProviderDetails({
378
382
  model,
379
383
  sessionId: stats.sessionId,
380
384
  authMode,
385
+ credentialSource,
381
386
  preferWebsockets: preferOpenAICodexWebsockets,
382
387
  providerSessionState: this.ctx.session.providerSessionState,
383
388
  });
@@ -503,7 +508,8 @@ export class CommandController {
503
508
  return;
504
509
  }
505
510
 
506
- const output = renderUsageReports(usageReports, theme, Date.now());
511
+ const availableWidth = Math.max(40, (this.ctx.ui.terminal.columns ?? 100) - 2);
512
+ const output = renderUsageReports(usageReports, theme, Date.now(), availableWidth);
507
513
  this.ctx.chatContainer.addChild(new Spacer(1));
508
514
  this.ctx.chatContainer.addChild(new Text(output, 1, 0));
509
515
  this.ctx.ui.requestRender();
@@ -1237,8 +1243,8 @@ export class CommandController {
1237
1243
  }
1238
1244
  }
1239
1245
 
1240
- const BAR_WIDTH = 24;
1241
- const COLUMN_WIDTH = BAR_WIDTH + 2;
1246
+ const BAR_WIDTH_MAX = 24;
1247
+ const BAR_WIDTH_MIN = 4;
1242
1248
 
1243
1249
  function renderJobLine(job: AsyncJobSnapshotItem, now: number): string {
1244
1250
  const duration = formatDuration(Math.max(0, now - job.startTime));
@@ -1266,6 +1272,7 @@ function truncateJobLabel(label: string, maxWidth: number): string {
1266
1272
 
1267
1273
  return `${out}โ€ฆ`;
1268
1274
  }
1275
+
1269
1276
  function formatProviderName(provider: string): string {
1270
1277
  return provider
1271
1278
  .split(/[-_]/g)
@@ -1277,10 +1284,6 @@ function formatNumber(value: number, maxFractionDigits = 1): string {
1277
1284
  return new Intl.NumberFormat("en-US", { maximumFractionDigits: maxFractionDigits }).format(value);
1278
1285
  }
1279
1286
 
1280
- function formatUsedAccounts(value: number): string {
1281
- return `${value.toFixed(2)} used`;
1282
- }
1283
-
1284
1287
  function resolveProviderAuthMode(authStorage: AuthStorage, provider: string): string {
1285
1288
  if (authStorage.hasOAuth(provider)) {
1286
1289
  return "oauth";
@@ -1364,11 +1367,39 @@ function formatResetShort(limit: UsageLimit, nowMs: number): string | undefined
1364
1367
  return undefined;
1365
1368
  }
1366
1369
 
1367
- function formatAccountHeader(limit: UsageLimit, report: UsageReport, index: number, nowMs: number): string {
1368
- const label = formatAccountLabel(limit, report, index);
1369
- const reset = formatResetShort(limit, nowMs);
1370
- if (!reset) return label;
1371
- return `${label} (${reset})`;
1370
+ function formatAccountHeaderRow(
1371
+ limits: UsageLimit[],
1372
+ reports: UsageReport[],
1373
+ nowMs: number,
1374
+ columnWidth: number,
1375
+ uiTheme: typeof theme,
1376
+ ): string[] {
1377
+ const parts = limits.map((limit, index) => {
1378
+ const reset = formatResetShort(limit, nowMs);
1379
+ return {
1380
+ label: formatAccountLabel(limit, reports[index], index),
1381
+ suffix: reset ? `(${reset})` : "",
1382
+ };
1383
+ });
1384
+ const maxSuffixWidth = parts.reduce((max, p) => Math.max(max, visibleWidth(p.suffix)), 0);
1385
+ const gap = maxSuffixWidth > 0 ? 1 : 0;
1386
+ const prefixBudget = columnWidth - maxSuffixWidth - gap;
1387
+
1388
+ // If suffix can't share the cell with at least `xโ€ฆ`, fall back to whole-label truncation.
1389
+ if (prefixBudget < 2) {
1390
+ return parts.map(p => {
1391
+ const full = p.suffix ? `${p.label} ${p.suffix}` : p.label;
1392
+ return padColumn(truncateJobLabel(full, columnWidth), columnWidth);
1393
+ });
1394
+ }
1395
+
1396
+ return parts.map(p => {
1397
+ const prefix = truncateJobLabel(p.label, prefixBudget);
1398
+ const prefixCell = prefix + " ".repeat(prefixBudget - visibleWidth(prefix));
1399
+ if (!p.suffix) return prefixCell + " ".repeat(maxSuffixWidth + gap);
1400
+ const suffixPad = " ".repeat(maxSuffixWidth - visibleWidth(p.suffix));
1401
+ return `${prefixCell} ${suffixPad}${uiTheme.fg("dim", p.suffix)}`;
1402
+ });
1372
1403
  }
1373
1404
 
1374
1405
  function padColumn(text: string, width: number): string {
@@ -1395,10 +1426,8 @@ function formatAggregateAmount(limits: UsageLimit[]): string {
1395
1426
  .filter((value): value is number => value !== undefined);
1396
1427
  if (fractions.length === limits.length && fractions.length > 0) {
1397
1428
  const sum = fractions.reduce((total, value) => total + value, 0);
1398
- const usedPct = Math.max(sum * 100, 0);
1399
- const remainingPct = Math.max(0, limits.length * 100 - usedPct);
1400
- const avgRemaining = limits.length > 0 ? remainingPct / limits.length : remainingPct;
1401
- return `${formatUsedAccounts(sum)} (${formatNumber(avgRemaining)}% left)`;
1429
+ const avgRemaining = Math.max(0, ((limits.length - sum) / limits.length) * 100);
1430
+ return `${formatNumber(avgRemaining)}% free`;
1402
1431
  }
1403
1432
 
1404
1433
  const amounts = limits
@@ -1407,13 +1436,11 @@ function formatAggregateAmount(limits: UsageLimit[]): string {
1407
1436
  if (amounts.length === limits.length && amounts.length > 0) {
1408
1437
  const totalUsed = amounts.reduce((sum, amount) => sum + (amount.used ?? 0), 0);
1409
1438
  const totalLimit = amounts.reduce((sum, amount) => sum + (amount.limit ?? 0), 0);
1410
- const usedPct = totalLimit > 0 ? (totalUsed / totalLimit) * 100 : 0;
1411
- const remainingPct = Math.max(0, 100 - usedPct);
1412
- const usedAccounts = totalLimit > 0 ? (usedPct / 100) * limits.length : 0;
1413
- return `${formatUsedAccounts(usedAccounts)} (${formatNumber(remainingPct)}% left)`;
1439
+ const remainingPct = totalLimit > 0 ? Math.max(0, 100 - (totalUsed / totalLimit) * 100) : 0;
1440
+ return `${formatNumber(remainingPct)}% free`;
1414
1441
  }
1415
1442
 
1416
- return `Accounts: ${limits.length}`;
1443
+ return `${limits.length} accts`;
1417
1444
  }
1418
1445
 
1419
1446
  function resolveResetRange(limits: UsageLimit[], nowMs: number): string | null {
@@ -1444,20 +1471,47 @@ function resolveStatusColor(status: UsageLimit["status"]): "success" | "warning"
1444
1471
  return "dim";
1445
1472
  }
1446
1473
 
1447
- function renderUsageBar(limit: UsageLimit, uiTheme: typeof theme): string {
1474
+ function renderUsageBar(limit: UsageLimit, uiTheme: typeof theme, barWidth: number): string {
1448
1475
  const fraction = resolveFraction(limit);
1449
1476
  if (fraction === undefined) {
1450
- return uiTheme.fg("dim", `[${"ยท".repeat(BAR_WIDTH)}]`);
1477
+ return uiTheme.fg("dim", "ยท".repeat(barWidth));
1451
1478
  }
1452
1479
  const clamped = Math.min(Math.max(fraction, 0), 1);
1453
- const filled = Math.round(clamped * BAR_WIDTH);
1454
- const filledBar = "โ–ˆ".repeat(filled);
1455
- const emptyBar = "โ–‘".repeat(Math.max(0, BAR_WIDTH - filled));
1480
+ const exact = clamped * barWidth;
1481
+ const fullCells = Math.floor(exact);
1482
+ const remainder = exact - fullCells;
1483
+ let partial = "";
1484
+ if (remainder >= 2 / 3) partial = "โ–“";
1485
+ else if (remainder >= 1 / 3) partial = "โ–’";
1486
+ const leading = "โ–ˆ".repeat(fullCells) + partial;
1487
+ const empty = "โ–‘".repeat(Math.max(0, barWidth - fullCells - (partial ? 1 : 0)));
1456
1488
  const color = resolveStatusColor(limit.status);
1457
- return `${uiTheme.fg("dim", "[")}${uiTheme.fg(color, filledBar)}${uiTheme.fg("dim", emptyBar)}${uiTheme.fg("dim", "]")}`;
1489
+ return `${uiTheme.fg(color, leading)}${uiTheme.fg("dim", empty)}`;
1490
+ }
1491
+
1492
+ /**
1493
+ * Pick a per-column width so n bars + a trailing amount string fit in `available` columns.
1494
+ * Falls back to the minimum when the terminal is too narrow rather than wrapping.
1495
+ */
1496
+ function resolveColumnWidth(count: number, available: number, trailing: number): number {
1497
+ if (count <= 0) return BAR_WIDTH_MAX;
1498
+ const indent = 2;
1499
+ const gaps = count - 1;
1500
+ const spaceForBars = available - indent - gaps - (trailing > 0 ? trailing + 1 : 0);
1501
+ const ideal = Math.floor(spaceForBars / count);
1502
+ const min = BAR_WIDTH_MIN;
1503
+ const max = BAR_WIDTH_MAX;
1504
+ if (ideal < min) return min;
1505
+ if (ideal > max) return max;
1506
+ return ideal;
1458
1507
  }
1459
1508
 
1460
- function renderUsageReports(reports: UsageReport[], uiTheme: typeof theme, nowMs: number): string {
1509
+ function renderUsageReports(
1510
+ reports: UsageReport[],
1511
+ uiTheme: typeof theme,
1512
+ nowMs: number,
1513
+ availableWidth: number,
1514
+ ): string {
1461
1515
  const lines: string[] = [];
1462
1516
  const latestFetchedAt = Math.max(...reports.map(report => report.fetchedAt ?? 0));
1463
1517
  const headerSuffix = latestFetchedAt ? ` (${formatDuration(nowMs - latestFetchedAt)} ago)` : "";
@@ -1506,7 +1560,7 @@ function renderUsageReports(reports: UsageReport[], uiTheme: typeof theme, nowMs
1506
1560
 
1507
1561
  lines.push(uiTheme.bold(uiTheme.fg("accent", providerName)));
1508
1562
 
1509
- for (const group of limitGroups.values()) {
1563
+ const renderableGroups = Array.from(limitGroups.values()).map(group => {
1510
1564
  const entries = group.limits.map((limit, index) => ({
1511
1565
  limit,
1512
1566
  report: group.reports[index],
@@ -1521,18 +1575,25 @@ function renderUsageReports(reports: UsageReport[], uiTheme: typeof theme, nowMs
1521
1575
  });
1522
1576
  const sortedLimits = entries.map(entry => entry.limit);
1523
1577
  const sortedReports = entries.map(entry => entry.report);
1578
+ return { group, sortedLimits, sortedReports, amountText: formatAggregateAmount(sortedLimits) };
1579
+ });
1524
1580
 
1581
+ const sectionCount = renderableGroups.reduce((max, g) => Math.max(max, g.sortedLimits.length), 0);
1582
+ const sectionTrailing = renderableGroups.reduce((max, g) => Math.max(max, visibleWidth(g.amountText)), 0);
1583
+ const sectionColumnWidth = resolveColumnWidth(sectionCount, availableWidth, sectionTrailing);
1584
+
1585
+ for (const { group, sortedLimits, sortedReports, amountText } of renderableGroups) {
1525
1586
  const status = resolveAggregateStatus(sortedLimits);
1526
1587
  const statusIcon = resolveStatusIcon(status, uiTheme);
1527
1588
 
1528
1589
  const windowSuffix = formatWindowSuffix(group.label, group.windowLabel, uiTheme);
1529
1590
  lines.push(`${statusIcon} ${uiTheme.bold(group.label)} ${windowSuffix}`.trim());
1530
- const accountLabels = sortedLimits.map((limit, index) =>
1531
- padColumn(formatAccountHeader(limit, sortedReports[index], index, nowMs), COLUMN_WIDTH),
1532
- );
1591
+ const accountLabels = formatAccountHeaderRow(sortedLimits, sortedReports, nowMs, sectionColumnWidth, uiTheme);
1533
1592
  lines.push(` ${accountLabels.join(" ")}`.trimEnd());
1534
- const bars = sortedLimits.map(limit => padColumn(renderUsageBar(limit, uiTheme), COLUMN_WIDTH));
1535
- lines.push(` ${bars.join(" ")} ${formatAggregateAmount(sortedLimits)}`.trimEnd());
1593
+ const bars = sortedLimits.map(limit =>
1594
+ padColumn(renderUsageBar(limit, uiTheme, sectionColumnWidth), sectionColumnWidth),
1595
+ );
1596
+ lines.push(` ${bars.join(" ")} ${amountText}`.trimEnd());
1536
1597
  const resetText = sortedLimits.length <= 1 ? resolveResetRange(sortedLimits, nowMs) : null;
1537
1598
  if (resetText) {
1538
1599
  lines.push(` ${uiTheme.fg("dim", resetText)}`.trimEnd());
@@ -1,9 +1,9 @@
1
1
  import * as fs from "node:fs/promises";
2
2
  import { type AgentMessage, ThinkingLevel } from "@oh-my-pi/pi-agent-core";
3
- import { sanitizeText } from "@oh-my-pi/pi-natives";
4
3
  import type { AutocompleteProvider, SlashCommand } from "@oh-my-pi/pi-tui";
5
- import { $env } from "@oh-my-pi/pi-utils";
6
- import { settings } from "../../config/settings";
4
+ import { $env, sanitizeText } from "@oh-my-pi/pi-utils";
5
+ import { isSettingsInitialized, settings } from "../../config/settings";
6
+ import { expandEmoticons } from "../../modes/emoji-autocomplete";
7
7
  import { createPromptActionAutocompleteProvider } from "../../modes/prompt-action-autocomplete";
8
8
  import { theme } from "../../modes/theme/theme";
9
9
  import type { InteractiveModeContext } from "../../modes/types";
@@ -187,6 +187,7 @@ export class InputController {
187
187
  setupEditorSubmitHandler(): void {
188
188
  this.ctx.editor.onSubmit = async (text: string) => {
189
189
  text = text.trim();
190
+ if ((!isSettingsInitialized() || settings.get("emojiAutocomplete")) && text) text = expandEmoticons(text);
190
191
 
191
192
  // Empty submit while streaming with queued messages: flush queues immediately
192
193
  if (!text && this.ctx.session.isStreaming && this.ctx.session.queuedMessageCount > 0) {
@@ -0,0 +1 @@
1
+ {"1":[["100","๐Ÿ’ฏ"],["1234","๐Ÿ”ข"],["1st_place_medal","๐Ÿฅ‡"]],"2":[["2nd_place_medal","๐Ÿฅˆ"]],"3":[["3rd_place_medal","๐Ÿฅ‰"]],"8":[["8ball","๐ŸŽฑ"]],"+":[["+1","๐Ÿ‘"]],"-":[["-1","๐Ÿ‘Ž"]],"a":[["a","๐Ÿ…ฐ๏ธ"],["ab","๐Ÿ†Ž"],["abacus","๐Ÿงฎ"],["abc","๐Ÿ”ค"],["abcd","๐Ÿ”ก"],["accept","๐Ÿ‰‘"],["adult","๐Ÿง‘"],["aerial_tramway","๐Ÿšก"],["afk","๐Ÿšถ"],["agree","๐Ÿ‘"],["airplane","โœˆ๏ธ"],["alarm_clock","โฐ"],["alembic","โš—"],["alien","๐Ÿ‘ฝ"],["amazing","๐Ÿคฉ"],["ambulance","๐Ÿš‘"],["amphora","๐Ÿบ"],["anchor","โš“"],["angel","๐Ÿ‘ผ"],["anger","๐Ÿ’ข"],["angry","๐Ÿ˜ "],["anguished","๐Ÿ˜ง"],["ant","๐Ÿœ"],["applause","๐Ÿ‘"],["apple","๐ŸŽ"],["aquarius","โ™’"],["aries","โ™ˆ"],["arrow_backward","โ—€๏ธ"],["arrow_double_down","โฌ"],["arrow_double_up","โซ"],["arrow_down","โฌ‡๏ธ"],["arrow_down_small","๐Ÿ”ฝ"],["arrow_forward","โ–ถ๏ธ"],["arrow_heading_down","โคต๏ธ"],["arrow_heading_up","โคด๏ธ"],["arrow_left","โฌ…๏ธ"],["arrow_lower_left","โ†™๏ธ"],["arrow_lower_right","โ†˜๏ธ"],["arrow_right","โžก๏ธ"],["arrow_right_hook","โ†ช๏ธ"],["arrow_up","โฌ†๏ธ"],["arrow_up_down","โ†•๏ธ"],["arrow_up_small","๐Ÿ”ผ"],["arrow_upper_left","โ†–๏ธ"],["arrow_upper_right","โ†—๏ธ"],["arrows_clockwise","๐Ÿ”ƒ"],["arrows_counterclockwise","๐Ÿ”„"],["art","๐ŸŽจ"],["articulated_lorry","๐Ÿš›"],["artificial_satellite","๐Ÿ›ฐ"],["asterisk","*โƒฃ"],["astonished","๐Ÿ˜ฒ"],["athletic_shoe","๐Ÿ‘Ÿ"],["atm","๐Ÿง"],["atom_symbol","โš›"],["avocado","๐Ÿฅ‘"],["awesome","๐Ÿ˜Ž"],["aww","๐Ÿฅน"]],"b":[["b","๐Ÿ…ฑ๏ธ"],["baby","๐Ÿ‘ถ"],["baby_bottle","๐Ÿผ"],["baby_chick","๐Ÿค"],["baby_symbol","๐Ÿšผ"],["back","๐Ÿ”™"],["bacon","๐Ÿฅ“"],["badger","๐Ÿฆก"],["badminton","๐Ÿธ"],["bae","๐Ÿ˜"],["bagel","๐Ÿฅฏ"],["baggage_claim","๐Ÿ›„"],["baguette_bread","๐Ÿฅ–"],["balance_scale","โš–"],["balloon","๐ŸŽˆ"],["ballot_box","๐Ÿ—ณ"],["ballot_box_with_check","โ˜‘๏ธ"],["bamboo","๐ŸŽ"],["banana","๐ŸŒ"],["bangbang","โ€ผ๏ธ"],["bank","๐Ÿฆ"],["bar_chart","๐Ÿ“Š"],["barber","๐Ÿ’ˆ"],["baseball","โšพ"],["basket","๐Ÿงบ"],["basketball","๐Ÿ€"],["basketball_man","โ›น"],["basketball_woman","โ›น๏ธโ€โ™€๏ธ"],["bat","๐Ÿฆ‡"],["bath","๐Ÿ›€"],["bathtub","๐Ÿ›"],["battery","๐Ÿ”‹"],["bawling","๐Ÿ˜ญ"],["bday","๐Ÿฅณ"],["beach_umbrella","๐Ÿ–"],["bear","๐Ÿป"],["bearded_person","๐Ÿง”"],["bed","๐Ÿ›"],["beer","๐Ÿบ"],["beers","๐Ÿป"],["beetle","๐Ÿž"],["beginner","๐Ÿ”ฐ"],["bell","๐Ÿ””"],["bellhop_bell","๐Ÿ›Ž"],["bento","๐Ÿฑ"],["bet","๐Ÿ‘"],["bike","๐Ÿšฒ"],["biking_man","๐Ÿšด"],["biking_woman","๐Ÿšดโ€โ™€๏ธ"],["bikini","๐Ÿ‘™"],["billed_hat","๐Ÿงข"],["biohazard","โ˜ฃ"],["bird","๐Ÿฆ"],["birthday","๐ŸŽ‚"],["black_circle","โšซ"],["black_flag","๐Ÿด"],["black_heart","๐Ÿ–ค"],["black_joker","๐Ÿƒ"],["black_large_square","โฌ›"],["black_medium_small_square","โ—พ"],["black_medium_square","โ—ผ๏ธ"],["black_nib","โœ’๏ธ"],["black_small_square","โ–ช๏ธ"],["black_square_button","๐Ÿ”ฒ"],["blonde_man","๐Ÿ‘ฑ"],["blonde_woman","๐Ÿ‘ฑโ€โ™€๏ธ"],["blossom","๐ŸŒผ"],["blowfish","๐Ÿก"],["blue_book","๐Ÿ“˜"],["blue_car","๐Ÿš™"],["blue_heart","๐Ÿ’™"],["blush","๐Ÿ˜Š"],["boar","๐Ÿ—"],["bomb","๐Ÿ’ฃ"],["bone","๐Ÿฆด"],["bookmark","๐Ÿ”–"],["bookmark_tabs","๐Ÿ“‘"],["books","๐Ÿ“š"],["boom","๐Ÿ’ฅ"],["boot","๐Ÿ‘ข"],["bored","๐Ÿฅฑ"],["bouquet","๐Ÿ’"],["bow_and_arrow","๐Ÿน"],["bowing_man","๐Ÿ™‡"],["bowing_woman","๐Ÿ™‡โ€โ™€๏ธ"],["bowl_with_spoon","๐Ÿฅฃ"],["bowling","๐ŸŽณ"],["boxing_glove","๐ŸฅŠ"],["boy","๐Ÿ‘ฆ"],["brain","๐Ÿง "],["brb","๐Ÿƒ"],["bread","๐Ÿž"],["breastfeeding","๐Ÿคฑ"],["brick","๐Ÿงฑ"],["bride_with_veil","๐Ÿ‘ฐ"],["bridge_at_night","๐ŸŒ‰"],["briefcase","๐Ÿ’ผ"],["broccoli","๐Ÿฅฆ"],["broken_heart","๐Ÿ’”"],["broom","๐Ÿงน"],["bruh","๐Ÿ˜"],["bs","๐Ÿ’ฉ"],["bug","๐Ÿ›"],["building_construction","๐Ÿ—"],["bulb","๐Ÿ’ก"],["bullettrain_front","๐Ÿš…"],["bullettrain_side","๐Ÿš„"],["bump","๐Ÿ‘Š"],["burrito","๐ŸŒฏ"],["bus","๐ŸšŒ"],["business_suit_levitating","๐Ÿ•ด"],["busstop","๐Ÿš"],["bust_in_silhouette","๐Ÿ‘ค"],["busts_in_silhouette","๐Ÿ‘ฅ"],["butterfly","๐Ÿฆ‹"],["bye","๐Ÿ‘‹"]],"c":[["cactus","๐ŸŒต"],["cake","๐Ÿฐ"],["calendar","๐Ÿ“†"],["call_me_hand","๐Ÿค™"],["calling","๐Ÿ“ฒ"],["camel","๐Ÿซ"],["camera","๐Ÿ“ท"],["camera_flash","๐Ÿ“ธ"],["camping","๐Ÿ•"],["cancer","โ™‹"],["candle","๐Ÿ•ฏ"],["candy","๐Ÿฌ"],["canned_food","๐Ÿฅซ"],["canoe","๐Ÿ›ถ"],["capital_abcd","๐Ÿ” "],["capricorn","โ™‘"],["card_file_box","๐Ÿ—ƒ"],["card_index","๐Ÿ“‡"],["card_index_dividers","๐Ÿ—‚"],["carousel_horse","๐ŸŽ "],["carrot","๐Ÿฅ•"],["cat","๐Ÿฑ"],["cat2","๐Ÿˆ"],["cd","๐Ÿ’ฟ"],["celebrate","๐ŸŽ‰"],["chains","โ›“"],["champagne","๐Ÿพ"],["chart","๐Ÿ’น"],["chart_with_downwards_trend","๐Ÿ“‰"],["chart_with_upwards_trend","๐Ÿ“ˆ"],["chat","๐Ÿ’ฌ"],["checkered_flag","๐Ÿ"],["cheese","๐Ÿง€"],["cherries","๐Ÿ’"],["cherry_blossom","๐ŸŒธ"],["chess_pawn","โ™Ÿ"],["chestnut","๐ŸŒฐ"],["chicken","๐Ÿ”"],["child","๐Ÿง’"],["children_crossing","๐Ÿšธ"],["chill","๐Ÿ˜Ž"],["chilling","๐Ÿ˜Ž"],["chipmunk","๐Ÿฟ"],["chocolate_bar","๐Ÿซ"],["chopsticks","๐Ÿฅข"],["christmas_tree","๐ŸŽ„"],["church","โ›ช"],["cinema","๐ŸŽฆ"],["circus_tent","๐ŸŽช"],["city_sunrise","๐ŸŒ‡"],["city_sunset","๐ŸŒ†"],["cityscape","๐Ÿ™"],["cl","๐Ÿ†‘"],["clamp","๐Ÿ—œ"],["clap","๐Ÿ‘"],["clapper","๐ŸŽฌ"],["classical_building","๐Ÿ›"],["climbing_man","๐Ÿง—โ€โ™‚๏ธ"],["climbing_woman","๐Ÿง—โ€โ™€๏ธ"],["clinking_glasses","๐Ÿฅ‚"],["clipboard","๐Ÿ“‹"],["clock1","๐Ÿ•"],["clock10","๐Ÿ•™"],["clock1030","๐Ÿ•ฅ"],["clock11","๐Ÿ•š"],["clock1130","๐Ÿ•ฆ"],["clock12","๐Ÿ•›"],["clock1230","๐Ÿ•ง"],["clock130","๐Ÿ•œ"],["clock2","๐Ÿ•‘"],["clock230","๐Ÿ•"],["clock3","๐Ÿ•’"],["clock330","๐Ÿ•ž"],["clock4","๐Ÿ•“"],["clock430","๐Ÿ•Ÿ"],["clock5","๐Ÿ•”"],["clock530","๐Ÿ• "],["clock6","๐Ÿ••"],["clock630","๐Ÿ•ก"],["clock7","๐Ÿ•–"],["clock730","๐Ÿ•ข"],["clock8","๐Ÿ•—"],["clock830","๐Ÿ•ฃ"],["clock9","๐Ÿ•˜"],["clock930","๐Ÿ•ค"],["closed_book","๐Ÿ“•"],["closed_lock_with_key","๐Ÿ”"],["closed_umbrella","๐ŸŒ‚"],["cloud","โ˜๏ธ"],["cloud_with_lightning","๐ŸŒฉ"],["cloud_with_lightning_and_rain","โ›ˆ"],["cloud_with_rain","๐ŸŒง"],["cloud_with_snow","๐ŸŒจ"],["clown_face","๐Ÿคก"],["clubs","โ™ฃ๏ธ"],["coat","๐Ÿงฅ"],["cocktail","๐Ÿธ"],["coconut","๐Ÿฅฅ"],["coffee","โ˜•"],["coffin","โšฐ"],["cold","๐Ÿฅถ"],["cold_sweat","๐Ÿ˜ฐ"],["comet","โ˜„"],["compass","๐Ÿงญ"],["computer","๐Ÿ’ป"],["computer_mouse","๐Ÿ–ฑ"],["confetti_ball","๐ŸŽŠ"],["confounded","๐Ÿ˜–"],["confused","๐Ÿ˜•"],["congrats","๐ŸŽ‰"],["congratulations","ใŠ—๏ธ"],["construction","๐Ÿšง"],["construction_worker_man","๐Ÿ‘ท"],["construction_worker_woman","๐Ÿ‘ทโ€โ™€๏ธ"],["control_knobs","๐ŸŽ›"],["convenience_store","๐Ÿช"],["cookie","๐Ÿช"],["cool","๐Ÿ†’"],["copyright","ยฉ๏ธ"],["corn","๐ŸŒฝ"],["correct","โœ…"],["couch_and_lamp","๐Ÿ›‹"],["couple","๐Ÿ‘ซ"],["couple_with_heart_man_man","๐Ÿ‘จโ€โค๏ธโ€๐Ÿ‘จ"],["couple_with_heart_woman_man","๐Ÿ’‘"],["couple_with_heart_woman_woman","๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ‘ฉ"],["couplekiss_man_man","๐Ÿ‘จโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ"],["couplekiss_man_woman","๐Ÿ’"],["couplekiss_woman_woman","๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ"],["cow","๐Ÿฎ"],["cow2","๐Ÿ„"],["cowboy_hat_face","๐Ÿค "],["crab","๐Ÿฆ€"],["crayon","๐Ÿ–"],["credit_card","๐Ÿ’ณ"],["crescent_moon","๐ŸŒ™"],["cricket","๐Ÿ"],["cringe","๐Ÿ˜–"],["crocodile","๐ŸŠ"],["croissant","๐Ÿฅ"],["crossed_fingers","๐Ÿคž"],["crossed_flags","๐ŸŽŒ"],["crossed_swords","โš”"],["crown","๐Ÿ‘‘"],["crush","๐Ÿฅฐ"],["cry","๐Ÿ˜ข"],["crying","๐Ÿ˜ญ"],["crying_cat_face","๐Ÿ˜ฟ"],["crystal_ball","๐Ÿ”ฎ"],["cucumber","๐Ÿฅ’"],["cup_with_straw","๐Ÿฅค"],["cupcake","๐Ÿง"],["cupid","๐Ÿ’˜"],["curling_stone","๐ŸฅŒ"],["curly_loop","โžฐ"],["currency_exchange","๐Ÿ’ฑ"],["curry","๐Ÿ›"],["custard","๐Ÿฎ"],["customs","๐Ÿ›ƒ"],["cya","๐Ÿ‘‹"],["cyclone","๐ŸŒ€"]],"d":[["dagger","๐Ÿ—ก"],["dancer","๐Ÿ’ƒ"],["dancing_men","๐Ÿ‘ฏโ€โ™‚๏ธ"],["dancing_women","๐Ÿ‘ฏ"],["dango","๐Ÿก"],["dark_sunglasses","๐Ÿ•ถ"],["dart","๐ŸŽฏ"],["dash","๐Ÿ’จ"],["date","๐Ÿ“…"],["daydream","๐Ÿ’ญ"],["dead","๐Ÿ’€"],["deal","๐Ÿค"],["deciduous_tree","๐ŸŒณ"],["deer","๐ŸฆŒ"],["delicious","๐Ÿ˜‹"],["department_store","๐Ÿฌ"],["derelict_house","๐Ÿš"],["desert","๐Ÿœ"],["desert_island","๐Ÿ"],["desktop_computer","๐Ÿ–ฅ"],["diamond_shape_with_a_dot_inside","๐Ÿ’ "],["diamonds","โ™ฆ๏ธ"],["disappointed","๐Ÿ˜ž"],["disappointed_relieved","๐Ÿ˜ฅ"],["dislike","๐Ÿ‘Ž"],["dizzy","๐Ÿ’ซ"],["dizzy_face","๐Ÿ˜ต"],["dna","๐Ÿงฌ"],["do_not_litter","๐Ÿšฏ"],["dog","๐Ÿถ"],["dog2","๐Ÿ•"],["dollar","๐Ÿ’ต"],["dolls","๐ŸŽŽ"],["dolphin","๐Ÿฌ"],["door","๐Ÿšช"],["doughnut","๐Ÿฉ"],["dove","๐Ÿ•Š"],["dragon","๐Ÿ‰"],["dragon_face","๐Ÿฒ"],["dream","๐Ÿ’ญ"],["dress","๐Ÿ‘—"],["dromedary_camel","๐Ÿช"],["drooling_face","๐Ÿคค"],["droplet","๐Ÿ’ง"],["drum","๐Ÿฅ"],["duck","๐Ÿฆ†"],["dumpling","๐ŸฅŸ"],["dvd","๐Ÿ“€"]],"e":[["e-mail","๐Ÿ“ง"],["eagle","๐Ÿฆ…"],["ear","๐Ÿ‘‚"],["ear_of_rice","๐ŸŒพ"],["earth_africa","๐ŸŒ"],["earth_americas","๐ŸŒŽ"],["earth_asia","๐ŸŒ"],["egg","๐Ÿฅš"],["eggplant","๐Ÿ†"],["eight","8๏ธโƒฃ"],["eight_pointed_black_star","โœด๏ธ"],["eight_spoked_asterisk","โœณ๏ธ"],["eject_button","โ๏ธ"],["electric_plug","๐Ÿ”Œ"],["elephant","๐Ÿ˜"],["email","โœ‰๏ธ"],["end","๐Ÿ”š"],["england","๐Ÿด๓ ง๓ ข๓ ฅ๓ ฎ๓ ง๓ ฟ"],["envelope_with_arrow","๐Ÿ“ฉ"],["euro","๐Ÿ’ถ"],["european_castle","๐Ÿฐ"],["european_post_office","๐Ÿค"],["evergreen_tree","๐ŸŒฒ"],["ew","๐Ÿคฎ"],["exclamation","โ—"],["exhausted","๐Ÿฅฑ"],["explode","๐Ÿ’ฅ"],["exploding_head","๐Ÿคฏ"],["expressionless","๐Ÿ˜‘"],["eye","๐Ÿ‘"],["eyeglasses","๐Ÿ‘“"],["eyes","๐Ÿ‘€"]],"f":[["face_with_head_bandage","๐Ÿค•"],["face_with_thermometer","๐Ÿค’"],["facepalm","๐Ÿคฆ"],["facepunch","๐Ÿ‘Š"],["factory","๐Ÿญ"],["fallen_leaf","๐Ÿ‚"],["family_man_boy","๐Ÿ‘จโ€๐Ÿ‘ฆ"],["family_man_boy_boy","๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ"],["family_man_girl","๐Ÿ‘จโ€๐Ÿ‘ง"],["family_man_girl_boy","๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ"],["family_man_girl_girl","๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง"],["family_man_man_boy","๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆ"],["family_man_man_boy_boy","๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ"],["family_man_man_girl","๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ง"],["family_man_man_girl_boy","๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ"],["family_man_man_girl_girl","๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง"],["family_man_woman_boy","๐Ÿ‘ช"],["family_man_woman_boy_boy","๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ"],["family_man_woman_girl","๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง"],["family_man_woman_girl_boy","๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ"],["family_man_woman_girl_girl","๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง"],["family_woman_boy","๐Ÿ‘ฉโ€๐Ÿ‘ฆ"],["family_woman_boy_boy","๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ"],["family_woman_girl","๐Ÿ‘ฉโ€๐Ÿ‘ง"],["family_woman_girl_boy","๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ"],["family_woman_girl_girl","๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง"],["family_woman_woman_boy","๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ"],["family_woman_woman_boy_boy","๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ"],["family_woman_woman_girl","๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ง"],["family_woman_woman_girl_boy","๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ"],["family_woman_woman_girl_girl","๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง"],["fart","๐Ÿ’จ"],["fast_forward","โฉ"],["fax","๐Ÿ“ "],["fearful","๐Ÿ˜จ"],["female_detective","๐Ÿ•ต๏ธโ€โ™€๏ธ"],["ferris_wheel","๐ŸŽก"],["ferry","โ›ด"],["field_hockey","๐Ÿ‘"],["file_cabinet","๐Ÿ—„"],["file_folder","๐Ÿ“"],["film_projector","๐Ÿ“ฝ"],["film_strip","๐ŸŽž"],["fingers_crossed","๐Ÿคž"],["fire","๐Ÿ”ฅ"],["fire_engine","๐Ÿš’"],["fire_extinguisher","๐Ÿงฏ"],["firecracker","๐Ÿงจ"],["fireworks","๐ŸŽ†"],["first_quarter_moon","๐ŸŒ“"],["first_quarter_moon_with_face","๐ŸŒ›"],["fish","๐ŸŸ"],["fish_cake","๐Ÿฅ"],["fishing_pole_and_fish","๐ŸŽฃ"],["fist","โœŠ"],["fist_left","๐Ÿค›"],["fist_right","๐Ÿคœ"],["fistbump","๐Ÿ‘Š"],["five","5๏ธโƒฃ"],["flags","๐ŸŽ"],["flashlight","๐Ÿ”ฆ"],["flat_shoe","๐Ÿฅฟ"],["fleek","๐Ÿ’ฏ"],["fleur_de_lis","โšœ"],["flight_arrival","๐Ÿ›ฌ"],["flight_departure","๐Ÿ›ซ"],["floppy_disk","๐Ÿ’พ"],["flower_playing_cards","๐ŸŽด"],["flushed","๐Ÿ˜ณ"],["flying_disc","๐Ÿฅ"],["flying_saucer","๐Ÿ›ธ"],["fml","๐Ÿ’ฉ"],["fog","๐ŸŒซ"],["foggy","๐ŸŒ"],["foot","๐Ÿฆถ"],["football","๐Ÿˆ"],["footprints","๐Ÿ‘ฃ"],["fork_and_knife","๐Ÿด"],["fortune_cookie","๐Ÿฅ "],["fountain","โ›ฒ"],["fountain_pen","๐Ÿ–‹"],["four","4๏ธโƒฃ"],["four_leaf_clover","๐Ÿ€"],["fox_face","๐ŸฆŠ"],["fr","๐Ÿ’ฏ"],["framed_picture","๐Ÿ–ผ"],["free","๐Ÿ†“"],["fried_egg","๐Ÿณ"],["fried_shrimp","๐Ÿค"],["fries","๐ŸŸ"],["frog","๐Ÿธ"],["frowning","๐Ÿ˜ฆ"],["frowning_face","โ˜น"],["frowning_man","๐Ÿ™โ€โ™‚๏ธ"],["frowning_woman","๐Ÿ™"],["ftw","๐Ÿ†"],["fu","๐Ÿ–•"],["fuelpump","โ›ฝ"],["full_moon","๐ŸŒ•"],["full_moon_with_face","๐ŸŒ"],["funeral_urn","โšฑ"]],"g":[["game_die","๐ŸŽฒ"],["gasp","๐Ÿ˜ฎ"],["gear","โš™"],["gem","๐Ÿ’Ž"],["gemini","โ™Š"],["germs","๐Ÿ˜ท"],["gg","๐Ÿ†"],["ghost","๐Ÿ‘ป"],["gift","๐ŸŽ"],["gift_heart","๐Ÿ’"],["giraffe","๐Ÿฆ’"],["girl","๐Ÿ‘ง"],["gj","๐Ÿ‘"],["globe_with_meridians","๐ŸŒ"],["gloves","๐Ÿงค"],["gm","โ˜€๏ธ"],["gn","๐Ÿ˜ด"],["gnight","๐Ÿ˜ด"],["goal_net","๐Ÿฅ…"],["goat","๐Ÿ"],["goggles","๐Ÿฅฝ"],["golf","โ›ณ"],["golfing_man","๐ŸŒ"],["golfing_woman","๐ŸŒ๏ธโ€โ™€๏ธ"],["goodjob","๐Ÿ‘"],["goodmorning","โ˜€๏ธ"],["goodnight","๐Ÿ˜ด"],["gorilla","๐Ÿฆ"],["gotcha","๐Ÿ‘Œ"],["grapes","๐Ÿ‡"],["grasshopper","๐Ÿฆ—"],["green_apple","๐Ÿ"],["green_book","๐Ÿ“—"],["green_heart","๐Ÿ’š"],["green_salad","๐Ÿฅ—"],["grey_exclamation","โ•"],["grey_question","โ”"],["grimacing","๐Ÿ˜ฌ"],["grin","๐Ÿ˜"],["grinning","๐Ÿ˜€"],["gtg","๐Ÿ‘‹"],["guardsman","๐Ÿ’‚"],["guardswoman","๐Ÿ’‚โ€โ™€๏ธ"],["guitar","๐ŸŽธ"],["gun","๐Ÿ”ซ"]],"h":[["haha","๐Ÿ˜†"],["hahaha","๐Ÿ˜†"],["haircut_man","๐Ÿ’‡โ€โ™‚๏ธ"],["haircut_woman","๐Ÿ’‡"],["hamburger","๐Ÿ”"],["hammer","๐Ÿ”จ"],["hammer_and_pick","โš’"],["hammer_and_wrench","๐Ÿ› "],["hamster","๐Ÿน"],["hand_over_mouth","๐Ÿคญ"],["handbag","๐Ÿ‘œ"],["handshake","๐Ÿค"],["hash","#๏ธโƒฃ"],["hatched_chick","๐Ÿฅ"],["hatching_chick","๐Ÿฃ"],["headphones","๐ŸŽง"],["hear_no_evil","๐Ÿ™‰"],["heart","โค๏ธ"],["heart_decoration","๐Ÿ’Ÿ"],["heart_eyes","๐Ÿ˜"],["heart_eyes_cat","๐Ÿ˜ป"],["heartbeat","๐Ÿ’“"],["heartpulse","๐Ÿ’—"],["hearts","โ™ฅ๏ธ"],["heavy_check_mark","โœ”๏ธ"],["heavy_division_sign","โž—"],["heavy_dollar_sign","๐Ÿ’ฒ"],["heavy_heart_exclamation","โฃ"],["heavy_minus_sign","โž–"],["heavy_multiplication_x","โœ–๏ธ"],["heavy_plus_sign","โž•"],["hedgehog","๐Ÿฆ”"],["helicopter","๐Ÿš"],["hello","๐Ÿ‘‹"],["herb","๐ŸŒฟ"],["hi","๐Ÿ‘‹"],["hibiscus","๐ŸŒบ"],["high_brightness","๐Ÿ”†"],["high_heel","๐Ÿ‘ "],["highfive","๐Ÿ™"],["hiking_boot","๐Ÿฅพ"],["hippopotamus","๐Ÿฆ›"],["hmm","๐Ÿค”"],["hocho","๐Ÿ”ช"],["hole","๐Ÿ•ณ"],["honey_pot","๐Ÿฏ"],["honeybee","๐Ÿ"],["hooray","๐Ÿ™Œ"],["horse","๐Ÿด"],["horse_racing","๐Ÿ‡"],["hospital","๐Ÿฅ"],["hot","๐Ÿฅต"],["hot_pepper","๐ŸŒถ"],["hotdog","๐ŸŒญ"],["hotel","๐Ÿจ"],["hotsprings","โ™จ๏ธ"],["hourglass","โŒ›"],["hourglass_flowing_sand","โณ"],["house","๐Ÿ "],["house_with_garden","๐Ÿก"],["houses","๐Ÿ˜"],["hug","๐Ÿค—"],["hugs","๐Ÿค—"],["huh","๐Ÿคจ"],["hushed","๐Ÿ˜ฏ"]],"i":[["ice_cream","๐Ÿจ"],["ice_hockey","๐Ÿ’"],["ice_skate","โ›ธ"],["icecream","๐Ÿฆ"],["id","๐Ÿ†”"],["ideograph_advantage","๐Ÿ‰"],["idk","๐Ÿคท"],["ill","๐Ÿค’"],["ily","โค๏ธ"],["imp","๐Ÿ‘ฟ"],["inbox_tray","๐Ÿ“ฅ"],["incoming_envelope","๐Ÿ“จ"],["infinity","โ™พ"],["information_source","โ„น๏ธ"],["innocent","๐Ÿ˜‡"],["interrobang","โ‰๏ธ"],["intoxicated","๐Ÿฅด"],["iphone","๐Ÿ“ฑ"],["izakaya_lantern","๐Ÿฎ"]],"j":[["jack_o_lantern","๐ŸŽƒ"],["japan","๐Ÿ—พ"],["japanese_castle","๐Ÿฏ"],["japanese_goblin","๐Ÿ‘บ"],["japanese_ogre","๐Ÿ‘น"],["jealous","๐Ÿ˜’"],["jeans","๐Ÿ‘–"],["jelly","๐Ÿ˜’"],["jigsaw","๐Ÿงฉ"],["joke","๐Ÿ˜œ"],["joy","๐Ÿ˜‚"],["joy_cat","๐Ÿ˜น"],["joystick","๐Ÿ•น"]],"k":[["kaaba","๐Ÿ•‹"],["kangaroo","๐Ÿฆ˜"],["key","๐Ÿ”‘"],["keyboard","โŒจ"],["keycap_ten","๐Ÿ”Ÿ"],["kick_scooter","๐Ÿ›ด"],["kimono","๐Ÿ‘˜"],["kiss","๐Ÿ’‹"],["kissing","๐Ÿ˜—"],["kissing_cat","๐Ÿ˜ฝ"],["kissing_closed_eyes","๐Ÿ˜š"],["kissing_heart","๐Ÿ˜˜"],["kissing_smiling_eyes","๐Ÿ˜™"],["kiwi_fruit","๐Ÿฅ"],["knockedout","๐Ÿ˜ต"],["koala","๐Ÿจ"],["koko","๐Ÿˆ"]],"l":[["labcoat","๐Ÿฅผ"],["label","๐Ÿท"],["lacrosse","๐Ÿฅ"],["large_blue_circle","๐Ÿ”ต"],["large_blue_diamond","๐Ÿ”ท"],["large_orange_diamond","๐Ÿ”ถ"],["last_quarter_moon","๐ŸŒ—"],["last_quarter_moon_with_face","๐ŸŒœ"],["later","๐Ÿ‘‹"],["latin_cross","โœ"],["laughing","๐Ÿ˜†"],["leafy_greens","๐Ÿฅฌ"],["leaves","๐Ÿƒ"],["ledger","๐Ÿ“’"],["left_luggage","๐Ÿ›…"],["left_right_arrow","โ†”๏ธ"],["left_speech_bubble","๐Ÿ—จ"],["leftwards_arrow_with_hook","โ†ฉ๏ธ"],["leg","๐Ÿฆต"],["legit","๐Ÿ‘Œ"],["lemon","๐Ÿ‹"],["leo","โ™Œ"],["leopard","๐Ÿ†"],["level_slider","๐ŸŽš"],["libra","โ™Ž"],["light_rail","๐Ÿšˆ"],["link","๐Ÿ”—"],["lion","๐Ÿฆ"],["lips","๐Ÿ‘„"],["lipstick","๐Ÿ’„"],["lizard","๐ŸฆŽ"],["llama","๐Ÿฆ™"],["lmao","๐Ÿ˜‚"],["lmfao","๐Ÿคฃ"],["lobster","๐Ÿฆž"],["lock","๐Ÿ”’"],["lock_with_ink_pen","๐Ÿ”"],["lol","๐Ÿ˜‚"],["lollipop","๐Ÿญ"],["looking","๐Ÿ‘€"],["loop","โžฟ"],["lotion_bottle","๐Ÿงด"],["loud_sound","๐Ÿ”Š"],["loudspeaker","๐Ÿ“ข"],["love","โค๏ธ"],["love_hotel","๐Ÿฉ"],["love_letter","๐Ÿ’Œ"],["love_you","๐ŸคŸ"],["low_brightness","๐Ÿ”…"],["luggage","๐Ÿงณ"],["lying_face","๐Ÿคฅ"]],"m":[["m","โ“‚๏ธ"],["mad","๐Ÿ˜ก"],["mag","๐Ÿ”"],["mag_right","๐Ÿ”Ž"],["magnet","๐Ÿงฒ"],["mahjong","๐Ÿ€„"],["mailbox","๐Ÿ“ซ"],["mailbox_closed","๐Ÿ“ช"],["mailbox_with_mail","๐Ÿ“ฌ"],["mailbox_with_no_mail","๐Ÿ“ญ"],["male_detective","๐Ÿ•ต"],["man","๐Ÿ‘จ"],["man_artist","๐Ÿ‘จโ€๐ŸŽจ"],["man_astronaut","๐Ÿ‘จโ€๐Ÿš€"],["man_cartwheeling","๐Ÿคธโ€โ™‚๏ธ"],["man_cook","๐Ÿ‘จโ€๐Ÿณ"],["man_dancing","๐Ÿ•บ"],["man_elf","๐Ÿงโ€โ™‚๏ธ"],["man_facepalming","๐Ÿคฆโ€โ™‚๏ธ"],["man_factory_worker","๐Ÿ‘จโ€๐Ÿญ"],["man_fairy","๐Ÿงšโ€โ™‚๏ธ"],["man_farmer","๐Ÿ‘จโ€๐ŸŒพ"],["man_firefighter","๐Ÿ‘จโ€๐Ÿš’"],["man_genie","๐Ÿงžโ€โ™‚๏ธ"],["man_health_worker","๐Ÿ‘จโ€โš•๏ธ"],["man_in_lotus_position","๐Ÿง˜โ€โ™‚๏ธ"],["man_in_steamy_room","๐Ÿง–โ€โ™‚๏ธ"],["man_in_tuxedo","๐Ÿคต"],["man_judge","๐Ÿ‘จโ€โš–๏ธ"],["man_juggling","๐Ÿคนโ€โ™‚๏ธ"],["man_mechanic","๐Ÿ‘จโ€๐Ÿ”ง"],["man_office_worker","๐Ÿ‘จโ€๐Ÿ’ผ"],["man_pilot","๐Ÿ‘จโ€โœˆ๏ธ"],["man_playing_handball","๐Ÿคพโ€โ™‚๏ธ"],["man_playing_water_polo","๐Ÿคฝโ€โ™‚๏ธ"],["man_scientist","๐Ÿ‘จโ€๐Ÿ”ฌ"],["man_shrugging","๐Ÿคทโ€โ™‚๏ธ"],["man_singer","๐Ÿ‘จโ€๐ŸŽค"],["man_student","๐Ÿ‘จโ€๐ŸŽ“"],["man_superhero","๐Ÿฆธโ€โ™‚๏ธ"],["man_supervillain","๐Ÿฆนโ€โ™‚๏ธ"],["man_teacher","๐Ÿ‘จโ€๐Ÿซ"],["man_technologist","๐Ÿ‘จโ€๐Ÿ’ป"],["man_vampire","๐Ÿง›โ€โ™‚๏ธ"],["man_with_gua_pi_mao","๐Ÿ‘ฒ"],["man_with_turban","๐Ÿ‘ณ"],["man_zombie","๐ŸงŸโ€โ™‚๏ธ"],["mango","๐Ÿฅญ"],["mans_shoe","๐Ÿ‘ž"],["mantelpiece_clock","๐Ÿ•ฐ"],["maple_leaf","๐Ÿ"],["martial_arts_uniform","๐Ÿฅ‹"],["mask","๐Ÿ˜ท"],["massage_man","๐Ÿ’†โ€โ™‚๏ธ"],["massage_woman","๐Ÿ’†"],["meat_on_bone","๐Ÿ–"],["medal_military","๐ŸŽ–"],["medal_sports","๐Ÿ…"],["mega","๐Ÿ“ฃ"],["meh","๐Ÿ˜"],["melon","๐Ÿˆ"],["memo","๐Ÿ“"],["men_wrestling","๐Ÿคผโ€โ™‚๏ธ"],["menorah","๐Ÿ•Ž"],["mens","๐Ÿšน"],["mermaid","๐Ÿงœโ€โ™€๏ธ"],["merman","๐Ÿงœโ€โ™‚๏ธ"],["metal","๐Ÿค˜"],["metro","๐Ÿš‡"],["microbe","๐Ÿฆ "],["microphone","๐ŸŽค"],["microscope","๐Ÿ”ฌ"],["milk_glass","๐Ÿฅ›"],["milky_way","๐ŸŒŒ"],["mindblown","๐Ÿคฏ"],["minibus","๐Ÿš"],["minidisc","๐Ÿ’ฝ"],["mobile_phone_off","๐Ÿ“ด"],["money_mouth_face","๐Ÿค‘"],["money_with_wings","๐Ÿ’ธ"],["moneybag","๐Ÿ’ฐ"],["monkey","๐Ÿ’"],["monkey_face","๐Ÿต"],["monocle","๐Ÿง"],["monorail","๐Ÿš"],["moon_cake","๐Ÿฅฎ"],["morning","โ˜€๏ธ"],["mortar_board","๐ŸŽ“"],["mosque","๐Ÿ•Œ"],["mosquito","๐ŸฆŸ"],["motor_boat","๐Ÿ›ฅ"],["motor_scooter","๐Ÿ›ต"],["motorcycle","๐Ÿ"],["motorway","๐Ÿ›ฃ"],["mount_fuji","๐Ÿ—ป"],["mountain","โ›ฐ"],["mountain_biking_man","๐Ÿšต"],["mountain_biking_woman","๐Ÿšตโ€โ™€๏ธ"],["mountain_cableway","๐Ÿš "],["mountain_railway","๐Ÿšž"],["mountain_snow","๐Ÿ”"],["mouse","๐Ÿญ"],["mouse2","๐Ÿ"],["movie_camera","๐ŸŽฅ"],["moyai","๐Ÿ—ฟ"],["mrs_claus","๐Ÿคถ"],["muah","๐Ÿ˜˜"],["muscle","๐Ÿ’ช"],["mushroom","๐Ÿ„"],["musical_keyboard","๐ŸŽน"],["musical_note","๐ŸŽต"],["musical_score","๐ŸŽผ"],["mute","๐Ÿ”‡"]],"n":[["nah","๐Ÿ‘Ž"],["nail_care","๐Ÿ’…"],["name_badge","๐Ÿ“›"],["nap","๐Ÿ˜ด"],["national_park","๐Ÿž"],["nauseated_face","๐Ÿคข"],["nazar_amulet","๐Ÿงฟ"],["necktie","๐Ÿ‘”"],["negative_squared_cross_mark","โŽ"],["nerd_face","๐Ÿค“"],["nervous","๐Ÿ˜…"],["neutral_face","๐Ÿ˜"],["new","๐Ÿ†•"],["new_moon","๐ŸŒ‘"],["new_moon_with_face","๐ŸŒš"],["newspaper","๐Ÿ“ฐ"],["newspaper_roll","๐Ÿ—ž"],["next_track_button","โญ"],["ng","๐Ÿ†–"],["night_with_stars","๐ŸŒƒ"],["nighty","๐Ÿ˜ด"],["nine","9๏ธโƒฃ"],["no_bell","๐Ÿ”•"],["no_bicycles","๐Ÿšณ"],["no_entry","โ›”"],["no_entry_sign","๐Ÿšซ"],["no_good_man","๐Ÿ™…โ€โ™‚๏ธ"],["no_good_woman","๐Ÿ™…"],["no_mobile_phones","๐Ÿ“ต"],["no_mouth","๐Ÿ˜ถ"],["no_pedestrians","๐Ÿšท"],["no_smoking","๐Ÿšญ"],["non-potable_water","๐Ÿšฑ"],["nope","๐Ÿ‘Ž"],["noped","๐Ÿ‘Ž"],["nose","๐Ÿ‘ƒ"],["notebook","๐Ÿ““"],["notebook_with_decorative_cover","๐Ÿ“”"],["noted","๐Ÿ“"],["notes","๐ŸŽถ"],["nut_and_bolt","๐Ÿ”ฉ"],["nvm","๐Ÿคท"]],"o":[["o","โญ•"],["o2","๐Ÿ…พ๏ธ"],["ocean","๐ŸŒŠ"],["octopus","๐Ÿ™"],["oden","๐Ÿข"],["office","๐Ÿข"],["oil_drum","๐Ÿ›ข"],["ok","๐Ÿ†—"],["ok_hand","๐Ÿ‘Œ"],["ok_man","๐Ÿ™†โ€โ™‚๏ธ"],["ok_woman","๐Ÿ™†"],["old_key","๐Ÿ—"],["older_adult","๐Ÿง“"],["older_man","๐Ÿ‘ด"],["older_woman","๐Ÿ‘ต"],["om","๐Ÿ•‰"],["omg","๐Ÿ˜ฑ"],["on","๐Ÿ”›"],["oncoming_automobile","๐Ÿš˜"],["oncoming_bus","๐Ÿš"],["oncoming_police_car","๐Ÿš”"],["oncoming_taxi","๐Ÿš–"],["one","1๏ธโƒฃ"],["oof","๐Ÿ˜ฌ"],["oops","๐Ÿ˜ฌ"],["open_book","๐Ÿ“–"],["open_file_folder","๐Ÿ“‚"],["open_hands","๐Ÿ‘"],["open_mouth","๐Ÿ˜ฎ"],["open_umbrella","โ˜‚"],["ophiuchus","โ›Ž"],["orange_book","๐Ÿ“™"],["orange_heart","๐Ÿงก"],["orthodox_cross","โ˜ฆ"],["ouch","๐Ÿค•"],["outbox_tray","๐Ÿ“ค"],["owl","๐Ÿฆ‰"],["ox","๐Ÿ‚"]],"p":[["package","๐Ÿ“ฆ"],["page_facing_up","๐Ÿ“„"],["page_with_curl","๐Ÿ“ƒ"],["pager","๐Ÿ“Ÿ"],["paintbrush","๐Ÿ–Œ"],["palm_tree","๐ŸŒด"],["palms_up","๐Ÿคฒ"],["pancakes","๐Ÿฅž"],["panda_face","๐Ÿผ"],["paperclip","๐Ÿ“Ž"],["paperclips","๐Ÿ–‡"],["parasol_on_ground","โ›ฑ"],["parking","๐Ÿ…ฟ๏ธ"],["parrot","๐Ÿฆœ"],["part_alternation_mark","ใ€ฝ๏ธ"],["partly_sunny","โ›…"],["party","๐Ÿฅณ"],["partying","๐Ÿฅณ"],["passenger_ship","๐Ÿ›ณ"],["passport_control","๐Ÿ›‚"],["pause_button","โธ"],["paw_prints","๐Ÿพ"],["peace","โœŒ"],["peace_symbol","โ˜ฎ"],["peach","๐Ÿ‘"],["peacock","๐Ÿฆš"],["peanuts","๐Ÿฅœ"],["pear","๐Ÿ"],["peep","๐Ÿ‘€"],["pen","๐Ÿ–Š"],["pencil2","โœ๏ธ"],["penguin","๐Ÿง"],["pensive","๐Ÿ˜”"],["performing_arts","๐ŸŽญ"],["persevere","๐Ÿ˜ฃ"],["person_fencing","๐Ÿคบ"],["petri_dish","๐Ÿงซ"],["phone","โ˜Ž๏ธ"],["pick","โ›"],["pie","๐Ÿฅง"],["pig","๐Ÿท"],["pig2","๐Ÿ–"],["pig_nose","๐Ÿฝ"],["pill","๐Ÿ’Š"],["pineapple","๐Ÿ"],["ping_pong","๐Ÿ“"],["pirate_flag","๐Ÿดโ€โ˜ ๏ธ"],["pisces","โ™“"],["pissed","๐Ÿคฌ"],["pizza","๐Ÿ•"],["place_of_worship","๐Ÿ›"],["plate_with_cutlery","๐Ÿฝ"],["play_or_pause_button","โฏ"],["pleading","๐Ÿฅบ"],["pls","๐Ÿ™"],["plz","๐Ÿ™"],["point_down","๐Ÿ‘‡"],["point_left","๐Ÿ‘ˆ"],["point_right","๐Ÿ‘‰"],["point_up","โ˜"],["point_up_2","๐Ÿ‘†"],["police_car","๐Ÿš“"],["policeman","๐Ÿ‘ฎ"],["policewoman","๐Ÿ‘ฎโ€โ™€๏ธ"],["poodle","๐Ÿฉ"],["poop","๐Ÿ’ฉ"],["popcorn","๐Ÿฟ"],["post_office","๐Ÿฃ"],["postal_horn","๐Ÿ“ฏ"],["postbox","๐Ÿ“ฎ"],["potable_water","๐Ÿšฐ"],["potato","๐Ÿฅ”"],["pouch","๐Ÿ‘"],["poultry_leg","๐Ÿ—"],["pound","๐Ÿ’ท"],["pouting_cat","๐Ÿ˜พ"],["pouting_man","๐Ÿ™Žโ€โ™‚๏ธ"],["pouting_woman","๐Ÿ™Ž"],["praise","๐Ÿ™Œ"],["pray","๐Ÿ™"],["prayer_beads","๐Ÿ“ฟ"],["pregnant_woman","๐Ÿคฐ"],["pretzel","๐Ÿฅจ"],["previous_track_button","โฎ"],["prince","๐Ÿคด"],["princess","๐Ÿ‘ธ"],["printer","๐Ÿ–จ"],["puke","๐Ÿคฎ"],["punch","๐Ÿ‘Š"],["purple_heart","๐Ÿ’œ"],["purse","๐Ÿ‘›"],["pushpin","๐Ÿ“Œ"],["put_litter_in_its_place","๐Ÿšฎ"]],"q":[["question","โ“"]],"r":[["rabbit","๐Ÿฐ"],["rabbit2","๐Ÿ‡"],["raccoon","๐Ÿฆ"],["racehorse","๐ŸŽ"],["racing_car","๐ŸŽ"],["rad","๐Ÿ˜Ž"],["radio","๐Ÿ“ป"],["radio_button","๐Ÿ”˜"],["radioactive","โ˜ข"],["rage","๐Ÿ˜ก"],["railway_car","๐Ÿšƒ"],["railway_track","๐Ÿ›ค"],["rainbow","๐ŸŒˆ"],["rainbow_flag","๐Ÿณ๏ธโ€๐ŸŒˆ"],["raised_back_of_hand","๐Ÿคš"],["raised_eyebrow","๐Ÿคจ"],["raised_hand","โœ‹"],["raised_hand_with_fingers_splayed","๐Ÿ–"],["raised_hands","๐Ÿ™Œ"],["raising_hand_man","๐Ÿ™‹โ€โ™‚๏ธ"],["raising_hand_woman","๐Ÿ™‹"],["ram","๐Ÿ"],["ramen","๐Ÿœ"],["rat","๐Ÿ€"],["receipt","๐Ÿงพ"],["record_button","โบ"],["recycle","โ™ป๏ธ"],["red_car","๐Ÿš—"],["red_circle","๐Ÿ”ด"],["red_envelope","๐Ÿงง"],["registered","ยฎ๏ธ"],["relaxed","โ˜บ๏ธ"],["relieved","๐Ÿ˜Œ"],["reminder_ribbon","๐ŸŽ—"],["repeat","๐Ÿ”"],["repeat_one","๐Ÿ”‚"],["rescue_worker_helmet","โ›‘"],["restroom","๐Ÿšป"],["revolving_hearts","๐Ÿ’ž"],["rewind","โช"],["rhinoceros","๐Ÿฆ"],["ribbon","๐ŸŽ€"],["rice","๐Ÿš"],["rice_ball","๐Ÿ™"],["rice_cracker","๐Ÿ˜"],["rice_scene","๐ŸŽ‘"],["right_anger_bubble","๐Ÿ—ฏ"],["ring","๐Ÿ’"],["rip","โšฐ๏ธ"],["robot","๐Ÿค–"],["rocket","๐Ÿš€"],["rockon","๐Ÿค˜"],["rofl","๐Ÿคฃ"],["roll_eyes","๐Ÿ™„"],["roller_coaster","๐ŸŽข"],["rooster","๐Ÿ“"],["rose","๐ŸŒน"],["rosette","๐Ÿต"],["rotating_light","๐Ÿšจ"],["round_pushpin","๐Ÿ“"],["rowing_man","๐Ÿšฃ"],["rowing_woman","๐Ÿšฃโ€โ™€๏ธ"],["rugby_football","๐Ÿ‰"],["running_man","๐Ÿƒ"],["running_shirt_with_sash","๐ŸŽฝ"],["running_woman","๐Ÿƒโ€โ™€๏ธ"]],"s":[["sa","๐Ÿˆ‚๏ธ"],["safety_pin","๐Ÿงท"],["sagittarius","โ™"],["sailboat","โ›ต"],["sake","๐Ÿถ"],["salt","๐Ÿง‚"],["sandal","๐Ÿ‘ก"],["sandwich","๐Ÿฅช"],["santa","๐ŸŽ…"],["satellite","๐Ÿ“ก"],["sauropod","๐Ÿฆ•"],["saxophone","๐ŸŽท"],["scared","๐Ÿ˜จ"],["scarf","๐Ÿงฃ"],["school","๐Ÿซ"],["school_satchel","๐ŸŽ’"],["scissors","โœ‚๏ธ"],["scorpion","๐Ÿฆ‚"],["scorpius","โ™"],["scotland","๐Ÿด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ"],["scream","๐Ÿ˜ฑ"],["scream_cat","๐Ÿ™€"],["scroll","๐Ÿ“œ"],["seat","๐Ÿ’บ"],["secret","ใŠ™๏ธ"],["see_no_evil","๐Ÿ™ˆ"],["seedling","๐ŸŒฑ"],["selfie","๐Ÿคณ"],["seven","7๏ธโƒฃ"],["shallow_pan_of_food","๐Ÿฅ˜"],["shamrock","โ˜˜"],["shark","๐Ÿฆˆ"],["shaved_ice","๐Ÿง"],["sheep","๐Ÿ‘"],["shell","๐Ÿš"],["shh","๐Ÿคซ"],["shield","๐Ÿ›ก"],["shinto_shrine","โ›ฉ"],["ship","๐Ÿšข"],["shocked","๐Ÿ˜ฑ"],["shopping","๐Ÿ›"],["shopping_cart","๐Ÿ›’"],["shower","๐Ÿšฟ"],["shrimp","๐Ÿฆ"],["shrug","๐Ÿคท"],["shushing","๐Ÿคซ"],["shut","๐Ÿค"],["sick","๐Ÿค’"],["signal_strength","๐Ÿ“ถ"],["silly","๐Ÿ˜œ"],["six","6๏ธโƒฃ"],["six_pointed_star","๐Ÿ”ฏ"],["skateboard","๐Ÿ›น"],["ski","๐ŸŽฟ"],["skier","โ›ท"],["skull","๐Ÿ’€"],["skull_and_crossbones","โ˜ "],["slay","๐Ÿ˜Ž"],["sled","๐Ÿ›ท"],["sleep","๐Ÿ’ค"],["sleeping","๐Ÿ˜ด"],["sleeping_bed","๐Ÿ›Œ"],["sleepy","๐Ÿ˜ช"],["slightly_frowning_face","๐Ÿ™"],["slightly_smiling_face","๐Ÿ™‚"],["slot_machine","๐ŸŽฐ"],["small_airplane","๐Ÿ›ฉ"],["small_blue_diamond","๐Ÿ”น"],["small_orange_diamond","๐Ÿ”ธ"],["small_red_triangle","๐Ÿ”บ"],["small_red_triangle_down","๐Ÿ”ป"],["smh","๐Ÿคฆ"],["smile","๐Ÿ˜„"],["smile_cat","๐Ÿ˜ธ"],["smiley","๐Ÿ˜ƒ"],["smiley_cat","๐Ÿ˜บ"],["smiling_face_with_three_hearts","๐Ÿฅฐ"],["smiling_imp","๐Ÿ˜ˆ"],["smirk","๐Ÿ˜"],["smirk_cat","๐Ÿ˜ผ"],["smoking","๐Ÿšฌ"],["snail","๐ŸŒ"],["snake","๐Ÿ"],["sneezing_face","๐Ÿคง"],["snooze","๐Ÿ’ค"],["snowboarder","๐Ÿ‚"],["snowflake","โ„๏ธ"],["snowman","โ›„"],["snowman_with_snow","โ˜ƒ"],["soap","๐Ÿงผ"],["sob","๐Ÿ˜ญ"],["soccer","โšฝ"],["socks","๐Ÿงฆ"],["softball","๐ŸฅŽ"],["soon","๐Ÿ”œ"],["sorceress","๐Ÿง™โ€โ™€๏ธ"],["sos","๐Ÿ†˜"],["sound","๐Ÿ”‰"],["space_invader","๐Ÿ‘พ"],["spades","โ™ ๏ธ"],["spaghetti","๐Ÿ"],["sparkle","โ‡๏ธ"],["sparkler","๐ŸŽ‡"],["sparkles","โœจ"],["sparkling_heart","๐Ÿ’–"],["speak_no_evil","๐Ÿ™Š"],["speaker","๐Ÿ”ˆ"],["speaking_head","๐Ÿ—ฃ"],["speech_balloon","๐Ÿ’ฌ"],["speechless","๐Ÿ˜ถ"],["speedboat","๐Ÿšค"],["spider","๐Ÿ•ท"],["spider_web","๐Ÿ•ธ"],["spiral_calendar","๐Ÿ—“"],["spiral_notepad","๐Ÿ—’"],["sponge","๐Ÿงฝ"],["spoon","๐Ÿฅ„"],["squid","๐Ÿฆ‘"],["stadium","๐ŸŸ"],["star","โญ"],["star2","๐ŸŒŸ"],["star_and_crescent","โ˜ช"],["star_of_david","โœก"],["star_struck","๐Ÿคฉ"],["stars","๐ŸŒ "],["station","๐Ÿš‰"],["statue_of_liberty","๐Ÿ—ฝ"],["steak","๐Ÿฅฉ"],["steam_locomotive","๐Ÿš‚"],["stew","๐Ÿฒ"],["stop_button","โน"],["stop_sign","๐Ÿ›‘"],["stopwatch","โฑ"],["straight_ruler","๐Ÿ“"],["strawberry","๐Ÿ“"],["stuck_out_tongue","๐Ÿ˜›"],["stuck_out_tongue_closed_eyes","๐Ÿ˜"],["stuck_out_tongue_winking_eye","๐Ÿ˜œ"],["studio_microphone","๐ŸŽ™"],["stuffed_flatbread","๐Ÿฅ™"],["sun_behind_large_cloud","๐ŸŒฅ"],["sun_behind_rain_cloud","๐ŸŒฆ"],["sun_behind_small_cloud","๐ŸŒค"],["sun_with_face","๐ŸŒž"],["sunflower","๐ŸŒป"],["sunglasses","๐Ÿ˜Ž"],["sunny","โ˜€๏ธ"],["sunrise","๐ŸŒ…"],["sunrise_over_mountains","๐ŸŒ„"],["surfing_man","๐Ÿ„"],["surfing_woman","๐Ÿ„โ€โ™€๏ธ"],["sus","๐Ÿคจ"],["sushi","๐Ÿฃ"],["suspension_railway","๐ŸšŸ"],["swag","๐Ÿ˜Ž"],["swan","๐Ÿฆข"],["sweat","๐Ÿ˜“"],["sweat_drops","๐Ÿ’ฆ"],["sweat_smile","๐Ÿ˜…"],["sweet_potato","๐Ÿ "],["swimming_man","๐ŸŠ"],["swimming_woman","๐ŸŠโ€โ™€๏ธ"],["symbols","๐Ÿ”ฃ"],["symbols_over_mouth","๐Ÿคฌ"],["synagogue","๐Ÿ•"],["syringe","๐Ÿ’‰"]],"t":[["t-rex","๐Ÿฆ–"],["taco","๐ŸŒฎ"],["tada","๐ŸŽ‰"],["takeout_box","๐Ÿฅก"],["tanabata_tree","๐ŸŽ‹"],["tangerine","๐ŸŠ"],["tasty","๐Ÿ˜‹"],["taurus","โ™‰"],["taxi","๐Ÿš•"],["tea","๐Ÿต"],["teddy_bear","๐Ÿงธ"],["telephone_receiver","๐Ÿ“ž"],["telescope","๐Ÿ”ญ"],["tennis","๐ŸŽพ"],["tent","โ›บ"],["test_tube","๐Ÿงช"],["text","๐Ÿ’ฌ"],["thanks","๐Ÿ™"],["thermometer","๐ŸŒก"],["think","๐Ÿ’ญ"],["thinking","๐Ÿค”"],["thought_balloon","๐Ÿ’ญ"],["thread","๐Ÿงต"],["three","3๏ธโƒฃ"],["thumbsdown","๐Ÿ‘Ž"],["thumbsup","๐Ÿ‘"],["thx","๐Ÿ™"],["ticket","๐ŸŽซ"],["tickets","๐ŸŽŸ"],["tiger","๐Ÿฏ"],["tiger2","๐Ÿ…"],["timer_clock","โฒ"],["tipping_hand_man","๐Ÿ’โ€โ™‚๏ธ"],["tipping_hand_woman","๐Ÿ’"],["tipsy","๐Ÿฅด"],["tired","๐Ÿ˜ด"],["tired_face","๐Ÿ˜ซ"],["tm","โ„ข๏ธ"],["toilet","๐Ÿšฝ"],["toilet_paper","๐Ÿงป"],["tokyo_tower","๐Ÿ—ผ"],["tomato","๐Ÿ…"],["tongue","๐Ÿ‘…"],["toolbox","๐Ÿงฐ"],["tooth","๐Ÿฆท"],["top","๐Ÿ”"],["tophat","๐ŸŽฉ"],["tornado","๐ŸŒช"],["trackball","๐Ÿ–ฒ"],["tractor","๐Ÿšœ"],["traffic_light","๐Ÿšฅ"],["train","๐Ÿš‹"],["train2","๐Ÿš†"],["tram","๐ŸšŠ"],["triangular_flag_on_post","๐Ÿšฉ"],["triangular_ruler","๐Ÿ“"],["trident","๐Ÿ”ฑ"],["triumph","๐Ÿ˜ค"],["trolleybus","๐ŸšŽ"],["trophy","๐Ÿ†"],["tropical_drink","๐Ÿน"],["tropical_fish","๐Ÿ "],["truck","๐Ÿšš"],["trumpet","๐ŸŽบ"],["tshirt","๐Ÿ‘•"],["ttyl","๐Ÿ‘‹"],["tulip","๐ŸŒท"],["tumbler_glass","๐Ÿฅƒ"],["turkey","๐Ÿฆƒ"],["turtle","๐Ÿข"],["tv","๐Ÿ“บ"],["twisted_rightwards_arrows","๐Ÿ”€"],["two","2๏ธโƒฃ"],["two_hearts","๐Ÿ’•"],["two_men_holding_hands","๐Ÿ‘ฌ"],["two_women_holding_hands","๐Ÿ‘ญ"],["ty","๐Ÿ™"],["typing","๐Ÿ’ฌ"]],"u":[["u5272","๐Ÿˆน"],["u5408","๐Ÿˆด"],["u55b6","๐Ÿˆบ"],["u6307","๐Ÿˆฏ"],["u6708","๐Ÿˆท๏ธ"],["u6709","๐Ÿˆถ"],["u6e80","๐Ÿˆต"],["u7121","๐Ÿˆš"],["u7533","๐Ÿˆธ"],["u7981","๐Ÿˆฒ"],["u7a7a","๐Ÿˆณ"],["ugh","๐Ÿ™„"],["umbrella","โ˜”"],["unamused","๐Ÿ˜’"],["underage","๐Ÿ”ž"],["unicorn","๐Ÿฆ„"],["unlock","๐Ÿ”“"],["up","๐Ÿ†™"],["upside_down_face","๐Ÿ™ƒ"]],"v":[["v","โœŒ"],["vertical_traffic_light","๐Ÿšฆ"],["vhs","๐Ÿ“ผ"],["vibration_mode","๐Ÿ“ณ"],["video_camera","๐Ÿ“น"],["video_game","๐ŸŽฎ"],["violin","๐ŸŽป"],["virgo","โ™"],["volcano","๐ŸŒ‹"],["volleyball","๐Ÿ"],["vomiting","๐Ÿคฎ"],["vs","๐Ÿ†š"],["vulcan_salute","๐Ÿ––"]],"w":[["wales","๐Ÿด๓ ง๓ ข๓ ท๓ ฌ๓ ณ๓ ฟ"],["walking_man","๐Ÿšถ"],["walking_woman","๐Ÿšถโ€โ™€๏ธ"],["waning_crescent_moon","๐ŸŒ˜"],["waning_gibbous_moon","๐ŸŒ–"],["warning","โš ๏ธ"],["wastebasket","๐Ÿ—‘"],["watch","โŒš"],["water_buffalo","๐Ÿƒ"],["watermelon","๐Ÿ‰"],["wave","๐Ÿ‘‹"],["wavy_dash","ใ€ฐ๏ธ"],["waxing_crescent_moon","๐ŸŒ’"],["waxing_gibbous_moon","๐ŸŒ”"],["wc","๐Ÿšพ"],["weary","๐Ÿ˜ฉ"],["wedding","๐Ÿ’’"],["weight_lifting_man","๐Ÿ‹"],["weight_lifting_woman","๐Ÿ‹๏ธโ€โ™€๏ธ"],["weirdo","๐Ÿ˜œ"],["whale","๐Ÿณ"],["whale2","๐Ÿ‹"],["whatever","๐Ÿ™„"],["wheel_of_dharma","โ˜ธ"],["wheelchair","โ™ฟ"],["white_check_mark","โœ…"],["white_circle","โšช"],["white_flag","๐Ÿณ"],["white_flower","๐Ÿ’ฎ"],["white_large_square","โฌœ"],["white_medium_small_square","โ—ฝ"],["white_medium_square","โ—ป๏ธ"],["white_small_square","โ–ซ๏ธ"],["white_square_button","๐Ÿ”ณ"],["whoa","๐Ÿ˜ฏ"],["wilted_flower","๐Ÿฅ€"],["wind_chime","๐ŸŽ"],["wind_face","๐ŸŒฌ"],["wine_glass","๐Ÿท"],["wink","๐Ÿ˜‰"],["wizard","๐Ÿง™โ€โ™‚๏ธ"],["woah","๐Ÿ˜ฑ"],["wolf","๐Ÿบ"],["woman","๐Ÿ‘ฉ"],["woman_artist","๐Ÿ‘ฉโ€๐ŸŽจ"],["woman_astronaut","๐Ÿ‘ฉโ€๐Ÿš€"],["woman_cartwheeling","๐Ÿคธโ€โ™€๏ธ"],["woman_cook","๐Ÿ‘ฉโ€๐Ÿณ"],["woman_elf","๐Ÿงโ€โ™€๏ธ"],["woman_facepalming","๐Ÿคฆโ€โ™€๏ธ"],["woman_factory_worker","๐Ÿ‘ฉโ€๐Ÿญ"],["woman_fairy","๐Ÿงšโ€โ™€๏ธ"],["woman_farmer","๐Ÿ‘ฉโ€๐ŸŒพ"],["woman_firefighter","๐Ÿ‘ฉโ€๐Ÿš’"],["woman_genie","๐Ÿงžโ€โ™€๏ธ"],["woman_health_worker","๐Ÿ‘ฉโ€โš•๏ธ"],["woman_in_lotus_position","๐Ÿง˜โ€โ™€๏ธ"],["woman_in_steamy_room","๐Ÿง–โ€โ™€๏ธ"],["woman_judge","๐Ÿ‘ฉโ€โš–๏ธ"],["woman_juggling","๐Ÿคนโ€โ™€๏ธ"],["woman_mechanic","๐Ÿ‘ฉโ€๐Ÿ”ง"],["woman_office_worker","๐Ÿ‘ฉโ€๐Ÿ’ผ"],["woman_pilot","๐Ÿ‘ฉโ€โœˆ๏ธ"],["woman_playing_handball","๐Ÿคพโ€โ™€๏ธ"],["woman_playing_water_polo","๐Ÿคฝโ€โ™€๏ธ"],["woman_scientist","๐Ÿ‘ฉโ€๐Ÿ”ฌ"],["woman_shrugging","๐Ÿคท"],["woman_singer","๐Ÿ‘ฉโ€๐ŸŽค"],["woman_student","๐Ÿ‘ฉโ€๐ŸŽ“"],["woman_superhero","๐Ÿฆธโ€โ™€๏ธ"],["woman_supervillain","๐Ÿฆนโ€โ™€๏ธ"],["woman_teacher","๐Ÿ‘ฉโ€๐Ÿซ"],["woman_technologist","๐Ÿ‘ฉโ€๐Ÿ’ป"],["woman_vampire","๐Ÿง›โ€โ™€๏ธ"],["woman_with_headscarf","๐Ÿง•"],["woman_with_turban","๐Ÿ‘ณโ€โ™€๏ธ"],["woman_zombie","๐ŸงŸโ€โ™€๏ธ"],["womans_clothes","๐Ÿ‘š"],["womans_hat","๐Ÿ‘’"],["women_wrestling","๐Ÿคผโ€โ™€๏ธ"],["womens","๐Ÿšบ"],["woozy","๐Ÿฅด"],["world_map","๐Ÿ—บ"],["worried","๐Ÿ˜Ÿ"],["wrench","๐Ÿ”ง"],["writing_hand","โœ"],["wtf","๐Ÿคฌ"]],"x":[["x","โŒ"],["xo","๐Ÿ’‹"],["xoxo","๐Ÿ’‹"]],"y":[["yarn","๐Ÿงถ"],["yawn","๐Ÿ˜ช"],["yay","๐ŸŽ‰"],["yellow_heart","๐Ÿ’›"],["yen","๐Ÿ’ด"],["yep","๐Ÿ‘"],["yin_yang","โ˜ฏ"],["yo","๐Ÿ‘‹"],["yum","๐Ÿ˜‹"],["yummy","๐Ÿ˜‹"],["yup","๐Ÿ‘"]],"z":[["zany","๐Ÿคช"],["zap","โšก"],["zebra","๐Ÿฆ“"],["zero","0๏ธโƒฃ"],["zipper_mouth_face","๐Ÿค"],["zzz","๐Ÿ’ค"]]}