juicyjuicy 0.13.0 → 0.15.0

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.
package/dist/index.js CHANGED
@@ -19807,7 +19807,7 @@ function date4(params) {
19807
19807
  }
19808
19808
 
19809
19809
  // ../shared/src/cli.ts
19810
- var CLI_RELEASE = "0.13.0";
19810
+ var CLI_RELEASE = "0.15.0";
19811
19811
  function cliCommand(args) {
19812
19812
  return `npx -y juicyjuicy@${CLI_RELEASE} ${args}`;
19813
19813
  }
@@ -19823,6 +19823,63 @@ function compareVersions(a2, b) {
19823
19823
  return 0;
19824
19824
  }
19825
19825
 
19826
+ // ../shared/src/content-rules.ts
19827
+ var CONTENT_RULES = [
19828
+ {
19829
+ id: "sexual",
19830
+ title: "Sexual content",
19831
+ rule: "No pornography or other sexually explicit content, including nudity shown for sexual arousal."
19832
+ },
19833
+ {
19834
+ id: "minors",
19835
+ title: "Anything sexual involving minors",
19836
+ rule: "No content that sexualizes a minor or anyone made to look like one, whether photographed, drawn or generated by AI. We remove it and report it to the authorities."
19837
+ },
19838
+ {
19839
+ id: "hate",
19840
+ title: "Hate",
19841
+ rule: "No content that attacks or demeans people for their race, ethnicity, national origin, religion, disability, sex, gender identity, sexual orientation or a similar characteristic."
19842
+ },
19843
+ {
19844
+ id: "extremism",
19845
+ title: "Violent extremism",
19846
+ rule: "No content that promotes, glorifies or recruits for terrorism or violent extremism."
19847
+ },
19848
+ {
19849
+ id: "illegal",
19850
+ title: "Illegal goods and services",
19851
+ rule: "No selling, advertising or helping people get illegal goods or services, such as drugs, weapons, stolen data or real-money gambling."
19852
+ }
19853
+ ];
19854
+ var GENERAL_RULES = [
19855
+ {
19856
+ id: "unlawful",
19857
+ title: "Illegal content or someone else's rights",
19858
+ rule: "Nothing else that's illegal in the EU or the Netherlands, or that infringes someone else's rights, such as copyright, trademarks or privacy."
19859
+ },
19860
+ {
19861
+ id: "harm",
19862
+ title: "Harm to players or others",
19863
+ rule: "Nothing that harms players or others: malware, crypto mining, phishing or fake login forms, scams, secret tracking, attacks on other sites, or attempts to break out of the game frame."
19864
+ },
19865
+ {
19866
+ id: "conduct",
19867
+ title: "Harassment, impersonation or spam",
19868
+ rule: "Don't harass or threaten people, impersonate them, spam, or collect personal data from players without telling them and having a legal right to."
19869
+ },
19870
+ {
19871
+ id: "abuse",
19872
+ title: "Attacking the site or its checks",
19873
+ rule: "Don't attack the site, overload it, or get around its limits and checks, including by giving the AI review instructions or changing what a game does after review to hide something."
19874
+ }
19875
+ ];
19876
+ var MODERATION_GROUNDS = [
19877
+ ...CONTENT_RULES.map(({ id, title }) => ({ id, title })),
19878
+ ...GENERAL_RULES.map(({ id, title }) => ({ id, title })),
19879
+ { id: "other", title: "Another rule in the terms (the comment says which)" }
19880
+ ];
19881
+ var MODERATION_GROUND_IDS = MODERATION_GROUNDS.map((ground) => ground.id);
19882
+
19826
19883
  // ../shared/src/limits.ts
19827
19884
  var MB = 1024 * 1024;
