[{"data":1,"prerenderedAt":964},["ShallowReactive",2],{"games":3,"level:poisoned-review:wallet-transfer":107,"levels:poisoned-review":951},[4,17,30,41,52,63,74,85,96],{"id":5,"order":6,"domain":7,"glyph":8,"requiresSandbox":9,"title":10,"tagline":13,"levelCount":6,"status":16},"legacy-nightmare",1,"refactoring","{ }",true,{"fr":11,"en":12},"Le cauchemar du Legacy","Legacy Nightmare",{"fr":14,"en":15},"Corrige le bug caché dans un code spaghetti, sans rien casser.","Fix the bug buried in spaghetti code without breaking anything.","available",{"id":18,"order":19,"domain":20,"glyph":20,"requiresSandbox":21,"title":22,"tagline":25,"levelCount":28,"status":29},"git-untangle",2,"git",false,{"fr":23,"en":24},"Démêlage d'historique","History Untangling",{"fr":26,"en":27},"Transforme un graphe de commits chaotique en historique propre.","Turn a chaotic commit graph into a clean history.",0,"coming-soon",{"id":31,"order":32,"domain":33,"glyph":34,"requiresSandbox":21,"title":35,"tagline":38,"levelCount":28,"status":29},"prod-pressure",3,"devops","RPS",{"fr":36,"en":37},"Pression en Prod","Prod Pressure",{"fr":39,"en":40},"Fais tenir la prod pendant le Black Friday, sans exploser le budget.","Keep production alive through Black Friday, on budget.",{"id":42,"order":43,"domain":44,"glyph":45,"requiresSandbox":9,"title":46,"tagline":49,"levelCount":28,"status":29},"the-heist",4,"security","0day",{"fr":47,"en":48},"Le braquage","The Heist",{"fr":50,"en":51},"Lis l'API, trouve la faille logique, exploite-la.","Read the API, find the logic flaw, exploit it.",{"id":53,"order":54,"domain":55,"glyph":56,"requiresSandbox":21,"title":57,"tagline":60,"levelCount":6,"status":16},"tech-dilemmas",5,"product","A|B",{"fr":58,"en":59},"Dilemmes","Tech Dilemmas",{"fr":61,"en":62},"Survis à un sprint d'arbitrages impossibles.","Survive a sprint of impossible trade-offs.",{"id":64,"order":65,"domain":66,"glyph":67,"requiresSandbox":21,"title":68,"tagline":71,"levelCount":28,"status":29},"cap-workshop",6,"distributed","CAP",{"fr":69,"en":70},"L'Atelier du Théorème CAP","CAP Workshop",{"fr":72,"en":73},"Choisis les bons compromis avant que le réseau ne se coupe.","Pick the right trade-offs before the network splits.",{"id":75,"order":76,"domain":77,"glyph":78,"requiresSandbox":9,"title":79,"tagline":82,"levelCount":28,"status":29},"feature-creeps",7,"patterns","\u003CT>",{"fr":80,"en":81},"L'attaque des Feature Creeps","Attack of the Feature Creeps",{"fr":83,"en":84},"Absorbe des règles métier sans fin sans réécrire ton cœur.","Absorb endless business rules without rewriting your core.",{"id":86,"order":87,"domain":88,"glyph":89,"requiresSandbox":21,"title":90,"tagline":93,"levelCount":32,"status":16},"poisoned-review",8,"review","PR",{"fr":91,"en":92},"La Code Review Empoisonnée","Poisoned Code Review",{"fr":94,"en":95},"Une PR parfaite en apparence cache une bombe. Trouve la ligne.","A flawless-looking PR hides a time bomb. Find the line.",{"id":97,"order":98,"domain":99,"glyph":100,"requiresSandbox":21,"hidden":9,"title":101,"tagline":104,"levelCount":6,"status":16},"engine-demo",99,"demo","?",{"fr":102,"en":103},"Démo du moteur de niveaux","Level engine demo",{"fr":105,"en":106},"Niveau factice qui exerce le moteur de bout en bout : indices, validation, score, débrief.","Dummy level exercising the engine end to end: hints, validation, score, debrief.",{"id":108,"gameId":86,"order":19,"title":109,"difficulty":32,"estimatedMinutes":87,"context":112,"objective":115,"tools":118,"initialState":121,"hints":941,"scoring":948},"wallet-transfer",{"fr":110,"en":111},"Virements entre portefeuilles","Wallet transfers",{"fr":113,"en":114},"Une marketplace crédite les vendeurs sur des portefeuilles internes. Le ticket #311 signale des **soldes négatifs** quand deux paiements tombent en même temps.\n\nChaque nuit, la finance rapproche le **grand livre** (`ledger_entries`) avec les soldes des portefeuilles. Un écart bloque les versements du lendemain.\n\nCette PR corrige le #311. Les nouveaux tests d'intégration (vraie base PostgreSQL) sont verts.","A marketplace credits sellers on internal wallets. Ticket #311 reports **negative balances** when two payments land at the same time.\n\nEvery night, finance reconciles the **ledger** (`ledger_entries`) with the wallet balances. Any mismatch blocks the next day's payouts.\n\nThis PR fixes #311. The new integration tests (real PostgreSQL database) are green.",{"fr":116,"en":117},"Le correctif est-il sûr ? Trouve la ligne qui peut encore corrompre les comptes, puis nomme le problème.","Is the fix safe? Find the line that can still corrupt the books, then name the problem.",[119,120],"diff-viewer","justification-menu",{"pr":122,"justificationOptions":133,"files":164},{"number":123,"title":124,"author":127,"description":128,"base":131,"head":132},317,{"fr":125,"en":126},"fix(wallet) : virements atomiques, plus de solde négatif (#311)","fix(wallet): atomic transfers, no more negative balances (#311)","samir-b",{"fr":129,"en":130},"## Contexte\nFixes #311 : deux virements simultanés pouvaient lire le même solde et passer tous les deux.\n\n## Changements\n- Débit **atomique** : `UPDATE … WHERE balance >= amount` au lieu de lire puis écrire\n- Tout le virement s'exécute dans une **transaction** `db.transaction()`\n- Erreurs métier typées : `InsufficientFundsError`, `WalletNotFoundError`\n\n## Tests\n- ✅ Solde insuffisant : aucun portefeuille modifié\n- ✅ 20 virements concurrents : le solde ne passe jamais sous zéro","## Context\nFixes #311: two simultaneous transfers could read the same balance and both go through.\n\n## Changes\n- **Atomic** debit: `UPDATE … WHERE balance >= amount` instead of read-then-write\n- The whole transfer runs inside a `db.transaction()` **transaction**\n- Typed business errors: `InsufficientFundsError`, `WalletNotFoundError`\n\n## Testing\n- ✅ Insufficient balance: no wallet is modified\n- ✅ 20 concurrent transfers: the balance never goes below zero","main","fix\u002F311-concurrent-transfers",[134,139,144,149,154,159],{"id":135,"label":136},"race-condition",{"fr":137,"en":138},"Condition de course","Race condition",{"id":140,"label":141},"missing-transaction",{"fr":142,"en":143},"Atomicité non garantie (transaction)","Atomicity not guaranteed (transaction)",{"id":145,"label":146},"sql-injection",{"fr":147,"en":148},"Injection SQL","SQL injection",{"id":150,"label":151},"n-plus-one",{"fr":152,"en":153},"Requête N+1","N+1 query",{"id":155,"label":156},"float-money",{"fr":157,"en":158},"Montants en virgule flottante","Floating-point money",{"id":160,"label":161},"memory-leak",{"fr":162,"en":163},"Fuite mémoire","Memory leak",[165,772],{"path":166,"language":167,"status":168,"hunks":169},"src\u002Fwallet\u002Fwallet.service.ts","typescript","modified",[170],{"header":171,"lines":172},"@@ -1,17 +1,35 @@",[173,189,201,211,221,231,241,244,254,268,293,297,330,367,393,417,453,470,476,483,488,493,498,530,551,559,574,583,601,618,627,652,656,676,680,694,701,717,726,733,755,761,766],{"id":174,"type":175,"oldNo":6,"newNo":6,"tokens":176},"d7ab2c2ea4","ctx",[177,180,182,184,186],{"content":178,"color":179},"import","#FF7B72",{"content":181}," { Injectable } ",{"content":183,"color":179},"from",{"content":185}," ",{"content":187,"color":188},"'@nestjs\u002Fcommon'","#A5D6FF",{"id":190,"type":191,"oldNo":19,"newNo":192,"tokens":193},"fd94ac0259","del",null,[194,195,197,198,199],{"content":178,"color":179},{"content":196}," { eq, sql } ",{"content":183,"color":179},{"content":185},{"content":200,"color":188},"'drizzle-orm'",{"id":202,"type":203,"oldNo":192,"newNo":19,"tokens":204},"2b79824a0b","add",[205,206,208,209,210],{"content":178,"color":179},{"content":207}," { and, eq, gte, sql } ",{"content":183,"color":179},{"content":185},{"content":200,"color":188},{"id":212,"type":175,"oldNo":32,"newNo":32,"tokens":213},"b2adcf0957",[214,215,217,218,219],{"content":178,"color":179},{"content":216}," { Database } ",{"content":183,"color":179},{"content":185},{"content":220,"color":188},"'..\u002Fdb\u002Fdatabase'",{"id":222,"type":175,"oldNo":43,"newNo":43,"tokens":223},"fa3cebf491",[224,225,227,228,229],{"content":178,"color":179},{"content":226}," { ledgerEntries, wallets } ",{"content":183,"color":179},{"content":185},{"content":230,"color":188},"'..\u002Fdb\u002Fschema'",{"id":232,"type":203,"oldNo":192,"newNo":54,"tokens":233},"a5b67cdc57",[234,235,237,238,239],{"content":178,"color":179},{"content":236}," { InsufficientFundsError, WalletNotFoundError } ",{"content":183,"color":179},{"content":185},{"content":240,"color":188},"'.\u002Fwallet.errors'",{"id":242,"type":175,"oldNo":54,"newNo":65,"tokens":243},"257c255f9d",[],{"id":245,"type":175,"oldNo":65,"newNo":76,"tokens":246},"6f2db1cbfb",[247,249,252],{"content":248},"@",{"content":250,"color":251},"Injectable","#D2A8FF",{"content":253},"()",{"id":255,"type":175,"oldNo":76,"newNo":87,"tokens":256},"e80268d136",[257,259,260,262,263,266],{"content":258,"color":179},"export",{"content":185},{"content":261,"color":179},"class",{"content":185},{"content":264,"color":265},"WalletService","#FFA657",{"content":267}," {",{"id":269,"type":175,"oldNo":87,"newNo":270,"tokens":271},"c38e824caf",9,[272,274,276,278,280,281,283,284,286,288,289,291],{"content":273},"  ",{"content":275,"color":179},"constructor",{"content":277},"(",{"content":279,"color":179},"private",{"content":185},{"content":282,"color":179},"readonly",{"content":185},{"content":285,"color":265},"db",{"content":287,"color":179},":",{"content":185},{"content":290,"color":265},"Database",{"content":292},") {}",{"id":294,"type":175,"oldNo":270,"newNo":295,"tokens":296},"1e838d1f27",10,[],{"id":298,"type":191,"oldNo":295,"newNo":192,"tokens":299},"419734b958",[300,301,303,304,306,307,309,310,311,314,316,318,319,320,321,322,324,325,326,328],{"content":273},{"content":302,"color":179},"async",{"content":185},{"content":305,"color":251},"transfer",{"content":277},{"content":308,"color":265},"fromId",{"content":287,"color":179},{"content":185},{"content":312,"color":313},"string","#79C0FF",{"content":315},", ",{"content":317,"color":265},"toId",{"content":287,"color":179},{"content":185},{"content":312,"color":313},{"content":315},{"content":323,"color":265},"amountCents",{"content":287,"color":179},{"content":185},{"content":327,"color":313},"number",{"content":329},") {",{"id":331,"type":191,"oldNo":332,"newNo":192,"tokens":333},"38f8451eb7",11,[334,336,338,340,341,343,345,346,348,349,351,353,355,357,358,360,362,363,365],{"content":335},"    ",{"content":337,"color":179},"const",{"content":339}," [",{"content":183,"color":313},{"content":342},"] ",{"content":344,"color":179},"=",{"content":185},{"content":347,"color":179},"await",{"content":185},{"content":350,"color":313},"this",{"content":352},".db.",{"content":354,"color":251},"select",{"content":356},"().",{"content":183,"color":251},{"content":359},"(wallets).",{"content":361,"color":251},"where",{"content":277},{"content":364,"color":251},"eq",{"content":366},"(wallets.id, fromId))",{"id":368,"type":191,"oldNo":369,"newNo":192,"tokens":370},"ef36e532cc",12,[371,372,374,376,378,380,382,383,385,386,388,389,391],{"content":335},{"content":373,"color":179},"if",{"content":375}," (from.balanceCents ",{"content":377,"color":179},"\u003C",{"content":379}," amountCents) ",{"content":381,"color":179},"throw",{"content":185},{"content":384,"color":179},"new",{"content":185},{"content":387,"color":251},"Error",{"content":277},{"content":390,"color":188},"'Insufficient funds'",{"content":392},")",{"id":394,"type":191,"oldNo":395,"newNo":192,"tokens":396},"a3eca86e65",13,[397,398,399,400,401,402,404,405,407,409,411,413,414,415,416],{"content":335},{"content":347,"color":179},{"content":185},{"content":350,"color":313},{"content":352},{"content":403,"color":251},"update",{"content":359},{"content":406,"color":251},"set",{"content":408},"({ balanceCents: from.balanceCents ",{"content":410,"color":179},"-",{"content":412}," amountCents }).",{"content":361,"color":251},{"content":277},{"content":364,"color":251},{"content":366},{"id":418,"type":191,"oldNo":419,"newNo":192,"tokens":420},"aa3652282c",14,[421,422,423,424,425,426,427,428,429,431,433,435,437,439,441,443,444,446,448,449,450,451],{"content":335},{"content":347,"color":179},{"content":185},{"content":350,"color":313},{"content":352},{"content":403,"color":251},{"content":359},{"content":406,"color":251},{"content":430},"({ balanceCents: ",{"content":432,"color":251},"sql",{"content":434,"color":188},"`${",{"content":436},"wallets",{"content":438,"color":188},".",{"content":440},"balanceCents",{"content":442,"color":188},"} + ${",{"content":323},{"content":445,"color":188},"}`",{"content":447}," }).",{"content":361,"color":251},{"content":277},{"content":364,"color":251},{"content":452},"(wallets.id, toId))",{"id":454,"type":191,"oldNo":455,"newNo":192,"tokens":456},"29fc14f1b2",15,[457,458,459,460,461,462,464,466,468],{"content":335},{"content":347,"color":179},{"content":185},{"content":350,"color":313},{"content":352},{"content":463,"color":251},"insert",{"content":465},"(ledgerEntries).",{"content":467,"color":251},"values",{"content":469},"({ fromId, toId, amountCents })",{"id":471,"type":191,"oldNo":472,"newNo":192,"tokens":473},"7c23d29388",16,[474],{"content":475},"  }",{"id":477,"type":203,"oldNo":192,"newNo":332,"tokens":478},"a63592bef4",[479,480],{"content":273},{"content":481,"color":482},"\u002F**","#8B949E",{"id":484,"type":203,"oldNo":192,"newNo":369,"tokens":485},"74b0a504e2",[486],{"content":487,"color":482},"   * Moves money between two wallets and records the movement in the ledger,",{"id":489,"type":203,"oldNo":192,"newNo":395,"tokens":490},"f068118f35",[491],{"content":492,"color":482},"   * which finance reconciles every night against the bank statements.",{"id":494,"type":203,"oldNo":192,"newNo":419,"tokens":495},"6c8f43b65a",[496],{"content":497,"color":482},"   *\u002F",{"id":499,"type":203,"oldNo":192,"newNo":455,"tokens":500},"d0b5ea40b0",[501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,525,526,528],{"content":273},{"content":302,"color":179},{"content":185},{"content":305,"color":251},{"content":277},{"content":308,"color":265},{"content":287,"color":179},{"content":185},{"content":312,"color":313},{"content":315},{"content":317,"color":265},{"content":287,"color":179},{"content":185},{"content":312,"color":313},{"content":315},{"content":323,"color":265},{"content":287,"color":179},{"content":185},{"content":327,"color":313},{"content":392},{"content":287,"color":179},{"content":185},{"content":524,"color":265},"Promise",{"content":377},{"content":527,"color":313},"void",{"content":529},"> {",{"id":531,"type":203,"oldNo":192,"newNo":472,"tokens":532},"8aba884800",[533,534,535,536,537,538,540,541,542,544,546,548,550],{"content":335},{"content":347,"color":179},{"content":185},{"content":350,"color":313},{"content":352},{"content":539,"color":251},"transaction",{"content":277},{"content":302,"color":179},{"content":543}," (",{"content":545,"color":265},"tx",{"content":547},") ",{"content":549,"color":179},"=>",{"content":267},{"id":552,"type":203,"oldNo":192,"newNo":553,"tokens":554},"b84a941509",17,[555,557],{"content":556},"      ",{"content":558,"color":482},"\u002F\u002F Atomic check-and-debit: two concurrent transfers cannot overdraw the wallet",{"id":560,"type":203,"oldNo":192,"newNo":561,"tokens":562},"810bc27d81",18,[563,564,565,566,568,569,570,571,572],{"content":556},{"content":337,"color":179},{"content":185},{"content":567,"color":313},"debited",{"content":185},{"content":344,"color":179},{"content":185},{"content":347,"color":179},{"content":573}," tx",{"id":575,"type":203,"oldNo":192,"newNo":576,"tokens":577},"8aa25fbe0f",19,[578,580,581],{"content":579},"        .",{"content":403,"color":251},{"content":582},"(wallets)",{"id":584,"type":203,"oldNo":192,"newNo":585,"tokens":586},"c6b1ff35da",20,[587,588,589,590,591,592,593,594,595,597,598,599],{"content":579},{"content":406,"color":251},{"content":430},{"content":432,"color":251},{"content":434,"color":188},{"content":436},{"content":438,"color":188},{"content":440},{"content":596,"color":188},"} - ${",{"content":323},{"content":445,"color":188},{"content":600}," })",{"id":602,"type":203,"oldNo":192,"newNo":603,"tokens":604},"814d4dfe6f",21,[605,606,607,608,610,611,612,614,616],{"content":579},{"content":361,"color":251},{"content":277},{"content":609,"color":251},"and",{"content":277},{"content":364,"color":251},{"content":613},"(wallets.id, fromId), ",{"content":615,"color":251},"gte",{"content":617},"(wallets.balanceCents, amountCents)))",{"id":619,"type":203,"oldNo":192,"newNo":620,"tokens":621},"64714effbd",22,[622,623,625],{"content":579},{"content":624,"color":251},"returning",{"content":626},"({ id: wallets.id })",{"id":628,"type":203,"oldNo":192,"newNo":629,"tokens":630},"1ea935227a",23,[631,632,633,635,637,638,640,641,643,644,645,646,647,648,650],{"content":556},{"content":373,"color":179},{"content":634}," (debited.",{"content":636,"color":313},"length",{"content":185},{"content":639,"color":179},"===",{"content":185},{"content":642,"color":313},"0",{"content":547},{"content":381,"color":179},{"content":185},{"content":384,"color":179},{"content":185},{"content":649,"color":251},"InsufficientFundsError",{"content":651},"(fromId, amountCents)",{"id":653,"type":203,"oldNo":192,"newNo":654,"tokens":655},"adfce44713",24,[],{"id":657,"type":203,"oldNo":192,"newNo":658,"tokens":659},"10dab629e4",25,[660,661,662,663,664,665,666,667,668,670,671,672,674],{"content":556},{"content":347,"color":179},{"content":185},{"content":350,"color":313},{"content":352},{"content":463,"color":251},{"content":465},{"content":467,"color":251},{"content":669},"({ fromId, toId, amountCents, createdAt: ",{"content":384,"color":179},{"content":185},{"content":673,"color":251},"Date",{"content":675},"() })",{"id":677,"type":203,"oldNo":192,"newNo":678,"tokens":679},"4fd0ee478e",26,[],{"id":681,"type":203,"oldNo":192,"newNo":682,"tokens":683},"0e40a489c2",27,[684,685,686,687,689,690,691,692,693],{"content":556},{"content":337,"color":179},{"content":185},{"content":688,"color":313},"credited",{"content":185},{"content":344,"color":179},{"content":185},{"content":347,"color":179},{"content":573},{"id":695,"type":203,"oldNo":192,"newNo":696,"tokens":697},"1a9c63cee6",28,[698,699,700],{"content":579},{"content":403,"color":251},{"content":582},{"id":702,"type":203,"oldNo":192,"newNo":703,"tokens":704},"be6f217034",29,[705,706,707,708,709,710,711,712,713,714,715,716],{"content":579},{"content":406,"color":251},{"content":430},{"content":432,"color":251},{"content":434,"color":188},{"content":436},{"content":438,"color":188},{"content":440},{"content":442,"color":188},{"content":323},{"content":445,"color":188},{"content":600},{"id":718,"type":203,"oldNo":192,"newNo":719,"tokens":720},"0e5686ee9f",30,[721,722,723,724,725],{"content":579},{"content":361,"color":251},{"content":277},{"content":364,"color":251},{"content":452},{"id":727,"type":203,"oldNo":192,"newNo":728,"tokens":729},"c879ddc7c9",31,[730,731,732],{"content":579},{"content":624,"color":251},{"content":626},{"id":734,"type":203,"oldNo":192,"newNo":735,"tokens":736},"7fe474cbb5",32,[737,738,739,741,742,743,744,745,746,747,748,749,750,751,753],{"content":556},{"content":373,"color":179},{"content":740}," (credited.",{"content":636,"color":313},{"content":185},{"content":639,"color":179},{"content":185},{"content":642,"color":313},{"content":547},{"content":381,"color":179},{"content":185},{"content":384,"color":179},{"content":185},{"content":752,"color":251},"WalletNotFoundError",{"content":754},"(toId)",{"id":756,"type":203,"oldNo":192,"newNo":757,"tokens":758},"e6f8a31c98",33,[759],{"content":760},"    })",{"id":762,"type":203,"oldNo":192,"newNo":763,"tokens":764},"fd91bd9ff5",34,[765],{"content":475},{"id":767,"type":175,"oldNo":553,"newNo":768,"tokens":769},"8dc6159220",35,[770],{"content":771},"}",{"path":773,"language":167,"status":168,"hunks":774},"src\u002Fwallet\u002Fwallet.service.spec.ts",[775],{"header":776,"lines":777},"@@ -12,3 +12,14 @@ describe('WalletService.transfer', () => {",[778,797,802,805,820,840,856,870,874,877,890,918,932,936],{"id":779,"type":175,"oldNo":369,"newNo":369,"tokens":780},"cda4a2470b",[781,782,784,785,786,787,789,791,793,794,796],{"content":335},{"content":783,"color":251},"expect",{"content":277},{"content":347,"color":179},{"content":185},{"content":788,"color":251},"balanceOf",{"content":790},"(bob)).",{"content":792,"color":251},"toBe",{"content":277},{"content":795,"color":313},"1_500",{"content":392},{"id":798,"type":175,"oldNo":395,"newNo":395,"tokens":799},"f99da3a21a",[800],{"content":801},"  })",{"id":803,"type":203,"oldNo":192,"newNo":419,"tokens":804},"9af5ce47f9",[],{"id":806,"type":203,"oldNo":192,"newNo":455,"tokens":807},"1f0310c08f",[808,809,811,812,814,815,816,818,819],{"content":273},{"content":810,"color":251},"it",{"content":277},{"content":813,"color":188},"'rejects a transfer above the balance and leaves both wallets untouched'",{"content":315},{"content":302,"color":179},{"content":817}," () ",{"content":549,"color":179},{"content":267},{"id":821,"type":203,"oldNo":192,"newNo":472,"tokens":822},"c463a7db4d",[823,824,825,826,827,829,830,832,834,836,838],{"content":335},{"content":347,"color":179},{"content":185},{"content":783,"color":251},{"content":828},"(service.",{"content":305,"color":251},{"content":831},"(alice, bob, ",{"content":833,"color":313},"10_000",{"content":835},")).rejects.",{"content":837,"color":251},"toThrow",{"content":839},"(InsufficientFundsError)",{"id":841,"type":203,"oldNo":192,"newNo":553,"tokens":842},"98240d3f71",[843,844,845,846,847,848,849,851,852,853,855],{"content":335},{"content":783,"color":251},{"content":277},{"content":347,"color":179},{"content":185},{"content":788,"color":251},{"content":850},"(alice)).",{"content":792,"color":251},{"content":277},{"content":854,"color":313},"500",{"content":392},{"id":857,"type":203,"oldNo":192,"newNo":561,"tokens":858},"26923d2b13",[859,860,861,862,863,864,865,866,867,868,869],{"content":335},{"content":783,"color":251},{"content":277},{"content":347,"color":179},{"content":185},{"content":788,"color":251},{"content":790},{"content":792,"color":251},{"content":277},{"content":795,"color":313},{"content":392},{"id":871,"type":203,"oldNo":192,"newNo":576,"tokens":872},"df8db9e079",[873],{"content":801},{"id":875,"type":203,"oldNo":192,"newNo":585,"tokens":876},"c1328220ac",[],{"id":878,"type":203,"oldNo":192,"newNo":603,"tokens":879},"6c108a93df",[880,881,882,883,885,886,887,888,889],{"content":273},{"content":810,"color":251},{"content":277},{"content":884,"color":188},"'never overdraws a wallet under concurrent transfers'",{"content":315},{"content":302,"color":179},{"content":817},{"content":549,"color":179},{"content":267},{"id":891,"type":203,"oldNo":192,"newNo":620,"tokens":892},"0d26e1b348",[893,894,895,896,897,898,900,902,903,905,907,909,910,912,913,914,916],{"content":335},{"content":347,"color":179},{"content":185},{"content":524,"color":313},{"content":438},{"content":899,"color":251},"allSettled",{"content":901},"(Array.",{"content":183,"color":251},{"content":904},"({ length: ",{"content":906,"color":313},"20",{"content":908}," }, () ",{"content":549,"color":179},{"content":911}," service.",{"content":305,"color":251},{"content":831},{"content":915,"color":313},"100",{"content":917},")))",{"id":919,"type":203,"oldNo":192,"newNo":629,"tokens":920},"34cf65229c",[921,922,923,924,925,926,927,928,929,930,931],{"content":335},{"content":783,"color":251},{"content":277},{"content":347,"color":179},{"content":185},{"content":788,"color":251},{"content":850},{"content":792,"color":251},{"content":277},{"content":642,"color":313},{"content":392},{"id":933,"type":203,"oldNo":192,"newNo":654,"tokens":934},"38b8dcc257",[935],{"content":801},{"id":937,"type":175,"oldNo":419,"newNo":658,"tokens":938},"5c5277e387",[939],{"content":940},"})",[942,944,946],{"type":943},"observation",{"type":945},"reflection",{"type":947},"focus",{"base":949,"parTimeSeconds":950},120,360,[952,957,959],{"id":953,"gameId":86,"order":6,"title":954,"difficulty":19,"estimatedMinutes":65},"store-dashboard",{"fr":955,"en":956},"Le dashboard des magasins","The store dashboard",{"id":108,"gameId":86,"order":19,"title":958,"difficulty":32,"estimatedMinutes":87},{"fr":110,"en":111},{"id":960,"gameId":86,"order":32,"title":961,"difficulty":32,"estimatedMinutes":295},"fx-rates-client",{"fr":962,"en":963},"Le client de taux de change","The FX rates client",1790619204046]