From a2b712b78dfc41e4cf6a0fe1c3377230d7617225 Mon Sep 17 00:00:00 2001 From: LeRatierBretonnier Date: Thu, 26 Feb 2026 13:30:53 +0100 Subject: [PATCH] Diverses corrections + ajouts armes en compendiums --- less/tedeum.less | 1 - modules/common/tedeum-utility.js | 52 ++++++++++++------ packs/aides/CURRENT | 2 +- packs/aides/LOG | 10 +--- packs/aides/LOG.old | 14 ++--- .../{MANIFEST-000214 => MANIFEST-000226} | Bin 225 -> 208 bytes packs/armes/CURRENT | 2 +- packs/armes/LOG | 10 +--- packs/armes/LOG.old | 14 ++--- .../{MANIFEST-000317 => MANIFEST-000329} | Bin 176 -> 159 bytes packs/armures/CURRENT | 2 +- packs/armures/LOG | 10 +--- packs/armures/LOG.old | 14 ++--- .../{MANIFEST-000317 => MANIFEST-000329} | Bin 175 -> 158 bytes packs/competences/CURRENT | 2 +- packs/competences/LOG | 10 +--- packs/competences/LOG.old | 14 ++--- .../{MANIFEST-000315 => MANIFEST-000327} | Bin 178 -> 160 bytes packs/education/CURRENT | 2 +- packs/education/LOG | 10 +--- packs/education/LOG.old | 14 ++--- .../{MANIFEST-000327 => MANIFEST-000339} | Bin 178 -> 160 bytes packs/graces/CURRENT | 2 +- packs/graces/LOG | 10 +--- packs/graces/LOG.old | 14 ++--- .../{MANIFEST-000316 => MANIFEST-000328} | Bin 174 -> 157 bytes packs/maladies/CURRENT | 2 +- packs/maladies/LOG | 10 +--- packs/maladies/LOG.old | 14 ++--- .../{MANIFEST-000316 => MANIFEST-000328} | Bin 173 -> 156 bytes packs/scenes/CURRENT | 2 +- packs/scenes/LOG | 10 +--- packs/scenes/LOG.old | 14 ++--- .../{MANIFEST-000253 => MANIFEST-000265} | Bin 176 -> 159 bytes packs/simples/CURRENT | 2 +- packs/simples/LOG | 10 +--- packs/simples/LOG.old | 14 ++--- .../{MANIFEST-000317 => MANIFEST-000329} | Bin 174 -> 157 bytes styles/tedeum.css | 1 - 39 files changed, 134 insertions(+), 154 deletions(-) rename packs/aides/{MANIFEST-000214 => MANIFEST-000226} (56%) rename packs/armes/{MANIFEST-000317 => MANIFEST-000329} (72%) rename packs/armures/{MANIFEST-000317 => MANIFEST-000329} (73%) rename packs/competences/{MANIFEST-000315 => MANIFEST-000327} (71%) rename packs/education/{MANIFEST-000327 => MANIFEST-000339} (71%) rename packs/graces/{MANIFEST-000316 => MANIFEST-000328} (73%) rename packs/maladies/{MANIFEST-000316 => MANIFEST-000328} (73%) rename packs/scenes/{MANIFEST-000253 => MANIFEST-000265} (79%) rename packs/simples/{MANIFEST-000317 => MANIFEST-000329} (73%) diff --git a/less/tedeum.less b/less/tedeum.less index 2cd3be4..42a2640 100644 --- a/less/tedeum.less +++ b/less/tedeum.less @@ -1238,7 +1238,6 @@ li { font-size: 0.9rem; border-radius: 8px; box-shadow: 0 3px 8px rgba(0, 0, 0, 0.15); - overflow: hidden; border: 1px solid rgba(139, 115, 85, 0.3); &.whisper { diff --git a/modules/common/tedeum-utility.js b/modules/common/tedeum-utility.js index e33b09f..0c1739d 100644 --- a/modules/common/tedeum-utility.js +++ b/modules/common/tedeum-utility.js @@ -17,7 +17,10 @@ export class TeDeumUtility { } static installHooks() { - Hooks.on('renderChatLog', (log, html, data) => TeDeumUtility.chatListeners(html)); + Hooks.on('renderChatMessageHTML', (message, html) => { + TeDeumUtility.chatListeners(html); + TeDeumUtility.onRenderChatMessage(message, html); + }); Hooks.on("renderActorDirectory", (app, html, data) => { if (game.user.can('ACTOR_CREATE')) { @@ -175,7 +178,6 @@ export class TeDeumUtility { fetch(ECRYME_WELCOME_MESSAGE_URL) .then(response => response.text()) .then(html => { - console.log("Fetched welcome message:", html); ChatMessage.create({ user: game.user.id, whisper: [game.user.id], @@ -309,16 +311,24 @@ export class TeDeumUtility { } } - /* -------------------------------------------- */ /* -------------------------------------------- */ + /* -------------------------------------------- */ + static getTokenActorFromId(tokenId) { + for (let scene of game.scenes) { + const tokenDoc = scene.tokens.get(tokenId) + if (tokenDoc) return tokenDoc.actor + } + return null + } + + /* -------------------------------------------- */ static async appliquerDegats(rollData) { await this.processAttaqueMelee(rollData) - let defenderToken = canvas.tokens.placeables.find(t => t.id == rollData.defenderTokenId) - if (defenderToken) { - let actor = defenderToken.actor - if (game.user.isGM || actor.isOwner) { - await actor.appliquerDegats(rollData) + let defenderActor = this.getTokenActorFromId(rollData.defenderTokenId) + if (defenderActor) { + if (game.user.isGM || defenderActor.isOwner) { + await defenderActor.appliquerDegats(rollData) } else { - // Send a socket message + // Send a socket message — seul le premier MJ actif le traitera game.socket.emit("system.fvtt-te-deum", { name: "msg_apply_damage", data: { rollData } }); } // Attaque naturelle avec dégats inférieur à -2 @@ -351,19 +361,27 @@ export class TeDeumUtility { TeDeumUtility.appliquerDegats(rollData, messageId) } }) - $(html).on("click", '.chat-command-gain-xp', event => { + $(html).on("click", '.chat-command-gain-xp', async event => { let messageId = TeDeumUtility.findChatMessageId(event.currentTarget) let message = game.messages.get(messageId) let rollData = message.getFlag("world", "te-deum-rolldata") if (rollData) { let actor = TeDeumUtility.getActorFromRollData(rollData) actor.modifyXP(rollData.carac.key, 1) - // Hide this button - event.currentTarget.style.display = 'none'; + event.currentTarget.style.display = 'none'; // feedback immédiat local + await message.setFlag("world", "te-deum-xp-used", true) // sync tous les clients } }) } + /* -------------------------------------------- */ + static onRenderChatMessage(message, html) { + if (message.getFlag("world", "te-deum-xp-used")) { + const btn = html.querySelector('.chat-command-gain-xp'); + if (btn) btn.style.display = 'none'; + } + } + /* -------------------------------------------- */ static async preloadHandlebarsTemplates() { @@ -467,12 +485,12 @@ export class TeDeumUtility { } } if (msg.name == "msg_apply_damage") { - if (game.user.isGM) { + const firstGM = game.users.find(u => u.isGM && u.active) + if (game.user === firstGM) { let rollData = msg.data.rollData - let defenderToken = canvas.tokens.placeables.find(t => t.id == rollData.defenderTokenId) - if (defenderToken) { - let actor = defenderToken.actor - await actor.appliquerDegats(rollData) + let defenderActor = TeDeumUtility.getTokenActorFromId(rollData.defenderTokenId) + if (defenderActor) { + await defenderActor.appliquerDegats(rollData) } else { ui.notifications.error("Impossible de trouver la cible de l'attaque, aucun degats appliqué") } diff --git a/packs/aides/CURRENT b/packs/aides/CURRENT index f0a2cf1..72f074e 100644 --- a/packs/aides/CURRENT +++ b/packs/aides/CURRENT @@ -1 +1 @@ -MANIFEST-000214 +MANIFEST-000226 diff --git a/packs/aides/LOG b/packs/aides/LOG index bf66cab..7272d90 100644 --- a/packs/aides/LOG +++ b/packs/aides/LOG @@ -1,7 +1,3 @@ -2026/01/04-21:26:37.933804 7f93eb7fe6c0 Recovering log #212 -2026/01/04-21:26:37.943801 7f93eb7fe6c0 Delete type=3 #210 -2026/01/04-21:26:37.943854 7f93eb7fe6c0 Delete type=0 #212 -2026/01/04-21:27:02.505234 7f93e9ffb6c0 Level-0 table #217: started -2026/01/04-21:27:02.505262 7f93e9ffb6c0 Level-0 table #217: 0 bytes OK -2026/01/04-21:27:02.512734 7f93e9ffb6c0 Delete type=0 #215 -2026/01/04-21:27:02.512909 7f93e9ffb6c0 Manual compaction at level-0 from '!journal!uNwJgi4kXBCiZmAH' @ 72057594037927935 : 1 .. '!journal.pages!uNwJgi4kXBCiZmAH.onhNU0mXhOpdNZJF' @ 0 : 0; will stop at (end) +2026/02/25-16:17:49.096861 7f821f7fe6c0 Recovering log #224 +2026/02/25-16:17:49.106471 7f821f7fe6c0 Delete type=3 #222 +2026/02/25-16:17:49.106539 7f821f7fe6c0 Delete type=0 #224 diff --git a/packs/aides/LOG.old b/packs/aides/LOG.old index ad56da5..97b7095 100644 --- a/packs/aides/LOG.old +++ b/packs/aides/LOG.old @@ -1,7 +1,7 @@ -2025/12/20-18:12:56.443928 7f244d1ff6c0 Recovering log #208 -2025/12/20-18:12:56.494058 7f244d1ff6c0 Delete type=3 #206 -2025/12/20-18:12:56.494134 7f244d1ff6c0 Delete type=0 #208 -2025/12/20-18:36:44.261828 7f2436ffd6c0 Level-0 table #213: started -2025/12/20-18:36:44.261865 7f2436ffd6c0 Level-0 table #213: 0 bytes OK -2025/12/20-18:36:44.320648 7f2436ffd6c0 Delete type=0 #211 -2025/12/20-18:36:44.320833 7f2436ffd6c0 Manual compaction at level-0 from '!journal!uNwJgi4kXBCiZmAH' @ 72057594037927935 : 1 .. '!journal.pages!uNwJgi4kXBCiZmAH.onhNU0mXhOpdNZJF' @ 0 : 0; will stop at (end) +2026/02/25-15:53:40.937630 7f821ffff6c0 Recovering log #220 +2026/02/25-15:53:40.949873 7f821ffff6c0 Delete type=3 #218 +2026/02/25-15:53:40.949933 7f821ffff6c0 Delete type=0 #220 +2026/02/25-16:16:19.716603 7f821d8d46c0 Level-0 table #225: started +2026/02/25-16:16:19.716652 7f821d8d46c0 Level-0 table #225: 0 bytes OK +2026/02/25-16:16:19.765894 7f821d8d46c0 Delete type=0 #223 +2026/02/25-16:16:19.766155 7f821d8d46c0 Manual compaction at level-0 from '!journal!uNwJgi4kXBCiZmAH' @ 72057594037927935 : 1 .. '!journal.pages!uNwJgi4kXBCiZmAH.onhNU0mXhOpdNZJF' @ 0 : 0; will stop at (end) diff --git a/packs/aides/MANIFEST-000214 b/packs/aides/MANIFEST-000226 similarity index 56% rename from packs/aides/MANIFEST-000214 rename to packs/aides/MANIFEST-000226 index c8a46aedde2978c356c39c2a5c882cc524a5fc33..f462645a923fbb712085c848ed2de544ddd290ed 100644 GIT binary patch delta 24 fcmaFJc!6=ke!_>ghJekGskJ^5S=j7--VIT@I5FtSLO{9ZH_Bya;Ha0@5^02uuXk^lez diff --git a/packs/armes/CURRENT b/packs/armes/CURRENT index fad7e54..00ac499 100644 --- a/packs/armes/CURRENT +++ b/packs/armes/CURRENT @@ -1 +1 @@ -MANIFEST-000317 +MANIFEST-000329 diff --git a/packs/armes/LOG b/packs/armes/LOG index 6dd66da..0ce0f42 100644 --- a/packs/armes/LOG +++ b/packs/armes/LOG @@ -1,7 +1,3 @@ -2026/01/04-21:26:37.828637 7f93eb7fe6c0 Recovering log #315 -2026/01/04-21:26:37.839103 7f93eb7fe6c0 Delete type=3 #313 -2026/01/04-21:26:37.839200 7f93eb7fe6c0 Delete type=0 #315 -2026/01/04-21:27:02.452079 7f93e9ffb6c0 Level-0 table #320: started -2026/01/04-21:27:02.452098 7f93e9ffb6c0 Level-0 table #320: 0 bytes OK -2026/01/04-21:27:02.458511 7f93e9ffb6c0 Delete type=0 #318 -2026/01/04-21:27:02.458741 7f93e9ffb6c0 Manual compaction at level-0 from '!folders!InCQeTRdT5jXMX82' @ 72057594037927935 : 1 .. '!items!wxIHkrq98eQ3cOvp' @ 0 : 0; will stop at (end) +2026/02/25-16:17:49.007591 7f821f7fe6c0 Recovering log #327 +2026/02/25-16:17:49.018485 7f821f7fe6c0 Delete type=3 #325 +2026/02/25-16:17:49.018548 7f821f7fe6c0 Delete type=0 #327 diff --git a/packs/armes/LOG.old b/packs/armes/LOG.old index f47fc7d..9d91d27 100644 --- a/packs/armes/LOG.old +++ b/packs/armes/LOG.old @@ -1,7 +1,7 @@ -2025/12/20-18:12:56.039187 7f244d1ff6c0 Recovering log #311 -2025/12/20-18:12:56.089963 7f244d1ff6c0 Delete type=3 #309 -2025/12/20-18:12:56.090033 7f244d1ff6c0 Delete type=0 #311 -2025/12/20-18:36:43.701277 7f2436ffd6c0 Level-0 table #316: started -2025/12/20-18:36:43.701303 7f2436ffd6c0 Level-0 table #316: 0 bytes OK -2025/12/20-18:36:43.756264 7f2436ffd6c0 Delete type=0 #314 -2025/12/20-18:36:43.812180 7f2436ffd6c0 Manual compaction at level-0 from '!folders!InCQeTRdT5jXMX82' @ 72057594037927935 : 1 .. '!items!wxIHkrq98eQ3cOvp' @ 0 : 0; will stop at (end) +2026/02/25-15:53:40.848906 7f821effd6c0 Recovering log #323 +2026/02/25-15:53:40.858667 7f821effd6c0 Delete type=3 #321 +2026/02/25-15:53:40.858720 7f821effd6c0 Delete type=0 #323 +2026/02/25-16:16:19.467652 7f821d8d46c0 Level-0 table #328: started +2026/02/25-16:16:19.467677 7f821d8d46c0 Level-0 table #328: 0 bytes OK +2026/02/25-16:16:19.528659 7f821d8d46c0 Delete type=0 #326 +2026/02/25-16:16:19.528885 7f821d8d46c0 Manual compaction at level-0 from '!folders!InCQeTRdT5jXMX82' @ 72057594037927935 : 1 .. '!items!wxIHkrq98eQ3cOvp' @ 0 : 0; will stop at (end) diff --git a/packs/armes/MANIFEST-000317 b/packs/armes/MANIFEST-000329 similarity index 72% rename from packs/armes/MANIFEST-000317 rename to packs/armes/MANIFEST-000329 index 8380c9764cc8b7b6eb00c1a01c5204551ca12d2b..f8e267204548b749eab99b4712359c283fb66513 100644 GIT binary patch delta 24 gcmdnMIG=GspWtoNwfbBPj7+DPI2o8vGqHFA0AH2{YybcN delta 41 scmbQwxPfs(pHkDpU=1z?My7pCoD9tSnOHnO{q}hX64(zCI0zH~0RB}A8vppUQ((Z64eVj7)o&I2oAtGO@g6+_|uN5=dk(NMt`q1OO}F3~K-Y diff --git a/packs/education/CURRENT b/packs/education/CURRENT index 9f81527..7adea65 100644 --- a/packs/education/CURRENT +++ b/packs/education/CURRENT @@ -1 +1 @@ -MANIFEST-000327 +MANIFEST-000339 diff --git a/packs/education/LOG b/packs/education/LOG index c545c0f..89c31ef 100644 --- a/packs/education/LOG +++ b/packs/education/LOG @@ -1,7 +1,3 @@ -2026/01/04-21:26:37.858384 7f93eaffd6c0 Recovering log #325 -2026/01/04-21:26:37.868673 7f93eaffd6c0 Delete type=3 #323 -2026/01/04-21:26:37.868726 7f93eaffd6c0 Delete type=0 #325 -2026/01/04-21:27:02.458878 7f93e9ffb6c0 Level-0 table #330: started -2026/01/04-21:27:02.458920 7f93e9ffb6c0 Level-0 table #330: 0 bytes OK -2026/01/04-21:27:02.465606 7f93e9ffb6c0 Delete type=0 #328 -2026/01/04-21:27:02.485393 7f93e9ffb6c0 Manual compaction at level-0 from '!folders!9PQi3Lv54rpcxavo' @ 72057594037927935 : 1 .. '!items!zGlRtP7zSnkjuuue' @ 0 : 0; will stop at (end) +2026/02/25-16:17:49.032966 7f821ffff6c0 Recovering log #337 +2026/02/25-16:17:49.043199 7f821ffff6c0 Delete type=3 #335 +2026/02/25-16:17:49.043264 7f821ffff6c0 Delete type=0 #337 diff --git a/packs/education/LOG.old b/packs/education/LOG.old index aea7623..994b1d2 100644 --- a/packs/education/LOG.old +++ b/packs/education/LOG.old @@ -1,7 +1,7 @@ -2025/12/20-18:12:56.154781 7f244c9fe6c0 Recovering log #321 -2025/12/20-18:12:56.203650 7f244c9fe6c0 Delete type=3 #319 -2025/12/20-18:12:56.206209 7f244c9fe6c0 Delete type=0 #321 -2025/12/20-18:36:43.812286 7f2436ffd6c0 Level-0 table #326: started -2025/12/20-18:36:43.812329 7f2436ffd6c0 Level-0 table #326: 0 bytes OK -2025/12/20-18:36:43.867818 7f2436ffd6c0 Delete type=0 #324 -2025/12/20-18:36:44.048015 7f2436ffd6c0 Manual compaction at level-0 from '!folders!9PQi3Lv54rpcxavo' @ 72057594037927935 : 1 .. '!items!zGlRtP7zSnkjuuue' @ 0 : 0; will stop at (end) +2026/02/25-15:53:40.874436 7f821ffff6c0 Recovering log #333 +2026/02/25-15:53:40.884848 7f821ffff6c0 Delete type=3 #331 +2026/02/25-15:53:40.884904 7f821ffff6c0 Delete type=0 #333 +2026/02/25-16:16:19.356498 7f821d8d46c0 Level-0 table #338: started +2026/02/25-16:16:19.356535 7f821d8d46c0 Level-0 table #338: 0 bytes OK +2026/02/25-16:16:19.414898 7f821d8d46c0 Delete type=0 #336 +2026/02/25-16:16:19.528852 7f821d8d46c0 Manual compaction at level-0 from '!folders!9PQi3Lv54rpcxavo' @ 72057594037927935 : 1 .. '!items!zGlRtP7zSnkjuuue' @ 0 : 0; will stop at (end) diff --git a/packs/education/MANIFEST-000327 b/packs/education/MANIFEST-000339 similarity index 71% rename from packs/education/MANIFEST-000327 rename to packs/education/MANIFEST-000339 index 7f2b7baf76e743292f70e01ca963a0391cfe666e..6e70a9c4beeaa9445d55e4f1c6c59dda502a0db2 100644 GIT binary patch delta 25 hcmdnQxPWm&pU}SpUQ8M`Mul>j7%q(I2o8vGO@IIEQgUx8VPllL=f5j7%q)I2o8vF|oJ<0BULn9{>OV delta 41 rcmbQkxR!B3w^CY=eIyqHBhy|cP6pVVwpL delta 41 tcmbQwxPfs(pVEBgY&I?iMy7v^oD9tW8Ch7F%x3%o3H%2MG%~TU0s!J92~_|9 diff --git a/packs/simples/CURRENT b/packs/simples/CURRENT index fad7e54..00ac499 100644 --- a/packs/simples/CURRENT +++ b/packs/simples/CURRENT @@ -1 +1 @@ -MANIFEST-000317 +MANIFEST-000329 diff --git a/packs/simples/LOG b/packs/simples/LOG index 4d5a082..d853150 100644 --- a/packs/simples/LOG +++ b/packs/simples/LOG @@ -1,7 +1,3 @@ -2026/01/04-21:26:37.904069 7f93eaffd6c0 Recovering log #315 -2026/01/04-21:26:37.914574 7f93eaffd6c0 Delete type=3 #313 -2026/01/04-21:26:37.914647 7f93eaffd6c0 Delete type=0 #315 -2026/01/04-21:27:02.465731 7f93e9ffb6c0 Level-0 table #320: started -2026/01/04-21:27:02.465755 7f93e9ffb6c0 Level-0 table #320: 0 bytes OK -2026/01/04-21:27:02.471938 7f93e9ffb6c0 Delete type=0 #318 -2026/01/04-21:27:02.485413 7f93e9ffb6c0 Manual compaction at level-0 from '!items!1bAL2MQVpVBd0c5Z' @ 72057594037927935 : 1 .. '!items!zs67k4sxCid6oTK3' @ 0 : 0; will stop at (end) +2026/02/25-16:17:49.070393 7f821ffff6c0 Recovering log #327 +2026/02/25-16:17:49.080654 7f821ffff6c0 Delete type=3 #325 +2026/02/25-16:17:49.080720 7f821ffff6c0 Delete type=0 #327 diff --git a/packs/simples/LOG.old b/packs/simples/LOG.old index 3b2c8d4..7976077 100644 --- a/packs/simples/LOG.old +++ b/packs/simples/LOG.old @@ -1,7 +1,7 @@ -2025/12/20-18:12:56.325650 7f244c9fe6c0 Recovering log #311 -2025/12/20-18:12:56.379165 7f244c9fe6c0 Delete type=3 #309 -2025/12/20-18:12:56.379237 7f244c9fe6c0 Delete type=0 #311 -2025/12/20-18:36:43.867925 7f2436ffd6c0 Level-0 table #316: started -2025/12/20-18:36:43.867945 7f2436ffd6c0 Level-0 table #316: 0 bytes OK -2025/12/20-18:36:43.935523 7f2436ffd6c0 Delete type=0 #314 -2025/12/20-18:36:44.048037 7f2436ffd6c0 Manual compaction at level-0 from '!items!1bAL2MQVpVBd0c5Z' @ 72057594037927935 : 1 .. '!items!zs67k4sxCid6oTK3' @ 0 : 0; will stop at (end) +2026/02/25-15:53:40.912618 7f821e7fc6c0 Recovering log #323 +2026/02/25-15:53:40.922737 7f821e7fc6c0 Delete type=3 #321 +2026/02/25-15:53:40.922804 7f821e7fc6c0 Delete type=0 #323 +2026/02/25-16:16:19.584692 7f821d8d46c0 Level-0 table #328: started +2026/02/25-16:16:19.584724 7f821d8d46c0 Level-0 table #328: 0 bytes OK +2026/02/25-16:16:19.645484 7f821d8d46c0 Delete type=0 #326 +2026/02/25-16:16:19.766128 7f821d8d46c0 Manual compaction at level-0 from '!items!1bAL2MQVpVBd0c5Z' @ 72057594037927935 : 1 .. '!items!zs67k4sxCid6oTK3' @ 0 : 0; will stop at (end) diff --git a/packs/simples/MANIFEST-000317 b/packs/simples/MANIFEST-000329 similarity index 73% rename from packs/simples/MANIFEST-000317 rename to packs/simples/MANIFEST-000329 index 5491a771e8e002c4312c3863fe815dd874f99ff7..46d89cbdd299d71280bd97f4031964953e545657 100644 GIT binary patch delta 24 gcmZ3-IG1rkkD%b4>vmiWj7+DPI2o8vGqHpM0AFqfhyVZp delta 41 scmbQsxQ=l`k5a~W19L70My7pCoD9tSnOH)9Of|m*64(zCI0zH~0Q+4E(EtDd diff --git a/styles/tedeum.css b/styles/tedeum.css index d3adb3d..a81d92a 100644 --- a/styles/tedeum.css +++ b/styles/tedeum.css @@ -944,7 +944,6 @@ li { font-size: 0.9rem; border-radius: 8px; box-shadow: 0 3px 8px rgba(0, 0, 0, 0.15); - overflow: hidden; border: 1px solid rgba(139, 115, 85, 0.3); } .chat-message.whisper {