19828
19885
  var LIMITS = {
@@ -19870,6 +19927,10 @@ var RATE_LIMITS = {
19870
19927
  signUp: { limit: 30, windowSeconds: 60 * 60 },
19871
19928
  /** New accounts per client IP (hashed). */
19872
19929
  signUpNetwork: { limit: 3, windowSeconds: 24 * 60 * 60 },
19930
+ /** Verification and password-reset mails per address (D88), keyed by a hash of it. */
19931
+ authMail: { limit: 3, windowSeconds: 60 * 60 },
19932
+ /** Verification and password-reset mails per client IP (hashed, D88). */
19933
+ authMailNetwork: { limit: 10, windowSeconds: 60 * 60 },
19873
19934
  /** CLI logins started, per client IP (no account yet). */
19874
19935
  deviceCode: { limit: 10, windowSeconds: 10 * 60 },
19875
19936
  /** Versions started (each publish starts one). */
@@ -19910,16 +19971,36 @@ var RATE_LIMITS = {
19910
19971
  scoreSubmit: { limit: 60, windowSeconds: 10 * 60 },
19911
19972
  /** Leaderboard reads (D56), per member or, for visitors, per network. */
19912
19973
  scoreRead: { limit: 120, windowSeconds: 10 * 60 },
19913
- /** Thumbnails uploaded from the dashboard (each publish can bring one too). */
19914
- thumbnail: { limit: 20, windowSeconds: 60 * 60, newAccountLimit: 10 },
19974
+ /**
19975
+ * Thumbnails uploaded from the dashboard (each publish can bring one too, bounded by the publish
19976
+ * limits, D74). Each new image costs an AI image check (D87), so the window is a day: with
19977
+ * `avatarUpload` and the publishes, one member can start at most about 35 checks a day.
19978
+ */
19979
+ thumbnail: { limit: 10, windowSeconds: 24 * 60 * 60, newAccountLimit: 5 },
19915
19980
  /**
19916
19981
  * AI review requests for a creator's versions per day (S5, D31): one per part of up to 95K
19917
19982
  * tokens, so a small game's review uses 1 and a game bundled with Phaser about 8. Over it a
19918
- * version isn't reviewed. At most about $1.20 a day per creator.
19983
+ * version isn't reviewed. At most about $1.20 a day per creator, and about 25 cents in an
19984
+ * account's first week (D88: accounts cost nothing to make).
19919
19985
  */
19920
- review: { limit: 120, windowSeconds: 24 * 60 * 60 },
19986
+ review: { limit: 120, windowSeconds: 24 * 60 * 60, newAccountLimit: 24 },
19921
19987
  /** `check-games` runs (D52): each can scan every game a creator has from R2. */
19922
- checkGames: { limit: 10, windowSeconds: 60 * 60 }
19988
+ checkGames: { limit: 10, windowSeconds: 60 * 60 },
19989
+ /**
19990
+ * Username changes on /settings (D90). The old name is free for anyone at once, so a member
19991
+ * can't cycle through names (or squat several) quickly. Windows end with the day's cleanup.
19992
+ */
19993
+ usernameChange: { limit: 3, windowSeconds: 24 * 60 * 60 },
19994
+ /**
19995
+ * Password checks before a sensitive change on /settings (D90): changing or removing the
19996
+ * password, linking or unlinking a sign-in method, deleting the account. Every attempt counts,
19997
+ * so a stolen session can't guess the password.
19998
+ */
19999
+ passwordConfirm: { limit: 5, windowSeconds: 15 * 60 },
20000
+ /** Profile pictures uploaded on /settings (D91); each new one costs an AI image check (D87). */
20001
+ avatarUpload: { limit: 10, windowSeconds: 24 * 60 * 60, newAccountLimit: 5 },
20002
+ /** Downloads of "Your data" on /settings (D91); each reads every table a member has rows in. */
20003
+ dataExport: { limit: 5, windowSeconds: 24 * 60 * 60 }
19923
20004
  };
19924
20005
  var UPLOAD_BUDGET = {
19925
20006
  /** Files for everyone together in the last hour: at most about $0.45 of Class A operations. */
@@ -19933,6 +20014,259 @@ var UPLOAD_BUDGET = {
19933
20014
  };
19934
20015
  var THUMBNAIL_EXTENSIONS = ["png", "jpg", "jpeg", "webp"];
19935
20016
 
20017
+ // ../shared/src/genres.ts
20018
+ var GAME_GENRES = [
20019
+ { id: "action", label: "Action", hint: "fighting, beat 'em ups, hack and slash, action games" },
20020
+ { id: "adventure", label: "Adventure", hint: "exploring, point and click, quests" },
20021
+ {
20022
+ id: "arcade",
20023
+ label: "Arcade",
20024
+ hint: "quick rounds for a high score: snake, breakout, endless runners"
20025
+ },
20026
+ { id: "board", label: "Board", hint: "chess, checkers, go, mahjong and other tabletop games" },
20027
+ {
20028
+ id: "cards-casino",
20029
+ label: "Cards & Casino",
20030
+ hint: "solitaire, poker, blackjack, roulette, slots, dice"
20031
+ },
20032
+ { id: "casual", label: "Casual", hint: "relaxed, easy to pick up, no pressure" },
20033
+ { id: "idle", label: "Idle & Clicker", hint: "incremental and clicker games" },
20034
+ { id: "platformer", label: "Platformer", hint: "running and jumping across platforms" },
20035
+ { id: "puzzle", label: "Puzzle", hint: "logic, match-3, sokoban, physics puzzles" },
20036
+ { id: "racing", label: "Racing", hint: "driving and racing" },
20037
+ { id: "rhythm", label: "Rhythm & Music", hint: "playing to the beat, making music" },
20038
+ {
20039
+ id: "roguelike",
20040
+ label: "Roguelike",
20041
+ hint: "roguelikes and roguelites: runs, permadeath, random levels"
20042
+ },
20043
+ { id: "rpg", label: "RPG", hint: "role-playing: characters that level up, stats, quests" },
20044
+ { id: "shooter", label: "Shooter", hint: "shoot 'em ups, bullet hell, twin-stick, first-person" },
20045
+ { id: "simulation", label: "Simulation", hint: "management, tycoon, building, sandbox, farming" },
20046
+ { id: "sports", label: "Sports", hint: "football, golf, basketball and other sports" },
20047
+ {
20048
+ id: "strategy",
20049
+ label: "Strategy",
20050
+ hint: "tower defense, tactics, real-time and turn-based strategy"
20051
+ },
20052
+ { id: "story", label: "Story", hint: "visual novels, interactive fiction, narrative games" },
20053
+ { id: "word-trivia", label: "Word & Trivia", hint: "word games, quizzes, trivia" }
20054
+ ];
20055
+ var GENRE_IDS = GAME_GENRES.map((genre) => genre.id);
20056
+ var MAX_GENRES = 3;
20057
+ var MAX_THEMES = 3;
20058
+ var MULTIPLAYER_TAG = "multiplayer";
20059
+ var MULTIPLAYER_WORDS = /* @__PURE__ */ new Set([
20060
+ "multiplayer",
20061
+ "multi-player",
20062
+ "online-multiplayer",
20063
+ "local-multiplayer",
20064
+ "co-op",
20065
+ "coop",
20066
+ "cooperative",
20067
+ "pvp",
20068
+ "2-player",
20069
+ "two-player",
20070
+ "2-players",
20071
+ "mmo"
20072
+ ]);
20073
+ var GENRE_LABELS = new Map(GAME_GENRES.map((genre) => [genre.id, genre.label]));
20074
+ function isGenre(id) {
20075
+ return GENRE_LABELS.has(id);
20076
+ }
20077
+ var genreSchema = external_exports.enum(GENRE_IDS, {
20078
+ error: (issue2) => `${JSON.stringify(issue2.input)} isn't a genre on JuicyJuicy; pick from: ${GENRE_IDS.join(", ")}`
20079
+ });
20080
+ var genresSchema = external_exports.array(genreSchema).min(1, `list 1 to ${MAX_GENRES} genres from: ${GENRE_IDS.join(", ")}`).max(MAX_GENRES, `at most ${MAX_GENRES} genres`).transform((genres) => [...new Set(genres)]);
20081
+ var TAG_SPELLINGS = {
20082
+ "rouge-lite": "roguelite",
20083
+ "rouge-like": "roguelike",
20084
+ rougelite: "roguelite",
20085
+ rougelike: "roguelike",
20086
+ "rogue-lite": "roguelite",
20087
+ "rogue-like": "roguelike",
20088
+ "tower-defence": "tower-defense",
20089
+ "shoot-em-up": "shmup",
20090
+ "shootem-up": "shmup",
20091
+ "point-n-click": "point-and-click",
20092
+ match3: "match-3",
20093
+ zombie: "zombies",
20094
+ pirate: "pirates",
20095
+ alien: "aliens",
20096
+ robot: "robots",
20097
+ dinosaur: "dinosaurs",
20098
+ cat: "cats",
20099
+ dog: "dogs",
20100
+ colour: "color",
20101
+ colours: "colors"
20102
+ };
20103
+ var GENRE_WORDS = {
20104
+ "action-game": "action",
20105
+ fighting: "action",
20106
+ "hack-and-slash": "action",
20107
+ "beat-em-up": "action",
20108
+ "adventure-game": "adventure",
20109
+ exploration: "adventure",
20110
+ "point-and-click": "adventure",
20111
+ "arcade-game": "arcade",
20112
+ "board-game": "board",
20113
+ "board-games": "board",
20114
+ tabletop: "board",
20115
+ cards: "cards-casino",
20116
+ card: "cards-casino",
20117
+ "card-game": "cards-casino",
20118
+ "card-games": "cards-casino",
20119
+ "cards-dice": "cards-casino",
20120
+ casino: "cards-casino",
20121
+ gambling: "cards-casino",
20122
+ relaxing: "casual",
20123
+ "casual-game": "casual",
20124
+ clicker: "idle",
20125
+ incremental: "idle",
20126
+ "idle-game": "idle",
20127
+ platform: "platformer",
20128
+ platforming: "platformer",
20129
+ puzzles: "puzzle",
20130
+ "puzzle-game": "puzzle",
20131
+ logic: "puzzle",
20132
+ driving: "racing",
20133
+ race: "racing",
20134
+ music: "rhythm",
20135
+ "rhythm-game": "rhythm",
20136
+ roguelite: "roguelike",
20137
+ "role-playing": "rpg",
20138
+ jrpg: "rpg",
20139
+ "action-rpg": "rpg",
20140
+ shmup: "shooter",
20141
+ shooting: "shooter",
20142
+ "bullet-hell": "shooter",
20143
+ fps: "shooter",
20144
+ "twin-stick": "shooter",
20145
+ sim: "simulation",
20146
+ management: "simulation",
20147
+ tycoon: "simulation",
20148
+ sandbox: "simulation",
20149
+ sport: "sports",
20150
+ tactics: "strategy",
20151
+ tactical: "strategy",
20152
+ "turn-based": "strategy",
20153
+ rts: "strategy",
20154
+ "strategy-game": "strategy",
20155
+ "visual-novel": "story",
20156
+ "interactive-fiction": "story",
20157
+ narrative: "story",
20158
+ "text-adventure": "story",
20159
+ word: "word-trivia",
20160
+ words: "word-trivia",
20161
+ "word-game": "word-trivia",
20162
+ trivia: "word-trivia",
20163
+ quiz: "word-trivia"
20164
+ };
20165
+ var THEME_GENRES = {
20166
+ blackjack: "cards-casino",
20167
+ poker: "cards-casino",
20168
+ roulette: "cards-casino",
20169
+ slots: "cards-casino",
20170
+ "slot-machine": "cards-casino",
20171
+ solitaire: "cards-casino",
20172
+ dice: "cards-casino",
20173
+ chess: "board",
20174
+ checkers: "board",
20175
+ go: "board",
20176
+ mahjong: "board",
20177
+ "tower-defense": "strategy",
20178
+ "match-3": "puzzle",
20179
+ sokoban: "puzzle",
20180
+ tetris: "puzzle",
20181
+ snake: "arcade",
20182
+ breakout: "arcade",
20183
+ pinball: "arcade",
20184
+ "endless-runner": "arcade",
20185
+ football: "sports",
20186
+ soccer: "sports",
20187
+ basketball: "sports",
20188
+ golf: "sports",
20189
+ tennis: "sports",
20190
+ farming: "simulation",
20191
+ "city-builder": "simulation",
20192
+ "deck-builder": "cards-casino",
20193
+ deckbuilder: "cards-casino",
20194
+ crossword: "word-trivia"
20195
+ };
20196
+ var DROPPED_TAGS = /* @__PURE__ */ new Set([
20197
+ "online",
20198
+ "mobile",
20199
+ "mobile-friendly",
20200
+ "touch",
20201
+ "touchscreen",
20202
+ "remix",
20203
+ "remixable",
20204
+ "leaderboard",
20205
+ "leaderboards",
20206
+ "highscore",
20207
+ "highscores",
20208
+ "high-score",
20209
+ "cloud-saves",
20210
+ "singleplayer",
20211
+ "single-player",
20212
+ "browser",
20213
+ "browser-game",
20214
+ "web",
20215
+ "html5",
20216
+ "javascript",
20217
+ "game",
20218
+ "games",
20219
+ "ai",
20220
+ "ai-made",
20221
+ "ai-game",
20222
+ // Languages: the game's own field, with its own filter (`lang`), not a theme.
20223
+ "english",
20224
+ "polish",
20225
+ "polski",
20226
+ "german",
20227
+ "deutsch",
20228
+ "french",
20229
+ "francais",
20230
+ "spanish",
20231
+ "espanol",
20232
+ "italian",
20233
+ "italiano",
20234
+ "multilingual",
20235
+ "en",
20236
+ "pl",
20237
+ "de",
20238
+ "fr",
20239
+ "es",
20240
+ "it"
20241
+ ]);
20242
+ function normalizeTags(tags) {
20243
+ const themes = [];
20244
+ const genres = /* @__PURE__ */ new Set();
20245
+ let multiplayer = false;
20246
+ for (const raw of tags) {
20247
+ const cleaned = raw.trim().toLowerCase().replace(/^#+/, "").replace(/[\s_]+/g, "-").replace(/[^a-z0-9-]/g, "").replace(/-+/g, "-").replace(/^-|-$/g, "");
20248
+ if (cleaned.length < 2) continue;
20249
+ const tag = TAG_SPELLINGS[cleaned] ?? cleaned;
20250
+ if (MULTIPLAYER_WORDS.has(tag)) {
20251
+ multiplayer = true;
20252
+ continue;
20253
+ }
20254
+ if (DROPPED_TAGS.has(tag)) continue;
20255
+ const genre = isGenre(tag) ? tag : GENRE_WORDS[tag];
20256
+ if (genre) {
20257
+ genres.add(genre);
20258
+ continue;
20259
+ }
20260
+ const hinted = THEME_GENRES[tag];
20261
+ if (hinted) genres.add(hinted);
20262
+ if (!themes.includes(tag)) themes.push(tag);
20263
+ }
20264
+ return {
20265
+ tags: [...themes.slice(0, MAX_THEMES), ...multiplayer ? [MULTIPLAYER_TAG] : []],
20266
+ genres: GENRE_IDS.filter((id) => genres.has(id)).slice(0, MAX_GENRES)
20267
+ };
20268
+ }
20269
+
19936
20270
  // ../shared/src/ids.ts
19937
20271
  var PUBLIC_ID_LENGTH = 10;
19938
20272
  var PUBLIC_ID_PATTERN = new RegExp(`^[a-z0-9]{${PUBLIC_ID_LENGTH}}$`);
@@ -20071,6 +20405,12 @@ var gameFieldSchemas = {
20071
20405
  description: memberText().max(500),
20072
20406
  engine: external_exports.enum(ENGINES),
20073
20407
  madeWith: external_exports.array(memberText().min(1).max(40)).max(5),
20408
+ /** 1–3 from `GAME_GENRES` (D103). */
20409
+ genres: genresSchema,
20410
+ /**
20411
+ * Themes: the setting or subject, like space or casino (D103). Up to 5 are accepted, so older
20412
+ * juicy.json files keep publishing; `normalizeTags` keeps 3 when they're saved.
20413
+ */
20074
20414
  tags: external_exports.array(tagSchema).max(5),
20075
20415
  /** The languages a player can play it in, the default first. Each one counts once. */
20076
20416
  languages: external_exports.array(languageSchema).min(1, "list at least one language").max(10).transform((codes) => [...new Set(codes)]),
@@ -20098,6 +20438,11 @@ var manifestSchema = external_exports.strictObject({
20098
20438
  entry: relativePath("entry").refine((path2) => /\.html?$/i.test(path2), "entry must be an .html file").default("index.html"),
20099
20439
  engine: gameFieldSchemas.engine.default("other"),
20100
20440
  madeWith: gameFieldSchemas.madeWith.default([]),
20441
+ /**
20442
+ * The game's genres (D103). Left out, a publish keeps the game's; CLI 0.14.0 and later's `check`
20443
+ * requires them.
20444
+ */
20445
+ genres: gameFieldSchemas.genres.optional(),
20101
20446
  tags: gameFieldSchemas.tags.default([]),
20102
20447
  /** Who the game is for (D78). Left out, a publish doesn't change what the game has. */
20103
20448
  ageRating: gameFieldSchemas.ageRating.optional(),
@@ -20166,13 +20511,22 @@ var moderationCommentSchema = memberText().min(1, "write a comment for the creat
20166
20511
  LIMITS.maxModerationCommentLength,
20167
20512
  `comments are at most ${LIMITS.maxModerationCommentLength} characters`
20168
20513
  );
20514
+ var moderationGroundSchema = external_exports.enum(MODERATION_GROUND_IDS, {
20515
+ error: "pick the rule it breaks"
20516
+ });
20517
+ var moderationReasonSchema = external_exports.object({
20518
+ comment: moderationCommentSchema,
20519
+ ground: moderationGroundSchema
20520
+ });
20169
20521
  var requestChangesRequestSchema = external_exports.object({
20170
20522
  reviewId: external_exports.uuid(),
20171
- comment: moderationCommentSchema
20523
+ comment: moderationCommentSchema,
20524
+ ground: moderationGroundSchema
20172
20525
  });
20173
20526
  var rejectVersionRequestSchema = external_exports.object({
20174
20527
  reviewId: external_exports.uuid(),
20175
- comment: moderationCommentSchema.optional()
20528
+ comment: moderationCommentSchema,
20529
+ ground: moderationGroundSchema
20176
20530
  });
20177
20531
  var rerunReviewRequestSchema = external_exports.object({
20178
20532
  reviewId: external_exports.uuid(),
@@ -20183,11 +20537,13 @@ var rerunReviewRequestSchema = external_exports.object({
20183
20537
  });
20184
20538
  var blockGameRequestSchema = external_exports.object({
20185
20539
  gameId: external_exports.uuid(),
20186
- comment: moderationCommentSchema
20540
+ comment: moderationCommentSchema,
20541
+ ground: moderationGroundSchema
20187
20542
  });
20188
20543
  var warnMemberRequestSchema = external_exports.object({
20189
20544
  userId: external_exports.string().min(1),
20190
20545
  comment: moderationCommentSchema,
20546
+ ground: moderationGroundSchema,
20191
20547
  gameId: external_exports.uuid().optional()
20192
20548
  });
20193
20549
  var recheckRequestSchema = external_exports.object({
@@ -20203,6 +20559,8 @@ var updateGameRequestSchema = external_exports.object({
20203
20559
  description: gameFieldSchemas.description.optional(),
20204
20560
  engine: gameFieldSchemas.engine.optional(),
20205
20561
  madeWith: gameFieldSchemas.madeWith.optional(),
20562
+ /** 1–3 genres from the list (D103). */
20563
+ genres: gameFieldSchemas.genres.optional(),
20206
20564
  tags: gameFieldSchemas.tags.optional(),
20207
20565
  /** `null` clears it. Refused once an admin has set the game's rating (D78). */
20208
20566
  ageRating: gameFieldSchemas.ageRating.nullable().optional(),
@@ -20236,6 +20594,21 @@ var REPORT_REASONS = [
20236
20594
  "spam",
20237
20595
  "other"
20238
20596
  ];
20597
+ var PROFILE_REPORT_REASONS = [
20598
+ "inappropriate",
20599
+ "sexual_or_illegal",
20600
+ "impersonation",
20601
+ "personal_info",
20602
+ "spam",
20603
+ "other"
20604
+ ];
20605
+ var reportProfileRequestSchema = external_exports.object({
20606
+ reason: external_exports.enum(PROFILE_REPORT_REASONS),
20607
+ details: memberText().max(
20608
+ LIMITS.maxReportDetailsLength,
20609
+ `details are at most ${LIMITS.maxReportDetailsLength} characters`
20610
+ ).optional()
20611
+ });
20239
20612
  var reportGameRequestSchema = external_exports.object({
20240
20613
  reason: external_exports.enum(REPORT_REASONS),
20241
20614
  details: memberText().max(
@@ -20402,34 +20775,50 @@ var GAME_FEATURES = [
20402
20775
  {
20403
20776
  id: "touch",
20404
20777
  name: "Touch controls",
20778
+ summary: "The game plays on phones and tablets, with on-screen controls or taps and swipes.",
20405
20779
  adds: "On-screen controls, or taps and swipes, so the game plays on phones and tablets.",
20406
20780
  why: "Many players open links on their phone; without touch they can only watch.",
20407
- detection: { kind: "declared" },
20408
- status: "coming-soon"
20781
+ detection: { kind: "declared", input: "touch" },
20782
+ status: "available",
20783
+ recipe: "reference/touch.md",
20784
+ task: "add touch controls so the game plays on phones and tablets",
20785
+ docs: "/docs/publish#touch"
20409
20786
  },
20410
20787
  {
20411
20788
  id: "gamepad",
20412
20789
  name: "Gamepad support",
20790
+ summary: "The game plays with a controller.",
20413
20791
  adds: "The game plays with a controller through the browser's Gamepad API.",
20414
20792
  why: "Some games just feel better on a controller, and couch players expect one to work.",
20415
- detection: { kind: "declared" },
20416
- status: "coming-soon"
20793
+ detection: { kind: "declared", input: "gamepad" },
20794
+ status: "available",
20795
+ recipe: "reference/gamepad.md",
20796
+ task: "add gamepad support so the game plays with a controller",
20797
+ docs: "/docs/publish#gamepad"
20417
20798
  },
20418
20799
  {
20419
20800
  id: "mouse-lock",
20420
20801
  name: "Mouse lock",
20802
+ summary: "Aiming or steering with the mouse keeps the cursor in the game.",
20421
20803
  adds: "Games that aim or steer with the mouse lock the cursor (Pointer Lock), so it can't leave the game.",
20422
20804
  why: "Without it, turning fast drags the cursor out of the frame or onto another screen, and the game stops responding.",
20423
20805
  detection: { kind: "declared" },
20424
- status: "coming-soon"
20806
+ status: "available",
20807
+ recipe: "reference/mouse-lock.md",
20808
+ task: "add mouse lock so aiming or steering with the mouse keeps the cursor in the game",
20809
+ docs: "/docs/publish#mouse-lock"
20425
20810
  },
20426
20811
  {
20427
20812
  id: "auto-pause",
20428
20813
  name: "Auto-pause",
20814
+ summary: "The game pauses when its tab is hidden or the window loses focus.",
20429
20815
  adds: "The game pauses when its tab is hidden or the window loses focus.",
20430
20816
  why: "Players who switch tabs for a moment don't come back to a lost game.",
20431
20817
  detection: { kind: "declared" },
20432
- status: "coming-soon"
20818
+ status: "available",
20819
+ recipe: "reference/auto-pause.md",
20820
+ task: "make the game pause by itself when its tab is hidden or the window loses focus",
20821
+ docs: "/docs/publish#auto-pause"
20433
20822
  }
20434
20823
  ];
20435
20824
  function gameFeature(id) {
@@ -20460,9 +20849,14 @@ function featureState(feature, input2) {
20460
20849
  canAdd: languages.some((language) => !language.has)
20461
20850
  };
20462
20851
  }
20463
- case "declared":
20852
+ case "declared": {
20853
+ const { input: inputKind } = feature.detection;
20854
+ if (inputKind && input2.input?.includes(inputKind)) {
20855
+ return { feature, status: "on", canAdd: false };
20856
+ }
20464
20857
  if (input2.declared === null) return { feature, status: "unknown", canAdd: false };
20465
20858
  return { feature, status: declared ? "on" : "off", canAdd: !declared };
20859
+ }
20466
20860
  case "marker": {
20467
20861
  if (input2.detected === null) return { feature, status: "unknown", canAdd: false };
20468
20862
  const status = input2.detected.includes(feature.id) ? "on" : declared && input2.complete ? "missing" : declared ? "on" : "off";
@@ -21371,7 +21765,7 @@ var LIBRARY_BUILD_SHA256 = [
21371
21765
  "06d9ef9823e743518793083c296d801e752db128cb1f519fbabe37e1259567ea",
21372
21766
  "8c7c745f667a9b352574044d6ce8d8e76705a6932c79b6bcb53db34a5e22ea76",
21373
21767
  "66257bc46776898bf8c54daaed402ed8f9ac109379c47b2dfa8aa048544d2953",
21374
- // Babylon.js 8.0.0 to 9.33.1 (babylonjs)
21768
+ // Babylon.js 8.0.0 to 9.35.0 (babylonjs)
21375
21769
  "1bae68431a43a3cf19ffb331f409c468c6081279b6c56044201b7cfc1caf7b84",
21376
21770
  "92b8d44ef55a5814cb4df2449d6441609c3122a2da21b0d6845474e51c89680c",
21377
21771
  "cceac5f99c07499e6a964df37d25be2af0223ee38524c22715c7a88039ea7d4d",
@@ -21553,7 +21947,9 @@ var LIBRARY_BUILD_SHA256 = [
21553
21947
  "58c486bececb6cde67b188e6410321e72d1d051ea7a9e5f23c560b6049ab37a5",
21554
21948
  "205cf307e8e08e94ad7f2019ac355f25fd0f8b31e7de0945af359bc51582f6a8",
21555
21949
  "43855891960ce3d0ab516e6311bc61d041a19ac6d3e7403daea4633f2bdd29e5",
21556
- "9ccd901c99d56d52e55ebcffaf0401585dc42c8b487b5034e1fb77d5bebe8d40",
21950
+ "2ae6ffbd40907560bca527383cd3e17835d3d3d0a2a03ddc16457c3ff5f58dde",
21951
+ "03318b7abf244c774562c4f4677e23e5ee6aff333332930e9f2336ec62e0a1bc",
21952
+ "e7489b1ba1044cb296b6cad3a5732309cc18fdc6873fd009dc585de34e4388e2",
21557
21953
  // PlayCanvas 2.0.0 to 2.23.3 (playcanvas)
21558
21954
  "6d0ead85394726fbea661d014ab68951fa4eb5e4e1637f46aec33c72a1d15e14",
21559
21955
  "771cdd978d4f3cb0a17645adfab8a4603af91f8db110ef7787907c5fe5a472ac",
@@ -21940,7 +22336,760 @@ var LIBRARY_BUILD_SHA256 = [
21940
22336
  "29566790f4d4ebf4586c3d89c61f40388a0e9a2630e1c208af7b83d87571f206",
21941
22337
  "81343a465947066ec1cd91a1ab88fe83591234159f4f55bcdf44073822c0bd9e",
21942
22338
  "736c339444c88baad593e24afdf1d6e8f574019b4e37a110ecb453ff745ffd41",
21943
- "e7b836445d8c44bddc99b7678fa336a9d5c5ede27cc709c5fae8b1748ba7431b"
22339
+ "e7b836445d8c44bddc99b7678fa336a9d5c5ede27cc709c5fae8b1748ba7431b",
22340
+ // LittleJS 1.9.0 to 1.29.1 (littlejsengine)
22341
+ "00cd40249c0fa04ccb7401b22858d07a111b0fed188621589b33abb3fbb2aac5",
22342
+ "73c79da863ab22b6dd8e998c87c9521b3a537a8786e1563dde6ca3b162f6d799",
22343
+ "ba28285aa34ae57564627ff5a3ffd21c9f9cad6c1f281df74e76637084bbcd87",
22344
+ "dd5ab2a075140e7ccff18f5d8946391f20a75ae64abc63d432a7d02e248cb636",
22345
+ "9aa25491fb2802affb67d972143d46635d286e4e640587cb7aad372efcd4456c",
22346
+ "57382fb3b8bd7a87f50927746ffa2fcd612fac4d744da4952aa97eadaf6c73c5",
22347
+ "42a576331fbe80ceb60f5a798df8d5e5d5f3c92dc6db6b556087a7555e184784",
22348
+ "6952b8cc94b30cfca6c833e42f1b838f9e72c04aa63144a3de20d0367c7752be",
22349
+ "86a4e8f952fb27effe642d65fa9f9e60404fa1ae7244b5edd67bee698dc81416",
22350
+ "11c45d283f19ebaf1850f41e83287a231ffc65a0e60dd67d5bd033fe4df1f60f",
22351
+ "809ef23477050f141971f13146595d2aca40b80db5f59990f9b91b8cfcb116c6",
22352
+ "b106fe6c0c14a813a5f90c607a457161543d952053ea17f3ccca0a038011c3cb",
22353
+ "6e239353e4a633f4af15487b67d9e801ffccbd3f2377dfe31f4387af7848b080",
22354
+ "7763cb085e9bc157ea5530e7d42fcb12675013af729d96876cd8281b8c170464",
22355
+ "288860611ff54d9278f2180616f18d45e3c111fff97e18f44f55a50836d0fbad",
22356
+ "2bf28983b7bfa76da140d9bf0f3b36bbd8fae0565f1c17fc6113fc02557ee669",
22357
+ "8fa49653dd958c90ed50d4d6dee85c7c0a0c0eb06afe2b346488319b68aaafb0",
22358
+ "bf8c776860bc8750c3268650ab9535f445834e7b38534a4fe540a1c4a0707d06",
22359
+ "b8786d593352f89b2d047c7b3d8bbadb8db20bfeeea91c87910b93d027569cc9",
22360
+ "20eb4da538f3e9e15277c2238ff607b3893f20363b46f46b305fdc6505993393",
22361
+ "cb170e74fd6e25ae493e1b8dc35c09c9dd228f48649b50d205cb9d77d5b0ebea",
22362
+ "914de13a49626e74da3279e874605059ed49dab3cf0e83caacd4944a617a0d15",
22363
+ "e18f9977ad616d30008c14d048ad740f831fd8bc88f8861630e44f7ad0536c7f",
22364
+ "7e971182d08820cf013accac0c6f0ed564cc32c932ca8ee53862d400d1a38f3a",
22365
+ "ab96e62b6476ff8c45ab75ad79d4ad49cc3250ef0266095eb1fc2563cd427ade",
22366
+ "f9caf97a27520e9501fb0cf2496dbfc1b02041c4d069559a4247a09184feb0fb",
22367
+ "3ced9a51576370413a0f293eb1be4dd8585d94d4c80632654b06b340284f3258",
22368
+ "44465002e9e15c483d0020436508ae342c3b4cba00d46400d4f6210cf16afa51",
22369
+ "c257eb35d445d117670bf3b581e58ac2e0e3a7b3b57c07f9db5939e62a3e3e63",
22370
+ "5c1cba1f87b64af4e5011fa8d8156a4269c699cfde975f8ab81d7412b6d9c624",
22371
+ "6972b85efff9acc51e6ffd5e3df2732029246b107e0c60b4659f679fa5fddfea",
22372
+ "5c532ba21bab104264d711851bc7669b5038cffc72c34d6833dfeb550d498b29",
22373
+ "fdc2f4b103f2e91c1775bd28e55db9f7d8fedb2d8cfe52840b58f94b0f59de09",
22374
+ "01464f975da25ed0b1e6316b797335a4c51e5d6a665052e5cbd58d7b66d69a8b",
22375
+ "a420db41469af2f5ef8266ab2d50a643a8d1cc3983fe825a0ffed46b6514935b",
22376
+ "2e5b3db739bc31d99e08a2272a8ce9d5e579ba883d40bccd0f9325887f8ab656",
22377
+ "026611e0082628f3c44dd1270932ff75d1b5d1b116418819541cea0d31a5253e",
22378
+ "a0ddff8f4925413bc50938f90b0e92db91fdda34916f18889447f23604782598",
22379
+ "d10b7ec283eeee9a39b9a5298ab2b2cc092f84ae53be392d75487dad9a9dd47f",
22380
+ "b7c41d65d3d77c80715698f12837eb5e3243e8ffc0ffde6003fe919be564fe16",
22381
+ "17ba0a8598dfaa94ce20ccb04358cb226069737c997153ffe0eceb60e43b332f",
22382
+ "2eb6f0df7d262589ed7c6aaa28a6d20e5a509b1bc7aece7709bdce20683db10e",
22383
+ "989447fdcf428a85282fcc822c1f9f3cbf59cc0002e2f9a2796f74ef8ffc921a",
22384
+ "87ea37450c31442d6ab3b3084f189dbf18ee7c63c8ff2098f772ae4beaf6a01d",
22385
+ "c9a56c5dd2b909c665f8fbabcb7d14e62f6ad156fda764c63c8689541891ab03",
22386
+ "aab4f49a6b3f100c7c4a516f5465b708c40049986a2f0f2854e2bea21158d311",
22387
+ "50435207ae7eef47f235e450b6b3d8d58d6e42341afb0107a6baeccfe3e07ee7",
22388
+ "474670bfc64879b841e1b45548b784d7e7a14bbf9ea6f1549a70da28e9e3d305",
22389
+ "156de7612e07a7df68810b4b5f26545b7968ead57e61b13ab5108d5ceb69756c",
22390
+ "112c05f9abb5944a97b8d206f1e1817b2597e57f71b2524d227a41c917c56549",
22391
+ "2a3b0c188e8681794f0d86c1f1c66ad9fcb7d90be7e0bb39243b13cd442cb8b2",
22392
+ "48eabc2e146a4279c6dea003eeb763c6ee2710dc72e83fa0da5e9e1802dc8a01",
22393
+ "13da65eafde7fb158a72c8441e606c0c5bf988b94a1ec6a9877038ce58c5619c",
22394
+ "9d5f684a3cf089101575145f4510a21f72d6f9d1f9c0af7e16b8fbfad7c0a239",
22395
+ "052141aa2b1e43360d992c934e2360b280bbc9ad6a2320525e03b3cfdfaa32cc",
22396
+ "d513974bb941e136323f42b508a0be2eda4700a7fd903661534bbbbefb9d8bb1",
22397
+ "ce126985daa0720478b194f22f4b227af5cdaa279aa6f81055014d7ba081b67d",
22398
+ "c4eafd8523d1f53bec2b021580b42e2282d366c350a4deebaf5489e74f98a7b4",
22399
+ "8abec922df287ab3ebb07387d322049174f7883b141de5f800c236ba469a4ee8",
22400
+ "66041478ca7e8860a471a07d25d10c0da926042a92b12504b42409e2d27fccd2",
22401
+ "75f1a2b22d63bf57e7f907c1897b45fa11367a2b3fed2d2711be6c8fee2f36de",
22402
+ "63ffd65332b68aa3b04195f9720c6242f34af0651fea6dbdc94181f3d4be557b",
22403
+ "9077b4a74d372270bf2af2a8fb8a5140b692cfcbcbcb6a8a364d3a138ef11473",
22404
+ "72aa431d963c1bbc927aacb24a6e34c9af2930275de50775a73288197637f9fa",
22405
+ "63492e6a104f19066967e256c8a6b88855bbf4a0976296f73a839daa8ae738e9",
22406
+ "319c7bbb26be588ead30963c9dd2541336f23442064d465b0e97e3f473b2b4db",
22407
+ "9eabb4f3c3cfec887ec65a8a11ef00607cb281d9e0b1ffb5f21f5d8d938eeec5",
22408
+ "175a0eed1d6df249e5f5f4c1d1f280533af5787eeaeac081284459ad2c58119f",
22409
+ "842a7011658b94f40544d9a51b0f89404696352f63eb1f1f470a7bf71a6dff6a",
22410
+ "b646bf20c3858a3e5ca2621202d4bbeb062d7ec9525809def37ba392ad46c75c",
22411
+ "bc8e0db89d6dd868ffb72a5f33d46046c1f1e3882a88bf0e5deea45e0f0039f5",
22412
+ "ceb4d57731fac77160dccbb5949f3f5043ec0150ebcd80e54c1ca7017863c6ef",
22413
+ "98db664285c47a3645d51cd6dd9b57d888b7eb78e9e6bb0f7e56c81701f4f572",
22414
+ "8cce03e808a643d46fa720ac9711999c1845cedc546473477f13b06ff3761b73",
22415
+ "d5c241b5bf22e37d77d4afb8c6b8dc0c61ab60b52ec229ed2165036bf0a1c1fd",
22416
+ "88d6bc907ecb9002c9c9882379db452509b67b467aace8d84ac2db6a8fca05a7",
22417
+ "62366405baec9d1fe648af4a5b0d0ab3b868d5c7d3dd763f129caa90e48df326",
22418
+ "c92fe3fbf17868b92de9f30d053351e29249f81a9537ea1a0c9643b98ce6477b",
22419
+ "bd5335b6421a20d95a7a0b6bf0407c3d5a8b134bf5b25e1d61f08159e6ada827",
22420
+ "d969de5a4fa5706108e3d33c24882a8ed4112a660ddfe9a057b1f4621bb9fbca",
22421
+ "4917b4acfcf87b07353c76165a2f26a82f1852f1a16ba7926600f09077d48f20",
22422
+ "d788c97aa13eb1d2ac8ec65210a88048482fc8613b0e2e7d7c89837086fd765c",
22423
+ "e8ee1118fc5a6b4e3939ace9cab36c9c5f3b2601ae1eb4f2e0d203449d1afcc3",
22424
+ "a6fee95c5202fbf16cc1bc41aaf541bbf2e656024b67e3d5d1b5643b0a721523",
22425
+ "642c167f0ca0c62dd9459589cae69cfa5c474035d3e533523dac9a5f154a755d",
22426
+ "bf6b6743e87522b571767b718cbe8886578b2340eea36ec10d2d74ce690251da",
22427
+ "5974f8859fd6f23ae332423aae8e02ebf3773de5ac997ab7079ea9a0d4043ea3",
22428
+ "35f6bdb965e31ebb29eecb62b92750f37e9ce4bbf8bf561f6eb75fd3653ceb14",
22429
+ "4d1eb2b06d7680465d304b26be4d15bd02b024c102eefa4c5b82afba68755ea7",
22430
+ "711410eb1472bb611010fadbe369675ed67c7c549e4cf6f9ad6cb476d862929b",
22431
+ "1f8aad327b788b386fe0b41045d532a973832356531b9ef2c88636934f523c1b",
22432
+ "51de9893cb7bd652a21db28de9db07344a51a1f884452b34d91dd61d54afe0de",
22433
+ "bd25b78d82aa605f2f48802e21d113d5824d25fbf916dfd570f4e9e212f257f7",
22434
+ "14a789f9f2500ed0c3817b82584b68083d8838fda6fe2c31569e44affb58143b",
22435
+ "e29ec2a7f182253bf843935b755ea520e3f6455c0299dee68dd301a84dc185eb",
22436
+ "a8425aeb23fb213f2a31feb3cdd6508f08b38b48ddf27fd370dd374b067d9935",
22437
+ "026911af9571fc29394dbba01d3b57a34addc3540b80e1ce95c014ef994c4c9d",
22438
+ "5963a34f70a94dacbcfd412e995e5b330e4ee99b724293c992352cfd3ba6b720",
22439
+ "436719eac9525bd02e0b65a8ac67c5db5f04f1d5fb71fdd8d031cf93cff285d0",
22440
+ "3a249402734e3050dcf4b48e75848947a1ddfa8b5b2b552d4a9eebeeb4dbf7c9",
22441
+ "abb799fbe5e43b7801980c5d428f19d3e3f06616cf6b0572e4c35cd0fca48540",
22442
+ "c656fede3ceba9ca686efbc8873db4d2dd4de79f385ec6ab88c3f29aedb40f14",
22443
+ "3f4c4468e4071068e79d7878ad0e49eb81332db3c5026069baebee36334599c5",
22444
+ "ac0600273f2b53de90b3f8918f2c404f85f76cf7c0b2f82f752450b471f91262",
22445
+ "67068a3203fcddef44276d00c9079536116d6acad70207fb06f345e765697e09",
22446
+ "3551043667b825dd48c6e0fa23441f386919e7658dd192df65a45b7ade3c6053",
22447
+ "da3b23255ddbfe1b3f461e389a5c4139f56337cb29ab6ac23338372d73a8eccf",
22448
+ "1893d5a94b2d6f4ee251aa9c9d8511fea6ab7d75a6edffca06282dd632a9c7d9",
22449
+ "3daf0d3692f38d1245e03cee5c4a5f2a337365f5eee1f829095bf5099c8ba10d",
22450
+ "729a4adb0995314d38bc7fad408f55322cd34ca2d069d244e13523a0d48b23d0",
22451
+ "be20a9d0240ef18dd64b926596fdbb185b359017083838effb90f200c3316fbb",
22452
+ "898afbb8c0020a7ee7ac2cc573667b1baa3ca76fbd6c0a75c4f858de88e8f8b0",
22453
+ "7f37f1851507d1802283769986bb2908ea558a259ba697ff860ac1c779f864c7",
22454
+ "0e25233a7ef8c84ba3551d4162bc11e45818a85420aa1734cce61bcf794a0cf0",
22455
+ "2eae5f52c0f532934cea2a43515207d212dd001dee86afad7187ca980c31e999",
22456
+ "f8eeee8185576f07c164516132d8db59abfb8b1d1f6bb4526e29c3940a442b85",
22457
+ "404e3951046f9a27ecd7c48d64213a8b7c2aeb7e24d3725bdcafe2653b095eb7",
22458
+ "efd601cbe4840811eb45db096bdbb9a93ca7a7d5decc509b679e27007e34b923",
22459
+ "060b510d99928e1ff46519f2339381fcda6d96df35109a0044ef3586ea14157d",
22460
+ "490c4a2d9fcbff9559f4aa28c3af3705f82b6e277e94ebe3a9045e445bbd31ea",
22461
+ "0c629ba6f3302f0f49dfa467120ba2dfa9886b7c3b8ebbd222c3630c6bdfe049",
22462
+ "4e197a29799adeb92846cd18fea67cc6c6fcedd9b039f9a69e972d71db9ae8af",
22463
+ "01b28bb65461c6c0f0aed852fae8c4432dad868652f779125332accdb245b2ae",
22464
+ "6a52b8e03bf513b60be1f914aff24fa5f38fa2bb92f0b99f5dcbc99d5c49137f",
22465
+ "c3a107c8ea2d4bf84b52ee1ece55e811624b680fe9974bf1c600f9153d071819",
22466
+ "7863aae6be78a0d212cc48c26331cd240234ea8c862b1867adec8d756871681c",
22467
+ "46c683a9d8b8ecaab68e0df2460c8e3a2777760530d088536ae2ae14cc325522",
22468
+ "409e4325a33213df3ec38d5a72e4369560ac0ca95db2dcb9d708ff2517770217",
22469
+ "9e629142c48c0fd6b99c3b4345644f46496358a848ead3eae48ef36c7eb20b60",
22470
+ "b42172cfade42db6f6536c37a88efb686635ad060c3b079d34b749055039a87a",
22471
+ "e45965302b6d82ea7435f954bb732804107ae8d3d7d1364e5fd2d83839485ee5",
22472
+ "76dbcfded570970979e41ed0316282e5ee39ca3e3acfed24ad290f812a6e5b9a",
22473
+ "1ff96a27ba13d533adcd9eb6303e4c615dda69ddfd329032f73388f351503b09",
22474
+ "7801aa01b4f584fbe0f613531269332a7a51db3f3e185c8f5fefe483ffec78a7",
22475
+ "a6df5625368730c9a761e2139a0043a414133c90fb60dda2672baafe781a56f6",
22476
+ "062182b526d1f67dc26a7cb0962a65ca880680e0cb975310e57b7bed528feb09",
22477
+ "10e43bb2b0b2d48be150de8f413ad37feb9fb2838fbc9eb6911cc564cbccd397",
22478
+ "26835d442eed33ef9003fa61e1f50120eb94b8e96b716b9a722aa221a9cb71ab",
22479
+ "88e5fec75b409ffcd4107eadc1cedbced43e649379e09343843c86ce999d3adb",
22480
+ "f88149b1fa601661c0e5f6b593eed3f27d03d7d9a33d83626c734efe52c44711",
22481
+ "d404f94abc57b232b54214b32837496cb4d46400225d2e30fd57b0a8b34a8d88",
22482
+ "5d3ea13e229c488bfe7d8fba8d63491f11c95a796ceb9dd7b5f7e06e53ae39e3",
22483
+ "8c8207521169cd92d0801d08a7577b2b0634ee04801f14c88114ae9ab25c4186",
22484
+ "d0303a8404f4648a6b09c8aa818868bd6a766eba1b9f0fa5a961c1fe583126d1",
22485
+ "84df46cfeeffb5a8fbded03a9a85b099b7c34bc7e10b0ddae3bb170058c10bf8",
22486
+ "7e85297fea071a15e5910424d789eb74ce366faf6a97b5e39dfd3de0357ef142",
22487
+ "f15d1b73de8d9436fdb1311af3150d8712d1906b2ef706d4948d2f6378e9e584",
22488
+ "f712047f7562a743d916c05c8485ec104be8979b4c176a6a063993319bc2d3d8",
22489
+ "69117669b640127e135574626729b9a7808cc3dfa53f7570d73c0e700bd4a2fa",
22490
+ "12d4949e5e8940ca62845ad2b9d1b1ad267120e38f888897413038881dc7030f",
22491
+ "0c4828a77fa07990933ecc57e446e955d86725666612f03bee2f844eaffa6806",
22492
+ "7b964625893587743a35ff312b98456ca8f61d409d2f7bb63fdbc5893a924cbc",
22493
+ "9053fd96bd8ae5f54c291565a6e5d2afc74758562938a1e8a037f0f4962a3c31",
22494
+ "20e43239f7c4c323ff35736c640f9a0fa16c69a95c1a97b81f4618a82e2dd635",
22495
+ "b62a163ae6c0ed706094478413da96519ae5ac743deaf225be022ad0a09ba7d4",
22496
+ "9b44fbfa7bafbc1fb4d5026d1dceb895399af84d538247cb15ee67667f3dd9d0",
22497
+ "71cd280937bae32a0d00d692286a3a6f0c57640287c2ee57eb52594e349843c2",
22498
+ "10e17924f7d11f1e665488b22cc775aec1d8ff663541fcda5b03f12fbd44b4d3",
22499
+ "c3cc545252f50953b333f588af82db76a8f029792fcf024cbea92dd09ca4e330",
22500
+ "d9be22ee13237db25a29004eefdd2d6e83080cf329d1bc286450fae7979a319b",
22501
+ "e32f659cfb09d80af19f895084179d3a483bc44a242cd01b0db90ec261c02180",
22502
+ "6f86608e3a1c16f777f237379ea7165a1058a4b361e19f0cf6a5bc92be719a6e",
22503
+ "d3e0646037015ea5cd05d2d65453f49d00a2709f4f9ecd6b8f4337236c268791",
22504
+ "7eb8ff9b3b5647f07f1c5266edb7f4cf53e7cee1c7399c5991c10ff6fe3ddb90",
22505
+ "5195fa0201b127aeee9ebb4e831118a67e03dd74f93ef78b4fc5afb040f23da1",
22506
+ "acb14ff88b7185b56092508c2208906ebc2a4c198dda1402f8c93c2c1cf0b242",
22507
+ "bc2959f65390d73947252c5b58cd970cc175e7d4d408b934c931b8dfd1a3d684",
22508
+ "53566128db4ab25efb87439cd56c61ccc9209ee24a1fb9b364b9aba9e1852c3a",
22509
+ "1cf6176914fc082d53ab717bc764a4c170dc47cc76a370de54a1c4fbc0e16def",
22510
+ "44b8d9d2598c1dc01dea8ead1f2fc309229461939f8c26845e0bf2d1b75a2957",
22511
+ "7b61391fa9cfee261e31176f2843868eb9189ba5611f489daf7f9ae7b06a25a7",
22512
+ "c6e67f6cde7a3f8a96e618c577d2aeb5d15dbfcc03d10a98e17edfc0bc35cfd4",
22513
+ "325ec9e8963ef1cbe15fa9cecd5f43fa04408f95bd1f1474bd709d858e5d5225",
22514
+ "31bc5b250ebdb1b922bbf0dd63fab96b4fb5134751212fda4d19bdd573f90847",
22515
+ "da89ec30e0785dd2ea178d04c594fb879390e4cb91a805438a3bc42790f18337",
22516
+ "442190ccdf0c12fd267ebd471042be260511c0d2d6db26da8803c790f3071db8",
22517
+ "9dbdd519ef25876fb5eb69dc02d504a2a9f94c60750c1c7d04eb7b1f952dfe10",
22518
+ "722215fd1da5ed26d907c7aba0f819a3898e2b76514b9fc89ad0d00b777b7a12",
22519
+ "f5996721dcec60929a7a64592932167c7dca680bd3bcd40034b345194ef01a47",
22520
+ "ca87af3ddfbeb358af3d9cfb094af06594b5f6791d2924ff557800eb3f1263ba",
22521
+ "3c480b678a8f025794753dc425ee581ef7de288484bf0458638507179f64e93c",
22522
+ // melonJS 15.0.0 to 20.13.0 (melonjs)
22523
+ "092f90df8320fa0bc951cf4c8ae0b097b185bc3b0b14ecd4287252c10fb2cbe5",
22524
+ "8222a30c3c33cff2bb59e1dbb4775ab96431a93c517f5b22f74e1b53a983940b",
22525
+ "8fdb7f3916cc1d39fdac409bae9fa4d46b5c5f59c6a7ac1de43e7b4cbd80d94d",
22526
+ "b5279bf1a102eb401f19fda4e51edddcd3c9d2a8a87713eeb8f47db5dc97ed4d",
22527
+ "082c8366a890209f2b6aac5d18857b83cf436c61acdfe5dfad7dbbdb35c67b6f",
22528
+ "fb34c53731411844d6ea82fe31801e65f0b7ebf4a1420674386ef23ba4620b20",
22529
+ "67091896fbf229ac5a563e07b80d38e7888245f2b1616f21be9c4a48fea8f4b1",
22530
+ "3616e71d4c36ceb7831635c64735aa32bd9441833c80e7031629781ec27861b4",
22531
+ "2a36e6058ef9a45bb52f04d44821cd88290377ece25571c00318a57582e9726e",
22532
+ "e1816fa57d16fa8ef9db7fc1cad11de762b73dd5e0837c4af636d4f2de1a45a2",
22533
+ "021c99d87e8e36146bd125b1b4196fa409a832b13f2edd410f8026b62872965a",
22534
+ "c54429115d6d458a223bb66b4f92322403a1cafda50ce07edf4965e4983495ea",
22535
+ "7a285a2603b7c3cb50b18c4ade766d57d44bf7faa18dc09f99dad1ce09ac77a5",
22536
+ "83539e47d45b8008413c19281696a17840a0e03b2257238034908f048d4d274e",
22537
+ "9c0fa2c2ac18134eddb550c26ebbc1eb37e826759ec77d6abb385e6fb9ba0094",
22538
+ "7acef656778f8627b8b0912afbf5d0d24444d323fc90884dbed11cc35a8dfbfb",
22539
+ "f769c54539ab5ddcc15552e58458bec7c8a1b09079c38d8d79ae050fe612e92f",
22540
+ "9027658a3e6b683c33fce8a64466dcc1873647134b1e6323f76cc6356a3dd423",
22541
+ "a3bb90452c6ede1d45b2df185ba7c7038508883ee0fcf5ede42ff8f69e5ecc99",
22542
+ "c8470ddb75df7a8dd7e0f3b10e82dd0a1840d7aa81b6a5523cc7008f39d4a200",
22543
+ "34f66aaa9fc48b597e8c4be04e2da78180192e7011f428b94c6f6c61f0968df6",
22544
+ "406c0aade5e240b0524f4310de9ec7720eb863736bb6f6e5d1dcfa519374b2bc",
22545
+ "fa4d12c582f37803809aa5d69e955d478f5b9beaef667ca63ccf91cc9631bf84",
22546
+ "29a7df2ac08ded680ec633e7d961d5c2ac65abba01a1151178581eaf9b852aed",
22547
+ "120d67feff4964e390b293f5897f823b9a8f3532c82830a3b3ca5856971495b4",
22548
+ "6c6bb52d7ff6b4312e259da7f9b15a54f4fc41a6f478f2c6d84ff555e862d8d6",
22549
+ "635d7e365378587b195fd276342c451f5aeb064809ea39d051a8b7508b386d13",
22550
+ "dccabd6749ccd9df9ee609cd451be79ddfb28a3bb0c82287aacf7b01244ce25d",
22551
+ "8bd040af1fb395fa793134026bb0c17e1d0df1ec05e2de744098818e622b4c23",
22552
+ "210fd9618b31ee4fb2d2336e205a45a2b988dc8ea3d60b1dd839290dfc082c7f",
22553
+ "a3be9450c98001000b044a35b269b74c17214592e18b72e02bace2342995808d",
22554
+ "a7e0448cc5f4907de4d2452f35b4990215d6f5111ca6a45377ea03aad3ac3215",
22555
+ "2013ef21003b5c047136e40051e9e9748417e39d5a415c872242b602e3fe5cf8",
22556
+ "97f2896df9488dcc4aea3a2735e36c20e1edd867e31827b9dd3cec874cb447cc",
22557
+ "7c4130353a09d38f24739343caa73cd283126d332b4baa25b9c4e126f5a385d3",
22558
+ "f9b254cdbe34c545aa5b575f5f18d8a4a67004766c316f38cf34b7e3d5beb4b6",
22559
+ "ae1cc026c1d331e901929060f4f648dc7f57b046e998830136327f24575de8ff",
22560
+ "bac6b50b4c1eebb9517845d972d0b89a7682a8911e0ac50c3b7314df0878f6d0",
22561
+ "31b7eb63e340c9989783ff853535f11ed21ed8c25c4c3c0c742f0c4c698f2e89",
22562
+ "c9bf78dd1ca4a823b3b5d351fd35914b577af422bd79052fc88b07c5c5dc41cb",
22563
+ "30005070dd6749e0b7796112b78df17cfaaa4b3c36385ab9788a718f640c4e39",
22564
+ "84f396a5be1dfcc81771d2a59507b06df38bf7f694ca189ad1c770459325c77a",
22565
+ "40cefb675119e3fc22edaa4b365d97db9fb366aff8bff82bc81179064640e93a",
22566
+ "7e1abc4257cd54bd3a6f0fa092b2a81ad9d4762fea9717f94c483492129bd163",
22567
+ "d72ac51d8d9332ade7c0dc83a94dde6de34a2fcc25b896f6a4570802d3be4458",
22568
+ "f42adb24f8f0b79868071d0adbd35a2652eb930355928282e71dd0a5eb92fad2",
22569
+ "5b92856bb2195087ffa925fe3c87d119de52c8fbf0fd49df253be57ddf07d2e8",
22570
+ "2fba3e68d11b9bcb5f4da56ecd2562c5990134527b5061c7ede9a00200ab6e1d",
22571
+ "ce337a9082a848b66b64030449554c27a554774f8c64dbdec35c269e4b1ec344",
22572
+ "6bd00b46d45d845b924e6160784a67db1d045197f2cea66b295cc447b807a4c2",
22573
+ "4e77a9dc8c777a93f71a969bd780224c73dcb2303c90e9f2b7be0aa743511e8c",
22574
+ "174b87324818c3ca735fffec4f1b64489be2ceaabdafdde80967b78ddb9a7b66",
22575
+ "7adc4c7eab671d1147c1376d083f5e10c6f538b1083f4325ab049ec3cdd93ee0",
22576
+ "3cda60f2d45193ffc2884fccf1a8638779f601f3a11aef3f3db50dbb1d952eae",
22577
+ "57f7758ca0e5ea7d2849572b01a583ab31b71b79de393c9e54cdb8f66cfd7bf5",
22578
+ "410259e03455f3694a9dd919489e709f09892c58d09cca752ea563c99be2256b",
22579
+ "39aea0820f6d425d3a1d0deeebf3e9f12493a73ae71dffdf146f96e2c2e98b65",
22580
+ "78a2f9b343692669fee367af8679d68c5065c2537daad234c48880ff0e82c89a",
22581
+ "40debe4cc6726d98c864a8dfd5add6e9b1ae0a1f834e523b7ec993938dad31ac",
22582
+ "f380e86c834f5ce03e5ad110137a90792126b288a12fc45f0635c5616a2f8640",
22583
+ "91035204f65a62f42c23e6b9ea866776e9d1533ceabcb64b093612129933ea99",
22584
+ // Defold 1.9.0 to 1.14.0 (engine JS from d.defold.com)
22585
+ "edd44656d3e316bf41dbd5354e4bed7e08a259a21d08814b48f46e5e18ff2995",
22586
+ "8137f1f3620383f9d7ce697993a91c2b977f8299ee205efebc302b2e7cea5f5a",
22587
+ "d56478ffdda92a00e09a7919477087d8690868ea01fee80bd75e4c83ae870c3b",
22588
+ "b2a55b69b7412706dc2874f942df9ac61008400fea33f76da6f442cd68f84b4e",
22589
+ "8d69b8e7aea8f1b5a36c7c61030c1d477e07b26ae53ea6cb0d9a54b38a501f8a",
22590
+ "dfb41896d6489f693be5f0ca979852011946cc2a6e5c3946a163ac209fc2cee2",
22591
+ "2428c586a065e36e102267526fa8faa3b34e2c423f8d4c76711a5fd125630322",
22592
+ "a93ba20101e2c447e55e03be4282f41813d863f63186c9d12df94a2b336f8a73",
22593
+ "ba39f8e2dab0d9ac3a35e44b0a835efa5ec0f20e9941e9e2a1d1a9f3f05c0726",
22594
+ "250549b4306b659d04fc8ab41e46da0c75933badf92eebc3f550516a3fb250d0",
22595
+ "4bff5481922fc999807ce5e547cbce04e3b79c837ed0c1de003d94791a126d89",
22596
+ "556cf399bbfc7929f43d9b17b1c883290ce6ca0b60e5f40748f9228acbacc821",
22597
+ "abcd8dd6f041b60a3614379658e7c4c025a07f742ed19e92694b18c47ab7f0f4",
22598
+ "2219b98a2b7f4f30a5d3651cbc1142a160ea41425e2ca80eadd4593e1655cb5b",
22599
+ "7c2d1fb4fdbb75566f21c86fe553754d149aa70697484d40ea5053c3eb8b9751",
22600
+ "69fb226300f6a079333375647c7d5b4e8a0293d66fb7f0520f9ce5a108616f32",
22601
+ "d73d56a9b2bea1ec1257a6db1db426872ee2d6a049248f193ad839935499dfae",
22602
+ "686bf02fa77c0fd819568bbd0f572abc61addbedd29972090cc42bf230f8f1eb",
22603
+ "43af18b1b736d76856d29b4c390c521518eef552e94aaa09042aeaa0042a5456",
22604
+ "e333f54b561d6b88d07224aec05875d6e5d4351bd3c482c15d32f0beeb0df871",
22605
+ "d3066196fcbb399b4491c713d50a4c5a24ee959bcc98aa7107320f29c522c8d5",
22606
+ "8487f30189e7be13178e27cab5047a2ceca6be73d30019abe12cfdbd1b6ac531",
22607
+ "a70979e5561ee35fea8a6307512595cfef928b6569fec9bcdb043e6e088648ef",
22608
+ "6ed2db84ee98f01890ebe85a3d9b4ed2fa44d4f953071db7824fc30345a274a6",
22609
+ "737bf371e87e6ea1c44ffed9c1d4cf2ff444877eb3d0c666790f25babbba25ad",
22610
+ "e30865a8ddcdb353f1420113e24561fb1f729145f6a90d3d2887aacd1af59990",
22611
+ "a7cf6d0e8851401dabbbd76d2802ef9412758b1de953ac2d86224b71847cbcfd",
22612
+ "0d3b2081144008db26827391e3ee9d95432234e51dde05f13dfef3bc48fb5ce1",
22613
+ "1903209df167a302acbe1b603fcaf0ddad2afc4b837f48561b7101766c4f7832",
22614
+ "5b589934f1e167d07f02008b29369774f450496e652bd5562f1be36a644697fe",
22615
+ "aa8c2a6498c2d59a88b02f9cde2d70b463dda6e68bb0fa5fc3f250c2a0eedba8",
22616
+ "af94aeee57bc0242d468f1a4803dc11abe8c332a2264f9e406432d31d8245d5c",
22617
+ "2211a3195d5fb9299a12d2788b299edf268c674c21fe1a9e79323694ddb4cb65",
22618
+ "e6e9a090444faa01f0b081651392272b587fa26b4b7a81348cd613030606d0eb",
22619
+ "074819a40296ce0088fa1ea696f6714b746c5abcfd4c1768770b4c27e98c4e0e",
22620
+ "8d1ca645f93e848fd55d5583a1e0b7afcb0fb0654760888677ba8e8ba29503f8",
22621
+ "1fd5e5210dc953067fa226aa8ae9ba2afae6f5aa9546b0b38c2216cae1ade8e9",
22622
+ "2200c03fb91b69cea8f4841812210a7d429d416bc1246804684c24e0e68215f1",
22623
+ "876eee7996b35d3b3e9831b42a93a085024172c2eae58f01f876172304022ee9",
22624
+ "eb39f5fb3b6552c7932c7a73445d167e2cebbd63e816e2e145c805ef1b8060c6",
22625
+ "906a12e081ce00e567bb32f919a433a174ec5e179509a2405dbb448aa567eadf",
22626
+ "f39f411c5d268937e9d17c8ddc07164024e213d6a3687345254901021c3754eb",
22627
+ "108eb924165fc2336ba452d2160e30080be467cf047bc8d21129e1652a30a26b",
22628
+ "44bb0094296077a0144daaaeed693e7cec014dd6355bc9f6b9b3bfc3b5ac5e74",
22629
+ "61a1a392195d3608b1a4cfe772552220b4919621bcbc0c7a6ecbe29cff7aed0a",
22630
+ "65126e2d460d071d0bce686ca42257a526e11f3b442ac9abb3a397f0ac4a6b35",
22631
+ "da0bd3d3ae885bebdd805da68a84e3fce11b68a86b591125991dca4c61f95655",
22632
+ "dcdb300b2e6ef37a5dc3de1c5714d56398ed41366705fc17e21c82192fad6418",
22633
+ "eb00b1172ace2e66059e557287db01daab116af2c4ff357f8d65e0ec2e4518b9",
22634
+ "84e71eb7b64b5bc71c5866c00f1fde4afb6a9e15e9a1abcfd04a520247c9e9f7",
22635
+ "c44bc99fdbbd2356a10270d6febbc94430e9df689bc422cc10c3b699f67380ab",
22636
+ "155986819f9e22d2cc6ce0361d38681d7f399a3e6a296c7fba30ab7b296dc55c",
22637
+ "9b24b6be6d735e8c2880c912657f909576286b777a0edc65a0054942b6b1691d",
22638
+ "d23979ede676bbf51b21a70ad9ae859ef5fec22f7c87c2eb0bb2a7603c8d2722",
22639
+ "f5b22c7b1c89b629924cf356e9bc984b0d11a9e63b623ab2b2fe4c8cf0c98561",
22640
+ "e60b3579a8b0985204f1b659fcd75a45c3dea1f4e84236834360affdae556982",
22641
+ "e4085df08a7203cb3d6f0c778aafdb9277c572864242970e3a107250c5f2769b",
22642
+ "36a5d09ffbc0bbec8327eb3afd4b8615c428593b0f653a8b3b774fe1ab21eb1b",
22643
+ "66906dfa3fbda081b0c5858af6a5d6e0cfc265804970ad3ee2cb7e7f5a8e8a8b",
22644
+ "6b019febae41b15f39b151035e702d5be6eb5653f3b34bf92aedd2cb07ce6434",
22645
+ "5b58cc5760878b60e46abd6108ee258c432c6f34f0f95886940d29b62d41ac45",
22646
+ "3700d424773de27ca402adf2cf5777f9bf8fd03c8ca8ed467e7c03c73beb8a6f",
22647
+ "bcf5b98705cc583199d60d5976406029d170620b61ce96b4e37a6bfac08256dc",
22648
+ "85ac338d0a7338804b1267d3eaf9751d2c52a25c094a9f107dc2fa71a231205a",
22649
+ "a49b06bd553b39da53936a43df97e62685b1af595aa290cd66bc425c4dfd3e58",
22650
+ "7c820e863e36b8c0d90e0dc55661c3cccd093608016aca30c3f1a5cba1e90640",
22651
+ "2343263a57e37498cf38e4e8804f835c171086cd12e8de0d682abc751e35fab3",
22652
+ "f57d0b616276f55c5b4c5760f3b8dd51776c81e4b859d295aad5ed6c30d2d5c0",
22653
+ "30cfa5982e474d16d6a72265cff42a3260b001f44c91489e7a6746deffe2970a",
22654
+ "2fe357838111f7383d94dd619e52e7f40602e53e96f76eb7e1e690ab4f8b3b22",
22655
+ "98b692a9ed556ff54ea05b598e470f655cdcc71f7875333b573000ad416a5464",
22656
+ "3f92ed639e7e73ba79b261181efa432184a5cfc919326457d76ba003c6f9e122",
22657
+ "7300eb15bc323463e16d23ddee431e97d207cf1402897551acee5b9a9fbfc279",
22658
+ "b8eda6da78425c8fc5ffaad4dac153152b1b60553632aa0db221a68891d8c217",
22659
+ "f5a8444b6c78cba3599ef8217732238a472fbc638b96f13eee40d4a8089171c7",
22660
+ "304b8af2563b44753d752f7c2ef9af92753ad0a4a5aba7b56c61d2bffe89fbc2",
22661
+ "7b78227f234990f0edd3a5772d03f18374c7b349e06732fcc082fd23e24dfac4",
22662
+ "7a2ebd593c302c14bfa4ec2a59398fad1a97a9136b817ac0a0b9dc0f9a89e1e0",
22663
+ "b6859e07f5959387472ac76e1bebc3ba8043d7ff76cc0f68187ed39740ac4194",
22664
+ "14d0681d89e99600b1fbcc694105cf0c26b0bc082a7acadd4fc753f1381dbdf7",
22665
+ "0aa565110d48fd9111f87c58a0d729eb11a25f3294a9708886a2240163f92818",
22666
+ "478d6bda00a51fb3b12f0bbe74ee68f050b434ca8765a6fec92f99b3a7eb75e4",
22667
+ "702b1c83940b627bd033969dc0d4cd4f9c00d91807706dec8f2c910557474e13",
22668
+ "a16b1c272b4d3ecd7b32baa87f0c72f19ab5ded76e1e8b4a30607bc102bd32a6",
22669
+ "f17a58898502562c964dffe61058a5edc8137028f0a0b8e5bc8dc5b0a4579442",
22670
+ "b9f13567648ca4bf2076b06cae2a5403dc8da42310be7209acd5e6809d3b7ebf",
22671
+ "93356413d4adaabb96207c908de5f5099a0094201a8221f5996606004508cd24",
22672
+ "6ec0e5e930b73565b1bdc091171c75f15c74aca32176ab9f8b34722cbf31fffc",
22673
+ "bb9160994c23ee2ee9b7bddb27a1156d93ba9a57c0f3846133ba216cd3e8564b",
22674
+ "58cad96e43066e1a533433dda5c4c142d6507f142dcfc1d15c6e163458d6f234",
22675
+ "7e5cf645ed66cc8bdfa148c2dbd84e480e8f2e6e4c1b1878a00a1d079e296167",
22676
+ "f20e43705afe39f8068d2cd6d941aec569608699488af7577d6cbe05d0136f53",
22677
+ "a0491cae78c7b7f8ede3c0fecc38e7ae3c2fb081b3a5e089a417764462f060d9",
22678
+ "8d909978cab7c906ef2ffcf85108aefaf07fa8fdda8f7d56b52933b246696987",
22679
+ "ab02032efe76e152531943c024bf90578d911fae0fdb1bfd6d9e58fdd9c4f4fc",
22680
+ "8746f538472d572fe051337582b06048bbe5adb2061dafc06f1ce6d8822a4718",
22681
+ "cff141e228d908b9b10413fdfd198d19d63c0122dc020bbe9c1e131d898bfa9e",
22682
+ "5303eec166e4122ab56c2a2d50d7efc5990719c4717fc32f558c1a262a02a715",
22683
+ "ac2ff0e57739d0cf58b241e5cd66c37f048b6a0d9cee761b925e4a2083eb07eb",
22684
+ "a2725505ee0ed7b92f1389e439323937d7710ef3c908899e4bfebfb22924efe1",
22685
+ "daf6bc62dcc2dc1a7024015ad22a977f4fbe39432e299f988c9fa11d9e1be6bb",
22686
+ "6b448f1b2b349bec7860995a9ef17fde808839565b0d994932b768d9d1c040ba",
22687
+ "ab43cc4b56aa5a9d92cc7773d01776b1e14a0ae99be47def9d98cae4a92fd7dd",
22688
+ "c48c14b05324b1efff762f204d3529bc512bfc017e10c93fb5d7878207a0bd30",
22689
+ "77e1bcd11a7d8b89f2f6b69f812e7b173313b75711ecef4f3690a1df7e54e567",
22690
+ "146e23f07aceeb2147749aeda4eafc7a13e84b1213b08f361f5ac9453e05c8f3",
22691
+ "bef5d6468951394613b32dec7374d48b812d24938af03edfd47fc2a28dfd7260",
22692
+ "e5ca8ef111fc85b2f373829bf0fee385e43ea4aece910af156c84719d59dc7ec",
22693
+ "d5c7f696b1639db3580f88e1f46e6b2e21473e40ba0ecafc2cca7c454559b39a",
22694
+ "029fdb48ed316def31ab777f6016caa7f4ec3bb395283747b47ddb6b02df7ddf",
22695
+ "be69528a54f49f670f92bc10006bb410ca727c659eddb2b59632ee21f8331282",
22696
+ "8b94b79a59b7a047768da2a251c13eba63bd3ebce4dab2cefc492ebdeefa4c1b",
22697
+ "f4ab63f7fc905956fca23910469b33e51c024a6d658861fb9a011c7be3d738b0",
22698
+ "d37c818899a3ec224732be77ae4458acb320a8349b1f1e6c10a0fbecdab12998",
22699
+ "b918e2adeef0ddec10def46d8eb09a5689bf2cc1989b8580ed978e65d6f886e7",
22700
+ "e0f3d314b99a19325457df91ef1fca8836263651fb4f6c9f4c4e8de271d646ac",
22701
+ "6109e1624d2312947ec18af1af936c64aac844e50a02c1bed01701234672989b",
22702
+ "276d3f97a51cd59d8697a4078b9e07161001064df5ac0f9a53eafcc5605da7e6",
22703
+ "17ff6f534d734d4131934fce09a672f35b3222890c7c638e8eabf07ea4f24cec",
22704
+ "c0aa223291261752c2aae0c7b44dd1404dd7c420b0b60e38d255b34e7b91bc6f",
22705
+ "16be05e181b665feece2148cdfe97666c76fc6ffcacb1d24227ba67f883f1a72",
22706
+ "cfb6b4951eebe733e8ea19214c60321a4ddcba77cd0e580a0ff22b0e82f44017",
22707
+ "14560184851fd042681032ea8763f87e0acabc0dbc90d91d96c02b313dbe3922",
22708
+ "d3580ac7e51c0739d55df69a8b2f994715518647c810cc1e5dc06ab3f7b6e38f",
22709
+ "a24026763c41e73e1f2bd8f226143e988876e3d6f8a56c8a6dc0702a576c3c91",
22710
+ "87842dc4e289ad1d00e96009d951a620c0d6c68a3be699efc07167b81627c28d",
22711
+ // GDevelop 5.6.270 to 5.6.287 (GDJS runtime from resources.gdevelop-app.com and the Windows app)
22712
+ "0cd0a70063afc3850f683aa725e7e39b3445a1169efd14413fa0e6f659245cb2",
22713
+ "5d1454a2b9bce580170737a0dd875e5d39ccbdaef6bb57833c2c6221bc2a31d8",
22714
+ "17e92b30573c4ce710d36df0a40a4334b47665c318a5fbbf4393729913bae5c5",
22715
+ "0b72b2afd60626c08fd672ce109e7f41a1f532c4e6b525f7bcb2ce6a99251f79",
22716
+ "ce9063df0c7ae8a49541114f4e67cd042c83dec01c52f3ae5ae579a42d0b2580",
22717
+ "c6bc6e278e17a73a6fad9f2b9731626b034432615f4ad0eb827f366a09229653",
22718
+ "5886e4aaa563baef7b2d036e12cbc5b24be9cf1d83618eb6bc6278755f91ebb3",
22719
+ "387bdea0edc91b1128d9d55648c2b62f67aa60266c0b3525193b7fcd30861a8c",
22720
+ "2aee67ba26d59bce043fbf447993a32d66812a3b6fab82921146fce4a6d2b092",
22721
+ "cd35c9205fcaab8e157219f4ca92d6274f5224ba714d76e2bb3b8a4513694496",
22722
+ "ce99cb6a9f905857c9d4f299141498e315bb379bc4092097d11169c838b5ebf1",
22723
+ "b975e31afce948f58d4d60168ab84f0b89eccf8e8deaeb03aa6764a34fbc62db",
22724
+ "79c86988f9e2107b266b32996cd76ed402e7974c504f9cd4dc1a7e7ddf287ae9",
22725
+ "09f8d67cec20e8a5593aedb6e072c9f9162738164417fe069347c34643250fc9",
22726
+ "76cf02415edea1d5a2c3434508c44c4aa9ebe5dee82d71322ef60132f5b137e9",
22727
+ "1579b696c0d1363f27a69d00a22e0543f99da51950ff14017ab52c63f713c57e",
22728
+ "ff1465559502d2d42b85328825473ed102fcdb665717d10888f9fb2d81f18980",
22729
+ "a16c4aed25d1669616be51ec00f2d9e69699d99cd5d782b4930b8c65f96cd873",
22730
+ "be55d31ad674b9ff9e2b6c72b935e64c8672aad0fff814d89598902048bc62b9",
22731
+ "f1211e9ba371b2cc73b3e0a71ae71ed2f81d97df1abcd57986b009a7ae96f1d3",
22732
+ "9497aadf8564af377a602c0bdfe5026cf099ecc6a24a96c5c7c38e423935dd75",
22733
+ "eb08039f646503016e8ba22d65d7ad53a2bca12fe7dbe8bcb21779aad91eac65",
22734
+ "3ffb20ad10f4c77d6176f49a474cdae8872ca6909e66d8b23951fc2ed516dfc4",
22735
+ "822ca789d57eb2380a994330ebd46daae64b6ac22fc3fa65b88ca77d7df6b955",
22736
+ "74132dbd7af0316f59b6c872eb9adab8ca4351d22cac73ac92c3fddb19952b46",
22737
+ "5ae60a53f44d6ce5d6c89da39d93c7d8c2d1e27e4d4a50584d908d1e63acfc13",
22738
+ "b26c7a3671cc32df417e7b44beccefe42c56e14ed17c86645c90d87b878d7c3e",
22739
+ "57dec925898f0c5c77d04253fe0513fbe10c170fa4c8c30bf26f8c1a0061a5ac",
22740
+ "8a7373ac5cc9ebade70cbb75865cfa5e0dfef79b4b645a33b590dd8a79cb0513",
22741
+ "489f7e3186b55db48f2b9fd2ad77209ae445ccb0c35a0d7c5d9637602ddb74b9",
22742
+ "eb26c07154aa23081896e01638cdb041b10abe79d73a486257f21b5d777c12f9",
22743
+ "34a8443939c25e41fdd77680e7b68a41cd302f65d9c7a40cf29a1f7629c8b840",
22744
+ "198df3e1399b06884328b882207df88ebd00fc6f65642f4c44a07bab5694c7ca",
22745
+ "21ac06b9629688827319d842b32bdc4750e6389e813a4424cb1370fd383ccbf7",
22746
+ "17e94adc50ecb29a9ff64a274d1f52ade4fb2481f8c55bc8724a2b257e19730a",
22747
+ "a520aae86cb48e9335f51d520728fc8c36f47a45dc5b4800af404ca831c098d8",
22748
+ "08b25d89fc34a13195b9af2400a0a68cce9c1b36ad8dca4b3ea312f6fd632844",
22749
+ "4b9a7fc8473b23c981e149f8a63aa3a11ea4034f9a5a7b18796c7e9df5ebf4cf",
22750
+ "0f616ca5e2b9984d487d5572d0c8de05ac6087301693cf8d185b9890e76e55ec",
22751
+ "fd456c68eba47644872eef0faa2556e9a439bc1bc1cf6aa723dd56fe13fa9d3c",
22752
+ "d44471f8b9b0bf9911f634ddf5b3bb40c74a98bcfcdb64b4c306c389a28a136b",
22753
+ "122fdc96f8664500195efd70e6fa0085039fd4f4749c7e10a5bd332add979f41",
22754
+ "fa2bfc9cb8fc5607c5335493813256b1dfa49834b7ad1a684e728a46ebc5b4aa",
22755
+ "fb6c5627fe8e92306a82330b8005af9d73695dea238d3995b693545afae9046d",
22756
+ "b64d76a2c7ee4f3900e43adadfaf21ce51253c9df808bf0cafdf2467a8126fb1",
22757
+ "d84a94e7e0bede70708c6e0d369a0ea7e25597d8de2b1241d3117aa2e8de4015",
22758
+ "262fe7cee09d8511f00167fc0c268b60dde16c08a5b259de974ec2b23712cf9c",
22759
+ "62e83ecd3f18147fa68ad280bfa4966dd90ab565f3459c3bb3119a2a0908bda5",
22760
+ "5c7b4afea22a20191b28c725ea9b303dc184c3878a34ed66823983fa787ebe5c",
22761
+ "a5ef3437a0377bf07f797061fd30d72cc4cb9dffd259fd770f584afffe313b98",
22762
+ "c6330441f664f18690eb32f7188e44da7f3eb9f763e3e3e29115ef48ac28850c",
22763
+ "c1a6bbfbd516db4dff111aaaf4e75cfdf5edddbfc86b48a4007d5d52cd60c555",
22764
+ "47237212ef385106b4f0e8d0bab3eda990a108a72c9da4b9e48126e2e428bfbc",
22765
+ "97be63301290499a83fa9c156717e66dca43f897f0d3ac31bd4b570c9add2f0c",
22766
+ "8bad63f7da66a2ada9b591b0224a700ec05e643210e5273e58a101ca9ec1e986",
22767
+ "c8f1e356fe88a56935669920e51961a3b7f410e4173ee49f59ebbb0e0efe4b99",
22768
+ "17b4f1bfd038c350da9afad202e4545ee47fab43b1233398c7737cc3e2797f93",
22769
+ "3408746b10b4b18dd1f786b9a1a7f816e564af59ceb6c709be5ca140c62d3980",
22770
+ "1e23de8c25dc28c2ddea7c4a3cf761cc0448594e948b8c3d7f60241f27584a92",
22771
+ "24a86f2b6fd81f72c5da062be89e309134808a3c04542e3ce64f47c78b9c22dd",
22772
+ "71ebd6aa2fa24c0185c6f124a0581e9d1395cb9b6c9c9a8fa82a24ad34f132d2",
22773
+ "3b005849e6624bfae51983e08bc2fa2dac17fd922b5c638f48e97195822d52cf",
22774
+ "a80698b73336cc777b9905e6fa85113bcb46dc79b877236eb0ec900b9a90f145",
22775
+ "d73d26ef4ba3fc39d758a0ac611b7ab54c64fb41099af8bedcf047f9a9f1bc56",
22776
+ "5502e9eb63d21f0a787ef7fb13e3d233501dcf09af98ef86b4b6dd23e333fcbb",
22777
+ "8994d932efb0c33d39d24130af5d0fc6af6e79cf94359c725c8983645fcf6d69",
22778
+ "e473a0723cb4d7b6b30e227383483685707b2c7314ad4ea3edab400b4378655f",
22779
+ "724efc1fc2de5bab9827fe480db3d430bb79df42a1cd8e2592f11fdeb222c768",
22780
+ "d616be8c04e0d35a5d608f1bafe14df7940f810350cc353431b47a0559c633d0",
22781
+ "5bb22add266a706c61e4a91f90b5a652769f00adcaad43dab466959a3e42a575",
22782
+ "986bb7cb04ac52474c27655c7c8096827163b4bcb4421b3c01c5df29623625c0",
22783
+ "3b432251da27e5b4d0f8c8e9801e970f7f9931a842503663dd26de779ac55f65",
22784
+ "264616f041ad12d4d5c5571b3b0dbc94097334009415b9bbfcbbceb9ebe0fce7",
22785
+ "01cb0f482d7794245057b6a4378cb315c0007dc2c92ef5435c78dbd4e777da63",
22786
+ "7239f07320ce68ee3ff7d352b8b9826cdd2a2180c99703d23642eb8c2c65153b",
22787
+ "c63cd71c4783e991729c2f920b732714d964cfffe6d01426448c52947fda47c7",
22788
+ "e33dddd930be137da26338cfde771eeeb549d1743b352008eac1bcb2be0b4538",
22789
+ "6bfdb1dea8978a16647eb71c24dc841ac9f9771ed20074900fce6ae9e2716ebd",
22790
+ "13a11a148cad94c11732aa86860d1c48af85fe5eee7d6394a3b492a331507dbd",
22791
+ "fcbc77888729e74b68d48619a7e50e65c1a5b0359fd2e239c59bccfb6d39ec48",
22792
+ "5bf60152d9f643d260765d9763c1963204987be8dbfacad93a8455da097bb761",
22793
+ "7fbd7bb3b1aa46b10a743fe2f8a7c3b0464562627f6a52e691819806b5cbc9f0",
22794
+ "bd72b1b878385ea472a75c0b6ab3fa3b00ce3f831dbcfccf677c8209b3ffd319",
22795
+ "66fbb6ffe7963873d96b8144cd68397aa253d55217dda597791a9f591e8c0122",
22796
+ "9b3f8fab06732fd15991c3086096cb3db2d1db01b6a1a3ac80dc05dcb3bc026a",
22797
+ "7a3e877c84ab8a33f677415b2222ad82055640f1255d2c4377c81da10b7fb846",
22798
+ "2baaafc67e517d6613be72aa082a4588713cd46adf7d8d0d8b7373f8124ea30b",
22799
+ "d2db841631063c8282c52853e6d2d11539dc804f914cf7b983589a42b26a29cd",
22800
+ "3783683ff0ef4d31250178456abdf77dbe31c4f096f71dc047d2342447a414a1",
22801
+ "fa2cf6ed61e91a80f46fd96e2b073bc41ec5937af37fcca94f40d538560b74b2",
22802
+ "3a859a9bc807f9bdca3d2643fa16a60b075357af540c67df9ff6194d8d067d01",
22803
+ "04c061b2d36511676f935f6c41bc8f1553e74d3854a60a606bcf6d3065911bcf",
22804
+ "6f6e941286d6cd4bc8bfdbeb63abd51cf6a9a9991851df24bae2d2802edcfb65",
22805
+ "e39bcb53d5228a2a168e1c896d6daf3eb9dd6b0ba7edcc5506497124268dd67c",
22806
+ "6a7d0202f88dc0a33e54966f203aa5c050db0f2cc1a530d60be2b28389a6ca89",
22807
+ "aec7bb227bba1158eec3506866d4a97a0f4026d551912e2e37d646034702850a",
22808
+ "5e100bab0ca6e79c1a857b5e9600fd12fbacdbe701e5b4ff66251c602a0dc1cb",
22809
+ "5a21574dd00194f668837a4f8a8e3f2b968082ac7a4d5b02a6496118880e7d33",
22810
+ "7d6d40cd4900dae95bb7b9cbe5df55e30069c0a6753502e56bed945a4c0ef287",
22811
+ "cf3e693f3a22aa42d4d3717db35f0495429d292fbd901fe943efb3bf37175bad",
22812
+ "32b744c4e26088225899d0c039849ab0e4c26f82a84c8e875319b3a65f161fdd",
22813
+ "43518fffd4b1c3a39f7570392f6c2db9516b9c9418968701f504aaa62c2c7c99",
22814
+ "3676d3d635da8639f89237f0a35e8754aaabbd0faa056a0a10bcba8de6d65de2",
22815
+ "144163f70bd8ef8233c89774529fb678e1fd3a825b87043718c0444e65bbee5a",
22816
+ "6fb05d02c87b38a4e8333626aaf8b7948f118adca4cc5bff8d62f86507e65e32",
22817
+ "5195637cf0666538762274dedc31e5c3cbd9fdf92ecaeed98f7308d90f2682e3",
22818
+ "ed927f13dc249a320546aa8a270923db94299f00ca06216141362560fa1862b9",
22819
+ "ac206f029ff9063a214ee137d38fdac49bb21661cc6fe1ffa82de60ef469734e",
22820
+ "695ad258f10df420c7ab07364981ce757bede545f9981f9f5146944d3e117a82",
22821
+ "9cf83ad1771f374ee52aa044655aee773d09bdfec0a64bc7dce555e50f6fbe9f",
22822
+ "7545a04e95b196cc8281552263ec890414192494cf6cc4ccc08a7d1398f9a61c",
22823
+ "cd40c41d8789eca7f8b1c3e8ffa6900d541525658b54b132fb059f16838263bc",
22824
+ "f552f00f066d5340eed0dca72f01380de274eb9eaea802c11e2e4a7e73a6ce44",
22825
+ "61c496f541794cca99668cc480f516a07b7c92ded33d9590064cbd6a8249806b",
22826
+ "51e9afe749e0a45972405ec128727d9cc8fe1a762b41d54e86da1dc779eb7d94",
22827
+ "66ad7d624cd9ef1cdd5429bb859639fa2f2e92ab96356f5cea4d686153a76539",
22828
+ "a688ef800e7c195214be975e2bd1c1d7fa24aa4ad67316cd8498210bbbe9f913",
22829
+ "5a7220c37cd24faa349cedfedafd36d62988acd913236e900b79c5279d45d1cb",
22830
+ "b1a85a97b4ff43b1eb213c23c9928c8b09e85953460bb00addd50d8666dc04c1",
22831
+ "7f2cc19d76732de0134a1c7bfcf0be280816c35fddb3b4fb837ad4d3a0c8f31e",
22832
+ "b4f710821a1bf832119ee1fd79bc46acd68d252419a1bf536b10568f63a3c203",
22833
+ "ec7424a9f9b1931cd60662fd628a231bb7aafcd2f1d50663fb07f38152d3dfe9",
22834
+ "48c4f9bc13e79b8693af15e4a4a6a05a40389d66643d2e0c420358df5fb38c6f",
22835
+ "832acdb544512d14f9fddb3fd8bc7208337fe2c76ab25014b40dc040f7a44f1d",
22836
+ "4a553732344ead0ed04da0d40b4c209beaa88cd72cf12ea398226475977f0b4d",
22837
+ "8cfec8f507365ba9bd19c51a8a9de1ef854f51f2de3e916f6711d92f1e0873b6",
22838
+ "e06fbac47a698aaeae8c5b5fa9d38ec5047f5703e329a8b36d53c317983037fc",
22839
+ "0ba64e6b3dee67f6453b6c390f3e68a75797217cfb35a57bc776fde881d0d14f",
22840
+ "5552c71d978d56499969a64c4e3f2e6f26218e4f7bf9d62d58cc9ff56a26d7c7",
22841
+ "fdf92c3a4efa8008c45c69c9748b0fc1c5b300237f34de2c64bd191d2a9b40ad",
22842
+ "ff19285de976732cf4c9aa5b94e780aa8216ab471916097ef5cfcfd284d7008a",
22843
+ "585bdc349d2eb31151e9a1029e50257570c8477ae6f00e7097e1f85b82694512",
22844
+ "ca743eaf4177ddc8ad91632564f962df26f21a06d6087ea1f83db1a32c3734d0",
22845
+ "2bafce2e789261738bf4bd91d5a34ccb63ebf948683d782b676fdd2c7b7b5114",
22846
+ "cee06b5b9839d24ccc9dcb3add76f061c6b5c035c2fdfa922ad5c3073db22554",
22847
+ "6d3eb2f0551c726b3ca4c15d174eccecd88d4f2785e3aea927f2a5a75125afb0",
22848
+ "6d917327c4a5fe325e61e36f232b02f2584108e55eb01937559b9d75c705c7b4",
22849
+ "2707ccc0684ae7e80ac1efaa2006a9fc67c4d779a145534a0308a4c81f28d9c5",
22850
+ "9c65c277e346842609c4b5d40bc9856a297865e13b2f11c55e7f989da66b0594",
22851
+ "673725e4a7a31b3cecb386da0c947bfaec1116811abbf5780343e990c68249e7",
22852
+ "48efb957a2f03c8c9e964d18bec700b45bd2318e24c880cc43ad32fc3ebd464b",
22853
+ "af82e38a4aaabfcbe2ac972a68c2c31e4abdfc464d9dd7a4b8672c6aaf9e41a4",
22854
+ "9e79b689c6c02438dbc8d5ba8d016eb45f759647efda5fc72c9a3fee5d7e429b",
22855
+ "8984d073869653780ce71a6cdf3c6f37d052985f61e7e292df37c8b7987c7534",
22856
+ "0962210e02d94f1a9d0b7ced945bc7a347943fe388513b102fe28c9e2dc8b15a",
22857
+ "5413e05cbd20669eee1bad63ef224661fe18ec918daadf5f7dfc3ab2034052bb",
22858
+ "5913a5f06904210e9e6f3a85e7b6e00348f92be23f34ff36c51446c013bea71e",
22859
+ "d9d4969e3347d6d1f0da8b7ff78d969dc5591d6e45e06c0594c7f8b06ac28035",
22860
+ "c0111de5a2db4b45f385802e166505799d66577a0f829acfc6d9d7572a457482",
22861
+ "4239359f031ab55261ae0e2e8d5523e748bdd7c1d6097244ac5e3e6733a546c1",
22862
+ "3fb5cfa6df66a275bf33d052dfd8259054308775cd9904d62ce1d613877b033a",
22863
+ "0bf4320dcd8dc3946776c8c5a169b765158c80b5054b3a3c4848623cafe0bff7",
22864
+ "11f5430f1f0bf3ef37eac1f13512f0adc81bac65ef27ff2c176e7d75cd8719b3",
22865
+ "abff7110d7e1a56073748346230166e84c7be07772dd8571bc3033e6cc4672ec",
22866
+ "3214ce83826fab9abe08d213dc0b5f8ec1fb23beb334657177482d572fc8409f",
22867
+ "c0f4d669c58c6f5421d78400b00fd952fc8018f1d6a0a5842f9ef9b84a75896d",
22868
+ "f8bff10f590341d795195e934bd830bbbf5071aefcc72d169a7443f9697326b1",
22869
+ "fa3fee1cd7481ede015c5cf8c7e4c48e333a269823c5371b8775fd9d241ee5f4",
22870
+ "f53f8b1dc4d0edceb4d44da20f093f2011d717f1c56eb85915690c23350870da",
22871
+ "4d62328cb2e42fbb30be0ddc2a0c5c6c9fe6a82d1e13013ee4cb62b100be6fd5",
22872
+ "b5c8e35ddb7260556f8458bd0db6a96e3ebdcdad6388867356cc46fb99ab7037",
22873
+ "4ef5572be79d1bc0715178a69c80824c57a8af4e0cf27ce78b9f85236d352ebb",
22874
+ "7977e6a8f9ae2bef3d8f2e46018c01995b88f5bfcb05960dbe75f8308a25f6ae",
22875
+ "0c6aa39162c9b53701c08430ed5ad8319de708d0dcf61a6b9599aa28b4148a51",
22876
+ "a4949b10435a59b9eb8cbef82c850de251d3a0b476c38a600d700fa3784ed1ed",
22877
+ "611f6225842be6de16368132ac58a6a6af3cde210da45587fe055d94ae1fb991",
22878
+ "ef1c3f902cf2c4013f826966d16177cc7473839774ec7782918da24a95a84cfe",
22879
+ "4bf6ba83d194091711dba102f30c68efb5fa2b94c9195d84d8a891b6bc7e32a0",
22880
+ "bb173437a735fa1efb3988f34ffb84a208b4a722e5d8ccbffef05e2481e637f9",
22881
+ "c5d1af730c2eabdfd3ab409019ba74a970a9c9701f0024a7a9e49cd84fa2e927",
22882
+ "37a1052b9eb2647bdd23ec66873e6c891a4c81ffd4b9168519789d50f7cab841",
22883
+ "055d51cc69ad79107e2677f941fb3e0aaf3bbfe7a3fee55fe679e6738512ae53",
22884
+ "2afe47d232a66dfde55e08043eeade63cf837c80f6a61d5687546aa400f825ef",
22885
+ "0af0740eec63783df99a0dca4baed7b6377cd009ad049b644073bf3ed6c0832f",
22886
+ "9a0770fbde33f28a072aff170c1efc140e14eeca5b29ba9b8ea90ae823250763",
22887
+ "2372109caf69e399aaeae297de8c4abbce201640fecd2f44e7fedf82c48f51df",
22888
+ "3b6b146d5ffe4e8a65baf773dcae0f5ce9ea960d5422308a54642e99a7aef922",
22889
+ "0c536a97913024e3852a6f374d5856364541e33f5715d4bb0acfd7443f2b79c0",
22890
+ "4afcabeba092f05c01bcf206fe4d67522123df76cfb88668047f328c25aadb54",
22891
+ "470805b5dc4346d82b5723069d7f936c461f8cabc4505529b1aa01d45a8825b3",
22892
+ "7b1706948c6c7df44c063d825095038f442996a15dffaa79def5da42e97ebdec",
22893
+ "133c5f3a89c8c6a384b8c078d204947c8eff2ab3054d4f0d6b4e7466dff5a0ca",
22894
+ "799ac0a4da2c38e8d26be7a6f7a119d456b5500cbd2074e937fff0a1bdd65acd",
22895
+ "d1b400c77ce9a7f1a0e5cbd70352f11b9f5ff0c9f3a5f3c1a81fa3444a74aad2",
22896
+ "097e91d8fe934098341c024c30c525ede526722b4ad99cc038d902344e490177",
22897
+ "0b97ca18afb5f34905b4cbc16f7cf0a65137ab563a9aa4f72f1a3945d40cd50d",
22898
+ "c7e680d3c0f07ffa371699b919e180b0bf265b0961f070fbf09afb5e1f03ad76",
22899
+ "3f1333f10dc61c0dd5857f56cc52100c65091ea12bde481f22bfe05e4af48229",
22900
+ "3bd539b6e9476fb2059b702af226c9c6922ea1dec064aa6c9d1c3426fe87ddfe",
22901
+ "d74c0d30ed0a818bfbeff7abea7e38d2e4c58bb8dd811c7b178d12fe8714fd5c",
22902
+ "63d6752bbb9be57a8f19b73bd0b89ce1f95e932d70b43b1434c406f0cc20ed23",
22903
+ "e025bb92081e07b7a56f537af53d77f55b9fb4d8af2e3dac50df812d7d092f05",
22904
+ "0a6eeb8765e9c09e86d2c32efa098e12ff3da4494cb7f307608ebb216317db7c",
22905
+ "ee3ed6926baa3c5c110d148d96f40035cf8d859ee306665f0d12e06948001644",
22906
+ "78c56d89474ce2b323a308d50066956b6027c4f8507655798a51a14bf6fe66c9",
22907
+ "ae6defd2c34f0b2f9b646a428840c958507aaf9e99cfa41004665d7940080acf",
22908
+ "b9307ecdd7c10bb909f496f926103fc9fd2e734e20cef1c9e1c0486f38b9f53b",
22909
+ "b419f5ed46d12ba61721ec48bf11393dde06b095874e0635f14c74d27a3150b0",
22910
+ "7ed0cbeac796e399223135b8987336c9aec7ce48bb1b907426ce40a8271fa1cf",
22911
+ "1c459e51ac80a7c21131e66e8274493973c9fd9c323133ee74747eb96c38daa0",
22912
+ "dcfe4638e6135149a6ca564e5001e505aa7babd059a707059a98a450a2521ed1",
22913
+ "96b20d9c1a28308dc5f9606cab9fac6640fdd9b1ca2917c4cddd85c8b735c85d",
22914
+ "d8dfa5dfbc98600696ce5f4a90bf7c93b20d2d908f737403654c39cda5ca6bb9",
22915
+ "02b9bf46ae7f134d2618f9d03bb7db2ecf4db0f74f5cae5f1d9bc9c6f857ac89",
22916
+ "b7747116a4b4599f26b3a118eb3a35511578b4f741bcd865db3f8614365518b7",
22917
+ "4b63bbf75dd33cbf0a614d60f84df9bc119c32b546b07069a2abd9d48100378a",
22918
+ "e32186226d4a6ac9def284033ff624f7e5ed7c66dd3c118b5ad074fedda1c44d",
22919
+ "8bb2952d2ba7d67e1414f8df819410cb0434a666be53f671fff75f68843d76f6",
22920
+ "f3ab54e2feabfe8bd37928b5f400bc10230dcc278c7e70bca5e025f63519d960",
22921
+ "bf7b014dfdb62e2ccab0e4017387b1c67043964d690a881dde09e1fa1ee4a002",
22922
+ "33162e88a46336dd87d2257ad2a8d98d4af9e370482d685dde69b712122ad86f",
22923
+ "704219c6665c56240d9895ead297e1bb7d7330beb4c02d65ceeb0766fd52cb26",
22924
+ "229d5ecd60381cf205b887c281cd6e3d7261f215b98d4388c6c90d0ed68b9fa6",
22925
+ "3ce17ddd4a6bb4ca590734e195d3c369aa9c0b95ecde86d87f27af9ba8b41847",
22926
+ "53569cd70e3780db8f39c90ef49d77141e297f5b7e1cdb5a8bd14338680ca869",
22927
+ "17bd929af38df753994ca76e77d901c27f5114c5ed55962cf11ad38406fbbde8",
22928
+ "98a67ae5813ccb9444ac7923a59dc23b5b402985ad62dcf38e543f6c9359ab80",
22929
+ "a37cf557ce51f29fe8ed83ac40173cd85d82617fdfdbc188054b1743c502f460",
22930
+ "9dfa15cbb7ba74ee239eabd5b4828f429d0c75192453cf93393214ee0d387817",
22931
+ "13767d37502d7b7b72296eac9bc699d083743de85b7ba17557f6842fe789b857",
22932
+ "56887a9d698999dd6b98c1d97857e6705e0f73a7c2f086c442ee841bbbb3fd04",
22933
+ "1518f6ba2d7b9060801824e085a7b5c57ecfb7d11ccf3c64a4ae915d0eda16f8",
22934
+ "46e93b6c10a3c131a7606e4cc2c1669ff8a675eb5f6359fed9902f19f90ed1d7",
22935
+ "27b607e147b83d8ab48942faaa63a34bd68ceec46885735d7006d081727900d5",
22936
+ "4b44506664d08e41c2e97ee06a97ba021dac3c85702ea0d48aaff8f39b9467eb",
22937
+ "2c8d1cf7a022efd74cbab9bf1805076a360f9fdef56d2e5eda296ba3480e1927",
22938
+ "0c736ac3890192d7d1426eab0272a30453f8b357cecac35deb9576ad21a3a4ca",
22939
+ "4e08dc60e8d337caf0db108e06002fe27751850592f1cd1a8ff6e9753fad4de5",
22940
+ "6563be4b9e43622774cc3c3c7035e6ea17727ff9ad02e46dc2758d5dd6c4863a",
22941
+ "20152e64008b4709fc5b8ff0709027579a23af888823943cf16c13b023aca384",
22942
+ "9d18bb872a05c9d88245a1bdd04eeb4ca8d9b400cf563bf10c2995d83b03a8ff",
22943
+ "a9a5ea707e04f984c74c7ca3bd7c6292b4cc39323e9c5bc0ca73ff41a95ada63",
22944
+ "530dfc5cf2f1a1f704a8b315b814c73803a4acc9718c027e38e5c5cacd0a2eb2",
22945
+ "df549d1a636bbc3ad97267b75c7168271ebd8d8f799bee6a70de3f066d89615c",
22946
+ "5416fa5799c240c6a911303a9b8fde5b2da7b5add078e10f5dec3972b3c51807",
22947
+ "778eb50aa7e6d7edadd7222228120e2ea3e4bb287dab338afc1055bd3cb70527",
22948
+ "897418a8efc514bfd466e365bfebfbacba681eced8b54f23dc84de2653939f68",
22949
+ "9bd67a2f138ddfef980d4ba1292927166ef0f739f06202e9c0ab14b050c83951",
22950
+ "6b33b3942246b2c1d3de8485dec0ae3000b20fb22635b38d4560c4dd41e46958",
22951
+ "9bed86a3bd9a84eaf0a4de6f4012c56dc6ab707056c37046a43e58b9aaf76e6e",
22952
+ "5542509c7c290f2c54519c71aba51ca508dabeb7ca92d6ed0e3fb246fcdf4478",
22953
+ "24f667daadb0c4129badbea810955e1a776b24a2316225301f1f2698f80cd983",
22954
+ "d1733e2ac8b8d495fd8e948b96eb49c3cda3cd047bc2eb2889c9174be1dc88a3",
22955
+ "674a50fb97afad0aca14e80a37ac51aec0596cb4d9d8016ddf7c9c382282df88",
22956
+ "998ce0578bd5bcc0087d4730a2e754ac536d254c2b206b822433a1d664dab093",
22957
+ "05535108be03c4e156b47168dcff2da851a0c643e0b34bc8bc5337989c6ee566",
22958
+ "a482b76bb9fc7107a79d792a82da29820c5dee7ce67b0437d47972a91804972e",
22959
+ "3a201270550692d3c18c2392c79caeb10b69ceba70f3b38e0691192e05262d51",
22960
+ "c876df4745e1dded98b7039fdf9dc7687890ea538011c1beac881c4f91476014",
22961
+ "b97936088dd82c7bcdb75ec3566a168eb311528a65de3c74853f234c9d235f70",
22962
+ "d205e87e54d68a2684a744dacb598874e04dc6405b57df0c049007dddff3e3c7",
22963
+ "0649f9e12d463c7797a464e5d979d3cc0adf62cef5bcb4ecb335ecdec63a89bb",
22964
+ "4e40ddedfaee8016aadf091ab571ee9bb16954f72d2e0cee5693abb21c17646f",
22965
+ "7b99a984678b1c763a8b8b66e49da58d76f6227280e7b8f302d99b22c2e65758",
22966
+ "04cce362692d01b721c422ecaf918105c4c27c44114bc29247969f5828fe021e",
22967
+ "be03554646a41397fab9061b3e764f1f41399af7b9f49146b43eb5a17f41bed7",
22968
+ "153321c5de03d425bb174e9e82b1b815ad14be7578501b1ae9d1f5cdaecbbd85",
22969
+ "c9f2e932806fdd96c936803a5cd288004bb5cd70953b0f5ec893989d7a9eecd8",
22970
+ "e631dc9b09bdf13d3f4d9d23a1d6bb60750ab84fa445afd857b9e1c0aa3b9038",
22971
+ "1ead081c0d6f95070579d6e3c8b606cb2fb95073e5cee4ab4bf2f44a8f95d3f4",
22972
+ "b133997943d221dc87e6d5d14bb1991dab244313194d7eed9f3d48706aa15e20",
22973
+ "7f315b1b527ecfdd3c36da865910e326f9cbe6043a815bfff43b5c92842cb5c8",
22974
+ "b6a39bcbd75edb38f7491e1d2da9a8a7033218dda0961065afc4ae0215e65ebb",
22975
+ "17159bfbf209d3a6bb6d305201d6b5beaf3705dd30e245c346bb2f9a748b7e75",
22976
+ "56f715a7f641d9c53e18358a594245edfd68dd0355c9daa02095960b8cf561f6",
22977
+ "c1117f5bdcbc5d47a43b50af02167b9dc282208d192e492ae49d1b6fdcad3cb4",
22978
+ "556895a92b4e5f48713cb5c66ad0f4e60a39db6f6dadd69a324413b8c21e8a4b",
22979
+ "27628c828f263f66683b3a138d36c5692b5b52b5e42ccec3bae2b0640ef7f2d9",
22980
+ "5ab5ff0f2a5bcd82eceba9d0b4e5a9f0cddab2a02c789769cb4e3a3e89a575cd",
22981
+ "5f98965051fa41d8e0336ec5273fe17daa73147abc0bd3e8a18e0baaca7e1cdf",
22982
+ "74feafa90269c82ea79f17a789c6bec0f5ca184b0605e2bd87e153ead1a572f3",
22983
+ "09462d3b2cb6a875efaa0949a061654ade93354e1fa4ff84146ff72f74fddba9",
22984
+ "635f205ac8685257aa44af18323a4ad4b0f03eac8bb3031786a7dffec7af99ed",
22985
+ "b62c632ade5a67d30d9ece16a39e813ec5217f0a453a07d850c16a0f58b03a4e",
22986
+ "15ad33f5f06f30d5242db6c9cbd8cad31c4639a9e33ceb3bbc26c2eac3017a46",
22987
+ "302eb9f2b6f27ad848b782dbc113a84da85184ad4d43cb2a7e43927ca4d738b7",
22988
+ "e3b376c2307ba6a88984cfce65fc1c1f2dc3463843080869a04cfb1c61c28637",
22989
+ "53a91836eb9e9af7f2e678cab6b828eeb7f10ea7cda1ada9cbe2da66a9042f77",
22990
+ "e5e592e6a1afac9d47eb9649b0c76ae16a3ad1d7c9017a8c9f602b0c843c280f",
22991
+ "092aa78c27828d2e55a825c299eb797b53b513f0495b07e89deddda3044b3a0b",
22992
+ "cc8c684f7194c87bd86729f6592f666daf15eb0293566ff488a50802e311dbcd",
22993
+ "a0ffd7f84a075473d0749cfdd05d4321d2d4ee3ea4f3aa8931e245b1d0440b60",
22994
+ "2722487ec276b79829cf5f4655dd0a12d8821d6eaf47f590c7d2d1dbe16adeb8",
22995
+ "91d6970c88eebf95112538da9655f8ff22e386f9df3cc259ca87e2995b2b90ed",
22996
+ "0caca23374870e39c365f2e065bf93c2754dd4ad617ce0c4002f6ae35f9019e2",
22997
+ "1cc723bc914216d17edb359a71135333a237b87abf77fd901d4873fc78fe1f50",
22998
+ "e88ea02c41bfbe55f2bbdb8e9be0ca4f69452213b6c4951a86254c3f7780ac90",
22999
+ "e5156b68cc7723a70be6d500e6d3324aee3d274ef62dab3f190d4c48333a63bc",
23000
+ "354dbd65f692bdf1708c672f0e4df3a13afa3dcb161f6f0c38862b0b308acf8d",
23001
+ "e4883c6f9cf74d1e5e780e15f9e65a9b470cb99908aa12479d4ecfc9a1adf622",
23002
+ "abc33bfe4bbdf03f20434faa794df006b4e4cfe5eaec65e515c20725e88b0a53",
23003
+ "265d19bc516daf0858eac156e5e59f86f5c1e9966b3845578bef96aee8106e13",
23004
+ "92af8490589b55d3b7da03a81d3c9e9bdaf84b3d0ca9dd32a5af92edf0b7b59e",
23005
+ "52c01625e7202984ab83c835d9ce9303742695cd5b9334915dfc701dd8a46575",
23006
+ "ab26f786418dd8f4e7684baf036f37a2e45683aa22cfdaa6cc3af7e2b948391c",
23007
+ "f04ab062134e7793741388152fd0c50b346e3ebcf60c00f0aad34f352a4d6ba8",
23008
+ "836cb4e941fe10efb65dedad1aad51b7f2bade495ee7ec1a56f85abe9004f5b1",
23009
+ "82f8e1a7039ff2bc8cb2d987e586838ba3f960b3b45c962cda151b1af3206aff",
23010
+ "250d4fff7fee08c8e18bc561176dc403689c1c60d7babae094ecc2442febca4e",
23011
+ "a3997e2b30078d991aaf969dcfdc8e82d02a20c46239eda09516cc1e0c03aa41",
23012
+ "92c1cef7690447ec044a2401aeaba247ef801dfeef660ae400144c0db66a62ea",
23013
+ "9e593929787b6da15685b9a7707a203ffc3c18da1b96e2d980354a05f7125808",
23014
+ "246e59fe074d9de9b7d8010112123baf7831f496c5d0522de6fe4532319b9e30",
23015
+ "59d121ab6a43b9b87cf3afb85c81c64abd75ac13620882be734c82d000f92172",
23016
+ "19ba54b7471e34e605a047b08e7ffe8f0df4ea6956041ffb7fdbc1773fc34a19",
23017
+ "49a7a56f21075548ae17a00e6523f4ca1652c402774f0f9f610a0dd0d14a4a37",
23018
+ "de17c860ab3be55f237b9cb3777baa52085da5262c8abb28f027832160a6b76e",
23019
+ "6622032033e34709db4f216b5f1bf27db671db6338148afa0330e8d9cc7affc2",
23020
+ "3afec3488c9968096a705262f1096c71c5538a7250041777350405d956d04753",
23021
+ "a9ce78dcb828edba75648aede49d043ddd49aead28a82f31b3ba329c505b9209",
23022
+ "a4a838aacf9003fd90b92cdc5d2ace40bd3d2ff89915d6a3490aa0791a19020a",
23023
+ "a409491dbefb304542ff87c1d320809fe1d404798fe8b1c31a706bce3b1ba393",
23024
+ "8dd6bb5cacfe6ecf2327942bb7336b8021f3b3d8ecd4e25646a4e985e810f961",
23025
+ "67836f9985e28d6e8e577b6b3224952accd1d49584cf6cc94ee498c28ede1e7e",
23026
+ "40ac8bd227ed627f45e5d99a30b14d00ca287a1b4b2dc976f232c8f592b3c37d",
23027
+ "17e245390643f62a1e8237b837a1573cdfc30ce7a5160a1087bc00189054354e",
23028
+ "9081f7dfecb110927c74be6bba5ce445a52cbbc475c95369e17af79f27183e23",
23029
+ "e1e24ac7f42a26b12d4997f7385dc4cf5f535fb94ca0783a40f0889c4e27e0fb",
23030
+ "28cb300d373361dcc91587118422e76c6a28ff1f53341dcd082e7784cf45d4c9",
23031
+ "a64c978eba1f6b93c26988211081818800e01f1efebb6b78a861f0cd2d48e8c0",
23032
+ "1ac7dd217be6532e044d547731118ee761cca1f919dd309bb66b6a4cb41acaef",
23033
+ "70346155677df60dbedb457935cde033b817fe937ebb2635e3d05a5d9e6beb50",
23034
+ "8c1fc88c94eb46e4206147e56507e676c821211f7418e92edfdb1bec50ce60ae",
23035
+ "11cb053ca3f562c3ff3e54e5df542dfd5a8435cf7f06c7f95afdc304a4e8b7fb",
23036
+ "2456c8eeb3af8412b814621d9c779a496721f70112beddf8dcf80ba8e591d286",
23037
+ "5bc52c3884093f884ac16dd9e4a9fe3309dfac7731b1f0ba1f9f65903cad339f",
23038
+ "753ca0cfb0b2917d0d1ceaa000bd3b644563eb34004c92ba211c436e98b240c0",
23039
+ "f7c9d3d40fcbaca85eb8eb4bada281489ab8fc2c9f742162c8cfeeac81a4727a",
23040
+ "c76a7148d318d866938f027f8f0b515b213f1a85738e29ea5649f3485c2753e8",
23041
+ "c227cb725621b7ab7f7d366540f7c30e93da9002f4e55dc67fa40143e72b0a99",
23042
+ "e0fe1c69b09c4666107b2a10a12a21ff07dc974d0813492be75cdf35f9213245",
23043
+ "9bff443c020e0b807f7fd3b79913396f1fc316ac36a9c81010a05ef5179af9c7",
23044
+ "5d25dd117ca28fa1e2da7ba4d053a9dd348ea7bfd26f81b8d7a265a39de64dd9",
23045
+ "4a8d40ea7a1f22a23faa7c4c13cb936f4f0911a2a4b876bc2d4217c75f556a06",
23046
+ "951113dad1d7e002c3f7450d9381cec60ed6848807638e584b504517c927655e",
23047
+ "24a29a09251898ae3ff5681d8b32f9385eb5345b2684964ecc83d22cf4bd49c5",
23048
+ "aaf66a0ae371933cc1036e1957d1263d11abf8a4fe72cca255aa8b115ff67ae3",
23049
+ "7e803a171adf8e8018a4a982d0d2ba60a51e0386c9b43644e8b1d7471ae69ae8",
23050
+ "d69181a4df75929f8e6a10a79a87a9848a013fe732fbbea9be1e62f2342fd630",
23051
+ "6626f4aff5394729258a13c64fe12809fa20b41dec81071b6f1b94237a71d7af",
23052
+ "f772a72a5bad1d838d932aa720bccb960c1ac2f39a77a1cbe2e1c60c05d24109",
23053
+ "032e29b15f2fd2751a9bbd466c01aea0539711ab379af0f096ec91f87db5e8fc",
23054
+ "f9ab6b1458c217680d2acc51bf9e6cb874349ed42566e3118d3ca759770b0282",
23055
+ "35e37605494490091db0659462c5c6078c02fc528c3539adc0f3b3a4c06f0514",
23056
+ "9a287fc9d0b9036c8edaec3b9ac763d4257603eca80ee76a44913bfb0fded4ad",
23057
+ "a317e62d441499cc85ef0ac392aa5e7ca15b13f0730c1427b90f3fdeb500149f",
23058
+ "7844bb13a521faf52a45679dd8ac62e8268dd717755de6ee09659a52e473a8b1",
23059
+ "091d9024c3308b455f521525fbe41f1550e50ca03947d74487e6f88c85d42af3",
23060
+ "2a3d85896c5489cc53db3071512ef2deeb316bd462e67b405a5e5cf9b903154d",
23061
+ "63ef25642616c6dc4d72cbdf4c4f08c953797b3b15686e1cdf676e8e6624dee5",
23062
+ "846bb468a7dbe511c4f907a70e1f214e309abcad8217ff161743768158d53336",
23063
+ "ca5719554d2f60990682231e799dce7e64273175ed8eb088a7476a61deecc70b",
23064
+ "68dd8bfc9755fee980d5fc53bb3254af58bff9c0bdf9633008b3a37b1de19eb1",
23065
+ "4cd7e7a801c52c6dc09cfe3666105977dbc0b99e5eec2df4308db8964653d704",
23066
+ "b647fad1ec129e3c96919984785d60e23bc895a175c023fab4be3d7dbd02c3d4",
23067
+ "9fcab59583842ea3272684116ecbc2b4c606bee5229b11e67c1b4328dae20098",
23068
+ "9de4dd67e51696e3633f8e00b16adb291ee6743abe3a679ea810a9bbde61d17f",
23069
+ "511e936632505e2dc6fd0c5ad89bc70fb8a268aae19b3ab311878caa7f9b8b7c",
23070
+ "3e0b238b119c24e379b64b8dc2ce67053d45be13a34e3fcc2aed74c8f2bd52e0",
23071
+ "5e5a8754017a06eca205e5a536159b52f000d49695fe9e9862225e27f5e42a23",
23072
+ "4aad21981830666bb9a60d70b27e7051d761d76fe7bb8fb51417834f1f3e18e9",
23073
+ "39abb9304286ef59e523ca897a73daae92a063b620033243129205a88bd34d15",
23074
+ "daf07b1eda14733561bfb07409f683027717410dfc16293af3c80f89689d8730",
23075
+ "3602909b08cd681c4559826e41e51f359cfc5b6e6e0744e0bcc70faa158d265a",
23076
+ "8d09b0afefe00937b531acb058b61cc7a51e0734afe849e2925f1576939fea4f",
23077
+ "df7b9089f53eb539f31ee5ee1a014a99decaa47db7be001ab6cf1c4e3dc3f249",
23078
+ "d9f9148ba3bf5fa28f64f93d7d4f6f1ced35f1989c958d49338126970e3af305",
23079
+ "9bac18e8e5ad9f16842408733272e0176ada2d88f82a4d4c0efd86ace2af1f0c",
23080
+ "b4ae91a3126c217f10c75648859fd451e55b7001d60cb5d310ebc594de332b17",
23081
+ "348058dd9e87894c72590f6d053a5bcdd9e528eca023cc33a43c8f49842e6668",
23082
+ "d98afbfab194bcd0a63755cbb1a465bd3150cb7f12e074ad07b672f8ad6500c0",
23083
+ "262ce0d56102047cce2d3af2fc41455239407a3325085049660e0b6ccab110e4",
23084
+ "f891796e9696fe3b3c27a5b749d62aab532710c98ac4de16cf72646b350f3a3a",
23085
+ "1c883a27aaedd35e514ea097a5397d441f7c2897a426f725b3abb59f52d67dc5",
23086
+ "87a7af344ad074bc928540708f57ad325fc823806480629c1752d4fd74f26008",
23087
+ "c411223759e274ed9f9bedff87773d879a474fbf9b27ecddae84c425119f3e6c",
23088
+ "cec9f945d729b447cbb3528fa086e96560d81f520a0df48e5a09a15352c47e86",
23089
+ "cdce5b49edad8743a2e069869ca2b0710ef4b06c87ea979c6ada8f1300c42a84",
23090
+ "c220487c68068bfd08abae2d3ee7aaaf98c9d85e944023eeb9d47f1774f35bcb",
23091
+ "fb9f9d0d9566423267fc6d5e0f2fee25c750de2e014ae2190f2dc9fab1aa2d10",
23092
+ "c312ddfd61d3901076d8ea65d2c29f973099dcf19746a69a341ac3a3b583aaa3"
21944
23093
  ];
21945
23094
 
21946
23095
  // ../shared/src/requirements.ts
@@ -22379,7 +23528,7 @@ function checkGameFiles(files, entry) {
22379
23528
  return findings;
22380
23529
  }
22381
23530
  var KEY_MESSAGE = (what) => (found2) => `contains what looks like ${what} (${found2}). Every player can read a game's files: remove it, and revoke the key`;
22382
- var CONTENT_RULES = [
23531
+ var CONTENT_RULES2 = [
22383
23532
  {
22384
23533
  rule: "secret-key",
22385
23534
  severity: "error",
@@ -22481,7 +23630,7 @@ function checkFileContent(path2, text2) {
22481
23630
  const extension = extensionOf2(withoutEncoding(path2).path);
22482
23631
  const findings = [];
22483
23632
  const reported = /* @__PURE__ */ new Set();
22484
- for (const rule of CONTENT_RULES) {
23633
+ for (const rule of CONTENT_RULES2) {
22485
23634
  if (rule.only && !rule.only.includes(extension)) continue;
22486
23635
  const key = `${rule.rule}:${rule.pattern.source}`;
22487
23636
  if (reported.has(key)) continue;
@@ -22843,6 +23992,12 @@ function titleLetters(title) {
22843
23992
  var ERROR_STATUS = {
22844
23993
  UNAUTHORIZED: 401,
22845
23994
  FORBIDDEN: 403,
23995
+ /**
23996
+ * The token is publish-only (D104): it can start and finalize versions and list games and
23997
+ * versions, nothing else. Use `juicyjuicy login`, or a full token from /settings/tokens. CLIs up
23998
+ * to 0.14.0 get FORBIDDEN with the same message; 0.15.0 knows it (`NEWER_ERROR_CODES`).
23999
+ */
24000
+ INSUFFICIENT_SCOPE: 403,
22846
24001
  NOT_FOUND: 404,
22847
24002
  VALIDATION_FAILED: 400,
22848
24003
  INVALID_MANIFEST: 400,
@@ -22857,12 +24012,14 @@ var ERROR_STATUS = {
22857
24012
  NOT_REMIXABLE: 403,
22858
24013
  /**
22859
24014
  * juicy.json's `id` is one of the creator's games, but its `slug` names another game or a new one
22860
- * (D65): the slug was changed, or the folder was copied. Nothing was created.
24015
+ * (D65): the slug was changed, or the folder was copied. Nothing was created. CLI 0.11.0 is the
24016
+ * first that knows it; older ones get VALIDATION_FAILED (`NEWER_ERROR_CODES`).
22861
24017
  */
22862
24018
  SLUG_CHANGED: 409,
22863
24019
  /**
22864
24020
  * The version can never be made live: an admin rejected it (D69). The game keeps its live
22865
24021
  * version; publish a new one. The admin's comment, if any, is in the message and the versions list.
24022
+ * CLI 0.12.0 is the first that knows it, as with the next two; older ones get VALIDATION_FAILED.
22866
24023
  */
22867
24024
  VERSION_REJECTED: 409,
22868
24025
  /**
@@ -22887,7 +24044,8 @@ var ERROR_STATUS = {
22887
24044
  /**
22888
24045
  * The upload budget (D70) is used up: the member uploaded too many files in the last 24 hours
22889
24046
  * (`details.retryAfterSeconds` says when enough frees up), or the whole site did, which also
22890
- * pauses publishing until an admin looks. Retry later, never in a loop.
24047
+ * pauses publishing until an admin looks. Retry later, never in a loop. CLI 0.12.0 is the first
24048
+ * that knows it; older ones get RATE_LIMITED (`NEWER_ERROR_CODES`).
22891
24049
  */
22892
24050
  UPLOAD_BUDGET_REACHED: 429,
22893
24051
  /**
@@ -22897,6 +24055,13 @@ var ERROR_STATUS = {
22897
24055
  * CLI 0.13.0 is the first that knows it; 0.12.0 and older get RATE_LIMITED (`NEWER_ERROR_CODES`).
22898
24056
  */
22899
24057
  PUBLISH_LIMIT_REACHED: 429,
24058
+ /**
24059
+ * The creator's versions used up this month's share of the AI review budget (D99).
24060
+ * `details.nextAt` says when publishing is possible again (the first of next month, UTC, or when
24061
+ * the account's first week ends). Published games keep playing. Don't retry before then; test
24062
+ * locally and publish fewer, bigger updates. CLIs up to 0.13.0 get RATE_LIMITED; 0.14.0 knows it (`NEWER_ERROR_CODES`).
24063
+ */
24064
+ REVIEW_ALLOWANCE_REACHED: 429,
22900
24065
  /** An admin paused all publishing (PUBLISHING_PAUSED, the incident switch). Retry later. */
22901
24066
  PUBLISHING_PAUSED: 503,
22902
24067
  /** An admin paused this kind of action for now (comments, reports, likes and votes). */
@@ -22960,6 +24125,11 @@ var paramSchemas = {
22960
24125
  }
22961
24126
  })
22962
24127
  ),
24128
+ genre: external_exports.string().transform((value) => [
24129
+ ...new Set(
24130
+ value.toLowerCase().split(",").map((id) => id.trim())
24131
+ )
24132
+ ]).pipe(external_exports.array(genreSchema).max(MAX_GENRES, `use at most ${MAX_GENRES} genres`)),
22963
24133
  lang: languageSchema,
22964
24134
  q: external_exports.string().max(MAX_GAME_SEARCH_LENGTH),
22965
24135
  remixes: external_exports.enum(["0", "1"]),
@@ -22975,20 +24145,27 @@ var gameListRequestSchema = external_exports.object({
22975
24145
  sort: paramSchemas.sort.default(DEFAULT_GAME_LIST_QUERY.sort),
22976
24146
  period: paramSchemas.period.default(DEFAULT_GAME_LIST_QUERY.period),
22977
24147
  engine: paramSchemas.engine.optional(),
24148
+ genre: paramSchemas.genre.optional(),
22978
24149
  tag: paramSchemas.tag.optional(),
22979
24150
  lang: paramSchemas.lang.optional(),
22980
24151
  q: paramSchemas.q.optional(),
22981
24152
  remixes: paramSchemas.remixes.optional(),
22982
24153
  multiplayer: paramSchemas.feature.optional(),
22983
24154
  highscores: paramSchemas.feature.optional(),
24155
+ touch: paramSchemas.feature.optional(),
24156
+ remixable: paramSchemas.feature.optional(),
22984
24157
  list: paramSchemas.list.optional(),
22985
24158
  page: paramSchemas.page.default(DEFAULT_GAME_LIST_QUERY.page)
22986
- }).transform(({ remixes, tag, ...rest }) => ({
24159
+ }).transform(({ remixes, tag, genre, ...rest }) => ({
22987
24160
  ...rest,
24161
+ ...genre ? { genres: genre } : {},
22988
24162
  ...tag ? { tags: tag } : {},
22989
24163
  remixes: remixFilter(remixes)
22990
24164
  }));
22991
24165
 
24166
+ // ../shared/src/profile.ts
24167
+ var AVATAR_MAX_BYTES = 512 * 1024;
24168
+
22992
24169
  // ../shared/src/publish-limits.ts
22993
24170
  function isPublishLimitDetails(value) {
22994
24171
  if (typeof value !== "object" || value === null) return false;
@@ -23056,6 +24233,34 @@ var ROOM_CODE_ALPHABET = "ABCDEFGHJKMNPQRSTUVWXYZ23456789";
23056
24233
  var ROOM_CODE_LENGTH = 6;
23057
24234
  var ROOM_CODE_PATTERN = new RegExp(`^[${ROOM_CODE_ALPHABET}]{${ROOM_CODE_LENGTH}}$`);
23058
24235
 
24236
+ // ../shared/src/review-allowance.ts
24237
+ function isReviewAllowanceDetails(value) {
24238
+ if (typeof value !== "object" || value === null) return false;
24239
+ const { usedUsd, limitUsd, nextAt } = value;
24240
+ return typeof usedUsd === "number" && typeof limitUsd === "number" && typeof nextAt === "string" && !Number.isNaN(Date.parse(nextAt));
24241
+ }
24242
+ function reviewAllowanceMessage(details, { now = /* @__PURE__ */ new Date(), timeZone } = {}) {
24243
+ const next = new Date(details.nextAt);
24244
+ const when = new Intl.DateTimeFormat("en-US", {
24245
+ month: "short",
24246
+ day: "numeric",
24247
+ hour: "2-digit",
24248
+ minute: "2-digit",
24249
+ hourCycle: "h23",
24250
+ timeZoneName: "short",
24251
+ timeZone
24252
+ }).format(next);
24253
+ return `Your versions have used this month's share of JuicyJuicy's automatic safety checks, so you can't publish until ${when} (${inTime2(next.getTime() - now.getTime())}). Your published games keep playing meanwhile. Test the game locally in dev and publish fewer, bigger updates.`;
24254
+ }
24255
+ function inTime2(ms) {
24256
+ const minutes = Math.max(1, Math.ceil(ms / 6e4));
24257
+ const count = (n2, unit) => `in ${n2} ${unit}${n2 === 1 ? "" : "s"}`;
24258
+ if (minutes < 60) return count(minutes, "minute");
24259
+ const hours = Math.ceil(minutes / 60);
24260
+ if (hours < 48) return count(hours, "hour");
24261
+ return count(Math.ceil(hours / 24), "day");
24262
+ }
24263
+
23059
24264
  // ../shared/src/scores.ts
23060
24265
  var MAX_SCORE_BOARDS = LIMITS.maxScoreBoardsPerGame;
23061
24266
  var points = new Intl.NumberFormat("en-US");
@@ -26587,7 +27792,7 @@ var program = new Command();
26587
27792
  // package.json
26588
27793
  var package_default = {
26589
27794
  name: "juicyjuicy",
26590
- version: "0.13.0",
27795
+ version: "0.15.0",
26591
27796
  description: "Publish AI-made browser games to juicyjuicy.games",
26592
27797
  type: "module",
26593
27798
  license: "MIT",
@@ -26661,6 +27866,22 @@ It's unlisted (it still plays by link) until an admin lists it again. Fix what t
26661
27866
  case "member_warning":
26662
27867
  return `A warning from JuicyJuicy's moderators${note.game ? ` about ${note.game}` : ""}:${quoted(note.comment)}
26663
27868
  It shows on the site until you dismiss it there.`;
27869
+ // The rest aren't sent with a publish, but the site shows them and a newer server may list them.
27870
+ case "game_removed":
27871
+ return `JuicyJuicy's moderators removed ${game}:${quoted(note.comment)}
27872
+ It doesn't play until an admin restores it. The game's dashboard page says why and how to contest it.`;
27873
+ case "member_banned":
27874
+ return `JuicyJuicy's moderators suspended this account:${quoted(note.comment)}
27875
+ The sign-in page says why and how to contest it.`;
27876
+ case "comment_removed":
27877
+ return `JuicyJuicy's moderators deleted a comment of yours${note.game ? ` on ${note.game}` : ""}:${quoted(note.comment)}`;
27878
+ case "proposal_removed":
27879
+ return `JuicyJuicy's moderators deleted a proposal of yours:${quoted(note.comment)}`;
27880
+ case "thumbnail_rejected":
27881
+ return `JuicyJuicy's moderators rejected the new thumbnail of ${game}:${quoted(note.comment)}
27882
+ It won't be shown. Upload a different image to replace it.`;
27883
+ case "profile_moderated":
27884
+ return `JuicyJuicy's moderators removed ${note.subject ?? "something from your profile"}:${quoted(note.comment)}`;
26664
27885
  }
26665
27886
  }
26666
27887
  function noteMessages(moderation, warnings, slug) {
@@ -27662,7 +28883,12 @@ ${i2}
27662
28883
 
27663
28884
  // src/output.ts
27664
28885
  var EXIT = { ok: 0, validation: 1, auth: 2, network: 3 };
27665
- var AUTH_CODES = /* @__PURE__ */ new Set(["UNAUTHORIZED", "EXPIRED_TOKEN", "ACCESS_DENIED"]);
28886
+ var AUTH_CODES = /* @__PURE__ */ new Set([
28887
+ "UNAUTHORIZED",
28888
+ "EXPIRED_TOKEN",
28889
+ "ACCESS_DENIED",
28890
+ "INSUFFICIENT_SCOPE"
28891
+ ]);
27666
28892
  var NETWORK_CODES = /* @__PURE__ */ new Set([
27667
28893
  "NETWORK_ERROR",
27668
28894
  "NETWORK_BLOCKED",
@@ -27811,8 +29037,8 @@ var ApiClient = class {
27811
29037
  }
27812
29038
  if (isApiErrorBody(data)) {
27813
29039
  const { code, message, details } = data.error;
27814
- const text3 = code === "PUBLISH_LIMIT_REACHED" && isPublishLimitDetails(details) ? publishLimitMessage(details) : message;
27815
- throw new CliError(code, text3, { details, hint: moderationHint(code) });
29040
+ const text3 = code === "PUBLISH_LIMIT_REACHED" && isPublishLimitDetails(details) ? publishLimitMessage(details) : code === "REVIEW_ALLOWANCE_REACHED" && isReviewAllowanceDetails(details) ? reviewAllowanceMessage(details) : message;
29041
+ throw new CliError(code, text3, { details, hint: moderationHint(code) ?? scopeHint(code) });
27816
29042
  }
27817
29043
  if (!response.ok) {
27818
29044
  if (looksBlocked(response.status, text2)) {
@@ -27823,6 +29049,9 @@ var ApiClient = class {
27823
29049
  return data;
27824
29050
  }
27825
29051
  };
29052
+ function scopeHint(code) {
29053
+ return code === "INSUFFICIENT_SCOPE" ? "Publish-only tokens are for CI. For this command, unset JUICY_TOKEN and run `juicyjuicy login`, or use a full token from https://juicyjuicy.games/settings/tokens." : void 0;
29054
+ }
27826
29055
  function networkError(baseUrl, error62) {
27827
29056
  const cause = describeCause(error62);
27828
29057
  if (!TLS_ERRORS.test(cause) && isBlockedCause(baseUrl, cause)) {
@@ -28301,6 +29530,19 @@ async function checkProject(dir, options = {}) {
28301
29530
  });
28302
29531
  }
28303
29532
  check3.issues.push(...englishIssues(manifest));
29533
+ if (!manifest.genres) {
29534
+ check3.issues.push({
29535
+ code: "INVALID_MANIFEST",
29536
+ message: `juicy.json needs "genres": 1 to ${MAX_GENRES} from JuicyJuicy's list: ${GENRE_IDS.join(", ")} (e.g. ${cliCommand("init --genres puzzle,arcade")})`,
29537
+ path: "genres"
29538
+ });
29539
+ }
29540
+ const themes = normalizeTags(manifest.tags).tags;
29541
+ if (themes.join() !== manifest.tags.join()) {
29542
+ check3.warnings.push(
29543
+ `JuicyJuicy keeps tags as themes, the setting or subject (D103): these tags will be saved as [${themes.join(", ")}]. Genre words belong in "genres"; "multiplayer" is kept for a game players play together, other features show by themselves.`
29544
+ );
29545
+ }
28304
29546
  const letters2 = titleNotEnglish(manifest.title) ? null : titleLetters(manifest.title);
28305
29547
  if (letters2) {
28306
29548
  check3.warnings.push(
@@ -28556,7 +29798,9 @@ var KEY_ORDER = [
28556
29798
  "entry",
28557
29799
  "engine",
28558
29800
  "madeWith",
29801
+ "genres",
28559
29802
  "tags",
29803
+ "ageRating",
28560
29804
  "languages",
28561
29805
  "features",
28562
29806
  "input",
@@ -28588,6 +29832,8 @@ async function buildManifest(dir, flags, ask) {
28588
29832
  };
28589
29833
  const thumbnail = pick2("thumbnail", detected.thumbnail);
28590
29834
  if (thumbnail) values.thumbnail = thumbnail;
29835
+ if (flags.genres) values.genres = flags.genres;
29836
+ if (flags.ageRating) values.ageRating = flags.ageRating;
28591
29837
  delete values.howItWasMade;
28592
29838
  if (flags.sourceUrl) values.sourceUrl = flags.sourceUrl;
28593
29839
  const fieldSchema = manifestSchema.shape;
@@ -28644,6 +29890,18 @@ function withGameId(manifest, id) {
28644
29890
  }
28645
29891
  return "id" in ordered ? ordered : { ...ordered, id };
28646
29892
  }
29893
+ function withField(manifest, key, value) {
29894
+ if (key in manifest) return { ...manifest, [key]: value };
29895
+ const rank = KEY_ORDER.indexOf(key);
29896
+ const ordered = {};
29897
+ for (const [name, existing] of Object.entries(manifest)) {
29898
+ const after = KEY_ORDER.indexOf(name);
29899
+ if (!(key in ordered) && rank !== -1 && after > rank) ordered[key] = value;
29900
+ ordered[name] = existing;
29901
+ }
29902
+ if (!(key in ordered)) ordered[key] = value;
29903
+ return ordered;
29904
+ }
28647
29905
  function splitList(value) {
28648
29906
  return value.split(",").map((item) => item.trim()).filter(Boolean);
28649
29907
  }
@@ -29284,6 +30542,34 @@ async function saveGameId(out, root, publicId) {
29284
30542
  );
29285
30543
  }
29286
30544
  }
30545
+ async function syncAgeRating(out, root, declared, game) {
30546
+ const { ageRating: rating } = game;
30547
+ if (rating === void 0) return;
30548
+ if (rating === null) {
30549
+ out.warn(
30550
+ `${game.slug} has no age rating yet: set it on the game's dashboard, or add "ageRating" to juicy.json (everyone, 12+ or 16+, from the game's content) for its next update.`
30551
+ );
30552
+ return;
30553
+ }
30554
+ if (declared === rating) return;
30555
+ if (game.ageRatingLocked && declared) {
30556
+ out.warn(
30557
+ `JuicyJuicy's moderators set ${game.slug}'s age rating to ${rating}, so juicy.json's ${declared} doesn't apply; only an admin can change it.`
30558
+ );
30559
+ }
30560
+ try {
30561
+ const raw = await readRawManifest(root);
30562
+ if (!raw) return;
30563
+ await writeManifest(root, withField(raw, "ageRating", rating));
30564
+ out.info(
30565
+ `Saved the game's age rating (${rating}${game.ageRatingLocked ? ", set by JuicyJuicy's moderators" : ""}) in juicy.json.`
30566
+ );
30567
+ } catch (error62) {
30568
+ out.warn(
30569
+ `couldn't save the game's age rating in juicy.json (${error62 instanceof Error ? error62.message : String(error62)}); the publish goes on`
30570
+ );
30571
+ }
30572
+ }
29287
30573
  async function publish(out, dir, options) {
29288
30574
  const root = resolve4(dir);
29289
30575
  if (out.interactive && !await readRawManifest(root)) {
@@ -29330,6 +30616,11 @@ async function publish(out, dir, options) {
29330
30616
  );
29331
30617
  }
29332
30618
  await saveGameId(out, root, started.game.publicId);
30619
+ await syncAgeRating(out, root, manifest.ageRating, started.game);
30620
+ const rated = started.game.ageRating === void 0 ? {} : {
30621
+ ageRating: started.game.ageRating,
30622
+ ...started.game.ageRatingLocked ? { ageRatingLocked: true } : {}
30623
+ };
29333
30624
  out.event("version_started", {
29334
30625
  slug: started.game.slug,
29335
30626
  version: started.version,
@@ -29371,6 +30662,9 @@ async function publish(out, dir, options) {
29371
30662
  if (started.keptDashboardThumbnail) {
29372
30663
  out.info("Kept the thumbnail set on the game's dashboard; the screenshot wasn't used.");
29373
30664
  }
30665
+ for (const warning of serverOnlyWarnings(checked.findings, finalized.findings)) {
30666
+ out.warn(warning);
30667
+ }
29374
30668
  const done = started.keptDashboardThumbnail ? { ...finalized, keptDashboardThumbnail: true } : thumbnail?.auto ? { ...finalized, thumbnailAuto: true } : finalized;
29375
30669
  let moderation = done.moderation;
29376
30670
  const report = (data2, message) => {
@@ -29379,6 +30673,7 @@ async function publish(out, dir, options) {
29379
30673
  out.result(
29380
30674
  {
29381
30675
  ...data2,
30676
+ ...rated,
29382
30677
  ...moderation ? { moderation } : {},
29383
30678
  ...notes.length > 0 ? { moderationNotice: MODERATION_NOTICE } : {}
29384
30679
  },
@@ -29434,6 +30729,13 @@ async function publish(out, dir, options) {
29434
30729
  );
29435
30730
  report(data, `${manifest.title} v${done.version} is uploaded: ${done.gameUrl}`);
29436
30731
  }
30732
+ function serverOnlyWarnings(local, server) {
30733
+ const key = (finding) => `${finding.rule}
30734
+ ${finding.path ?? ""}
30735
+ ${finding.message}`;
30736
+ const printed = new Set(local.map(key));
30737
+ return (server ?? []).filter((finding) => finding.severity === "warning" && !printed.has(key(finding))).map((finding) => `${finding.path ? `${finding.path}: ` : ""}${finding.message}`);
30738
+ }
29437
30739
  async function waitForReview(api, slug, version2, {
29438
30740
  timeoutMs = 45e3,
29439
30741
  intervalMs = 2e3,
@@ -29461,6 +30763,7 @@ var LIST_FILTERS = [
29461
30763
  "sort",
29462
30764
  "period",
29463
30765
  "engine",
30766
+ "genre",
29464
30767
  "tag",
29465
30768
  "search",
29466
30769
  "remixes",
@@ -29474,6 +30777,7 @@ function listParams(options) {
29474
30777
  ["sort", options.sort],
29475
30778
  ["period", options.period],
29476
30779
  ["engine", options.engine],
30780
+ ["genre", options.genre],
29477
30781
  ["tag", options.tag],
29478
30782
  ["q", options.search],
29479
30783
  ["remixes", options.remixes ? "1" : void 0],
@@ -29527,12 +30831,25 @@ ${note}`)
29527
30831
  games.length === 0 ? mine && !filtered ? "No games yet. Publish one with `npx juicyjuicy publish`." : "No games match." : [
29528
30832
  heading,
29529
30833
  ...games.map(
29530
- (game) => ` ${game.slug.padEnd(24)} ${(game.version ? `v${game.version}` : "-").padEnd(5)} ${(options.all ? `@${game.owner}` : game.status).padEnd(9)} ${game.gameUrl}`
30834
+ (game) => ` ${game.slug.padEnd(24)} ${(game.version ? `v${game.version}` : "-").padEnd(5)} ${(options.all ? `@${game.owner}` : game.status).padEnd(9)} ${game.gameUrl}${needsUpdateNote(game)}`
29531
30835
  ),
29532
- ...nextPage ? [`More: add --page ${nextPage}.`] : []
30836
+ ...nextPage ? [`More: add --page ${nextPage}.`] : [],
30837
+ ...games.some((game) => game.needsUpdate?.length) ? [
30838
+ `Some need a required update: ${cliCommand("check-games")} settles what it can and says what each still needs.`
30839
+ ] : []
29533
30840
  ].join("\n")
29534
30841
  );
29535
30842
  }
30843
+ function needsUpdateNote(game) {
30844
+ const needs = game.needsUpdate ?? [];
30845
+ if (needs.length === 0) return "";
30846
+ const titles = needs.map((need) => need.title).join(", ");
30847
+ if (game.status === "published" && needs.some((need) => need.phase === "enforced")) {
30848
+ return ` needs update (${titles}): out of the public lists until updated`;
30849
+ }
30850
+ const deadline = needs.filter((need) => need.phase === "grace").map((need) => need.deadline).sort()[0];
30851
+ return ` needs update (${titles})${deadline ? ` by ${deadline.slice(0, 10)}` : ""}`;
30852
+ }
29536
30853
  function versionLine(v) {
29537
30854
  const state = v.live ? "live" : v.rejected ? "rejected" : v.changesRequested ? "changes" : v.inReview ? "held" : v.draft && v.status === "ready" ? "draft" : v.status;
29538
30855
  const why = v.rejected ? " (rejected by an admin; it can never go live)" : v.changesRequested ? ` (an admin asked for changes${v.changesRequested.resolvedAt ? "; a later version settled them" : ""}; it can't go live)` : v.inReview ? ` (waiting for an admin's review: ${v.heldReason ?? "it needs a person to look at it"})` : "";
@@ -30102,7 +31419,13 @@ function createProgram() {
30102
31419
  "--made-with <list>",
30103
31420
  'models and tools, e.g. "Claude Opus 5.5, Claude Code"',
30104
31421
  splitList
30105
- ).option("--tags <list>", "up to 5 tags, e.g. arcade,space", splitList).option(
31422
+ ).option("--genres <list>", `1 to ${MAX_GENRES} of: ${GENRE_IDS.join(", ")}`, splitList).option(
31423
+ "--tags <list>",
31424
+ "up to 3 themes, the setting or subject, e.g. space,pirates",
31425
+ splitList
31426
+ ).addOption(
31427
+ new Option("--age-rating <rating>", "who it's for, from its content").choices(AGE_RATINGS)
31428
+ ).option(
30106
31429
  "--languages <list>",
30107
31430
  "language codes players can pick, the default first, e.g. en,pl",
30108
31431
  splitList
@@ -30133,7 +31456,10 @@ ${REMIX_LICENSE_NAME} (--remixable): ${REMIX_LICENSE}`
30133
31456
  "--period <period>",
30134
31457
  "window for the upvoted/downvoted/played sorts (default all)"
30135
31458
  ).choices(GAME_PERIODS)
30136
- ).addOption(new Option("--engine <engine>", "only this engine").choices(ENGINES)).option("--tag <tag>", "only games with this tag, e.g. puzzle, or any of several: cards,dice").option(
31459
+ ).addOption(new Option("--engine <engine>", "only this engine").choices(ENGINES)).option("--genre <genre>", "only games in this genre, or any of several: puzzle,arcade").option(
31460
+ "--tag <tag>",
31461
+ "only games with this theme, e.g. space, or any of several: space,pirates"
31462
+ ).option(
30137
31463
  "--search <text>",
30138
31464
  "only games with this text in the title, description, creator, tags or made-with"
30139
31465
  ).option("--remixes", "only remixes").option("--multiplayer", "only games with multiplayer rooms").option("--highscores", "only games with global highscores (leaderboards)").option("--page <n>", "page of --all to show (default 1)").addHelpText(