From 0140c06866ce07a4a6decc33343ae9928f455f15 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Wed, 2 Oct 2024 21:26:22 +0100 Subject: [PATCH 01/74] Code: created a new websocket to represent the Remote Game Queue. Next step is to broadcast to the pairs of users their opponents ips. --- backend/pong/consumers.py | 86 ++++++++++++++++++++-------------- backend/pong/urls.py | 1 + backend/static/js/game/main.js | 5 ++ 3 files changed, 57 insertions(+), 35 deletions(-) diff --git a/backend/pong/consumers.py b/backend/pong/consumers.py index 6a78cf0..fec22a7 100644 --- a/backend/pong/consumers.py +++ b/backend/pong/consumers.py @@ -8,38 +8,54 @@ class TournamentConsumer(WebsocketConsumer): - def connect(self): - self.room_group_name = f'{self.scope["url_route"]["kwargs"]["tournament_id"]}' - self.user = self.scope["user"] - - async_to_sync(self.channel_layer.group_add)( - self.room_group_name, self.channel_name - ) - - self.accept() - - def disconnect(self, code): - async_to_sync(self.channel_layer.group_discard)( - self.room_group_name, self.channel_name - ) - return super().disconnect(code) - - def receive(self, text_data): - tournament_id = self.room_group_name - all_tour_users = TournamentsUsers.objects.filter(tournament_id=tournament_id) - serializer = TournamentsUsersSerializer(all_tour_users, many=True) - - tour_users_data = serializer.data - - for tour_user in tour_users_data: - user = Users.objects.get(pk=tour_user['user_id']) - user_data = UsersSerializer(user).data - tour_user['user'] = user_data - - async_to_sync(self.channel_layer.group_send)( - self.room_group_name, {"type": "send.users", "message": json.dumps(tour_users_data)} - ) - - def send_users(self, event): - self.send(text_data=event["message"]) - + def connect(self): + self.room_group_name = f'{self.scope["url_route"]["kwargs"]["tournament_id"]}' + + async_to_sync(self.channel_layer.group_add)( + self.room_group_name, self.channel_name + ) + + self.accept() + + def disconnect(self, code): + async_to_sync(self.channel_layer.group_discard)( + self.room_group_name, self.channel_name + ) + return super().disconnect(code) + + def receive(self, text_data): + tournament_id = self.room_group_name + all_tour_users = TournamentsUsers.objects.filter(tournament_id=tournament_id) + serializer = TournamentsUsersSerializer(all_tour_users, many=True) + + tour_users_data = serializer.data + + for tour_user in tour_users_data: + user = Users.objects.get(pk=tour_user['user_id']) + user_data = UsersSerializer(user).data + tour_user['user'] = user_data + + async_to_sync(self.channel_layer.group_send)( + self.room_group_name, {"type": "send.users", "message": json.dumps(tour_users_data)} + ) + + def send_users(self, event): + self.send(text_data=event["message"]) + + +class RemoteGameQueueConsumer(WebsocketConsumer): + queue = {} + + def connect(self): + self.room_group_name = "Remote Game Queue" + self.accept() + + def disconnect(self, code): + del self.queue[self.scope['user'].id] + ic(self.queue) + return super().disconnect(code) + + def receive(self, text_data=None): + user_id = self.scope['user'].id + self.queue[user_id] = self.scope['client'] + ic(self.queue) diff --git a/backend/pong/urls.py b/backend/pong/urls.py index 099aec1..d18129f 100644 --- a/backend/pong/urls.py +++ b/backend/pong/urls.py @@ -107,4 +107,5 @@ websocket_urlpatterns = [ path('ws/tournaments/', consumers.TournamentConsumer.as_asgi()), + path('ws/games/remote/queue', consumers.RemoteGameQueueConsumer.as_asgi()), ] \ No newline at end of file diff --git a/backend/static/js/game/main.js b/backend/static/js/game/main.js index e56b7dd..1dff5b9 100644 --- a/backend/static/js/game/main.js +++ b/backend/static/js/game/main.js @@ -1,5 +1,10 @@ import { MyApp } from './MyApp.js'; +var socket = new WebSocket(`ws://${window.location.hostname}:8002/ws/games/remote/queue`); +socket.onopen = (event) => { + console.log('Socket opening', event); +}; + let app = new MyApp() app.init() app.render() \ No newline at end of file From 49c1546c4b4863465c213d363ec71eb0783b616d Mon Sep 17 00:00:00 2001 From: Xyckens Date: Wed, 2 Oct 2024 21:28:24 +0100 Subject: [PATCH 02/74] profile tab started --- .../pong/templates/pages/view_profile.html | 194 +++++++++++------- backend/static/assets/icons/fast.png | Bin 0 -> 512 bytes backend/static/assets/icons/longest.png | Bin 0 -> 867 bytes backend/static/assets/icons/pie.png | Bin 0 -> 545 bytes backend/static/assets/icons/pong2.png | Bin 0 -> 645 bytes backend/static/assets/icons/prize.png | Bin 0 -> 886 bytes backend/static/assets/icons/quickest.png | Bin 0 -> 830 bytes backend/static/assets/icons/rally.png | Bin 0 -> 760 bytes backend/static/assets/icons/speed.png | Bin 0 -> 917 bytes backend/static/css/profile.css | 89 +++++++- 10 files changed, 208 insertions(+), 75 deletions(-) create mode 100644 backend/static/assets/icons/fast.png create mode 100644 backend/static/assets/icons/longest.png create mode 100644 backend/static/assets/icons/pie.png create mode 100644 backend/static/assets/icons/pong2.png create mode 100644 backend/static/assets/icons/prize.png create mode 100644 backend/static/assets/icons/quickest.png create mode 100644 backend/static/assets/icons/rally.png create mode 100644 backend/static/assets/icons/speed.png diff --git a/backend/pong/templates/pages/view_profile.html b/backend/pong/templates/pages/view_profile.html index 135c758..9a1416f 100755 --- a/backend/pong/templates/pages/view_profile.html +++ b/backend/pong/templates/pages/view_profile.html @@ -24,9 +24,9 @@

Change Password

- +
@@ -89,32 +89,32 @@

Password changed

{{ user_view.username }}

{{ user_view.status }} - {% if is_own_profile %} -
- - - {% if user_view.user_42 is None %} - - {% endif %} -
- + + {% if user_view.user_42 is None %} + + {% endif %} + + {% elif is_friend %} {% if friendship_status %} - + {% else %} {% if me %} + + + {% if tournament_size == 4 %} +
+
+
+

Group A

+
+
+ Player 1 + Player 1 +
+
+ 0 +
+
+
+
+
+
+
+ Player 2 + Player 2 +
+
+ 0 +
+
+
+
+
+

Group B

+
+
+ Player 3 + Player 3 +
+
+ 0 +
+
+
+
+
+
+
+ + Player 4 + Player 4 +
+
+ 0 +
+
+
+
+
+
+
+
+
+ Semi 1 + Group A Winner +
+
+ 0 +
+
+
+
+
+
+
+ Semi 2 + Group B Winner +
+
+ 0 +
+
+
+
+
+
+
+
+
+ Final Winner + Tournament Winner +
+
+ Final Winner + +
+
+
+
+
+ + {% elif tournament_size == 8 %} +
+
+
+

Group A

+
+
+ Player 1 + Player 1 +
+
+ 0 +
+
+
+
+
+
+
+ Player 2 + Player 2 +
+
+ 0 +
+
+
+
+
+

Group B

+
+
+ + Player 3 + Player 3 +
+
+ 0 +
+
+
+
+
+
+
+ Player 4 + Player 4 +
+
+ 0 +
+
+
+
+
+

Group C

+
+
+ Player 3 + Player 5 +
+
+ 0 +
+
+
+
+
+
+
+ + Player 4 + Player 6 +
+
+ 0 +
+
+
+
+
+

Group D

+
+
+ + Player 3 + Player 7 +
+
+ 0 +
+
+
+
+
+
+
+ + Player 4 + Player 8 +
+
+ 0 +
+
+
+
+
+
+
+
+
+ Semi 1 + Group A Winner +
+
+ 0 +
+
+
+
+
+
+
+ Semi 2 + Group B Winner +
+
+ 0 +
+
+
+
+
+
+
+ Semi 1 + Group C Winner +
+
+ 0 +
+
+
+
+
+
+
+ Semi 2 + Group D Winner +
+
+ 0 +
+
+
+
+
+
+
+
+
+ Final Winner + Tournament Winner +
+
+ Final Winner + +
+
+
+
+
+ {% else %} + + {% endif %} + + + + +{% endblock %} diff --git a/backend/pong/templates/pages/ongoing-tourn.html b/backend/pong/templates/pages/ongoing-tourn.html index 231353d..306d2d0 100644 --- a/backend/pong/templates/pages/ongoing-tourn.html +++ b/backend/pong/templates/pages/ongoing-tourn.html @@ -5,7 +5,7 @@
-
+

{{ tournament_name }} Name

@@ -27,95 +27,302 @@

Leave Tournament

-
+ {% if tournament_size == 4 %} +
+
+
+

Group A

+
+
+ Player 1 + Player 1 +
+
+ 0 +
+
+
+
+
+
+
+ Player 2 + Player 2 +
+
+ 0 +
+
+
+
+
+

Group B

+
+
+ Player 3 + Player 3 +
+
+ 0 +
+
+
+
+
+
+
-
-
-

Group A

-
-
+ Player 4 + Player 4 +
+
+ 0 +
+
+
+
+
+
+
+
+
+ Semi 1 + Group A Winner +
+
+ 0 +
+
+
+
+
+
+
+ Semi 2 + Group B Winner +
+
+ 0 +
+
+
+
+
+
+
+
+
+ Final Winner + Tournament Winner +
+
+ Final Winner - Player 1 - Player 1 +
+
-
- 0 +
+
+ + {% elif tournament_size == 8 %} +
+
+
+

Group A

+
+
+ Player 1 + Player 1 +
+
+ 0 +
+
+
+
+
+
+
+ Player 2 + Player 2 +
+
+ 0 +
-
-
-
- Player 2 - Player 2 -
-
- 0 +
+
+
+

Group B

+
+
+ Player 3 + Player 3 +
+
+ 0 +
-
-
-
-
-

Group B

-
-
+
+
+
+
+
- Player 3 - Player 3 + Player 4 + Player 4 +
+
+ 0 +
-
- 0 +
+
+
+
+
+
+
+ Semi 1 + Group A Winner +
+
+ 0 +
+
+
+
+
+
+
+ Semi 2 + Group B Winner +
+
+ 0 +
-
-
-
+
+
+
+
+
+
+
+ Final Winner + Tournament Winner +
+
+ Final Winner - Player 4 - Player 4 +
-
- 0 +
+
+
+
+
+
+
+
+
+

Group A

+
+
+ Player 1 + Player 1 +
+
+ 0 +
-
-
-
-
- -
-
-
-
- - Semi 1 - Group A Winner +
+
+
+
+
+ Player 2 + Player 2 +
+
+ 0 +
-
- 0 +
+
+
+

Group B

+
+
+ Player 3 + Player 3 +
+
+ 0 +
-
-
-
+
+
+
+
+
- Semi 2 - Group B Winner + Player 4 + Player 4 +
+
+ 0 +
+
+
+
+
+
+
+
+
+ Semi 1 + Group A Winner +
+
+ 0 +
-
- 0 +
+
+
+
+
+ Semi 2 + Group B Winner +
+
+ 0 +
-
-
-
-
+
+
+
+
+
+
+
+ Final Winner + Tournament Winner +
+
+ Final Winner -
-
-
-
- Tournament Winner - Final Winner +
-
+
-
+
+ {% else %} +
+ {% endif %} +
diff --git a/backend/pong/templates/pages/search_users.html b/backend/pong/templates/pages/search_users.html index 87edbac..0298199 100644 --- a/backend/pong/templates/pages/search_users.html +++ b/backend/pong/templates/pages/search_users.html @@ -6,32 +6,42 @@
{% if searched %} -

Search Results

-
-
Your search for "{{ searched }}" has retrieved {{ numbers}} - {% if numbers == 1 %} - result. - {% else %} - results. - {% endif %} -
-
-
diff --git a/backend/pong/templates/pages/tournament_stats.html b/backend/pong/templates/pages/tournament_overview.html similarity index 100% rename from backend/pong/templates/pages/tournament_stats.html rename to backend/pong/templates/pages/tournament_overview.html diff --git a/backend/pong/views.py b/backend/pong/views.py index 6e9f53c..66432f6 100644 --- a/backend/pong/views.py +++ b/backend/pong/views.py @@ -1093,7 +1093,8 @@ def ongoingtournaments(request, tournament_id): user_id = request.user.id context = { 'user_id': user_id, - 'tournament_id': tournament_id + 'tournament_id': tournament_id, + 'tournament_size': 8 } return render(request,'pages/ongoing-tourn.html', context) @@ -1102,7 +1103,7 @@ def tournamentstats(request, tournament_id): context = { 'tournament_id': tournament_id } - return render(request,'pages/tournament_stats.html', context) + return render(request,'pages/tournament_overview.html', context) @login_required def gamestats(request, game_id): diff --git a/backend/static/assets/icons/error.png b/backend/static/assets/icons/error.png new file mode 100644 index 0000000000000000000000000000000000000000..e062ba70d2fdae829b39b9a05ea16f7e84bf5ceb GIT binary patch literal 7982 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 { console.log('WebSocket message received:', players); - playerSlots.forEach(slot => { - slot.querySelector("span.name").textContent = "Waiting for player..."; - slot.querySelector("img").src = "../../media/default.jpg"; - }); - players.forEach((player, i) => { playerSlots[i].querySelector("span.name").textContent = player.alias playerSlots[i].querySelector("img").src = player.user.picture @@ -42,53 +37,6 @@ socket.onclose = (event) => { // ================================================================== -const players = [ - { id: 1, name: 'Player 1', score: 0, icon: 'icon1.png' }, - { id: 2, name: 'Player 2', score: 0, icon: 'icon2.png' }, - { id: 3, name: 'Player 3', score: 0, icon: 'icon3.png' }, - { id: 4, name: 'Player 4', score: 0, icon: 'icon4.png' }, -]; - -let semiFinals = { winner1: null, winner2: null }; -let finalWinner = null; - -function advancePlayer(playerId) { - const player = players.find(p => p.id === playerId); - if (!player) return; - - // Increase the player's score - player.score += 1; - - // Update the player's score in the HTML - document.getElementById(`player${playerId}`).querySelector('.score').innerText = player.score; - - // Check if the player should advance to the next round - if (player.score === 1) { - if (playerId === 1 || playerId === 2) { - semiFinals.winner1 = player; - updateRound2Player('semi1', player); - } else if (playerId === 3 || playerId === 4) { - semiFinals.winner2 = player; - updateRound2Player('semi2', player); - } - - // Update lines - document.querySelector(`#player${playerId} ~ .line`).style.backgroundColor = 'white'; - } else if (player.score === 2) { - if (playerId === semiFinals.winner1.id) { - finalWinner = semiFinals.winner1; - updateRound3Player('final', finalWinner); - } else if (playerId === semiFinals.winner2.id) { - finalWinner = semiFinals.winner2; - updateRound3Player('final', finalWinner); - } - - // Update lines - document.querySelector(`#semi1 ~ .line`).style.backgroundColor = 'white'; - document.querySelector(`#semi2 ~ .line`).style.backgroundColor = 'white'; - } -} - function updateRound2Player(elementId, player) { const element = document.getElementById(elementId); element.querySelector('.name').innerText = player.name; From a94b5fded6599e14d6bc3f87112b371298df767a Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Fri, 4 Oct 2024 21:19:47 +0100 Subject: [PATCH 07/74] Code: remote game information about player and enemy is passed to the GameController. --- backend/pong/consumers.py | 93 ++++++++++++-------- backend/pong/migrations/0001_initial.py | 2 +- backend/pong/templates/pages/gameonline.html | 20 +++++ backend/static/js/game/GameController.js | 21 +++-- backend/static/js/game/MyApp.js | 16 ++-- backend/static/js/game/main.js | 38 +++++--- docker-compose.yml | 3 +- 7 files changed, 130 insertions(+), 63 deletions(-) diff --git a/backend/pong/consumers.py b/backend/pong/consumers.py index a0dc9b4..f9709be 100644 --- a/backend/pong/consumers.py +++ b/backend/pong/consumers.py @@ -6,6 +6,7 @@ from asgiref.sync import async_to_sync from channels.generic.websocket import WebsocketConsumer from channels.layers import get_channel_layer +import random class TournamentConsumer(WebsocketConsumer): @@ -51,54 +52,66 @@ def connect(self): self.accept() if len(self.queue) == 0: - user_id = self.scope['user'].id - room_name = "room_%s" % user_id - - self.queue[user_id] = { - 'ip': self.scope['client'], - 'user_id': user_id, - 'username': self.scope['user'].username, - 'room_name': room_name - } - async_to_sync(self.channel_layer.group_add)(room_name, self.channel_name) + ic('adding player to queue') + self.add_player_to_queue() else: - other_id = ic(list(self.queue.keys())[0]) - other_user = self.queue[other_id] - room_name = other_user['room_name'] - curr_user = { - 'ip': self.scope['client'], - 'user_id': self.scope['user'].id, - 'username': self.scope['user'].username, - 'room_name': room_name - } - async_to_sync(self.channel_layer.group_add)(other_user['room_name'], self.channel_name) - async_to_sync(self.channel_layer.group_send)( - room_name, {"type": "send.message", "message": json.dumps({ - 'player1': curr_user, - 'player2': other_user - })} - ) + ic('adding player to waiting room') + self.add_player_to_waiting_room() + ic(self.queue) + def add_player_to_queue(self): + """ + This will add the new player to the queue and also create a channel group + (a 'waiting room') to allow another player to join in + """ + + user_id = self.scope['user'].id + room_name = "room_%s" % user_id + + self.queue[user_id] = { + 'id': user_id, + 'username': self.scope['user'].username, + 'room_name': room_name + } + async_to_sync(self.channel_layer.group_add)(room_name, self.channel_name) + + def add_player_to_waiting_room(self): + """ + Since the queue is not empty, this means there is already at least + 1 waiting room. We add the current player to the waiting room and + send a START command to initiate the game. This also removes the + waiting room from the queue. + """ + + host_id = ic(list(self.queue.keys())[0]) + host_player = self.queue[host_id] + room_name = host_player['room_name'] + curr_player = { + 'id': self.scope['user'].id, + 'username': self.scope['user'].username, + 'room_name': room_name + } + async_to_sync(self.channel_layer.group_add)(host_player['room_name'], self.channel_name) + async_to_sync(self.channel_layer.group_send)( + room_name, {"type": "send.message", "message": json.dumps({ + 'player1': curr_player, + 'player2': host_player, + 'direction': 1 if random.randint(0, 1) == 1 else -1 + })} + ) + del self.queue[host_id] def disconnect(self, code): del self.queue[self.scope['user'].id] - ic(self.queue) return super().disconnect(code) def receive(self, text_data=None): + ic(f'{self.scope['user'].username} has sent:', json.loads(text_data)) pass def send_message(self, event): data = json.loads(event["message"]) - curr_username = self.scope['user'].username - if data['player1']['username'] == curr_username: - ic(f'Current user: {curr_username} Opponent: {data['player2']['username']}') - self.send(text_data=json.dumps({'opponent': data['player2']})) - else: - ic(f'Current user: {curr_username} Opponent: {data['player1']['username']}') - self.send(text_data=json.dumps({'opponent': data['player1']})) - - #! WAS looking it what the players were receiving. + self.send(event['message']) @@ -108,5 +121,11 @@ def send_message(self, event): # else: (available rooms) # - Pop the first available room in the queue # - Add the client to the room -# - Broadcast a message to the channel with the IPs of both +# - Broadcast a message to the channel with a starting command + +# If receive() function is triggered: +# - Create a new object with the position of the paddle of the player who sent it +# - Send position to the other player + + \ No newline at end of file diff --git a/backend/pong/migrations/0001_initial.py b/backend/pong/migrations/0001_initial.py index 22ffe36..2c2c5ef 100644 --- a/backend/pong/migrations/0001_initial.py +++ b/backend/pong/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.1 on 2024-10-03 18:03 +# Generated by Django 5.1.1 on 2024-10-04 19:39 import django.db.models.deletion from django.conf import settings diff --git a/backend/pong/templates/pages/gameonline.html b/backend/pong/templates/pages/gameonline.html index 8962230..c970603 100644 --- a/backend/pong/templates/pages/gameonline.html +++ b/backend/pong/templates/pages/gameonline.html @@ -1,6 +1,26 @@ {% extends 'navs.html' %} {% load static %} +{% block head %} + + + +{% endblock %} + + {% block main_content %} +
+
+
+
+ {% endblock %} \ No newline at end of file diff --git a/backend/static/js/game/GameController.js b/backend/static/js/game/GameController.js index 6eb4058..3477940 100644 --- a/backend/static/js/game/GameController.js +++ b/backend/static/js/game/GameController.js @@ -1,13 +1,13 @@ import * as THREE from 'three'; import { Ball } from './Ball.js'; -import { Player } from './Player.js'; import { Arena } from './Arena.js'; import { GameStats } from './GameStats.js'; import { LocalPlayer } from './LocalPlayer.js'; +import { RemotePlayer } from './RemotePlayer.js'; export class GameController extends THREE.Group { - constructor(gameType) { + constructor({ playerData, enemyData, gameType, socket }) { super(); this.gameType = gameType; @@ -18,16 +18,21 @@ export class GameController extends THREE.Group { this.enemy = null; this.stats = null; - this.init(); + this.init(playerData, enemyData); this.build(); } - async init() { + async init(playerData, enemyData) { + const { id: playerID, username: playerUsername } = playerData; + const { id: enemyID, username: enemyUsername } = enemyData; + this.arena = new Arena({}); this.ball = new Ball({}); - this.player = new LocalPlayer(1, 'Nuno', [-25, 0, 0], {'up': 'w', 'down': 's'}); + this.player = new LocalPlayer(playerID, playerUsername, [-25, 0, 0], {'up': 'w', 'down': 's'}); if (this.gameType == "Local") this.enemy = new LocalPlayer(2, 'Andreia', [25, 0, 0], {'up': 'ArrowUp', 'down': 'ArrowDown'}); + else if (this.gameType == "Remote") + this.enemy = new RemotePlayer(enemyID, enemyUsername, [25, 0, 0], {'up': 'ArrowUp', 'down': 'ArrowDown'}); this.stats = new GameStats(this.player, this.enemy); this.keybinds = { @@ -44,9 +49,9 @@ export class GameController extends THREE.Group { }); const formData = { - "user1_id": document.getElementById('game-engine').getAttribute('data-user-id'), - "user2_id": null, - "type": document.getElementById('game-engine').getAttribute('game-type') + "user1_id": this.player.id, + "user2_id": this.enemy.id, + "type": this.gameType } const response = await fetch(`/games/create`, { diff --git a/backend/static/js/game/MyApp.js b/backend/static/js/game/MyApp.js index 876d556..8b4abc5 100644 --- a/backend/static/js/game/MyApp.js +++ b/backend/static/js/game/MyApp.js @@ -26,22 +26,26 @@ export class MyApp { this.renderer = null; this.controls = null; this.gui = null; - this.arcade = null; + this.gameController = null; this.canvas = document.querySelector('#canvas-container'); - this.gameType = document.getElementById('game-engine').getAttribute('game-type'); } /** * initializes the application */ - init() { + init({playerData, enemyData, socket=null, gameType}) { this.scene = new THREE.Scene(); this.scene.background = new THREE.Color( 0x101010 ); this.scene.add(new Axis(this)); - this.arcade = new GameController(this.gameType); - this.scene.add(this.arcade); + this.gameController = new GameController({ + playerData: playerData, + enemyData: enemyData, + socket: socket, + gameType: gameType, + }); + this.scene.add(this.gameController); this.light = new THREE.PointLight('#FFFFFF', 100); this.light.position.set(0, 0, 5); @@ -145,7 +149,7 @@ export class MyApp { this.updateCameraIfRequired() this.controls.update(); - this.arcade.update(); + this.gameController.update(); this.renderer.render(this.scene, this.activeCamera); requestAnimationFrame( this.render.bind(this) ); diff --git a/backend/static/js/game/main.js b/backend/static/js/game/main.js index 98e2584..e2316c7 100644 --- a/backend/static/js/game/main.js +++ b/backend/static/js/game/main.js @@ -1,14 +1,32 @@ import { MyApp } from './MyApp.js'; -var socket = new WebSocket(`ws://${window.location.hostname}:8002/ws/games/remote/queue`); -socket.onopen = (event) => { - console.log('Socket opening', event); -}; +const gameType = document.getElementById('game-engine').getAttribute('game-type'); +const currUserId = document.getElementById('game-engine').getAttribute('data-user-id'); -socket.onmessage = (event) => { - console.log(JSON.parse(event.data)) -} +if (gameType == "Remote") { + let socket = new WebSocket(`ws://${window.location.host}/ws/games/remote/queue`); + socket.onopen = (event) => { + console.log('Socket opening', event); + }; + + socket.onmessage = (event) => { + const { player1, player2, direction } = JSON.parse(event.data); + const player = player1.id == currUserId ? player1 : player2; + const enemy = player == player1 ? player2 : player1; -let app = new MyApp() -app.init() -app.render() \ No newline at end of file + console.log(JSON.parse(event.data)); + let app = new MyApp(); + app.init({ + playerData: player, + enemyData: enemy, + socket: socket, + gameType: gameType, + }); + app.render(); + } +} +else { + let app = new MyApp(); + app.init({ gameType: gameType }); + app.render(); +} \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 4b03a59..113f1fe 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,6 +16,7 @@ services: - redis env_file: - .env + restart: on-failure postgres: container_name: postgres-container @@ -28,7 +29,7 @@ services: ports: - "5432:5432" networks: - - Transcendence + - Transcendence env_file: - .env From 52bc3d8bfad12bbc4fed9cdf95a5ef8b85bf7d87 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Fri, 4 Oct 2024 23:05:59 +0100 Subject: [PATCH 08/74] Code: remote gameplay seems to finally started working. --- backend/pong/consumers.py | 58 ++++++++++++------- backend/static/js/game/GameController.js | 71 +++++++++++++++--------- backend/static/js/game/LocalPlayer.js | 12 ++-- backend/static/js/game/Player.js | 6 +- backend/static/js/game/RemotePlayer.js | 51 ++++++++++++++++- 5 files changed, 139 insertions(+), 59 deletions(-) diff --git a/backend/pong/consumers.py b/backend/pong/consumers.py index f9709be..0cb6148 100644 --- a/backend/pong/consumers.py +++ b/backend/pong/consumers.py @@ -50,6 +50,8 @@ class RemoteGameQueueConsumer(WebsocketConsumer): def connect(self): self.accept() + self.user = self.scope['user'] + self.room_name = '' if len(self.queue) == 0: ic('adding player to queue') @@ -64,16 +66,14 @@ def add_player_to_queue(self): This will add the new player to the queue and also create a channel group (a 'waiting room') to allow another player to join in """ + self.room_name = "room_%s" % self.user.id - user_id = self.scope['user'].id - room_name = "room_%s" % user_id - - self.queue[user_id] = { - 'id': user_id, + self.queue[self.user.id] = { + 'id': self.user.id, 'username': self.scope['user'].username, - 'room_name': room_name + 'room_name': self.room_name } - async_to_sync(self.channel_layer.group_add)(room_name, self.channel_name) + async_to_sync(self.channel_layer.group_add)(self.room_name, self.channel_name) def add_player_to_waiting_room(self): """ @@ -83,35 +83,51 @@ def add_player_to_waiting_room(self): waiting room from the queue. """ - host_id = ic(list(self.queue.keys())[0]) + host_id = list(self.queue.keys())[0] host_player = self.queue[host_id] - room_name = host_player['room_name'] + self.room_name = host_player['room_name'] curr_player = { - 'id': self.scope['user'].id, + 'id': self.user.id, 'username': self.scope['user'].username, - 'room_name': room_name + 'room_name': self.room_name } + async_to_sync(self.channel_layer.group_add)(host_player['room_name'], self.channel_name) async_to_sync(self.channel_layer.group_send)( - room_name, {"type": "send.message", "message": json.dumps({ - 'player1': curr_player, - 'player2': host_player, - 'direction': 1 if random.randint(0, 1) == 1 else -1 - })} + self.room_name, { + "type": "send.start.game.message", + "message": json.dumps({ + 'player1': curr_player, + 'player2': host_player, + 'direction': 1 if random.randint(0, 1) == 1 else -1 + }) + } ) del self.queue[host_id] def disconnect(self, code): - del self.queue[self.scope['user'].id] + del self.queue[self.user.id] return super().disconnect(code) def receive(self, text_data=None): - ic(f'{self.scope['user'].username} has sent:', json.loads(text_data)) - pass + async_to_sync(self.channel_layer.group_send)( + self.room_name, { + "type": "send.update.paddle.message", + "message": text_data + } + ) - def send_message(self, event): - data = json.loads(event["message"]) + def send_start_game_message(self, event): self.send(event['message']) + + def send_update_paddle_message(self, event): + data = json.loads(event['message']) + ic(data) + if data['id'] != self.user.id: + self.send(event['message']) + + + diff --git a/backend/static/js/game/GameController.js b/backend/static/js/game/GameController.js index 3477940..853c571 100644 --- a/backend/static/js/game/GameController.js +++ b/backend/static/js/game/GameController.js @@ -18,36 +18,41 @@ export class GameController extends THREE.Group { this.enemy = null; this.stats = null; - this.init(playerData, enemyData); + this.createPlayers(playerData, enemyData, socket); + this.createGameInstance(); + this.registerKeybinds(); this.build(); } - async init(playerData, enemyData) { + createPlayers(playerData, enemyData, socket) { const { id: playerID, username: playerUsername } = playerData; const { id: enemyID, username: enemyUsername } = enemyData; this.arena = new Arena({}); this.ball = new Ball({}); - this.player = new LocalPlayer(playerID, playerUsername, [-25, 0, 0], {'up': 'w', 'down': 's'}); - if (this.gameType == "Local") - this.enemy = new LocalPlayer(2, 'Andreia', [25, 0, 0], {'up': 'ArrowUp', 'down': 'ArrowDown'}); - else if (this.gameType == "Remote") - this.enemy = new RemotePlayer(enemyID, enemyUsername, [25, 0, 0], {'up': 'ArrowUp', 'down': 'ArrowDown'}); - this.stats = new GameStats(this.player, this.enemy); - this.keybinds = { - 'w': false, 's': false, - 'ArrowUp': false, 'ArrowDown': false - }; - document.addEventListener('keydown', (event) => { - if (event.key in this.keybinds) - this.keybinds[event.key] = true; - }); - document.addEventListener('keyup', (event) => { - if (event.key in this.keybinds) - this.keybinds[event.key] = false; - }); + if (this.gameType == "Local") { + this.player = new LocalPlayer({ id: playerID, username: playerUsername, + position: [-25, 0, 0], keybinds: {'up': 'w', 'down': 's'} + }); + this.enemy = new LocalPlayer({ + position: [25, 0, 0], keybinds: {'up': 'ArrowUp', 'down': 'ArrowDown'} + }); + } + else if (this.gameType == "Remote") { + this.player = new RemotePlayer({ id: playerID, username: playerUsername, + position: [-25, 0, 0], socket: socket, keybinds: {'up': 'w', 'down': 's'} + }); + console.log(this.player); + this.enemy = new RemotePlayer({ id: enemyID, username: enemyUsername, + position: [25, 0, 0], socket: socket, isEnemy: true + }); + console.log(this.enemy ); + } + this.stats = new GameStats(this.player, this.enemy); + } + async createGameInstance() { const formData = { "user1_id": this.player.id, "user2_id": this.enemy.id, @@ -62,11 +67,25 @@ export class GameController extends THREE.Group { } }); - const data = await response.json(); - console.log(data); - this.stats.gameId = data.id; - console.log(this.stats.gameId); + const gameData = await response.json(); + this.stats.gameId = gameData.id; + console.log(gameData); + } + + registerKeybinds() { + this.keybinds = { + 'w': false, 's': false, + 'ArrowUp': false, 'ArrowDown': false + }; + document.addEventListener('keydown', (event) => { + if (event.key in this.keybinds) + this.keybinds[event.key] = true; + }); + document.addEventListener('keyup', (event) => { + if (event.key in this.keybinds) + this.keybinds[event.key] = false; + }); } build() { @@ -77,8 +96,8 @@ export class GameController extends THREE.Group { } update() { - this.player.update(this.keybinds, this.arena.semiHeight); - this.enemy.update(this.keybinds, this.arena.semiHeight); + this.player.update(this.keybinds); + this.enemy.update(this.keybinds); if (this.ball == null) return ; diff --git a/backend/static/js/game/LocalPlayer.js b/backend/static/js/game/LocalPlayer.js index eb3db12..5aa64d2 100644 --- a/backend/static/js/game/LocalPlayer.js +++ b/backend/static/js/game/LocalPlayer.js @@ -1,26 +1,26 @@ import { Player } from './Player.js'; -import { PADDLE_SEMI_HEIGHT, PADDLE_SPEED } from './macros.js'; +import { PADDLE_SEMI_HEIGHT, PADDLE_SPEED, ARENA_SEMI_HEIGHT } from './macros.js'; export class LocalPlayer extends Player { - constructor (id, username, position, controls) { - super(id, username, position, controls); + constructor ({id=0, username='Local Player', position, keybinds}) { + super(id, username, position, keybinds); } - update(pressedKeys, arenaSemiHeight) { + update(pressedKeys) { const targetPos = this.paddle.position.clone(); const { up: upKey, down: downKey } = this.controls; if (pressedKeys[upKey]) { this.paddle.position.y = Math.min( this.paddle.position.y + PADDLE_SPEED, - arenaSemiHeight - PADDLE_SEMI_HEIGHT + ARENA_SEMI_HEIGHT - PADDLE_SEMI_HEIGHT ); } if (pressedKeys[downKey]){ this.paddle.position.y = Math.max( this.paddle.position.y - PADDLE_SPEED, - -(arenaSemiHeight - PADDLE_SEMI_HEIGHT) + -(ARENA_SEMI_HEIGHT - PADDLE_SEMI_HEIGHT) ); } this.paddle.position.lerp(targetPos, 0.5); diff --git a/backend/static/js/game/Player.js b/backend/static/js/game/Player.js index cdc9ba2..d87416e 100644 --- a/backend/static/js/game/Player.js +++ b/backend/static/js/game/Player.js @@ -1,10 +1,10 @@ import * as THREE from 'three'; import { PADDLE_SEMI_HEIGHT, PADDLE_SEMI_LENGTH, PADDLE_SPEED } from './macros.js'; export class Player { - constructor (id, username, position, controls) { + constructor (id, username, position, keybinds) { this.id = id this.username = username; - this.controls = controls; + this.keybinds = keybinds; this.paddle = null; this.build(); @@ -22,5 +22,5 @@ export class Player { ); } - update(pressedKeys, arenaSemiHeight) {} + update(pressedKeys) {} } \ No newline at end of file diff --git a/backend/static/js/game/RemotePlayer.js b/backend/static/js/game/RemotePlayer.js index 44c0128..5ab56bc 100644 --- a/backend/static/js/game/RemotePlayer.js +++ b/backend/static/js/game/RemotePlayer.js @@ -1,11 +1,56 @@ import { Player } from './Player.js'; +import { PADDLE_SEMI_HEIGHT, ARENA_SEMI_HEIGHT, PADDLE_SPEED } from './macros.js'; export class RemotePlayer extends Player { - constructor (id, username, position, controls) { - super(id, username, position, controls); + constructor ({ id, username, position, keybinds=null, socket, isEnemy=false }) { + super(id, username, position, keybinds); + this.socket = socket; + this.isEnemy = isEnemy; + if (isEnemy) + this.socket.onmessage = (event) => { + console.log(event); + const newY = JSON.parse(event.data).paddle.position.y; + this.paddle.position.y = newY; + } + + this.socket.onerror = (event) => { + console.log(event); + } } - update(pressedKeys, arenaSemiHeight) { + update(pressedKeys) { + if (this.isEnemy) + return ; + + const targetPos = this.paddle.position.clone(); + const { up: upKey, down: downKey } = this.keybinds; + + if (pressedKeys[upKey]) { + targetPos.y = Math.min( + this.paddle.position.y + PADDLE_SPEED, + ARENA_SEMI_HEIGHT - PADDLE_SEMI_HEIGHT + ); + } + + if (pressedKeys[downKey]){ + targetPos.y = Math.max( + this.paddle.position.y - PADDLE_SPEED, + -(ARENA_SEMI_HEIGHT - PADDLE_SEMI_HEIGHT) + ); + } + if (pressedKeys[upKey] || pressedKeys[downKey]) { + this.paddle.position.lerp(targetPos, 0.5); + this.socket.send(JSON.stringify({ + 'id': this.id, + 'paddle': { + 'position': { + 'y': targetPos.y + } + } + })); + } } + + } \ No newline at end of file From 337612204dd817d01e4e21c8cb2bfb810d9bb490 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Fri, 4 Oct 2024 23:18:35 +0100 Subject: [PATCH 09/74] Fix: fixed wrong ID being sent on the enemy field when creating a Local game. --- backend/pong/templates/pages/gamelocal.html | 2 +- backend/pong/templates/pages/gameonline.html | 2 +- backend/static/js/game/GameController.js | 10 ++++----- backend/static/js/game/LocalPlayer.js | 4 ++-- backend/static/js/game/index.html | 22 -------------------- backend/static/js/game/main.js | 15 ++++++------- 6 files changed, 17 insertions(+), 38 deletions(-) delete mode 100644 backend/static/js/game/index.html diff --git a/backend/pong/templates/pages/gamelocal.html b/backend/pong/templates/pages/gamelocal.html index be85113..a402b4f 100644 --- a/backend/pong/templates/pages/gamelocal.html +++ b/backend/pong/templates/pages/gamelocal.html @@ -22,5 +22,5 @@
+ data-user-id="{{ user.id }}" data-username="{{ user.username }}" game-type="Local"> {% endblock %} \ No newline at end of file diff --git a/backend/pong/templates/pages/gameonline.html b/backend/pong/templates/pages/gameonline.html index c970603..2b3714b 100644 --- a/backend/pong/templates/pages/gameonline.html +++ b/backend/pong/templates/pages/gameonline.html @@ -22,5 +22,5 @@
+ data-user-id="{{ user.id }}" data-username="{{ user.username }}" game-type="Remote"> {% endblock %} \ No newline at end of file diff --git a/backend/static/js/game/GameController.js b/backend/static/js/game/GameController.js index 853c571..a2bdc34 100644 --- a/backend/static/js/game/GameController.js +++ b/backend/static/js/game/GameController.js @@ -27,9 +27,6 @@ export class GameController extends THREE.Group { createPlayers(playerData, enemyData, socket) { const { id: playerID, username: playerUsername } = playerData; const { id: enemyID, username: enemyUsername } = enemyData; - - this.arena = new Arena({}); - this.ball = new Ball({}); if (this.gameType == "Local") { this.player = new LocalPlayer({ id: playerID, username: playerUsername, @@ -49,6 +46,8 @@ export class GameController extends THREE.Group { }); console.log(this.enemy ); } + this.arena = new Arena({}); + this.ball = new Ball({}); this.stats = new GameStats(this.player, this.enemy); } @@ -59,6 +58,8 @@ export class GameController extends THREE.Group { "type": this.gameType } + console.log(formData); + const response = await fetch(`/games/create`, { method: 'POST', body: JSON.stringify(formData), @@ -106,8 +107,7 @@ export class GameController extends THREE.Group { this.stats.registerGoal(scorer, this.ball); this.ball.reset(); } - if (this.stats.winner != null) - { + if (this.stats.winner != null) { this.remove(this.ball); this.ball.dispose(); this.ball = null; diff --git a/backend/static/js/game/LocalPlayer.js b/backend/static/js/game/LocalPlayer.js index 5aa64d2..2dbfdb5 100644 --- a/backend/static/js/game/LocalPlayer.js +++ b/backend/static/js/game/LocalPlayer.js @@ -2,13 +2,13 @@ import { Player } from './Player.js'; import { PADDLE_SEMI_HEIGHT, PADDLE_SPEED, ARENA_SEMI_HEIGHT } from './macros.js'; export class LocalPlayer extends Player { - constructor ({id=0, username='Local Player', position, keybinds}) { + constructor ({id=null, username='Local Player', position, keybinds}) { super(id, username, position, keybinds); } update(pressedKeys) { const targetPos = this.paddle.position.clone(); - const { up: upKey, down: downKey } = this.controls; + const { up: upKey, down: downKey } = this.keybinds; if (pressedKeys[upKey]) { this.paddle.position.y = Math.min( diff --git a/backend/static/js/game/index.html b/backend/static/js/game/index.html deleted file mode 100644 index 72e73ae..0000000 --- a/backend/static/js/game/index.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - -
-
-
-
- - - diff --git a/backend/static/js/game/main.js b/backend/static/js/game/main.js index e2316c7..39ff9cd 100644 --- a/backend/static/js/game/main.js +++ b/backend/static/js/game/main.js @@ -1,17 +1,14 @@ import { MyApp } from './MyApp.js'; const gameType = document.getElementById('game-engine').getAttribute('game-type'); -const currUserId = document.getElementById('game-engine').getAttribute('data-user-id'); +const userID = document.getElementById('game-engine').getAttribute('data-user-id'); +const username = document.getElementById('game-engine').getAttribute('data-username'); if (gameType == "Remote") { let socket = new WebSocket(`ws://${window.location.host}/ws/games/remote/queue`); - socket.onopen = (event) => { - console.log('Socket opening', event); - }; - socket.onmessage = (event) => { const { player1, player2, direction } = JSON.parse(event.data); - const player = player1.id == currUserId ? player1 : player2; + const player = player1.id == userID ? player1 : player2; const enemy = player == player1 ? player2 : player1; console.log(JSON.parse(event.data)); @@ -27,6 +24,10 @@ if (gameType == "Remote") { } else { let app = new MyApp(); - app.init({ gameType: gameType }); + app.init({ + playerData: {'id': userID, 'username': username}, + enemyData: {'id': '', 'username': ''}, + gameType: gameType + }); app.render(); } \ No newline at end of file From 45cc62fac757a8f60ca2a02015fb5ad8d4196a1f Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Fri, 4 Oct 2024 23:47:20 +0100 Subject: [PATCH 10/74] Code: attempted to stop the requestAnimationFrame handler, but unsuccessful. --- backend/pong/templates/pages/gameonline.html | 1 + backend/static/js/game/MyApp.js | 20 ++++++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/backend/pong/templates/pages/gameonline.html b/backend/pong/templates/pages/gameonline.html index 2b3714b..bd8e162 100644 --- a/backend/pong/templates/pages/gameonline.html +++ b/backend/pong/templates/pages/gameonline.html @@ -4,6 +4,7 @@ {% block head %} +
-
+

{{ tournament_name }} Name

This tournament is over.

-
-
+
+

Leaderboard

Placement User - Score + Score
- {% for id in user_id %} + + +
+ 1st + + + + Profile + username + + + 270 +
+
+ 1st + + + + Profile + username + + + 270 +
+ +
{% if tournament_size == 4 %} -
+

Group A

@@ -136,7 +165,7 @@

Group B

{% elif tournament_size == 8 %}
-
+

Group A

@@ -263,7 +292,7 @@

Group B

-
+

Group C

diff --git a/backend/pong/views.py b/backend/pong/views.py index 4f311d0..758e194 100644 --- a/backend/pong/views.py +++ b/backend/pong/views.py @@ -1102,7 +1102,7 @@ def ongoingtournaments(request, tournament_id): def tournamentstats(request, tournament_id): context = { 'tournament_id': tournament_id, - 'tournament_size': 8 + 'tournament_size': 4 } return render(request,'pages/tournament_overview.html', context) diff --git a/backend/static/css/game-stats.css b/backend/static/css/game-stats.css new file mode 100644 index 0000000..af40535 --- /dev/null +++ b/backend/static/css/game-stats.css @@ -0,0 +1,158 @@ +#main-wrapper { + display: flex; + width: 100%; + gap: 20px; +} + +.profile-head { + color: #FFFFFF; + height: 20%; +} + +.stats2 { + flex-direction: column; + width: 100%; + height: 100%; + +} + +.percentages { + margin-bottom: 20px; +} + +.stats-head { + flex-direction: column; + width: 50%; + height: 100%; + margin: 5px; + +} + +.two-joined { + height: 50%; +} +.stat { + text-align: center; + padding: 10px; + width: 49%; + border-radius: 8px; + background-color: #ffffff0C; + border: 1px solid #ffffff2a; + +} + +.donut { + border-radius: 8px; + background-color: #ffffff0C; + border: 1px solid #ffffff2a; + flex-direction: column; + width: 50%; + height: 100%; + margin: 5px; + +} + +.profile-foot { + width: 100%; + height: 60%; + margin-top: 10px; +} + +.bar-graphs { + border-radius: 8px; + background-color: #ffffff0C; + border: 1px solid #ffffff2a; + width: 56%; + height: 100%; + margin: 5px; +} + +.records { + margin: 5px; + border-radius: 8px; + background-color: #ffffff0C; + border: 1px solid #ffffff2a; + height: 100%; + +} + +.record-info { + width: 100%; + padding: 20px; + padding-bottom: 5px; +} + +.record-info-tit { + height: 35px; + text-align: left; + padding-left: 5px; + +} + +.img-tit { + flex-direction: row; +} + +.img-tit img { + width: 25px; + height: 25px; +} + +.record-tit { + color: #FFFFFF; + font-size: small; + margin-bottom: 0; +} + +.record-date { + color: #ffffff83; + font-size: x-small; + +} + +.stats-title { + color: #c3c3c3bb; + font-size: x-small; +} + +.stat .winr { + font-size: larger !important; +} +.icon-stat { + height: 30px; + width: 30px; +} + +.graph-title { + align-self: flex-start; + padding: 20px; + font-size: x-large; +} + +.winr, .graph-value { + font-weight: bold; + color: #F8D082; +} + +.numbers-stat{ + flex-direction: column; +} + +.numbers-stat h4 { + margin: 0; +} + +.graph-img { + max-width: 50%; + max-height: 50%; +} + +.averages { + width: 28%; + height: 100%; +} + +.performance { + width: 16%; + height: 100%; +} \ No newline at end of file diff --git a/backend/static/css/tourn-overview.css b/backend/static/css/tourn-overview.css index 6e13bb3..028a8c7 100644 --- a/backend/static/css/tourn-overview.css +++ b/backend/static/css/tourn-overview.css @@ -6,6 +6,53 @@ } +.leaderboard { + color: white; + /*position: relative;*/ + width: 400px; + text-align: left; + margin: 50px; + align-self: normal; + +} + +.header .title { + color: #f2f2f269; + width: 33%; + text-align: left; + white-space: nowrap; + text-overflow: ellipsis; + height: 30px; + position: relative; + display: flex; + align-items: center; + overflow: hidden; + +} + +.details { + border-radius: 8px; + flex: 1; + height: 64px; + z-index: 100; + background-color: #28313a; + color: #FFF; + border: 1px solid #ffffff2a; + margin-bottom: 8px; +} + +.details .content { + width: 33%; + text-align: left; + white-space: nowrap; + text-overflow: ellipsis; + height: 40px; + position: relative; + display: flex; + align-items: center; + overflow: hidden; +} + .tourn-info { position: absolute; left: 50%; From d42f2b815b0d83d0ec2b196ac3fb5b684b56f889 Mon Sep 17 00:00:00 2001 From: Xyckens Date: Tue, 8 Oct 2024 00:22:10 +0100 Subject: [PATCH 14/74] game stats --- backend/pong/templates/pages/game_stats.html | 147 ++++++++++++++----- backend/static/assets/icons/ball-speed.png | Bin 0 -> 1411 bytes backend/static/assets/icons/rally-len.png | Bin 0 -> 1249 bytes backend/static/css/game-stats.css | 92 +++++++----- backend/static/js/game-stats.js | 43 ++++++ 5 files changed, 213 insertions(+), 69 deletions(-) create mode 100644 backend/static/assets/icons/ball-speed.png create mode 100644 backend/static/assets/icons/rally-len.png create mode 100644 backend/static/js/game-stats.js diff --git a/backend/pong/templates/pages/game_stats.html b/backend/pong/templates/pages/game_stats.html index 2ace107..20628a1 100644 --- a/backend/pong/templates/pages/game_stats.html +++ b/backend/pong/templates/pages/game_stats.html @@ -4,6 +4,7 @@ {% block main_content %} +
@@ -27,50 +28,124 @@
Score History
Ainda nao tenho isto
-
-
Maximum Ball Speed
-
-
- Max Speed -
- -
01/01/1111
-
+
+
Rally Length per Goal
+
+
+
40
+ 1 +
+
+
20
+ 2 +
+
+
5
+ 3 +
+
+
44
+ 4 +
+
+
57
+ 5 +
+
+
11
+ 6 +
+
+
64
+ 7 +
+
+
90
+ 8 +
+
+
0
+ 9
-
{{ stats.max_ball_speed }}
-
-
- Max Speed -
-
Maximum Rally Length
-
01/01/1111
-
+
+
+ +
-
{{ stats.max_rally_length }}
+
+
5
+ Min +
+
+
43
+ Average +
+
+
90
+ Max +
+
-
-
Maximum Ball Speed
-
-
- Max Speed -
- -
01/01/1111
-
+
+
Ball Speed per Goal
+
+
+
40
+ 1 +
+
+
20
+ 2 +
+
+
5
+ 3 +
+
+
44
+ 4 +
+
+
57
+ 5 +
+
+
11
+ 6 +
+
+
64
+ 7 +
+
+
90
+ 8 +
+
+
0
+ 9
-
{{ stats.max_ball_speed }}
-
-
- Max Speed -
-
Maximum Rally Length
-
01/01/1111
-
+
+
+ +
-
{{ stats.max_rally_length }}
+
+
5
+ Min +
+
+
43
+ Average +
+
+
90
+ Max +
+
diff --git a/backend/static/assets/icons/ball-speed.png b/backend/static/assets/icons/ball-speed.png new file mode 100644 index 0000000000000000000000000000000000000000..e1350b2ce91aa1da44ae467bacd9e68f1a6ed106 GIT binary patch literal 1411 zcmV-}1$_F6P)eWEhyVZp00000000000000000000 z0KiYBk6s~R7zX?k=x(*IukQG?7QL|4^Pg_GnLxFqz@$r$8z}M@p*HFNs1|lkN1|uUQ-<`X=yQ2iyBTsl0 zmPM5=RUq3@VQ+75r5{T%*(6VR6LxoZw?J)Ts)%}VaX~RK90op-C%g&E51n`S@9*!Q zrMbGgqU-Bx>H)*HKpycXEPG_m-EZZcXJ=<&Bn&Ynx2=CAT~TaOx!i2fq{YAac%(V;o*U9Zf?x< z^z@&U5_}0;ZFcbB;DBalXTOQo4CyV1xv+;;Szxa*HHw!|u&}UTsEN4JfEi=DdN~kL z*%oGIW(=hWpN&`3t`Jvg+TY*r^aWv$J#~&lKCXse7vZ{rz(qQc{W6SK7tJ#kE!;p&cB9 z|4Or{g7@#SEN+400Pu$?p@H;*KI4y#H;!%Ynduo+l z0jZo~Bn=x2Toac&|7Ll4*$@B#000000K8UWy?N>UQ~Uba(IN|-q*k`G0Cj@!DerGI zNh^7;=&lTB@6k_y|F^(D@A&_E9_ooZG-GE?8@512lfk?nz0bSf0z}|vBZ-<ToaqbJ{#(d1#BmJNJO>6-0%7P26cx#V8)$);M4>; zCJQ*$o&4AIJ_7!ckqM~@b8IE2KvwlS!x{`D5b0mK&dc_u0SYJ1GqT4HSuG#(eN+O|vO&%m5 z^&IxBqBd+&^460Lb&2Fd^{|qox~CPWF?GnTveIbUAs$KlCTuK8dP_B}zJ-rfDI`5- zXMD@Oex(FSLfERtFvB-hE~%Y)djX*YOCZM>T=4udVJMscw}V3I7!_63e=bjE5A~>(l}M+ zUTkdUZSm~DX>2pjHLFhAx8xHiw%RyY(yArriq0{+oz>V@ablv4qxneQD|)=FcA{e2 z7+7&)d?j=iaX9~HueGr`>s(iH8?VSUTXAFTi=rahhss2b2hM&Fwpi4m=Yq(w?;684 z{~ff+Gt=&Ve@VgwTJ4u6l`9iFz>vpj@Bjb+0000000000000000002e#{ZXwF4xbl R8m|BV002ovPDHLkV1nWMhnoNZ literal 0 HcmV?d00001 diff --git a/backend/static/assets/icons/rally-len.png b/backend/static/assets/icons/rally-len.png new file mode 100644 index 0000000000000000000000000000000000000000..70450524ff91fcf7de5c9d7db49414f494a1f041 GIT binary patch literal 1249 zcmV<71Rnc|P)-ei8ZzN~}$Aj#211bPu`$ z{SEaxi24Hz{7>j1G+}Lk`kVph(s~|2f7mdBfqxB^p--$0Q2(p6F_&#v!Qfx;&#llq z)&i*a?K;L@w_yebZ18pQG_<8)b=Kbu-DzO#KQ_#`u_vLUyrC7S_ck;SeG2^m-Hl9L zgx)k!92obboA|q@UxRi)+lF>W&XpV7Bd1W!w6Vc0J?yoTck>l9mrE<)!`6sOr5sr9o(VB7>$33qia3(#KZ zue1Y?ze5YmJK}fy&piD)bjkO+h4;C_fq9#t(KUJRLm!xEA1(#Zt0p=J4fSo;sX=*y z8l*ewHUGS2LWp6+e+T#<`gc%nV1u&8ZiIF~DU|!CM3DnT>U&Vhgb+dqA%qY@tN~9; z+o4@ideQ~}^m8}+ZY{E*NZ~Yl8!+f#&PUAM(5@)G-wJ>>#-V-IW!%V3Q5FNBH^y3K z&~MNl=mfO5rZe4OtFr58ZrmqGXw|6=wM0_#V{(%Q~F5 z0}Bvu8mv=_%*X@Vh$DO{N1emav`-qotFU66b%B=tL7)L#r*O!1=T~R~T0s5`zYkM1 z2eX!45T2`I`3Yu>6*Q(|*)D|~E_fje(av8pG?Z%)r*93K^eM`l8K-v~K_iUnFr`?I zgJL?mKzo|BRf^YXUO=QPI6R0?&XUnAJ9*kxu4LJAz&`Fo-4WCY%TLX+*|QwwwMU5H!v^E6t!`vp&5TsWj?i?>w1>raWD<%)oIP>e0sOIoTw7*2^EWEc)0cU*im> z*1XNYeAH*YN*^MeO9^)l=0+ literal 0 HcmV?d00001 diff --git a/backend/static/css/game-stats.css b/backend/static/css/game-stats.css index af40535..af32573 100644 --- a/backend/static/css/game-stats.css +++ b/backend/static/css/game-stats.css @@ -20,37 +20,6 @@ margin-bottom: 20px; } -.stats-head { - flex-direction: column; - width: 50%; - height: 100%; - margin: 5px; - -} - -.two-joined { - height: 50%; -} -.stat { - text-align: center; - padding: 10px; - width: 49%; - border-radius: 8px; - background-color: #ffffff0C; - border: 1px solid #ffffff2a; - -} - -.donut { - border-radius: 8px; - background-color: #ffffff0C; - border: 1px solid #ffffff2a; - flex-direction: column; - width: 50%; - height: 100%; - margin: 5px; - -} .profile-foot { width: 100%; @@ -124,9 +93,8 @@ } .graph-title { - align-self: flex-start; - padding: 20px; font-size: x-large; + color: #fff; } .winr, .graph-value { @@ -150,9 +118,67 @@ .averages { width: 28%; height: 100%; + min-width: 320px; } .performance { width: 16%; height: 100%; +} + +.records-title { + font-size: large; + color: #fff; +} + +.rally-len, .ball-speed { + /*background: url('../assets/images/rally-len.png') no-repeat;*/ + background: linear-gradient(to right, #ffffff00, #f8d18218); + background-size: cover; /* Make the image cover the entire div */ + width: 90%; + border-radius: 8px; + border: 1px solid #ffffff2a; +} + +.grey-line { + width: 2px; + height: 50px; + background-color: #ffffff5d; + border-radius: 8px; +} + +.rally-len div, .ball-speed div { + width: 88px; + color: #FFFFFF; +} + +.rally-len div h6, .ball-speed div h6 { + margin-bottom: 0; + font-size: x-large; +} + +.rally-len div span, .ball-speed div span { + font-size: smaller; +} + +.squares { + color: #FFFFFF; + width: 65%; + min-width: 270px; + padding-bottom: 20px; +} + +.square-length, .square-speed { + width: 25px; + height: 25px; + background-color: #FFFFFF; + border-radius: 3px; + color: #836938; + font-weight: bold; + margin-bottom: 3px; + +} + +.squares span { + font-size: smaller; } \ No newline at end of file diff --git a/backend/static/js/game-stats.js b/backend/static/js/game-stats.js new file mode 100644 index 0000000..1a12be9 --- /dev/null +++ b/backend/static/js/game-stats.js @@ -0,0 +1,43 @@ +function interpolateColor(startColor, endColor, factor) { + const result = startColor.slice(); // Create a copy of the start color + for (let i = 0; i < 3; i++) { + // Interpolate each color component (R, G, B) + result[i] = Math.round(result[i] + factor * (endColor[i] - startColor[i])); + } + return result; +} + +// Convert RGB array to hex color string +function rgbToHex(rgb) { + return `#${rgb.map(x => x.toString(16).padStart(2, '0')).join('')}`; +} + +// Main function to apply the background color to all divs with class 'square' +function applyGradientToSquares() { + const squares1 = document.querySelectorAll('.square-length'); // Select all divs with class 'square' + const squares2 = document.querySelectorAll('.square-speed'); // Select all divs with class 'square' + const startColor = [255, 255, 255]; // RGB for #FFFFFF (white) + const endColor = [253, 180, 39]; // RGB for #F8D082 (light orange) + + squares1.forEach(square => { + const value = parseInt(square.textContent); // Get the text inside the div and convert to integer + const factor = value / 100; // Calculate the interpolation factor (0 to 1) + + const interpolatedColor = interpolateColor(startColor, endColor, factor); // Get the interpolated color + const hexColor = rgbToHex(interpolatedColor); // Convert the RGB color to hex format + + square.style.backgroundColor = hexColor; // Apply the background color to the div + }); + squares2.forEach(square => { + const value = parseInt(square.textContent); // Get the text inside the div and convert to integer + const factor = value / 100; // Calculate the interpolation factor (0 to 1) + + const interpolatedColor = interpolateColor(startColor, endColor, factor); // Get the interpolated color + const hexColor = rgbToHex(interpolatedColor); // Convert the RGB color to hex format + + square.style.backgroundColor = hexColor; // Apply the background color to the div + }); +} + +// Call the function to apply the background gradient on page load +applyGradientToSquares(); \ No newline at end of file From 3349d4c0e5d67412b3470c471e1d904d5417270a Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Tue, 8 Oct 2024 09:47:40 +0100 Subject: [PATCH 15/74] Code: locked frame rate to ~60 FPS to prevent different animation speeds on different monitors. --- backend/static/js/game/MyApp.js | 32 +++++++++++++++++--------------- backend/static/js/game/macros.js | 3 +++ 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/backend/static/js/game/MyApp.js b/backend/static/js/game/MyApp.js index 869589c..d0aad24 100644 --- a/backend/static/js/game/MyApp.js +++ b/backend/static/js/game/MyApp.js @@ -5,9 +5,11 @@ import Stats from 'three/addons/libs/stats.module.js' import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; import { Axis } from './Axis.js'; import { GameController } from './GameController.js'; +import { REFRESH_RATE } from './macros.js'; var frameID; +var timeoutID; /** * This class contains the application object */ @@ -147,24 +149,24 @@ export class MyApp { * the main render function. Called in a requestAnimationFrame loop */ render () { - this.stats.begin(); - this.updateCameraIfRequired() - - this.controls.update(); - this.gameController.update(); - this.renderer.render(this.scene, this.activeCamera); - - frameID = requestAnimationFrame( this.render.bind(this) ); - - this.lastCameraName = this.activeCameraName - this.stats.end(); + const updateCallback = (() => { + this.stats.begin(); + this.updateCameraIfRequired(); + + this.controls.update(); + this.gameController.update(); + this.renderer.render(this.scene, this.activeCamera); + + frameID = requestAnimationFrame( this.render.bind(this) ); + + this.lastCameraName = this.activeCameraName; + this.stats.end(); + }).bind(this); + + timeoutID = setTimeout(updateCallback, REFRESH_RATE); } } -window.addEventListener('beforeunload', () => { - cancelAnimationFrame(frameID); - }); - window.addEventListener('popstate', function(event) { var r = confirm("You're about to leave the game! Are you sure?!"); diff --git a/backend/static/js/game/macros.js b/backend/static/js/game/macros.js index efff222..a0faa4e 100644 --- a/backend/static/js/game/macros.js +++ b/backend/static/js/game/macros.js @@ -13,6 +13,9 @@ export const ARENA_SEMI_DEPTH = 0.25; export const MAX_GOALS = 5; +export const FPS = 75; +export const REFRESH_RATE = 1000 / FPS; + //! DEPENDENCY INJECTION TESTING export var TEST_GOALS = [ From 04da2c34ac0b1abd794c284bd55f7e76fcaeff79 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Tue, 8 Oct 2024 10:27:11 +0100 Subject: [PATCH 16/74] Code: adjusted the ball logic to depend on the direction. The server now sets the starting direction for the ball. --- backend/pong/consumers.py | 5 ++++- backend/static/js/game/Ball.js | 27 +++++++++++++----------- backend/static/js/game/GameController.js | 20 ++++++++++-------- backend/static/js/game/MyApp.js | 23 +++++++++----------- backend/static/js/game/macros.js | 11 ++++++++-- backend/static/js/game/main.js | 23 +++++++++++++++----- 6 files changed, 67 insertions(+), 42 deletions(-) diff --git a/backend/pong/consumers.py b/backend/pong/consumers.py index 0cb6148..ef339fa 100644 --- a/backend/pong/consumers.py +++ b/backend/pong/consumers.py @@ -99,7 +99,10 @@ def add_player_to_waiting_room(self): "message": json.dumps({ 'player1': curr_player, 'player2': host_player, - 'direction': 1 if random.randint(0, 1) == 1 else -1 + 'direction': { + 'x': 1 if random.randint(0, 1) == 1 else -1, + 'y': 1 if random.randint(0, 1) == 1 else -1 + } }) } ) diff --git a/backend/static/js/game/Ball.js b/backend/static/js/game/Ball.js index a4f35bd..7a0f1e1 100644 --- a/backend/static/js/game/Ball.js +++ b/backend/static/js/game/Ball.js @@ -1,13 +1,14 @@ import * as THREE from 'three'; -import { BALL_SPEED_FACTOR, BALL_START_SPEED, BALL_RADIUS, - PADDLE_SEMI_HEIGHT, PADDLE_SEMI_LENGTH } from './macros.js'; +import { BALL_SPEEDUP_FACTOR, BALL_START_SPEED, BALL_RADIUS, + PADDLE_SEMI_HEIGHT, PADDLE_SEMI_LENGTH, DIRECTION } from './macros.js'; export class Ball extends THREE.Object3D { - constructor ({ radius, color, speed }) { + constructor ({ radius, color, speed, direction }) { super(); this.radius = radius || BALL_RADIUS; - this.speed = speed || {'x': BALL_START_SPEED.x, 'y': BALL_START_SPEED.y}; + this.speed = { 'x': BALL_START_SPEED, 'y': BALL_START_SPEED }; + this.direction = direction || { 'x': DIRECTION.LEFT, 'y': DIRECTION.UP } this.rally = 0; this.ball = null; this.build(); @@ -26,8 +27,8 @@ export class Ball extends THREE.Object3D { move(arcade) { const { arena, player, enemy } = arcade; - this.position.x += this.speed.x; - this.position.y += this.speed.y; + this.position.x += this.direction.x * this.speed.x; + this.position.y += this.direction.y * this.speed.y; this.collideWithVerticalBounds(arena); this.collideWithPaddle(player.paddle, true); @@ -49,9 +50,9 @@ export class Ball extends THREE.Object3D { const { upperBoundary, lowerBoundary } = arena; if (this.position.y + this.radius >= upperBoundary.position.y) - this.speed.y = -Math.abs(this.speed.y); + this.direction.y = DIRECTION.DOWN; else if (this.position.y - this.radius <= lowerBoundary.position.y) - this.speed.y = Math.abs(this.speed.y); + this.direction.y = DIRECTION.UP; } collideWithPaddle(paddle, isPlayer){ @@ -87,11 +88,13 @@ export class Ball extends THREE.Object3D { //! - Change ball speed according to the speed of the paddle at the time if (isPlayer) { this.position.x = paddle.position.x + PADDLE_SEMI_LENGTH + this.radius; - this.speed.x = Math.abs(this.speed.x) + BALL_SPEED_FACTOR; + this.speed.x += BALL_SPEEDUP_FACTOR; + this.direction.x = DIRECTION.RIGHT; } else { this.position.x = paddle.position.x - PADDLE_SEMI_LENGTH - this.radius; - this.speed.x = -(Math.abs(this.speed.x) + BALL_SPEED_FACTOR); + this.speed.x += BALL_SPEEDUP_FACTOR; + this.direction.x = DIRECTION.LEFT; } this.rally += 1; @@ -99,8 +102,8 @@ export class Ball extends THREE.Object3D { reset() { this.rally = 0; - this.speed.x = BALL_START_SPEED.x; - this.speed.y = BALL_START_SPEED.y; + this.speed.x = BALL_START_SPEED; + this.speed.y = BALL_START_SPEED; this.position.set(0, 0, 0); } diff --git a/backend/static/js/game/GameController.js b/backend/static/js/game/GameController.js index a2bdc34..62952de 100644 --- a/backend/static/js/game/GameController.js +++ b/backend/static/js/game/GameController.js @@ -7,7 +7,7 @@ import { RemotePlayer } from './RemotePlayer.js'; export class GameController extends THREE.Group { - constructor({ playerData, enemyData, gameType, socket }) { + constructor({ playerData, enemyData, gameType, socket, ballDirection }) { super(); this.gameType = gameType; @@ -21,7 +21,7 @@ export class GameController extends THREE.Group { this.createPlayers(playerData, enemyData, socket); this.createGameInstance(); this.registerKeybinds(); - this.build(); + this.build(ballDirection); } createPlayers(playerData, enemyData, socket) { @@ -40,14 +40,13 @@ export class GameController extends THREE.Group { this.player = new RemotePlayer({ id: playerID, username: playerUsername, position: [-25, 0, 0], socket: socket, keybinds: {'up': 'w', 'down': 's'} }); - console.log(this.player); + // console.log(this.player); this.enemy = new RemotePlayer({ id: enemyID, username: enemyUsername, position: [25, 0, 0], socket: socket, isEnemy: true }); - console.log(this.enemy ); + // console.log(this.enemy ); } - this.arena = new Arena({}); - this.ball = new Ball({}); + this.stats = new GameStats(this.player, this.enemy); } @@ -58,7 +57,7 @@ export class GameController extends THREE.Group { "type": this.gameType } - console.log(formData); + // console.log(formData); const response = await fetch(`/games/create`, { method: 'POST', @@ -70,7 +69,7 @@ export class GameController extends THREE.Group { const gameData = await response.json(); this.stats.gameId = gameData.id; - console.log(gameData); + // console.log(gameData); } registerKeybinds() { @@ -89,7 +88,10 @@ export class GameController extends THREE.Group { }); } - build() { + build(ballDirection) { + this.arena = new Arena({}); + this.ball = new Ball({ direction: ballDirection }); + this.add(this.arena); this.add(this.player.paddle); this.add(this.enemy.paddle); diff --git a/backend/static/js/game/MyApp.js b/backend/static/js/game/MyApp.js index d0aad24..b18bed9 100644 --- a/backend/static/js/game/MyApp.js +++ b/backend/static/js/game/MyApp.js @@ -34,10 +34,11 @@ export class MyApp { this.canvas = document.querySelector('#canvas-container'); } + /** * initializes the application */ - init({playerData, enemyData, socket=null, gameType}) { + init({playerData, enemyData, socket=null, gameType, ballDirection}) { this.scene = new THREE.Scene(); this.scene.background = new THREE.Color( 0x101010 ); @@ -47,7 +48,8 @@ export class MyApp { playerData: playerData, enemyData: enemyData, socket: socket, - gameType: gameType, + gameType: gameType, + ballDirection: ballDirection }); this.scene.add(this.gameController); @@ -63,7 +65,7 @@ export class MyApp { document.getElementById('main-content').appendChild(this.gui.domElement); this.stats = new Stats(); - this.stats.showPanel(0); // 0: fps, 1: ms, 2: mb, 3+: custom + this.stats.showPanel(0); document.body.appendChild(this.stats.dom); const lightFolder = this.gui.addFolder('Light') @@ -77,8 +79,8 @@ export class MyApp { this.renderer.setPixelRatio( this.canvas.clientWidth / this.canvas.clientHeight ); this.renderer.setClearColor("#000000"); this.renderer.setSize( this.canvas.clientWidth, this.canvas.clientHeight ); - this.renderer.shadowMap.enabled = true; - this.renderer.shadowMap.type = THREE.PCFSoftShadowMap; // search for other alternatives + // this.renderer.shadowMap.enabled = true; + // this.renderer.shadowMap.type = THREE.PCFSoftShadowMap; // search for other alternatives this.initCameras(); this.setActiveCamera('Perspective') @@ -167,12 +169,7 @@ export class MyApp { } } -window.addEventListener('popstate', function(event) { - var r = confirm("You're about to leave the game! Are you sure?!"); - - if (r == true) { - document.getElementById('game-engine').remove(); +window.addEventListener('popstate', function(event) { + if (confirm("You're about to leave the game! Are you sure?!")) this.window.cancelAnimationFrame(frameID); - } - -}, false); \ No newline at end of file +}); \ No newline at end of file diff --git a/backend/static/js/game/macros.js b/backend/static/js/game/macros.js index a0faa4e..0875c5d 100644 --- a/backend/static/js/game/macros.js +++ b/backend/static/js/game/macros.js @@ -1,8 +1,15 @@ export const HELLO = "Hello"; -export const BALL_START_SPEED = {'x': -0.3, 'y': 0.3}; -export const BALL_SPEED_FACTOR = 0.02; +export const BALL_START_SPEED = 0.3; +export const BALL_SPEEDUP_FACTOR = 0.02; export const BALL_RADIUS = 1.25; +export const DIRECTION = Object.freeze({ + UP: 1, + DOWN: -1, + LEFT: -1, + RIGHT: 1, +}); + export const PADDLE_SEMI_LENGTH = 0.25; export const PADDLE_SEMI_HEIGHT = 3.75; export const PADDLE_SPEED = 2; diff --git a/backend/static/js/game/main.js b/backend/static/js/game/main.js index 39ff9cd..fbaa7c3 100644 --- a/backend/static/js/game/main.js +++ b/backend/static/js/game/main.js @@ -8,16 +8,29 @@ if (gameType == "Remote") { let socket = new WebSocket(`ws://${window.location.host}/ws/games/remote/queue`); socket.onmessage = (event) => { const { player1, player2, direction } = JSON.parse(event.data); - const player = player1.id == userID ? player1 : player2; - const enemy = player == player1 ? player2 : player1; - - console.log(JSON.parse(event.data)); + let player, enemy, ballDirection; + console.log(`Direction`, direction); + + if (player1.id == userID) { + player = player1; + enemy = player2; + ballDirection = direction; + } + else { + player = player2; + enemy = player1; + ballDirection = { 'x': -direction.x, 'y': direction.y }; + } + console.log(`Ball Direction`, ballDirection); + + // console.log(JSON.parse(event.data)); let app = new MyApp(); app.init({ playerData: player, enemyData: enemy, socket: socket, - gameType: gameType, + gameType: gameType, + ballDirection: ballDirection, }); app.render(); } From f52eb24024c8f93d6b973dec16b5d5e72358e4c3 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Tue, 8 Oct 2024 10:33:22 +0100 Subject: [PATCH 17/74] Code: small changes. --- backend/static/js/game/Ball.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/static/js/game/Ball.js b/backend/static/js/game/Ball.js index 7a0f1e1..2d472da 100644 --- a/backend/static/js/game/Ball.js +++ b/backend/static/js/game/Ball.js @@ -3,11 +3,11 @@ import { BALL_SPEEDUP_FACTOR, BALL_START_SPEED, BALL_RADIUS, PADDLE_SEMI_HEIGHT, PADDLE_SEMI_LENGTH, DIRECTION } from './macros.js'; export class Ball extends THREE.Object3D { - constructor ({ radius, color, speed, direction }) { + constructor ({ radius, speed, direction }) { super(); this.radius = radius || BALL_RADIUS; - this.speed = { 'x': BALL_START_SPEED, 'y': BALL_START_SPEED }; + this.speed = speed || { 'x': BALL_START_SPEED, 'y': BALL_START_SPEED }; this.direction = direction || { 'x': DIRECTION.LEFT, 'y': DIRECTION.UP } this.rally = 0; this.ball = null; From bead7c37ed7f26680f14753a11d326b0707e7535 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Tue, 8 Oct 2024 10:34:00 +0100 Subject: [PATCH 18/74] Refactoring: small changes. --- backend/static/js/game/Ball.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/static/js/game/Ball.js b/backend/static/js/game/Ball.js index 2d472da..8e7a602 100644 --- a/backend/static/js/game/Ball.js +++ b/backend/static/js/game/Ball.js @@ -24,8 +24,8 @@ export class Ball extends THREE.Object3D { this.add(this.ball); } - move(arcade) { - const { arena, player, enemy } = arcade; + move(controller) { + const { arena, player, enemy } = controller; this.position.x += this.direction.x * this.speed.x; this.position.y += this.direction.y * this.speed.y; From 02552a6faf716f6327678da5dc106260fd5804c9 Mon Sep 17 00:00:00 2001 From: fvieira Date: Tue, 8 Oct 2024 17:36:08 +0100 Subject: [PATCH 19/74] game stats --- backend/pong/templates/pages/game_stats.html | 78 ++++++-------------- backend/pong/views.py | 2 +- backend/static/css/game-stats.css | 38 +++++++++- 3 files changed, 56 insertions(+), 62 deletions(-) diff --git a/backend/pong/templates/pages/game_stats.html b/backend/pong/templates/pages/game_stats.html index 20628a1..caf27e0 100644 --- a/backend/pong/templates/pages/game_stats.html +++ b/backend/pong/templates/pages/game_stats.html @@ -150,73 +150,37 @@
90
-
-
Maximum Ball Speed
+
+
Greateast Deficit Overcome
+
Who bounced back the most goals.
-
- Max Speed -
- -
01/01/1111
-
+
+ The one +
Username
-
{{ stats.max_ball_speed }}
-
-
-
- Max Speed -
-
Maximum Rally Length
-
01/01/1111
-
-
-
{{ stats.max_rally_length }}
+
3
-
-
Maximum Ball Speed
+
+
Most Consecutive Goals
+
Who scored more goals in a row.
-
- Max Speed -
- -
01/01/1111
-
+
+ The one +
Username
-
{{ stats.max_ball_speed }}
-
-
-
- Max Speed -
-
Maximum Rally Length
-
01/01/1111
-
-
-
{{ stats.max_rally_length }}
+
3
-
-
Maximum Ball Speed
+
+
Biggest Lead
+
Who had the biggest goal lead.
-
- Max Speed -
- -
01/01/1111
-
+
+ The one +
Username
-
{{ stats.max_ball_speed }}
-
-
-
- Max Speed -
-
Maximum Rally Length
-
01/01/1111
-
-
-
{{ stats.max_rally_length }}
+
3
diff --git a/backend/pong/views.py b/backend/pong/views.py index 758e194..3737075 100644 --- a/backend/pong/views.py +++ b/backend/pong/views.py @@ -1094,7 +1094,7 @@ def ongoingtournaments(request, tournament_id): context = { 'user_id': user_id, 'tournament_id': tournament_id, - 'tournament_size': 8 + 'tournament_size': 4 } return render(request,'pages/ongoing-tourn.html', context) diff --git a/backend/static/css/game-stats.css b/backend/static/css/game-stats.css index af32573..ef6c5e5 100644 --- a/backend/static/css/game-stats.css +++ b/backend/static/css/game-stats.css @@ -42,12 +42,15 @@ background-color: #ffffff0C; border: 1px solid #ffffff2a; height: 100%; + padding: 20px; } .record-info { width: 100%; padding: 20px; + padding: 0; + padding-top: 20px; padding-bottom: 5px; } @@ -63,16 +66,23 @@ } .img-tit img { - width: 25px; - height: 25px; + width: 40px; + height: 40px; +} + +.record-title { + color: #FFFFFF; + font-size: large; + margin-bottom: 0; } -.record-tit { +.record-sub { color: #FFFFFF; - font-size: small; + font-size: x-small; margin-bottom: 0; } + .record-date { color: #ffffff83; font-size: x-small; @@ -124,6 +134,8 @@ .performance { width: 16%; height: 100%; + text-align: left; + white-space: nowrap; } .records-title { @@ -181,4 +193,22 @@ .squares span { font-size: smaller; +} + +.record-info .name { + padding-left: 10px; + color: #FFFFFF; + margin-bottom: 0; + font-size: large; +} + +.record-info .winr { + font-size: xx-large; + margin-bottom: 0; +} + + +.records .record-title { + padding-bottom: 10px; + } \ No newline at end of file From ea4d9b7f6fd1a6b13bff2272b28a4bfa9e02ec78 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Sun, 13 Oct 2024 13:24:01 +0100 Subject: [PATCH 20/74] Fix: fixed a bug where the scorer would be the player who suffered it. --- backend/static/js/game/Ball.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/static/js/game/Ball.js b/backend/static/js/game/Ball.js index 8e7a602..77a1042 100644 --- a/backend/static/js/game/Ball.js +++ b/backend/static/js/game/Ball.js @@ -40,9 +40,9 @@ export class Ball extends THREE.Object3D { const { rightBoundary, leftBoundary } = arena; if (this.position.x - this.radius <= leftBoundary.position.x) - return player; - else if (this.position.x + this.radius >= rightBoundary.position.x) return enemy; + else if (this.position.x + this.radius >= rightBoundary.position.x) + return player; return null; } From 2e7fc287501556fa3573de14762147179bde826e Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Sun, 13 Oct 2024 16:16:49 +0100 Subject: [PATCH 21/74] Code: created a new RemoteGameController to split local and remote logics. --- backend/pong/consumers.py | 54 +++---- backend/static/js/game/Ball.js | 11 +- ...meController.js => LocalGameController.js} | 41 ++---- backend/static/js/game/MyApp.js | 24 ++-- .../static/js/game/RemoteGameController.js | 135 ++++++++++++++++++ backend/static/js/game/RemotePlayer.js | 38 ++--- 6 files changed, 214 insertions(+), 89 deletions(-) rename backend/static/js/game/{GameController.js => LocalGameController.js} (64%) create mode 100644 backend/static/js/game/RemoteGameController.js diff --git a/backend/pong/consumers.py b/backend/pong/consumers.py index ef339fa..67272a0 100644 --- a/backend/pong/consumers.py +++ b/backend/pong/consumers.py @@ -53,6 +53,15 @@ def connect(self): self.user = self.scope['user'] self.room_name = '' + # if the queue is empty: (no room available) + # - create a new channel_name and add it to the object + # - push the new object alongside the channel name to the queue + # else: (available rooms) + # - Pop the first available room in the queue + # - Add the client to the room + # - Broadcast a message to the channel with a starting command + + if len(self.queue) == 0: ic('adding player to queue') self.add_player_to_queue() @@ -109,13 +118,21 @@ def add_player_to_waiting_room(self): del self.queue[host_id] def disconnect(self, code): - del self.queue[self.user.id] + if self.user.id in self.queue: + del self.queue[self.user.id] return super().disconnect(code) def receive(self, text_data=None): + handler = '' + data = json.loads(text_data) + if data['event'] == 'UPDATE': + handler = "send.update.paddle.message" + elif data['event'] == 'GOAL': + handler = "send.reset.ball.message" + async_to_sync(self.channel_layer.group_send)( self.room_name, { - "type": "send.update.paddle.message", + "type": handler, "message": text_data } ) @@ -125,26 +142,15 @@ def send_start_game_message(self, event): def send_update_paddle_message(self, event): data = json.loads(event['message']) - ic(data) - if data['id'] != self.user.id: - self.send(event['message']) - + data['event'] = 'MOVE' + self.send(json.dumps(data)) - - - - -# if the queue is empty: (no room available) -# - create a new channel_name and add it to the object -# - push the new object alongside the channel name to the queue -# else: (available rooms) -# - Pop the first available room in the queue -# - Add the client to the room -# - Broadcast a message to the channel with a starting command - -# If receive() function is triggered: -# - Create a new object with the position of the paddle of the player who sent it -# - Send position to the other player - - - \ No newline at end of file + def send_reset_ball_message(self, event): + data = { + 'event': 'RESET', + 'ballDirection': { + 'x': 1 if random.randint(0, 1) == 1 else -1, + 'y': 1 if random.randint(0, 1) == 1 else -1 + } + } + self.send(json.dumps(data)) \ No newline at end of file diff --git a/backend/static/js/game/Ball.js b/backend/static/js/game/Ball.js index 77a1042..9879188 100644 --- a/backend/static/js/game/Ball.js +++ b/backend/static/js/game/Ball.js @@ -1,6 +1,7 @@ import * as THREE from 'three'; import { BALL_SPEEDUP_FACTOR, BALL_START_SPEED, BALL_RADIUS, - PADDLE_SEMI_HEIGHT, PADDLE_SEMI_LENGTH, DIRECTION } from './macros.js'; + PADDLE_SEMI_HEIGHT, PADDLE_SEMI_LENGTH, DIRECTION, + ARENA_SEMI_DEPTH } from './macros.js'; export class Ball extends THREE.Object3D { constructor ({ radius, speed, direction }) { @@ -39,9 +40,9 @@ export class Ball extends THREE.Object3D { collidedWithGoals(arena, player, enemy) { const { rightBoundary, leftBoundary } = arena; - if (this.position.x - this.radius <= leftBoundary.position.x) + if (this.position.x - this.radius <= leftBoundary.position.x + ARENA_SEMI_DEPTH) return enemy; - else if (this.position.x + this.radius >= rightBoundary.position.x) + else if (this.position.x + this.radius >= rightBoundary.position.x - ARENA_SEMI_DEPTH) return player; return null; } @@ -49,9 +50,9 @@ export class Ball extends THREE.Object3D { collideWithVerticalBounds(arena) { const { upperBoundary, lowerBoundary } = arena; - if (this.position.y + this.radius >= upperBoundary.position.y) + if (this.position.y + this.radius >= upperBoundary.position.y - ARENA_SEMI_DEPTH) this.direction.y = DIRECTION.DOWN; - else if (this.position.y - this.radius <= lowerBoundary.position.y) + else if (this.position.y - this.radius <= lowerBoundary.position.y + ARENA_SEMI_DEPTH) this.direction.y = DIRECTION.UP; } diff --git a/backend/static/js/game/GameController.js b/backend/static/js/game/LocalGameController.js similarity index 64% rename from backend/static/js/game/GameController.js rename to backend/static/js/game/LocalGameController.js index 62952de..e8588ba 100644 --- a/backend/static/js/game/GameController.js +++ b/backend/static/js/game/LocalGameController.js @@ -3,14 +3,12 @@ import { Ball } from './Ball.js'; import { Arena } from './Arena.js'; import { GameStats } from './GameStats.js'; import { LocalPlayer } from './LocalPlayer.js'; -import { RemotePlayer } from './RemotePlayer.js'; -export class GameController extends THREE.Group { - constructor({ playerData, enemyData, gameType, socket, ballDirection }) { +export class LocalGameController extends THREE.Group { + constructor({ playerData, enemyData, ballDirection }) { super(); - this.gameType = gameType; this.keybinds = null; this.arena = null; this.ball = null; @@ -18,34 +16,22 @@ export class GameController extends THREE.Group { this.enemy = null; this.stats = null; - this.createPlayers(playerData, enemyData, socket); - this.createGameInstance(); this.registerKeybinds(); + this.createPlayers(playerData, enemyData); + this.createGameInstance(); this.build(ballDirection); } - createPlayers(playerData, enemyData, socket) { + createPlayers(playerData, enemyData) { const { id: playerID, username: playerUsername } = playerData; const { id: enemyID, username: enemyUsername } = enemyData; - if (this.gameType == "Local") { - this.player = new LocalPlayer({ id: playerID, username: playerUsername, - position: [-25, 0, 0], keybinds: {'up': 'w', 'down': 's'} - }); - this.enemy = new LocalPlayer({ - position: [25, 0, 0], keybinds: {'up': 'ArrowUp', 'down': 'ArrowDown'} - }); - } - else if (this.gameType == "Remote") { - this.player = new RemotePlayer({ id: playerID, username: playerUsername, - position: [-25, 0, 0], socket: socket, keybinds: {'up': 'w', 'down': 's'} - }); - // console.log(this.player); - this.enemy = new RemotePlayer({ id: enemyID, username: enemyUsername, - position: [25, 0, 0], socket: socket, isEnemy: true - }); - // console.log(this.enemy ); - } + this.player = new LocalPlayer({ id: playerID, username: playerUsername, + position: [-25, 0, 0], keybinds: {'up': 'w', 'down': 's'} + }); + this.enemy = new LocalPlayer({ + position: [25, 0, 0], keybinds: {'up': 'ArrowUp', 'down': 'ArrowDown'} + }); this.stats = new GameStats(this.player, this.enemy); } @@ -54,11 +40,9 @@ export class GameController extends THREE.Group { const formData = { "user1_id": this.player.id, "user2_id": this.enemy.id, - "type": this.gameType + "type": "Local" } - // console.log(formData); - const response = await fetch(`/games/create`, { method: 'POST', body: JSON.stringify(formData), @@ -69,7 +53,6 @@ export class GameController extends THREE.Group { const gameData = await response.json(); this.stats.gameId = gameData.id; - // console.log(gameData); } registerKeybinds() { diff --git a/backend/static/js/game/MyApp.js b/backend/static/js/game/MyApp.js index b18bed9..1742faf 100644 --- a/backend/static/js/game/MyApp.js +++ b/backend/static/js/game/MyApp.js @@ -4,8 +4,9 @@ import { GUI } from 'three/addons/libs/lil-gui.module.min.js'; import Stats from 'three/addons/libs/stats.module.js' import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; import { Axis } from './Axis.js'; -import { GameController } from './GameController.js'; +import { LocalGameController } from './LocalGameController.js'; import { REFRESH_RATE } from './macros.js'; +import { RemoteGameController } from './RemoteGameController.js'; var frameID; @@ -44,13 +45,20 @@ export class MyApp { this.scene.background = new THREE.Color( 0x101010 ); this.scene.add(new Axis(this)); - this.gameController = new GameController({ - playerData: playerData, - enemyData: enemyData, - socket: socket, - gameType: gameType, - ballDirection: ballDirection - }); + if (gameType == "Remote"){ + this.gameController = new RemoteGameController({ + playerData: playerData, + enemyData: enemyData, + socket: socket, + ballDirection: ballDirection + }); + } else { + this.gameController = new LocalGameController({ + playerData: playerData, + enemyData: enemyData, + ballDirection: ballDirection + }); + } this.scene.add(this.gameController); this.light = new THREE.PointLight('#FFFFFF', 100); diff --git a/backend/static/js/game/RemoteGameController.js b/backend/static/js/game/RemoteGameController.js new file mode 100644 index 0000000..124dd5d --- /dev/null +++ b/backend/static/js/game/RemoteGameController.js @@ -0,0 +1,135 @@ +import * as THREE from 'three'; +import { Ball } from './Ball.js'; +import { Arena } from './Arena.js'; +import { GameStats } from './GameStats.js'; +import { RemotePlayer } from './RemotePlayer.js'; + + +export class RemoteGameController extends THREE.Group { + constructor({ playerData, enemyData, socket, ballDirection }) { + super(); + + this.keybinds = null; + this.arena = null; + this.ball = null; + this.player = null; + this.enemy = null; + this.socket = socket; + this.stats = null; + + this.registerKeybinds(); + this.registerSocketEvents(); + this.createPlayers(playerData, enemyData); + this.createGameInstance(); + this.build(ballDirection); + } + + createPlayers(playerData, enemyData) { + const { id: playerID, username: playerUsername } = playerData; + const { id: enemyID, username: enemyUsername } = enemyData; + const onUpdate = (id, username, targetY) => { + this.socket.send(JSON.stringify({ + 'event': 'UPDATE', + 'data': { + 'id': id, + 'username': username, + 'y': targetY + } + })); + } + + this.player = new RemotePlayer({ id: playerID, username: playerUsername, + position: [-25, 0, 0], onUpdate: onUpdate, keybinds: {'up': 'w', 'down': 's'} + }); + this.enemy = new RemotePlayer({ id: enemyID, username: enemyUsername, + position: [25, 0, 0], isEnemy: true + }); + this.stats = new GameStats(this.player, this.enemy); + + console.log(this.player); + console.log(this.enemy); + + } + + async createGameInstance() { + const formData = { + "user1_id": this.player.id, + "user2_id": this.enemy.id, + "type": "Remote" + } + + const response = await fetch(`/games/create`, { + method: 'POST', + body: JSON.stringify(formData), + headers: { + 'Content-Type': 'application/json', + } + }); + + const gameData = await response.json(); + this.stats.gameId = gameData.id; + } + + registerKeybinds() { + this.keybinds = { + 'w': false, 's': false, + }; + + document.addEventListener('keydown', (event) => { + if (event.key in this.keybinds) + this.keybinds[event.key] = true; + }); + document.addEventListener('keyup', (event) => { + if (event.key in this.keybinds) + this.keybinds[event.key] = false; + }); + } + + registerSocketEvents(){ + this.socket.onmessage = (event) => { + const data = JSON.parse(event.data); + console.log(data.event); + // console.log(`player = ${this.player.username}, enemy = ${this.enemy.username}, data.username = ${data.username}`); + if (data.event == 'MOVE') { + if (data.data.id == this.player.id) + this.player.move(data.data.y); + else + this.enemy.move(data.data.y); + } + else if (data.event == 'RESET') + this.ball.reset(); + } + + this.socket.onerror = (event) => { + console.log(event); + } + } + + build(ballDirection) { + this.arena = new Arena({}); + this.ball = new Ball({ direction: ballDirection }); + + this.add(this.arena); + this.add(this.player.paddle); + this.add(this.enemy.paddle); + this.add(this.ball); + } + + update() { + this.player.update(this.keybinds); + this.enemy.update(this.keybinds); + if (this.ball == null) + return ; + + const scorer = this.ball.move(this); + if (scorer != null) { + this.stats.registerGoal(scorer, this.ball); + this.ball.reset(); + } + if (this.stats.winner != null) { + this.remove(this.ball); + this.ball.dispose(); + this.ball = null; + } + } +} \ No newline at end of file diff --git a/backend/static/js/game/RemotePlayer.js b/backend/static/js/game/RemotePlayer.js index 5ab56bc..d830a37 100644 --- a/backend/static/js/game/RemotePlayer.js +++ b/backend/static/js/game/RemotePlayer.js @@ -1,24 +1,16 @@ +import * as THREE from 'three'; import { Player } from './Player.js'; import { PADDLE_SEMI_HEIGHT, ARENA_SEMI_HEIGHT, PADDLE_SPEED } from './macros.js'; export class RemotePlayer extends Player { - constructor ({ id, username, position, keybinds=null, socket, isEnemy=false }) { + constructor ({ id, username, position, keybinds=null, onUpdate, isEnemy=false }) { super(id, username, position, keybinds); - this.socket = socket; + this.onUpdate = onUpdate; this.isEnemy = isEnemy; - if (isEnemy) - this.socket.onmessage = (event) => { - console.log(event); - const newY = JSON.parse(event.data).paddle.position.y; - this.paddle.position.y = newY; - } - - this.socket.onerror = (event) => { - console.log(event); - } } update(pressedKeys) { + //! REPOR COM KEYBINDS == NULL if (this.isEnemy) return ; @@ -39,18 +31,18 @@ export class RemotePlayer extends Player { ); } - if (pressedKeys[upKey] || pressedKeys[downKey]) { - this.paddle.position.lerp(targetPos, 0.5); - this.socket.send(JSON.stringify({ - 'id': this.id, - 'paddle': { - 'position': { - 'y': targetPos.y - } - } - })); - } + if (pressedKeys[upKey] || pressedKeys[downKey]) + this.onUpdate(this.id, this.username, targetPos.y); } + move(targetY) { + const target = new THREE.Vector3(...this.paddle.position); + + target.y = targetY; + this.paddle.position.lerp(target, 0.5); + } + + + } \ No newline at end of file From 6dce677f3c081797d6bc2e9ce62db9a1b31bc6e7 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Sun, 13 Oct 2024 17:31:36 +0100 Subject: [PATCH 22/74] Code: game view is the same for both players. Disabled orbit controls. --- backend/static/js/game/Ball.js | 14 ++--- backend/static/js/game/GameStats.js | 28 ++++----- backend/static/js/game/MyApp.js | 48 ++++++++++----- .../static/js/game/RemoteGameController.js | 61 +++++++++++-------- backend/static/js/game/main.js | 20 +----- 5 files changed, 94 insertions(+), 77 deletions(-) diff --git a/backend/static/js/game/Ball.js b/backend/static/js/game/Ball.js index 9879188..5d610a0 100644 --- a/backend/static/js/game/Ball.js +++ b/backend/static/js/game/Ball.js @@ -26,24 +26,24 @@ export class Ball extends THREE.Object3D { } move(controller) { - const { arena, player, enemy } = controller; + const { arena, player1, player2 } = controller; this.position.x += this.direction.x * this.speed.x; this.position.y += this.direction.y * this.speed.y; this.collideWithVerticalBounds(arena); - this.collideWithPaddle(player.paddle, true); - this.collideWithPaddle(enemy.paddle, false); - return this.collidedWithGoals(arena, player, enemy); + this.collideWithPaddle(player1.paddle, true); + this.collideWithPaddle(player2.paddle, false); + return this.collidedWithGoals(arena, player1, player2); } - collidedWithGoals(arena, player, enemy) { + collidedWithGoals(arena, player1, player2) { const { rightBoundary, leftBoundary } = arena; if (this.position.x - this.radius <= leftBoundary.position.x + ARENA_SEMI_DEPTH) - return enemy; + return player2; else if (this.position.x + this.radius >= rightBoundary.position.x - ARENA_SEMI_DEPTH) - return player; + return player1; return null; } diff --git a/backend/static/js/game/GameStats.js b/backend/static/js/game/GameStats.js index 10c5c98..35aabc1 100644 --- a/backend/static/js/game/GameStats.js +++ b/backend/static/js/game/GameStats.js @@ -3,19 +3,19 @@ /* ::: :::::::: */ /* GameStats.js :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: crypted +#+ +:+ +#+ */ +/* By: nunomiguel533 this.setActivateControls(value)); + orbitFolder.open(); + this.renderer = new THREE.WebGLRenderer({antialias:true}); this.renderer.setPixelRatio( this.canvas.clientWidth / this.canvas.clientHeight ); this.renderer.setClearColor("#000000"); @@ -118,6 +123,15 @@ export class MyApp { this.activeCamera = this.cameras[this.activeCameraName] } + setActivateControls(value) { + this.activateControls = value; + + if (this.activateControls) + this.controls = new OrbitControls( this.activeCamera, this.renderer.domElement ); + else + this.controls = null; + } + /** * updates the active camera if required * this function is called in the render loop @@ -131,8 +145,13 @@ export class MyApp { this.activeCamera = this.cameras[this.activeCameraName] document.getElementById("camera").innerHTML = this.activeCameraName - this.onResize() + this.onResize(); + console.log(this.activateControls); + if (!this.activateControls) + return ; + console.log(this.controls); + if (this.controls === null) { this.controls = new OrbitControls( this.activeCamera, this.renderer.domElement ); this.controls.enableZoom = true; @@ -163,7 +182,8 @@ export class MyApp { this.stats.begin(); this.updateCameraIfRequired(); - this.controls.update(); + if (this.controls != null) + this.controls.update(); this.gameController.update(); this.renderer.render(this.scene, this.activeCamera); diff --git a/backend/static/js/game/RemoteGameController.js b/backend/static/js/game/RemoteGameController.js index 124dd5d..9567c72 100644 --- a/backend/static/js/game/RemoteGameController.js +++ b/backend/static/js/game/RemoteGameController.js @@ -6,27 +6,28 @@ import { RemotePlayer } from './RemotePlayer.js'; export class RemoteGameController extends THREE.Group { - constructor({ playerData, enemyData, socket, ballDirection }) { + constructor({ player1Data, player2Data, socket, ballDirection }) { super(); this.keybinds = null; this.arena = null; this.ball = null; - this.player = null; - this.enemy = null; + this.player1 = null; + this.player2 = null; this.socket = socket; this.stats = null; this.registerKeybinds(); this.registerSocketEvents(); - this.createPlayers(playerData, enemyData); + this.createPlayers(player1Data, player2Data); this.createGameInstance(); this.build(ballDirection); } - createPlayers(playerData, enemyData) { - const { id: playerID, username: playerUsername } = playerData; - const { id: enemyID, username: enemyUsername } = enemyData; + createPlayers(player1Data, player2Data) { + const { id: p1ID, username: p1Username } = player1Data; + const { id: p2ID, username: p2Username } = player2Data; + const currPlayerID = document.getElementById('game-engine').getAttribute('data-user-id'); const onUpdate = (id, username, targetY) => { this.socket.send(JSON.stringify({ 'event': 'UPDATE', @@ -38,23 +39,33 @@ export class RemoteGameController extends THREE.Group { })); } - this.player = new RemotePlayer({ id: playerID, username: playerUsername, - position: [-25, 0, 0], onUpdate: onUpdate, keybinds: {'up': 'w', 'down': 's'} - }); - this.enemy = new RemotePlayer({ id: enemyID, username: enemyUsername, - position: [25, 0, 0], isEnemy: true - }); - this.stats = new GameStats(this.player, this.enemy); + if (p1ID == currPlayerID) { + this.player1 = new RemotePlayer({ id: p1ID, username: p1Username, + position: [-25, 0, 0], onUpdate: onUpdate, keybinds: {'up': 'w', 'down': 's'} + }); + this.player2 = new RemotePlayer({ id: p2ID, username: p2Username, + position: [25, 0, 0], isEnemy: true + }); + } + else { + this.player1 = new RemotePlayer({ id: p1ID, username: p1Username, + position: [-25, 0, 0], isEnemy: true + }); + this.player2 = new RemotePlayer({ id: p2ID, username: p2Username, + position: [25, 0, 0], onUpdate: onUpdate, keybinds: {'up': 'w', 'down': 's'} + }); + } + this.stats = new GameStats(this.player1, this.player2); - console.log(this.player); - console.log(this.enemy); + console.log(this.player1); + console.log(this.player2); } async createGameInstance() { const formData = { - "user1_id": this.player.id, - "user2_id": this.enemy.id, + "user1_id": this.player1.id, + "user2_id": this.player2.id, "type": "Remote" } @@ -91,10 +102,10 @@ export class RemoteGameController extends THREE.Group { console.log(data.event); // console.log(`player = ${this.player.username}, enemy = ${this.enemy.username}, data.username = ${data.username}`); if (data.event == 'MOVE') { - if (data.data.id == this.player.id) - this.player.move(data.data.y); + if (data.data.id == this.player1.id) + this.player1.move(data.data.y); else - this.enemy.move(data.data.y); + this.player2.move(data.data.y); } else if (data.event == 'RESET') this.ball.reset(); @@ -110,14 +121,14 @@ export class RemoteGameController extends THREE.Group { this.ball = new Ball({ direction: ballDirection }); this.add(this.arena); - this.add(this.player.paddle); - this.add(this.enemy.paddle); + this.add(this.player1.paddle); + this.add(this.player2.paddle); this.add(this.ball); } update() { - this.player.update(this.keybinds); - this.enemy.update(this.keybinds); + this.player1.update(this.keybinds); + this.player2.update(this.keybinds); if (this.ball == null) return ; diff --git a/backend/static/js/game/main.js b/backend/static/js/game/main.js index fbaa7c3..4424429 100644 --- a/backend/static/js/game/main.js +++ b/backend/static/js/game/main.js @@ -8,29 +8,15 @@ if (gameType == "Remote") { let socket = new WebSocket(`ws://${window.location.host}/ws/games/remote/queue`); socket.onmessage = (event) => { const { player1, player2, direction } = JSON.parse(event.data); - let player, enemy, ballDirection; console.log(`Direction`, direction); - if (player1.id == userID) { - player = player1; - enemy = player2; - ballDirection = direction; - } - else { - player = player2; - enemy = player1; - ballDirection = { 'x': -direction.x, 'y': direction.y }; - } - console.log(`Ball Direction`, ballDirection); - - // console.log(JSON.parse(event.data)); let app = new MyApp(); app.init({ - playerData: player, - enemyData: enemy, + player1Data: player1, + player2Data: player2, socket: socket, gameType: gameType, - ballDirection: ballDirection, + ballDirection: direction, }); app.render(); } From 5129715871136caae6472c842258e339e5a856ab Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Sun, 13 Oct 2024 18:11:06 +0100 Subject: [PATCH 23/74] Code: added remote sync of the ball properties when it hits a paddle. --- backend/pong/consumers.py | 17 +++++++++----- backend/static/js/game/Ball.js | 12 +++++++++- backend/static/js/game/MyApp.js | 3 --- .../static/js/game/RemoteGameController.js | 23 ++++++++++++++++--- backend/static/js/game/macros.js | 8 +++---- 5 files changed, 46 insertions(+), 17 deletions(-) diff --git a/backend/pong/consumers.py b/backend/pong/consumers.py index 67272a0..577e766 100644 --- a/backend/pong/consumers.py +++ b/backend/pong/consumers.py @@ -123,22 +123,27 @@ def disconnect(self, code): return super().disconnect(code) def receive(self, text_data=None): - handler = '' + handlers = { + 'UPDATE': 'send.update.paddle.message', + 'GOAL': 'send.reset.ball.message', + 'SYNC': 'send.ball.sync.message' + } data = json.loads(text_data) - if data['event'] == 'UPDATE': - handler = "send.update.paddle.message" - elif data['event'] == 'GOAL': - handler = "send.reset.ball.message" + event = data['event'] async_to_sync(self.channel_layer.group_send)( self.room_name, { - "type": handler, + "type": handlers[event], "message": text_data } ) def send_start_game_message(self, event): self.send(event['message']) + + def send_ball_sync_message(self, event): + data = json.loads(event['message']) + self.send(event['message']) def send_update_paddle_message(self, event): data = json.loads(event['message']) diff --git a/backend/static/js/game/Ball.js b/backend/static/js/game/Ball.js index 5d610a0..1118e05 100644 --- a/backend/static/js/game/Ball.js +++ b/backend/static/js/game/Ball.js @@ -4,7 +4,7 @@ import { BALL_SPEEDUP_FACTOR, BALL_START_SPEED, BALL_RADIUS, ARENA_SEMI_DEPTH } from './macros.js'; export class Ball extends THREE.Object3D { - constructor ({ radius, speed, direction }) { + constructor ({ radius, speed, direction, onPaddleHit=null }) { super(); this.radius = radius || BALL_RADIUS; @@ -12,6 +12,7 @@ export class Ball extends THREE.Object3D { this.direction = direction || { 'x': DIRECTION.LEFT, 'y': DIRECTION.UP } this.rally = 0; this.ball = null; + this.onPaddleHit = onPaddleHit; this.build(); this.reset(); } @@ -98,6 +99,8 @@ export class Ball extends THREE.Object3D { this.direction.x = DIRECTION.LEFT; } + if (this.onPaddleHit != null) + this.onPaddleHit(); this.rally += 1; } @@ -108,6 +111,13 @@ export class Ball extends THREE.Object3D { this.position.set(0, 0, 0); } + sync({position, speed, direction}) { + this.position.set(...position); + this.speed.x = speed.x; + this.speed.y = speed.y; + this.direction = direction; + } + dispose() { this.ball.geometry.dispose(); this.ball.material.dispose(); diff --git a/backend/static/js/game/MyApp.js b/backend/static/js/game/MyApp.js index 84b878a..0bf6732 100644 --- a/backend/static/js/game/MyApp.js +++ b/backend/static/js/game/MyApp.js @@ -86,14 +86,11 @@ export class MyApp { const orbitFolder = this.gui.addFolder('Mouse Controls'); orbitFolder.add(this, 'activateControls', false).name("Active") .onChange((value) => this.setActivateControls(value)); - orbitFolder.open(); this.renderer = new THREE.WebGLRenderer({antialias:true}); this.renderer.setPixelRatio( this.canvas.clientWidth / this.canvas.clientHeight ); this.renderer.setClearColor("#000000"); this.renderer.setSize( this.canvas.clientWidth, this.canvas.clientHeight ); - // this.renderer.shadowMap.enabled = true; - // this.renderer.shadowMap.type = THREE.PCFSoftShadowMap; // search for other alternatives this.initCameras(); this.setActiveCamera('Perspective') diff --git a/backend/static/js/game/RemoteGameController.js b/backend/static/js/game/RemoteGameController.js index 9567c72..38f52d0 100644 --- a/backend/static/js/game/RemoteGameController.js +++ b/backend/static/js/game/RemoteGameController.js @@ -34,7 +34,10 @@ export class RemoteGameController extends THREE.Group { 'data': { 'id': id, 'username': username, - 'y': targetY + 'y': targetY, + 'ball': { + 'position': [...this.ball.position] + } } })); } @@ -99,16 +102,18 @@ export class RemoteGameController extends THREE.Group { registerSocketEvents(){ this.socket.onmessage = (event) => { const data = JSON.parse(event.data); - console.log(data.event); // console.log(`player = ${this.player.username}, enemy = ${this.enemy.username}, data.username = ${data.username}`); if (data.event == 'MOVE') { if (data.data.id == this.player1.id) this.player1.move(data.data.y); else this.player2.move(data.data.y); + // console.log(data.data); } else if (data.event == 'RESET') this.ball.reset(); + else if (data.event == 'SYNC') + this.ball.sync(data.data.ball); } this.socket.onerror = (event) => { @@ -117,8 +122,20 @@ export class RemoteGameController extends THREE.Group { } build(ballDirection) { + const onPaddleHit = () => { + this.socket.send(JSON.stringify({ + 'event': 'SYNC', + 'data': { + 'ball': { + 'position': [...this.ball.position], + 'direction': this.ball.direction, + 'speed': this.ball.speed + } + } + })); + } this.arena = new Arena({}); - this.ball = new Ball({ direction: ballDirection }); + this.ball = new Ball({ direction: ballDirection, onPaddleHit: onPaddleHit }); this.add(this.arena); this.add(this.player1.paddle); diff --git a/backend/static/js/game/macros.js b/backend/static/js/game/macros.js index 0875c5d..b675831 100644 --- a/backend/static/js/game/macros.js +++ b/backend/static/js/game/macros.js @@ -1,6 +1,6 @@ export const HELLO = "Hello"; -export const BALL_START_SPEED = 0.3; -export const BALL_SPEEDUP_FACTOR = 0.02; +export const BALL_START_SPEED = 0.6; +export const BALL_SPEEDUP_FACTOR = 0.06; export const BALL_RADIUS = 1.25; export const DIRECTION = Object.freeze({ @@ -12,7 +12,7 @@ export const DIRECTION = Object.freeze({ export const PADDLE_SEMI_LENGTH = 0.25; export const PADDLE_SEMI_HEIGHT = 3.75; -export const PADDLE_SPEED = 2; +export const PADDLE_SPEED = 2.6; export const ARENA_SEMI_HEIGHT = 20; export const ARENA_SEMI_LENGTH = 30; @@ -20,7 +20,7 @@ export const ARENA_SEMI_DEPTH = 0.25; export const MAX_GOALS = 5; -export const FPS = 75; +export const FPS = 30; export const REFRESH_RATE = 1000 / FPS; //! DEPENDENCY INJECTION TESTING From e1f1a30c52db606b2a06cb63864755cd5080b9b5 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Sun, 13 Oct 2024 19:38:11 +0100 Subject: [PATCH 24/74] Code + refactoring: removed GOAL event to prevent different goal registers. Normalized event names and other code cleaning. --- backend/pong/consumers.py | 24 ++---- backend/static/js/game/Ball.js | 6 +- backend/static/js/game/MyApp.js | 2 - backend/static/js/game/Player.js | 6 +- .../static/js/game/RemoteGameController.js | 74 +++++++++---------- backend/static/js/game/RemotePlayer.js | 16 ++-- backend/static/js/game/macros.js | 3 +- backend/static/js/game/main.js | 5 +- 8 files changed, 60 insertions(+), 76 deletions(-) diff --git a/backend/pong/consumers.py b/backend/pong/consumers.py index 577e766..dc5e7af 100644 --- a/backend/pong/consumers.py +++ b/backend/pong/consumers.py @@ -108,9 +108,11 @@ def add_player_to_waiting_room(self): "message": json.dumps({ 'player1': curr_player, 'player2': host_player, - 'direction': { - 'x': 1 if random.randint(0, 1) == 1 else -1, - 'y': 1 if random.randint(0, 1) == 1 else -1 + 'ball': { + 'direction': { + 'x': 1 if random.randint(0, 1) == 1 else -1, + 'y': 1 if random.randint(0, 1) == 1 else -1 + } } }) } @@ -125,7 +127,6 @@ def disconnect(self, code): def receive(self, text_data=None): handlers = { 'UPDATE': 'send.update.paddle.message', - 'GOAL': 'send.reset.ball.message', 'SYNC': 'send.ball.sync.message' } data = json.loads(text_data) @@ -142,20 +143,7 @@ def send_start_game_message(self, event): self.send(event['message']) def send_ball_sync_message(self, event): - data = json.loads(event['message']) self.send(event['message']) def send_update_paddle_message(self, event): - data = json.loads(event['message']) - data['event'] = 'MOVE' - self.send(json.dumps(data)) - - def send_reset_ball_message(self, event): - data = { - 'event': 'RESET', - 'ballDirection': { - 'x': 1 if random.randint(0, 1) == 1 else -1, - 'y': 1 if random.randint(0, 1) == 1 else -1 - } - } - self.send(json.dumps(data)) \ No newline at end of file + self.send(event['message']) \ No newline at end of file diff --git a/backend/static/js/game/Ball.js b/backend/static/js/game/Ball.js index 1118e05..570d6c2 100644 --- a/backend/static/js/game/Ball.js +++ b/backend/static/js/game/Ball.js @@ -14,7 +14,7 @@ export class Ball extends THREE.Object3D { this.ball = null; this.onPaddleHit = onPaddleHit; this.build(); - this.reset(); + this.reset({}); } build() { @@ -104,10 +104,12 @@ export class Ball extends THREE.Object3D { this.rally += 1; } - reset() { + reset({ direction }) { this.rally = 0; this.speed.x = BALL_START_SPEED; this.speed.y = BALL_START_SPEED; + if (direction) + this.direction = direction; this.position.set(0, 0, 0); } diff --git a/backend/static/js/game/MyApp.js b/backend/static/js/game/MyApp.js index 0bf6732..ea327d3 100644 --- a/backend/static/js/game/MyApp.js +++ b/backend/static/js/game/MyApp.js @@ -144,10 +144,8 @@ export class MyApp { this.onResize(); - console.log(this.activateControls); if (!this.activateControls) return ; - console.log(this.controls); if (this.controls === null) { this.controls = new OrbitControls( this.activeCamera, this.renderer.domElement ); diff --git a/backend/static/js/game/Player.js b/backend/static/js/game/Player.js index d87416e..6a0304b 100644 --- a/backend/static/js/game/Player.js +++ b/backend/static/js/game/Player.js @@ -1,14 +1,14 @@ import * as THREE from 'three'; -import { PADDLE_SEMI_HEIGHT, PADDLE_SEMI_LENGTH, PADDLE_SPEED } from './macros.js'; +import { ARENA_SEMI_LENGTH, PADDLE_SEMI_HEIGHT, PADDLE_SEMI_LENGTH, PADDLE_SPEED } from './macros.js'; export class Player { - constructor (id, username, position, keybinds) { + constructor ({id, username, x, keybinds}) { this.id = id this.username = username; this.keybinds = keybinds; this.paddle = null; this.build(); - this.paddle.position.set(...position); + this.paddle.position.x = x; } build() { diff --git a/backend/static/js/game/RemoteGameController.js b/backend/static/js/game/RemoteGameController.js index 38f52d0..4d8a183 100644 --- a/backend/static/js/game/RemoteGameController.js +++ b/backend/static/js/game/RemoteGameController.js @@ -3,7 +3,7 @@ import { Ball } from './Ball.js'; import { Arena } from './Arena.js'; import { GameStats } from './GameStats.js'; import { RemotePlayer } from './RemotePlayer.js'; - +import { ARENA_SEMI_LENGTH, PADDLE_OFFSET_X } from './macros.js'; export class RemoteGameController extends THREE.Group { constructor({ player1Data, player2Data, socket, ballDirection }) { @@ -14,6 +14,7 @@ export class RemoteGameController extends THREE.Group { this.ball = null; this.player1 = null; this.player2 = null; + this.players = {}; this.socket = socket; this.stats = null; @@ -42,27 +43,25 @@ export class RemoteGameController extends THREE.Group { })); } - if (p1ID == currPlayerID) { - this.player1 = new RemotePlayer({ id: p1ID, username: p1Username, - position: [-25, 0, 0], onUpdate: onUpdate, keybinds: {'up': 'w', 'down': 's'} - }); - this.player2 = new RemotePlayer({ id: p2ID, username: p2Username, - position: [25, 0, 0], isEnemy: true - }); - } - else { - this.player1 = new RemotePlayer({ id: p1ID, username: p1Username, - position: [-25, 0, 0], isEnemy: true - }); - this.player2 = new RemotePlayer({ id: p2ID, username: p2Username, - position: [25, 0, 0], onUpdate: onUpdate, keybinds: {'up': 'w', 'down': 's'} - }); - } + this.player1 = new RemotePlayer({ + id: p1ID, + username: p1Username, + onUpdate: p1ID == currPlayerID ? onUpdate : null, + isEnemy: p1ID != currPlayerID, + keybinds: p1ID == currPlayerID ? {'up': 'w', 'down': 's'} : null, + x: -ARENA_SEMI_LENGTH + PADDLE_OFFSET_X + }); + this.player2 = new RemotePlayer({ + id: p2ID, + username: p2Username, + onUpdate: p2ID == currPlayerID ? onUpdate : null, + isEnemy: p2ID != currPlayerID, + keybinds: p2ID == currPlayerID ? {'up': 'w', 'down': 's'} : null, + x: ARENA_SEMI_LENGTH - PADDLE_OFFSET_X + }); + this.players[this.player1.id] = this.player1; + this.players[this.player2.id] = this.player2; this.stats = new GameStats(this.player1, this.player2); - - console.log(this.player1); - console.log(this.player2); - } async createGameInstance() { @@ -100,24 +99,17 @@ export class RemoteGameController extends THREE.Group { } registerSocketEvents(){ - this.socket.onmessage = (event) => { - const data = JSON.parse(event.data); - // console.log(`player = ${this.player.username}, enemy = ${this.enemy.username}, data.username = ${data.username}`); - if (data.event == 'MOVE') { - if (data.data.id == this.player1.id) - this.player1.move(data.data.y); - else - this.player2.move(data.data.y); - // console.log(data.data); - } - else if (data.event == 'RESET') - this.ball.reset(); - else if (data.event == 'SYNC') - this.ball.sync(data.data.ball); + this.socket.onmessage = (ev) => { + const { event, data } = JSON.parse(ev.data); + + if (event == 'UPDATE') + this.players[data.id].move(data.y); + else if (event == 'SYNC') + this.ball.sync(data.ball); } - this.socket.onerror = (event) => { - console.log(event); + this.socket.onerror = (ev) => { + console.error(ev); } } @@ -134,8 +126,12 @@ export class RemoteGameController extends THREE.Group { } })); } + this.arena = new Arena({}); - this.ball = new Ball({ direction: ballDirection, onPaddleHit: onPaddleHit }); + this.ball = new Ball({ + direction: ballDirection, + onPaddleHit: onPaddleHit + }); this.add(this.arena); this.add(this.player1.paddle); @@ -152,7 +148,7 @@ export class RemoteGameController extends THREE.Group { const scorer = this.ball.move(this); if (scorer != null) { this.stats.registerGoal(scorer, this.ball); - this.ball.reset(); + this.ball.reset({}); } if (this.stats.winner != null) { this.remove(this.ball); diff --git a/backend/static/js/game/RemotePlayer.js b/backend/static/js/game/RemotePlayer.js index d830a37..b882284 100644 --- a/backend/static/js/game/RemotePlayer.js +++ b/backend/static/js/game/RemotePlayer.js @@ -3,15 +3,19 @@ import { Player } from './Player.js'; import { PADDLE_SEMI_HEIGHT, ARENA_SEMI_HEIGHT, PADDLE_SPEED } from './macros.js'; export class RemotePlayer extends Player { - constructor ({ id, username, position, keybinds=null, onUpdate, isEnemy=false }) { - super(id, username, position, keybinds); + constructor ({ id, username, x, keybinds=null, onUpdate }) { + super({ + id: id, + username: username, + keybinds:keybinds, + x: x + }); this.onUpdate = onUpdate; - this.isEnemy = isEnemy; } update(pressedKeys) { //! REPOR COM KEYBINDS == NULL - if (this.isEnemy) + if (this.keybinds == null) return ; const targetPos = this.paddle.position.clone(); @@ -41,8 +45,4 @@ export class RemotePlayer extends Player { target.y = targetY; this.paddle.position.lerp(target, 0.5); } - - - - } \ No newline at end of file diff --git a/backend/static/js/game/macros.js b/backend/static/js/game/macros.js index b675831..d42259b 100644 --- a/backend/static/js/game/macros.js +++ b/backend/static/js/game/macros.js @@ -12,7 +12,8 @@ export const DIRECTION = Object.freeze({ export const PADDLE_SEMI_LENGTH = 0.25; export const PADDLE_SEMI_HEIGHT = 3.75; -export const PADDLE_SPEED = 2.6; +export const PADDLE_SPEED = 3.5; +export const PADDLE_OFFSET_X = 7; export const ARENA_SEMI_HEIGHT = 20; export const ARENA_SEMI_LENGTH = 30; diff --git a/backend/static/js/game/main.js b/backend/static/js/game/main.js index 4424429..bc77282 100644 --- a/backend/static/js/game/main.js +++ b/backend/static/js/game/main.js @@ -7,8 +7,7 @@ const username = document.getElementById('game-engine').getAttribute('data-usern if (gameType == "Remote") { let socket = new WebSocket(`ws://${window.location.host}/ws/games/remote/queue`); socket.onmessage = (event) => { - const { player1, player2, direction } = JSON.parse(event.data); - console.log(`Direction`, direction); + const { player1, player2, ball } = JSON.parse(event.data); let app = new MyApp(); app.init({ @@ -16,7 +15,7 @@ if (gameType == "Remote") { player2Data: player2, socket: socket, gameType: gameType, - ballDirection: direction, + ballDirection: ball.direction, }); app.render(); } From 75d647173d66ae5ca98a2ffb5cd84fea564537ce Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Sun, 13 Oct 2024 20:07:30 +0100 Subject: [PATCH 25/74] Refactoring + code: adapted LocalGameController to extend from AbstractGameController. --- backend/static/js/game/AIPlayer.js | 4 +- .../static/js/game/AbstractGameController.js | 65 ++++++++++++++ .../js/game/{Player.js => AbstractPlayer.js} | 5 +- backend/static/js/game/LocalGameController.js | 87 +++++-------------- backend/static/js/game/LocalPlayer.js | 13 ++- .../static/js/game/RemoteGameController.js | 62 ++----------- backend/static/js/game/RemotePlayer.js | 4 +- backend/static/js/game/main.js | 4 +- 8 files changed, 114 insertions(+), 130 deletions(-) create mode 100644 backend/static/js/game/AbstractGameController.js rename backend/static/js/game/{Player.js => AbstractPlayer.js} (92%) diff --git a/backend/static/js/game/AIPlayer.js b/backend/static/js/game/AIPlayer.js index d356e7d..3b7d10e 100644 --- a/backend/static/js/game/AIPlayer.js +++ b/backend/static/js/game/AIPlayer.js @@ -1,6 +1,6 @@ -import { Player } from './Player.js'; +import { AbstractPlayer } from './AbstractPlayer.js'; -export class AIPlayer extends Player { +export class AIPlayer extends AbstractPlayer { constructor () { super(0, "AI Bot", null, null); } diff --git a/backend/static/js/game/AbstractGameController.js b/backend/static/js/game/AbstractGameController.js new file mode 100644 index 0000000..31b19e4 --- /dev/null +++ b/backend/static/js/game/AbstractGameController.js @@ -0,0 +1,65 @@ +import * as THREE from 'three'; +import { Ball } from './Ball.js'; +import { Arena } from './Arena.js'; + +export class AbstractGameController extends THREE.Group { + constructor () { + super(); + + this.keybinds = null; + this.arena = null; + this.ball = null; + this.player1 = null; + this.player2 = null; + this.stats = null; + } + + registerKeybinds() { + this.keybinds = { + 'w': false, 's': false, + 'ArrowUp': false, 'ArrowDown': false + }; + + document.addEventListener('keydown', (event) => { + if (event.key in this.keybinds) + this.keybinds[event.key] = true; + }); + document.addEventListener('keyup', (event) => { + if (event.key in this.keybinds) + this.keybinds[event.key] = false; + }); + } + + build({ ballDirection, onPaddleHit=null }) { + this.arena = new Arena({}); + this.ball = new Ball({ + direction: ballDirection, + onPaddleHit: onPaddleHit + }); + + this.add(this.arena); + this.add(this.player1.paddle); + this.add(this.player2.paddle); + this.add(this.ball); + } + + update() { + this.player1.update(this.keybinds); + this.player2.update(this.keybinds); + if (this.ball == null) + return ; + + const scorer = this.ball.move(this); + if (scorer != null) { + this.stats.registerGoal(scorer, this.ball); + this.ball.reset({}); + } + if (this.stats.winner != null) { + this.remove(this.ball); + this.ball.dispose(); + this.ball = null; + } + } + + createPlayers() {} +} \ No newline at end of file diff --git a/backend/static/js/game/Player.js b/backend/static/js/game/AbstractPlayer.js similarity index 92% rename from backend/static/js/game/Player.js rename to backend/static/js/game/AbstractPlayer.js index 6a0304b..fa8a6e6 100644 --- a/backend/static/js/game/Player.js +++ b/backend/static/js/game/AbstractPlayer.js @@ -1,6 +1,7 @@ import * as THREE from 'three'; import { ARENA_SEMI_LENGTH, PADDLE_SEMI_HEIGHT, PADDLE_SEMI_LENGTH, PADDLE_SPEED } from './macros.js'; -export class Player { + +export class AbstractPlayer { constructor ({id, username, x, keybinds}) { this.id = id this.username = username; @@ -22,5 +23,5 @@ export class Player { ); } - update(pressedKeys) {} + update () {} } \ No newline at end of file diff --git a/backend/static/js/game/LocalGameController.js b/backend/static/js/game/LocalGameController.js index e8588ba..975a747 100644 --- a/backend/static/js/game/LocalGameController.js +++ b/backend/static/js/game/LocalGameController.js @@ -1,45 +1,40 @@ -import * as THREE from 'three'; -import { Ball } from './Ball.js'; -import { Arena } from './Arena.js'; import { GameStats } from './GameStats.js'; import { LocalPlayer } from './LocalPlayer.js'; +import { AbstractGameController } from './AbstractGameController.js'; +import { PADDLE_OFFSET_X, ARENA_SEMI_LENGTH } from './macros.js'; - -export class LocalGameController extends THREE.Group { - constructor({ playerData, enemyData, ballDirection }) { +export class LocalGameController extends AbstractGameController { + constructor({ player1Data, player2Data, ballDirection }) { super(); - - this.keybinds = null; - this.arena = null; - this.ball = null; - this.player = null; - this.enemy = null; - this.stats = null; this.registerKeybinds(); - this.createPlayers(playerData, enemyData); + this.createPlayers(player1Data, player2Data); this.createGameInstance(); this.build(ballDirection); } - createPlayers(playerData, enemyData) { - const { id: playerID, username: playerUsername } = playerData; - const { id: enemyID, username: enemyUsername } = enemyData; + createPlayers(player1Data, player2Data) { + const { id: p1ID, username: p1Username } = player1Data; + // const { id: enemyID, username: enemyUsername } = player2Data; - this.player = new LocalPlayer({ id: playerID, username: playerUsername, - position: [-25, 0, 0], keybinds: {'up': 'w', 'down': 's'} + this.player1 = new LocalPlayer({ + id: p1ID, + username: p1Username, + x: -ARENA_SEMI_LENGTH + PADDLE_OFFSET_X, + keybinds: {'up': 'w', 'down': 's'} }); - this.enemy = new LocalPlayer({ - position: [25, 0, 0], keybinds: {'up': 'ArrowUp', 'down': 'ArrowDown'} + this.player2 = new LocalPlayer({ + x: ARENA_SEMI_LENGTH - PADDLE_OFFSET_X, + keybinds: {'up': 'ArrowUp', 'down': 'ArrowDown'} }); - this.stats = new GameStats(this.player, this.enemy); + this.stats = new GameStats(this.player1, this.player2); } async createGameInstance() { const formData = { - "user1_id": this.player.id, - "user2_id": this.enemy.id, + "user1_id": this.player1.id, + "user2_id": this.player2.id, "type": "Local" } @@ -55,47 +50,11 @@ export class LocalGameController extends THREE.Group { this.stats.gameId = gameData.id; } - registerKeybinds() { - this.keybinds = { - 'w': false, 's': false, - 'ArrowUp': false, 'ArrowDown': false - }; - - document.addEventListener('keydown', (event) => { - if (event.key in this.keybinds) - this.keybinds[event.key] = true; - }); - document.addEventListener('keyup', (event) => { - if (event.key in this.keybinds) - this.keybinds[event.key] = false; - }); - } - build(ballDirection) { - this.arena = new Arena({}); - this.ball = new Ball({ direction: ballDirection }); - - this.add(this.arena); - this.add(this.player.paddle); - this.add(this.enemy.paddle); - this.add(this.ball); - } - - update() { - this.player.update(this.keybinds); - this.enemy.update(this.keybinds); - if (this.ball == null) - return ; + const ballData = { + ballDirection: ballDirection, + }; - const scorer = this.ball.move(this); - if (scorer != null) { - this.stats.registerGoal(scorer, this.ball); - this.ball.reset(); - } - if (this.stats.winner != null) { - this.remove(this.ball); - this.ball.dispose(); - this.ball = null; - } + super.build(ballData); } } \ No newline at end of file diff --git a/backend/static/js/game/LocalPlayer.js b/backend/static/js/game/LocalPlayer.js index 2dbfdb5..4ebf4e1 100644 --- a/backend/static/js/game/LocalPlayer.js +++ b/backend/static/js/game/LocalPlayer.js @@ -1,9 +1,14 @@ -import { Player } from './Player.js'; +import { AbstractPlayer } from './AbstractPlayer.js'; import { PADDLE_SEMI_HEIGHT, PADDLE_SPEED, ARENA_SEMI_HEIGHT } from './macros.js'; -export class LocalPlayer extends Player { - constructor ({id=null, username='Local Player', position, keybinds}) { - super(id, username, position, keybinds); +export class LocalPlayer extends AbstractPlayer { + constructor ({id=null, username='Local Player', x, keybinds}) { + super({ + id: id, + username: username, + x: x, + keybinds: keybinds + }); } update(pressedKeys) { diff --git a/backend/static/js/game/RemoteGameController.js b/backend/static/js/game/RemoteGameController.js index 4d8a183..a7e03b8 100644 --- a/backend/static/js/game/RemoteGameController.js +++ b/backend/static/js/game/RemoteGameController.js @@ -1,22 +1,14 @@ -import * as THREE from 'three'; -import { Ball } from './Ball.js'; -import { Arena } from './Arena.js'; import { GameStats } from './GameStats.js'; import { RemotePlayer } from './RemotePlayer.js'; import { ARENA_SEMI_LENGTH, PADDLE_OFFSET_X } from './macros.js'; +import { AbstractGameController } from './AbstractGameController.js'; -export class RemoteGameController extends THREE.Group { +export class RemoteGameController extends AbstractGameController { constructor({ player1Data, player2Data, socket, ballDirection }) { super(); - this.keybinds = null; - this.arena = null; - this.ball = null; - this.player1 = null; - this.player2 = null; this.players = {}; this.socket = socket; - this.stats = null; this.registerKeybinds(); this.registerSocketEvents(); @@ -83,21 +75,6 @@ export class RemoteGameController extends THREE.Group { this.stats.gameId = gameData.id; } - registerKeybinds() { - this.keybinds = { - 'w': false, 's': false, - }; - - document.addEventListener('keydown', (event) => { - if (event.key in this.keybinds) - this.keybinds[event.key] = true; - }); - document.addEventListener('keyup', (event) => { - if (event.key in this.keybinds) - this.keybinds[event.key] = false; - }); - } - registerSocketEvents(){ this.socket.onmessage = (ev) => { const { event, data } = JSON.parse(ev.data); @@ -125,35 +102,12 @@ export class RemoteGameController extends THREE.Group { } } })); - } - - this.arena = new Arena({}); - this.ball = new Ball({ - direction: ballDirection, - onPaddleHit: onPaddleHit - }); - - this.add(this.arena); - this.add(this.player1.paddle); - this.add(this.player2.paddle); - this.add(this.ball); - } - - update() { - this.player1.update(this.keybinds); - this.player2.update(this.keybinds); - if (this.ball == null) - return ; + }; + const ballData = { + ballDirection: ballDirection, + onPaddleHit: onPaddleHit + }; - const scorer = this.ball.move(this); - if (scorer != null) { - this.stats.registerGoal(scorer, this.ball); - this.ball.reset({}); - } - if (this.stats.winner != null) { - this.remove(this.ball); - this.ball.dispose(); - this.ball = null; - } + super.build(ballData); } } \ No newline at end of file diff --git a/backend/static/js/game/RemotePlayer.js b/backend/static/js/game/RemotePlayer.js index b882284..2de10c9 100644 --- a/backend/static/js/game/RemotePlayer.js +++ b/backend/static/js/game/RemotePlayer.js @@ -1,8 +1,8 @@ import * as THREE from 'three'; -import { Player } from './Player.js'; +import { AbstractPlayer } from './AbstractPlayer.js'; import { PADDLE_SEMI_HEIGHT, ARENA_SEMI_HEIGHT, PADDLE_SPEED } from './macros.js'; -export class RemotePlayer extends Player { +export class RemotePlayer extends AbstractPlayer { constructor ({ id, username, x, keybinds=null, onUpdate }) { super({ id: id, diff --git a/backend/static/js/game/main.js b/backend/static/js/game/main.js index bc77282..7e23885 100644 --- a/backend/static/js/game/main.js +++ b/backend/static/js/game/main.js @@ -23,8 +23,8 @@ if (gameType == "Remote") { else { let app = new MyApp(); app.init({ - playerData: {'id': userID, 'username': username}, - enemyData: {'id': '', 'username': ''}, + player1Data: {'id': userID, 'username': username}, + player2Data: {'id': '', 'username': ''}, gameType: gameType }); app.render(); From 84f20d1ecb5d4e7d2ae518e7661cef7c8f19cdc7 Mon Sep 17 00:00:00 2001 From: Xyckens Date: Sun, 13 Oct 2024 20:10:08 +0100 Subject: [PATCH 26/74] bug fixing side profile --- .../Screenshot_from_2024-10-03_14-33-32.png | Bin 0 -> 2271 bytes .../Screenshot_from_2024-10-11_17-48-12.png | Bin 0 -> 124110 bytes .../pong/templates/pages/view_profile.html | 134 +++++++++--------- backend/static/css/match-block.css | 7 + backend/static/js/edit-profile.js | 14 +- 5 files changed, 81 insertions(+), 74 deletions(-) create mode 100644 backend/media/upload/Screenshot_from_2024-10-03_14-33-32.png create mode 100644 backend/media/upload/Screenshot_from_2024-10-11_17-48-12.png diff --git a/backend/media/upload/Screenshot_from_2024-10-03_14-33-32.png b/backend/media/upload/Screenshot_from_2024-10-03_14-33-32.png new file mode 100644 index 0000000000000000000000000000000000000000..b916d8a1af39f48ce5c430708428c45334ed5ff3 GIT binary patch literal 2271 zcmV<52q5=~P)ZgXgFbngSdJ^%m!E_6j$bVG7w zVRUJ4ZXi@?ZDjydXmubkGayf6bRaS?GBhACGCDIeIx{jLP)#6LMN?FD;qK1>00=ip zL_t(&f$f`rY!l}h$G;ali97pDQYk+iCjpYiHlQR;0!cHeR8^6f2I&@UBrO_&mO@6F z(jtL2wVfCnlxk~4sWP;r?Y0cj61G346|%PKy2R52%SaGZ0qnFv9d-^VBPQo0{(bu+ zi}Bg-dp_HjiDdi!ckjLL`@A2&@4fHy+;e7rT3siAAl5U3j-X0ZwjX{xpl3?1tcGXn4cfOJ*|%TvuLd~7YUO=Xe> z(peUHHPrxsl8qYx0FHhu#`^l;=(j>82ylZD+W`Z$K-^kVl1~7bpRIa0rsvF12)!W& z*P~W^o)E&xmv*7}dz(eGn5?Ea4ySg#fc;m;V(zU+5GJ*9Ph3zC@Ieq@ip*8Ae#(^= z6FOc$fK?W=VuP5|yFKsWNM{!&d0z3pqa_P?Q)2`6zq}WE1!k2dhjScFEj!?Fa`R>b zkg-eeX>Ucx;R6Z5PV#)h11~fd;M8y5MxoJ=P`gAWIm3I}Td}9THEt*828Zy`Cx5}& z!Sir9InmP8vn*DwFkw^Ulc=w)L7}lgvak7`Y37inA_mwO3L>y>9S;8DP07aY;bC0v zJce_FL$VEiqp<-?+uD$6$fwqEILGmmZ*4-UdlErLnT^XA3Zf5cFeld3#{g>$`B;Cf z6B^2F1b8>b4jsZB>tB;HuF~mHxcylenwzL~oPYcP0|yT$)jv%$lRWtuF5j`83hU)= z;InPpl74{W)>MTZglKuW8@Sxw4zEI< z64(1Xd~xs)^?v>SR~4}nsTkn$=boch9@_SdVz6_%bNUSIJ;#anv<3r8Hhxo4dm>=1 zAs=})dqRMxG5rLqDU8cq0K$7?^w z$WYQv%5vzlmLOB3L4IKYmYYpfBPz8TD=I5sTvm)s zjRyLxB`Arif8ez@h;8#~sug{fMZj}Tezc-t0U$GCh5#TZKaU7K2m3XhR#dLfS|YkW zH#mf|gXf9%Y2!*pVc-l_hpaMkSu`{acDB7MrtITS`ib`EWrnjTVcy6U z8`0~zX0yZV@x+wRK}*4UJsw=MjmDIJ^yhx!7_v?D$0bpPfwL*IOY@?<9uKZw{EQ0y zaNQazEUlfxIZlk2GFTnbSsk4s0Yxlna&RCOvPlhIMR)-xRX=QR(oHPS&?ytC#dTC8 zk0O%fKqOM{y3R z1xt%%4XDUyB$g}n;x7z5HBOE{;|1hWyK$sw=d@gVQ=BsKaTxf{XzVco0PCN4oZ46} z?4063*VnElmb>hBS^djV7C%K~Q?Jb+B8|1B_3vn>yO9XuFOdoYwcN{(tz77Tg2m}J6Iy5+1 zd1U)SV*$2r-Ao+d*y%pSHY^|t*vGqJJ9&y&vA%XSs<&3lC1p4YKl=u8f5_XE?;BzaRYw|z<^XaPC7x5lJz^6F|ym;c* zlCGtfdy7Hp$g3 zD~OmcDG4nr9&T#c88RTeXPk9RAQu9X!JJDlVA`V$+8Z!c5TT(+>OWrt+{ zN4+R1JP~$cu{`NvA2xu$FLG$i5 z3vl!gVC>AF;OBX;ejmD~e7KZ$&j)(t`JHHe;rsMH?4vlovkjgEp_%C!I&dOi;%N;A zWSbsBw#fvo!2oT+><{4Q`Ts;=c1+kuF){i%{859XeTnz_OKn)ai$2rIK(n5i)W6dL zW}Sp7j)P+$`4noj{`SkaF`cHu+E#LMFV9qlE#1cwhQ6=A#Itt418dhi)cbSLnglko z`x+Qf9{Roq29$+f5Ws+P&1-Lt?I4I7BCz#;<%W}ye) t@1;gii)KkjN-A7jl)zH@Kk#DLzX4UKw2{jo6g>a{002ovPDHLkV1oN}FE;=H literal 0 HcmV?d00001 diff --git a/backend/media/upload/Screenshot_from_2024-10-11_17-48-12.png b/backend/media/upload/Screenshot_from_2024-10-11_17-48-12.png new file mode 100644 index 0000000000000000000000000000000000000000..26575efbad76d0ffad00147fcebcf2498262a72e GIT binary patch literal 124110 zcmV)$K#sqOP)ZgXgFbngSdJ^%m!D|AIzbVG7w zVRUJ4ZXi@?ZDjyPa%mtjF(6N4bRaS?GBhADH##&pIx#XJS4C4)W_t!}001BWNkl!{p^?hb~X7`c$}t*WasGa`PMq5Yx@ z%cCbxc?N_Sc(7bh>c}UX=Xmk7-jRkKB~2W}z_;Fhi|;;oi)I|D;xIE%0YF4BGgNhc z{hB2*A8%$?KE8O&#pf@Mx%~gC;{Z$rsfOYZo8K#z5eL~S#K<50* zCxo~_1@7Hib8>!;NrM23AT+J#WV<8A7Dr{ZXn1~_7)9`sxw}5#(X;22=xGrSmP<}| z1G}kU0<9PNu4POaG-74PvhUdr1Lh(*C63oiPR`D$z9pr?y#{{m7ru%m!(7WB{rR6$ zo4`p*|94x@YBfc^^(udPN}Y;Y`5GxUUKqm$6$u@ z&^u!o5<{JTZ?(eV!t-ofK@~|858k@ZUw`r$iGZqbXB|1)j0{%s&e5CEG!37hoz3@` zc6{xv`+W51bG$}sE!;U+@agmCY|bZsV%9zK1F;kbL}9#o@6Na2Jcg}z-t5DpI(y#L^BqwC_pjK-dtDlQ0PN{Du(ETm$@RvAnf4azujyjIS}M6SlJfNv8| zo}W>~0Wf*tbh}{~6Fzo0fsF9QqbJ~7pc31bPai*n*psT!F9Th_rr`MB{_sEW@c9Xg zqa!|j^bGS2J{P*f6=&m!sGzm7KzX*CsBIuwW#xqD!^ruRFh3jZqK>Ci!kkA-#Wj($ zGLj`wN}-FM2M9^ktTZD=Vq z5mtw!%}BdCWZAYXx`w8>mxe$^P=hES7v$5-=D!Q_&0e1C3xj|m7mP>Wb=*8Y=9|Cp z4SxH#{sI5Xzy3G;_y5EHNGauK4Z+Q~?(^+`{?F-;k2#K!<0HoyBjaQ&m}p(YEomuc zOxq3XHt?1E_i!P?u%Y*k_wL_kQU#O)@A%-syNK)Am65}?r8_?2R23f@T1%)Z+p6T~ zxxZYX+vnWw@A6w8e3Lkgh(K}NQkPMAEO{q$3Q`uSrT*R!?E`l}Ck z`1m0vk>Uai6?WS#&o>DdJgvfN(Q$eK(=?&A(#D3f-Hu$1G7NOBXO}9|bdFG2A1ryc*&st9O@&*l1*H}?Qw4L7GqJC1 z#>`}b7-Vx4aj5SwGNz6(WwZ&XDiRz@Bxt5-do0gN=Hr6Nl$%)S%_K95ft5-h0yG_2cjQ_~R>|t93g#TiK&p`uiYXOEih+1i zHnM`5VpSNjk&B=~F%d)@DQ65%&Y4ERTPBr)SixbGw51P1u7#a}74Qh96smxT;Sn?& zM_rE?7ouLlUOcD5-hf_|{aWj61ehZPM7T=AMdYQS0Px=PU;kJClwbbf7x{1gyMMut ze)PAm-UI00dYg~O3H#|M+-^H^o_L-!CV^Ya4p#?0JDX62zG>K|EkF9=j4HseW4&JU zr$7D}f3QZx5t}6+KYon!9p~eOyMK@K-Hy{-IXQpG&1Fvr4WFHyqauuF&$t(r-~D^P zOj{<*D@DLeUfk+y%6wUQuTt!*-oGw_xaj3yoO^LIFGm3vuWO>1)ctujE0vFY^yDdj z@WUT+=fQgnMWAVMT1lnSx(;kJ3mV4Sx1{QzD%E*1N)e9*PclQh21|*!j7-ynG?C&x z6FWle$m4{>p5hvUZ*k61@NCD5^MO)@NWg_2DMD}&rirQ^7dz6FNj8!33`NM|NK@u) z$lwE66paq^N}dcToJ3LP`lWsCl;b zVun}U3vfYEEN6TO{Mq094L|(prtE1F~Bqt@J!o*P%FL^d?|#+u^9#&uR`<}N*A4Hvl|d` z^fKbhjymkn*n)%JK{uWA;a9)PTgNvcC+c2?V6VJRan-07wFug7M0!=_UC! zGafv6hu{1Mzy7)*xb@z<-1wyrIX9&iL1RB}PzWHAg2!tiG=Uf+u2$OMX?>woKq_St znz+KG!Nou+o@$OJbhH-O?Fv{x%s4n`5D`=&ns!(xI1_&RJHJ9F8M8uV-T;rjx&gS> zbHBC`S40bMG7eW^1{XK3*7}+;xNI1bll_kc)r9IDkA^M(^Pl`*aJZ)0gp*3pO5IJk zu3^}0NTm`bP-~ezr5V*S;`f+?DpdrB;Y4UcB-<-bAR>70$*M^7ptHwmV?#;_DMk=w z8V0)Hi7M1Ip|ud4!!;4Dm1(ynh6X}JYDG#0QJN6(CTKO%G!eb0agJ)4?KGjz6CLEV zqoy6XOlZweM$$0Qv@InKsI@pz@;Kp~qq>B~fRzj;lEJW%m9BWWT8MV;XT z{N<1T3hf(e$s7bvTPxPKBoU${`snDr$2Ad8rVF0KzNZAGDD)z93fo#~TtjFZ`WQG~ zFUbfh#(LSI^(I9Es<3DsPAl8uQ1$pav1l9Ked`{@dAPae_RFd@%{U`sJfA@d> z;Y(xS-~RAJst6cVnT1+o!?4>DL@6R<3g!iqjCf&gw3c-W|7}w|TS8dEy>pFn&s?ED9 zHMs6t0M5W6STYdDE?557fAf39#fqT{R(CX^GUhF68Oxb!iJV6uQKkWZbO2?GQ$s}Y zn&<;0GfxFSM4q*|+#c`Gv2)&sWz=T%MRD zW8!A_YO@h=&ds6b6-s#7Q@`oPFB_AqB8tl)*mVZrwd+%nYM6MEQ-1i-$J~AIeQL8{ zEQLEO$AKR?a6&MnaY8yjXLaL{vdv`494uFS^&4MBt0%ci-*=>Hr0N*U#Ikejc3bY; zUNMzS<5uKx%lfD#xrmfZo(7H%*GTXrF?{10rc=y&$~bcK_=tyJe2zKKZk$-Q4G$kZ z=4{FogVuYNeWVKHS{SC0YCTU*p5dAWC1q|LE&1fr&nV8LF3`t0Pu}b@)qCoA#=7fx z`1lFBTq2XvN6$w;{VAbaB2H<%(8j>C)8~ZPlgD%J-oC@5$4?;kSW0x!advh_mH{6G zD~YEk=OhgjjMf>xZP;uFk~eId2z@()gQB=Ha*!+AX`I2nJj-F-O-!{g<%v)#sd$Dl zQM@PTLcy`k84Yp96V#CjWM<63InQ<~__k-PLg*J5vtd=Ih*wN!q~C|xcotdlJZD_j z5Q^j7^)cUi=K*8cf$S5DJvN}#pen_I2~@6*ZtcS3i`9dRva8p~_(d7MbNlwo=l;g3 zCa`*l{rd;UT0BYPgKA@^2Pl-MTrYYdN zKy?PSQmvpW)M}uWvfJ>D2XFD+w{An(lAR%Y#59YNVb1j~+~8${aGl~__5O>EyZHa| zc~>d_n{WmZVQ@fI#C!hbzy057?%d`_kG{aF!{bPIjyQY#oWU#JjMfW{!Y5B3(@9H8 zBVFt`-R-a}Z0kg)%1=LkjOc<=EA6ew>3PD}aV`^ek?qbHCZp(p2gX)O<|tDk8=MW9 zZ4pcrA6hmA&eB}sDhQSZsg4~&HltL>rV7b-6dWZO*|(I|&)^xJEtQ=J+Vm6y^$p~6 zBs6GnSPkF<5*nr|w82wEkr*-OF%@u1MhWc#)FZXQoCDubj6L=cNg4d2p^#~tC2BjI zwq##Pnn=!p4^%a(tL$=R5|4%s)TrVqE>P7`tx^!wdB&8eI)iJ;3^So7!>XeR4T7f> zC(oph5Xgf+xm@0TjredW~L@A}t=?{wc9Y#UO++HpC&2N7bcmA9Z zWsX)5%HHpLQ=;WmCD+t#(yvvUC=B*pA48cQ->^^(Q5Ib_t ztd|aXoOq64QaS9G^g8mz`9$y@Eru82^OI*d=Qumf9Cq(;el}1ROUCT^EM?9&l^hF} zM}~bk_I#5O-_THa@Xj&6{N7zil{pk*4)5j&dscb@6M?-EcyYro9)Fp#UVQ(meCu*r za9t#k6x5(8^AD07WDKXU9y8CI761BA|ALRE%Gc?sZi%*$Vg=_rG!EcBCXwJBdj5d#LZYC-2&ED$NX>{A zq9q0@s~Cuqzy_*iVik~#2sCM;aUEkW_tx$Nh(QmWuh z07r39tj;RGua><4Bj@PzRmguix-~#_1{%LCWq$GAYPo!62&x%vzhGC4ijpgM=cvV~ z2)j~<&QU|du2v|O5+gMT>!*6#8~Ts;1&>*>ABbl)zg7*XmwG3#Tz$&$5)JL2al#yI3i^f43aF(!r`N`E0$pbNXa_cA*P$B0^ z+eUmXq%_gT$WRh{WQSUfrfrzU0mTtxggT*8@l>4E8B?~3D@Mr$s|7K|nGw}+B&Ml= zRT>XbXMTVW4o@M-OlneuIwe|0)MjpiPCH_q2z5kIIt5pD^pf{R%Mq&)Br{k+3OEX( zCKe7{5NZglf^Zfcy`KTll^2Q^vJ)gmqGXoA)AbJZ#@H5?6mIpA7<;M(Zgm0jlF31= zk=_SNZP=tVM-pX@Tw7hBE+7U+2OX`fsjj7z#9{9_I6h($PnJrjux@%*zQKY+w6N#{ zZ|fn+&Bku+0>c0)&Y*6rj#Z3&@ZeoYWlklLS)uEU30;?lUK!=WOI+Y*oZvN)?sci~ z#pTrsmL{Bfj7m_QQEr*TIA1GKl`;-^@2OUhoJrF_P9u%V>_uu~9Cou6Y!{5Ruqy=( zo^(F4Xd;0`ZRjFY?$pgoIK%~<3o|S`J2NC0l;u?(1 zK^qBjlc{N_#ps=<)Wir_g-#uP06jV+OC(PNZQF47_HCwWMDJMjk)~5ON`z63x-Kk(E|Taae^W2HF^@B~xR> z8qcW4SQ8}`ZY+DAoR8@Brf6X-136D*S@3joLeid)3sWm>HXC+8ksV4U zI>*^|ORh>y6T@`G7muGJae-I?R-8O}gf$(-Dt&;{^HWZTjEjLOZ8^SupY8K4Q<=-5 z_io(a@zZCxu7PUY!}#D=e-)n#K|oB9efW>eN_~~GUUpnp8H>xhAQ#Sk(|K1_7koou zeYnJp1=k0>OWa-`@V8G-Nme;6qF_DnXijLQ8RhnSxQzdbnMX3&|PO;dMbEfYm zoG4SNOjT&K(E6U!?SyEg7sEmo{^K`yfTd=$vKAYj$s(EQrYbmoSmJ~G!4OdcGJXWoJd}%6?Pcg z?UwUe*bL7(CGeFSH~IGa@9=ip;!38vIq$lt{1fw7oT5cWK6*7 zixSUFA+AL^wZ#AQ?|+ZC9=y$upFAaNKzwC++w<`GDcN~c1qm&WPtMsj9xKM!HXMoP z$@w#;1z+fZdJQU+>NMv=GdN5^3 z84Cg5FR|pX&|p3yO^e`AA1HYwv<;>n6QK|Yi#3xuM%z)ep}K(j0JV_R4bV_s zq{xKEJt!zfLP?^8*x=QXvLU_&7b(T?p<@^Z#$vPa*aL_@2E1z+spML~2h1FbBI;(= zV4d+H?UZ7L*mew-W+hcWlbdY*(aZ$z0$F)Uxh+=k!Osy+jMSV7Az(^Des69cseH9enBb|JM}!T zN^61?SQR))hQ`QLD~&m}CY%>VyJPA!@!mV{@s+!8p?No>x;C@FF5m1`H*;Nhe^owz z-DbS$dSAvDsBVU7#FUCKdgWjJ{vT3TYl>^AzQMO0bk zUlUORP1}>l4Wf=z3>O@to-q|n9nJ@$jWl9Jog20ag*N(`d_=`d#XIPNXPXKp22u%5 z34V`pICmjJQl?y}8ukJ=6QQydidAZv6{d+TDdoA5C1<1-yeNw98^LBoyG$F9h^WJp z@m6R91gqpa63Eoy9HS**bWTWloGG^A@RnvwB+X7H)Qqp0$o#og3(mEO%{YrwowcbJ zYE3vbsuiqGh*ko73|X@g2fN)zG(iZP{xQ$@^Cr%WCu#8pZfu+%c_&hU*Or-~25OuswcrL8fH?-*kR_NoL=q z*jLH=#q}m^?aSodXJamTh#=mRYKEZXF`)v6Lwo?=kc!PhgF{^)ml>JOrBci&wP5z@ zgJuB9_}bn3eDK~o$TUzzQ4^F(sTmRXDhjyd!7ty~Rh5D_l}WA&tuAlKo1%ev%_05^ zJY$TWfBE~r&vUN~*@z~D3VBSl>d>5twPLy8#4s(WtN2E7S`h`S2_a);M03JhLQ6ti zqHi4DX3RxvCRd}jLMjIM`qj&G#NVW2_>OcW?;!GE@wmx zD~Z+)@M%XKl$r}>nYCAPs@z*I`DfqxfPVL!>Wm~FwJ>u8od20G`*%_3t8j#?-g^^y z=&Fsp%Gij^onUjA==r0+_;XG@Ocq!YS@edHC4FcF)CO2M12yc+% z7qWSI{Y)Br!8u+f>u);WzkTBdcNURV(;-nQNY$WtNLGd!M6+A$6rsUR!oPbpBA0G1b z=?PnenvLT{hdSeI0%J?-g|RF+JKr*$ZW%UPjJtgN^eO5hH5cd?eDvrUNoR7|;j%?6 zvr7sTBoAo6<$0YW52bP@%6T=C&OH;uSU4+{lax8o4lMI*w`Ft@t3Vyu*#V<2u-4&F za`l)sm~Uq;1p$$k$vJQZVPvaNeNU21-Hv2!seW#DGEr&_WbY^@RCTyc(VS5+MEzW1 z^`5FSducVCQ>GeF*W$e+nc$iQ=2}DruLU9C`heRF{MxsFiQ|KooTrx#1a!}b0WRPH z6?<9tze-tOfr#a`=a-k+n|o+pGb9)F;8JAZKmOtwdUMUECnM+Mjz!}MCj98Lr(`c! zP7D(H(X%s#C(n_R`SyeN_>0fJU@RVQi3j)ZwUa7C001BWNklzqWP=M1qOfje7T+*tq*QKZ$Jvl^tDZ4c*3vMU!|>F(^8)7@ zv{^8j;C;)kD)^o$J1}s*qe#GqmJnO223#|Pblyd>f#SeNoL5R6DOz!DAV{R9im8#M zfHpX<;97E3v~5r?mduoGSsT%sIaVN1ie{B~%PUUUe--7-eE~b1LJ^D9$Ka zF%h)toL(AOGE@a84yQn#+kVrK<{1pN;(SD81^|URe{W`4NmHQ|+t2M%KxnnnNuf?7 zeY<2(L&A(v^bXQyL)~ro_BX!4SKfY`GEOh`O>LH?i}HGvqF#<-ud8ZZx88&ST&$$k zOV@oZBB&ZjcuH`TA|xM3+LE=!$AC0D2!eV?qn=t4nL=m-PFi-UVG@NdQmPR`gJ$J7 zzWZHn9rTd%)oA>SFKFHv!lWKAGc{YKAzF zYWN!Y!51g|-Vgp7S*{SLI1izTurE8QdYo6RCMt77i|i{RDa}HkT|iw$P;%N5V?@Mb zIZ=x-jfvRJQBz47t#w8xazUfvRS-A#qKn$xlw)&#Z?!;hc{dYVJu^s_aw2#)D~js=+J(kBBKyfpx#CJ<8h5i%Dg~_>M}aayo~dG% z6H*GnGIh#W^h7V@nwW+}TzU%4dMP(h|N@PWxG_cQK5)&XfPYAr)P|&g;j|th^VmDLT_g5vmxcXHWTq z@Bb;%ca&jZxnAt*fj$g)mnf4!S^% z9lH$PN1_DQs}Ap#sxxr6?gIJdn#nt~8b?iwZ-mJQ(k8L&B0ZI653UDItXogA1>zvG z;O26T-Gspfu)@t%$3g>>dWsmq8xiPY!{i{8o<&sNxqFjA6;>UKCUE!G4YCNO7%@0@ zzOq_%%<+}c1~@ug&1KO^Xo6#XbV!weZz8T~abZMUM1#Yt@Zi=BzW(5SWSZtqLY0?v z`B}!U58bcB#;%jut7QF66|aj9@G5rTB>0#Mf>d^Xp%KkC1jGFUX|{L-O*!y!L{KybR4R z-}Lp?@&fVa4Hbgxz(#n1+EzpyuG%~lMjcs{sTRKf@MCVg|29jBGghlJ9Ug??!ilHTOsKV5El#Vg)=oT%w#WRPz&(CruI*-~wbJKBp_MB1@$z~7x zH$VLZ>z7!~Xg%cg9D~6roXN*#%C{&mi=u2>mc{vY9YfD5apz@$_s+=4qqS%YCUu8Jn1dhLa{nGP`%iq6wgLNDE`aAa-tx!wiu=PB6>n;*J zyV}tNxO;0&mPlv=T@a46pGP>!62x&3THbLz|L~W8kvg1{+^Z1%^1906Rj!T>{w|>4 zRqOJmT%Uivhz1JaFoBF?K>4?S{3o3B!jrR8N)}d9NU7zgr>9gLAq(N&0Uv*U!lZ>@ zg15xO$2&$XG#WWr1kz^5Nv(L-&^n_m8XldTQSy#lN7MzLoNVCvgjnYO%^N&=`UHy$ zLI|wehNn-TGKi;X8Ww6qmv}l1Se-y7md!C|<4E33IOo}k|a>$f}DnV24UNxO`rrv8yboe zs`ua{>OILBRv{rws!Ta^qghg$GI#Q+r-lVtBfe>wYN7EB$+a`vQ0IXrlT-)`vX4Y{ z>@o~F<6LCS6WNqnp=~0!4p#iyw?CwgTf*MiRre|y5TI&B?dnqa#oYaka{NM8FX_$; z5dB3-@=a0qby4+esllH={ET?e@q^Dkhu~QB4U3KAhmRl4!eJGEv*QP!JVV+AIODw= z2Rz>FVBg7gYteI<6Tk5*f1fxO5Kq>*L~@n&xjH|e(b^X|m6xj~v0*BOB9L8WmkUevqypkSTN@dfmBoCZRwx?CGC}m11S$?B z;9G}EM5It;X1Dp^ktyT7r)gTM1cZutPc}uJCnHRyfOEvAM-W73N^28kp5m(@&dr@` z-cxM`(2C6-9C1hpRD+TVAt<>TO2P!6@maIGY**&1Htwj76V5mPZO>rJW$iLr%TU0B-LyNAxmK%@K$j^9=C*c z#<+%bO7wwfh29xAx{lxe@Y}@QX66KlQufWn0(fS?G+&xRe32^uWiowPZn>ZfuPgKQ z+1p_YWNl}3b`5}^rHt8-Jf z6{cZ_sBz#HL?`6^Tsy59k0)rwxt5YM-UP{j&1sJ0xuv^Wp;|&}!b?S@kcJWIJDz7l94h&9&olFR70g}A_=fsZ~|=;AVhr5v~dPyUE|o2 z>7x*Ar1gbP1a*;>H&)(|pz~ODS1I1+nE-AkKD8mROGb4{a>`LBOv|1kij~A+7g^dN z-}}yow9~-S5?kq+{tZz>;Nd|vH!@cgxi zz{wW#6}5A+>q!Qqi`23uh_h_MtDoh`V>dG-u2qToJ`Yk&SuWXlq5 zg+-YHMUb#W5+p$o+icy_doA~7=DQq!cyCo#*Hkq?XGBMJ-J5sGtamx*InQ|>>mmo! z8QLj1ozsUkesj)hz2=Lu!KA~|%$`5uR9>*%LUhVt${-`D1jve@yt9gQbCV?ZF)<*- zDs&;RVWyYLdT>-rBv)8lWgV0nA}WQo6OQ)RobT?*p6^;&HaXHNEhnh7CvBvZU^X(x9)TM@{a{ly*+?%n6ypx2(k1I}}#Ldx5= z*z`U7PQf1%a$ykzuVU90y11Z^J^TB@vN)_8>8YGA7Ho3^4ZGUPf+9VeIuXrbr9v1; zF5%`zZpz6}Kaf+RMtHs*IiF@k62Xkk7G9ngR1;DstnBgozxC@3X##<*@1W!+rXo9q zAz*d@hOgG5v1?=ZYRBRA$^4~BeeK-W8|Q9b@utf0<;!;eeC0Atch!JOlG?<9ubl7S z-8UPdIRpf_H;Y^K0A5AGfTX4 z{~ielmRKuvixpJ^q4ON{9S`puQ=G#Y#31bLFIhNGMCkj-dcA~xfF$g%J$@S5U#+p~ zLAL}E7G1<^L_$-cbIQwVcyr+3#0Ne*eMyi3mBMNj`1I9FO6VwQ z!o@p$^2JkRwW6eo931fS^pvvW-Y;gs2j%(cNEXNTe1krCm&Y#}k;z$Qf3f1x$tj~k zoldyF7#MRxoZ`J=X=b%r@#^%vrAT=O6&|0wz-doaV>NglKYQ9F)N*3&183vJvs5X$ zau^)qdY*44W>@jW*ssddZDQ7$zB-0J@~Rk+@nSeUo0^#|Ahf7%s>&vh1T$6+e)}8W zrbkd~#EVi}XU@e~ygJUW|9oRU$eT6&>*M#P$KD1iUY#q~kD@ejMiq(}&MF;BGU4>f zQsAF&N8ZUZ!@(Zec}mVC3Kl(Gx1gI^C|D7qA1F@PZnt!K!-sqO{O0kyFf}HXsl%+* z|63KHUS7n79{cqRxqbn+UC`B=aoagJrU5(P#^j>&>vdRF1-vwU`=7pe!5{zVZ+Kaa zT3h?;uvCu2f=A~G2@$_J$Ay7UpS~h%fSi!`@AB#MbJEW7$mxPduSU*ZY*>XA#W`Xc z871Q^GUrp?SuS`ojyQ5N-&n19F-_ztGv<-wy#pSdoH4te*mtabYiOxE?!dG&2YE5g zhz7=5*%UY(3mSx6jImaxR58gE6_P01(w_6aNu_7^nvjFEw9YqOB5DP8;8?9-)#1#e z)j?LGi`3L2KQnE)Z^@`@=Ts9q-!%Xd!F4^7QWInqCFKgDm{UXo;&ynHj}220+2Ii_ z9do{MfQ!{8PaXrP;6tSE7o3in;3G~eRx@Z*42tTgQ%0-e)!|}~jIx7>n{m%YA5%)H zA^m^`Pp$>$VKC)?{wM#8wFE*fRB_}|QRgwckk7l=yyf!u>tpij*u7W`u1@{8P3m7Y zow$A!YZ5Q{ph2pjwRW~zJ{4ORnD zL#0wnK{0}BL~1L!sR8fg%34{n;DW=nL0%QeVpwogfugmUxI{-5FbvelmMNm(Tw5@9 z6kYEcWH#U!5av>;Ipd3=x!|qfE#QKuY&T#{Qrv1qd<&=Nl(3ZWYls)p_SFcvGhlbB%JEt5Q|jrrL5s^^I??0W3EZnbuA$)sf1KGLwlEKy9X)QY5jR zX*KzGj>wXc;EB#tHKTzh?dFtXiMfmviB!pqxwf54jZO?GIICDm2=9NBrCDABp5 z(mZq+4(&Xv=vnnWx${&ExiX1CSB>aAu6Pz*=$JY9Wsv`E|wgu z)@*l`jHOc+6n^)c-{S6iiJK?HIkHp?*==@h)Zd0<-4^QKw&`6&%{KylU()J$bD_8n z0=_OYwoO5Izq z>@$0h7SCREc$;`-3dIu%>;+FPU^Jb8d;J=>Us2zYH1nWau(}_ZT)>>NA04(_vaRj< z;ykllE;-JX8K`7d(Q#BGRc4$x*2{r+@7>2ahdNkl;DfKcPl_#{-}g$H7Hn|1D!UN4 zQk@42nFsPmRYGhYeL(TQWgsH#Y=|)@Ie{RC(tHR>UWgc%{*bQlD6mcL*&`n30@+}Du=6%Cof-tpIQ&WYQ^UK zlxZg*vgaK>c^;jfA!_9F8F_G*zyItp7QvUm{yR&aKYz|P2|7*4!v{Qh@f_jx$I5Yo5H^Fu4XQbp&3G zTeb+^0-I>m>6{ZBDjlJW++VMF^ztQ}IZ?9_L*Vmg&sx~#jpgw%PflNvrNbOdG4Sf_ zlu>-6_Nua&6HiV~o5GM4bbrOik6+;;SgPDzeZZr~Pw~S*DKqaL9`cJvpOLx_GvVH1 z!FYbc7qt*15S($?bv)Z{NweUbuv&C{{QM;r0#Xb6>lKeTXOynFDHRrc{_+GuQwUyn z%F^Iu99v&RPIQZo7pLdU(PL9$s=~|dgbh7qoLO~=)6JHy@7vCYG0ziog(*!~HL`e2 z1KYVUlN;Mmm1;`LkWn;5kcOdaaBSv^>z1T6Awj4$VA7FFLd;XmGj0pHUm&F*u}8as zA`raiH$V6~_g4qhG*T6I`4?J2M0d`^jtlJlwo>;+m5OT{*Y(=}ZJe3wK;(5mQsfpn zzKfsQn#Tw|fB2{0=hL$-CA3Di@hVvO@zW;|13&rsFVNKiX&TXccNw>5oS#*KI=suo zH1VB#U*(~1VNy}SszWL`kyg%7qiEA|^R>xj=W8lN*LU*kmSQ(u)J-?=Z41I1`LeZ= z$z@z%Mh$^K{o#M*@%D`86{4;vrGiz?r!6Hr(rkn<@MUReDoJ}zXQLWE9MQCiv zVbu^;D&jjr=o?8YZCaUC8W4y$)ODEaFpa2hAYMkncdaupDu}04ZR|v=*T3>LzW(q5aXT^x*93QHa_p`et}0pN(m&wpxV{z0hBqn< z7w29dyEl#Hi`3xFxpDisZ#*VVHTiFU_A@>{dBx~jQy>Mlp=$jm7{>uJMx9)6W?-@AvUiR2We$xNARe>Aa{4)}8UEhvsR7*W8^)#c_1d~sY) z1>RONR9^Qei0sTFcE3Al2A<|YDn$w@IDYu?BmU;u20cEY-(*G=)ce+vTmu_xJF{n^ z`UT*rQ^H%5yV9hD0N^Q>cT75AQ;lsd1U#L9iZ$P$X0wA{8Owm1a?% ztm*F+!$oPP8or~CyB1`pJE4?{1py0`c_w&8*a2-SR4-IlsA7oosJa%Znc`ZGgt*;C zS1VogsKJ~@O7(~|gHct%EQ70b(!fD#>v;%fL@CU9B)YI;<~b;tDoV{0wam;S_}Vl9 zD=nG|mdSOC*RBz$s*$IOA$qK)rWy@6jL1kzi4Y)GW8n&AN<=o;G!r>us)aPQs*3uE zvrJ7H54hQY3758bb5s(0GV?TNR#m|H2BxN&@4Wv$zw_P$B#%tqu-Z&WWH-p_#SXh; zrpRuGzKIjihWp#g-1hpxH#e}|^J+Wof@_;(>q>0S&EgCzh8DM57z}Wuz|^^~QM_K|G6+I9jf-X^VFqCY~cN zoHRjgCCv6Te(Tt)YLo==4kI#!Fw+By1BQSHekaVLTutx*>k z^M<3K%==3S0|p#9W%2Hv*2Zo^bQMK7T0^zwgK)g;30;p!p;mZz-J{lI+cL&_SRgJ? zU0Xn+R1OdJ*raA<-c5x&OOFrx)LO~Q#L5RgymzlH{9+so9lcjZZC2)Muj~yyrx|7| zbXnM6JM{gYlnb5r^j(7YB3q|KgmvHX!8g9ax4-r^n8%&qsl0*2Umtt7js3UP{%?D) z%Y{RmAdX!;euZ*#HTt-mD>&kua1|zj>}ctWfx5uI|GU5A2S5H1zwxaP`HP=_Mp&%a z=9%{omVEKq%ggWJhn(r>k%y~+S7V}KYMKv#us~2_=1zi0855WT7hCyHnr2|p6x$v{+&pG_+dtjbpag?%Uc9Cj@STf#6 zo=t^nLdY}ktOM>Vcbn7Be9Y0(5kC5W8rq#1go^f&8GWQwhX!HLzSZ^Bu__hslp#n1Ekkn+ z^0A^3qIgP%RE*+1f{-jS;z{_XF&QGK=Of8=lu{W_Mrz;llL=fQ&4u9K;pbnx!tKOG z9_+!RXU{P4s2Hn0Hkq&r6G~KJw8*2=iD^3`RtWJvKY9F&E{0b7f9Hrtj~viFfa>`Q+&fw$5;yiQoJ1YyA30-$ceOA{U5z^D?|C z9lfbEczs;oc3kBPTtv)QH?!*%0C*Ery!yEcxC@NV+3OZ)-|>T={gnUu_!DHkqzE|Q zWCp}LI`1wm(g6I?!2yShNSP;W(Sh?Uwe2YHdC%|s`mYhvh`Y#gc6DNRQF46iCBHdQ zuZHl~Z_2L{P5dgy)qF~%En3w)r{m0j{?T9a)6FU4+1Pvu`;OD`jI*8i!=8667ArnK zIb%u&>cym+zU ztX9y-($5?YOCE2xc!}g`!-sc|_@F0$GXMY}07*naRGUYS@qWcPj(p@IA3r}q7Maco z%jJS6=Od?VQSt0AB2p?R35rwtd15biJlUROegT&8q2uvpf@IXH^nK5>1i@9(yk&pA z$63m3tzstlB#iUSxr1IkPK2{GGfLA)NGUNpnAE^~QZXhGMyq6P`g@})lM1+|12{`l zK%Sic@{weP9F$mF^}=evxuK~#;VI$>en4F2-Ft`p-gkZroi{kSaN4+t zI0Y!b(k_3~q`mE&tM4W4i5t%|E2uW9c(aSrqQC`-xGKpDMJfgGR`KHa;iHfF&%gLF zb+L!dg_OaCK+#5+s-jeRz4`jT-Mr#e9SBwVbQ~dijwyT)mG6G^bpqv*&D^xy1l=** z)Y|Vil>pzE{1*!VH#a<7f9=%>;cei`#do@@Yk2YVb$SrlNZ?<8?~hsEKPGQy3IXQ> zlk<2N8^u=LuGvTN8knUZzHcQ`sdU4z<4qVYIwU9=qe!Jv+heX$$juQqc&b4RD+G_# zi9$0Tt+TNh*3=q_+DKQ<1n(jNpej@duEUEqbIb~)+<0Q9E$?@MVj1!lY|)@grxY`S z1L{n!5p~U+bS{-iWJfMhOq%LZN*QxP6^9GHnT70_dzFS0lw3(v%ryfR6LuUDniFu@ z)xo8aq6%#hrndawsl$m*OSm%Vs0TJ5~VGJjRluXTKCr4HYqK!R> zVYLuN@McZ&EZ5d$SevXFqPSAgT8P0T-Z7>Trx8!#ZolMz{DVKZj0B1_4-2VH4ce?A zJNfoEC#k%#>0BMdx0MsG|9;a(ciqMKOB>sjqy27VHEK0nZAPk3PM`C)AO8Z49i29w z$igx)&tzAyd1mPbhVc6Ryd_UIVLhx_Nk=hbu#w;S@SEHZ9mU37P4XgNsX+TRPQPu|0V%GDo{`f!gDl{b}mzAsy6uZ-{G2a%Q zRC03(W+Im@E<{pJxUj(a*qDJTR8`DHBq(KUEyT7n_pH@u9)#d77<<05owt~)lsw~H zC2OWiMnXh$1)0e<5w*4frmyOM8ck!+y#2J-yES=L;&u@JA9*4`J zt=1+W+AzZF7h~Gc=UuLI)6IEXcz@djzipCVea-80z6>BO*VY(JnSE_4W15T9TeP(EuO7Y z`kc5kEZFNjRXsxFUMR%-2bgc}$;V;lTle?KVF@*HG?Up88OTf zr5J;+9Q2M{JmQRN=c>3dV#b+`tl21 zgfwrvkn8`yDIItl`g+sC;p7IovI^#uk3asH^G;YVSM0e!tuyOohvk9>C5jRIfz4EL z>WR{L{j1fAu_)Rpi_mfZ_#QJESBxR{^r43!)Bra0;!^QD=fQr`Pq{fWIs0W%SS$W@run^vn7B3;E2H zS*h^&{1op7L@FO0AM&@4pP(+1N}|6%@b{0Ok*%5Gy1U2xddynqqCV>Gt)RC-tqa#2InBv!q6{ydU8&cx&4igJg2YDF?CdJF3ZbMcwP;g=9Xqu zcr?#Ar&ubyBY`i@ChBsDl}a?>$@w{397znifwS|GmzxX@`Z@9KKloi373VJO>{@%a zv!*0nWtR#U0l8iH<6>N1Jb$&`e|?N!2l{TRf?dvqwlZBlew(I&?&jeq=coLezx*$h z{UyuTbAGmEJ48rESg#lra@<9)-4bUbL>d((~UO64rJ?-jB%Znca2*-w7VU!FeY z=_}=|ZZSLOgX2S3i}S)0&Fo3f2t(dLK8Ss+W|)jaWsfBt=B*aveA<+a*$ zP>k3!NLCS7sYL$r=_!Bsx4+>2d+&lfM|NOWa~W=$`IV+lBTjMVFkh)9 zBNA}YQO1cRiu0@Hy`m1Qj%V2OJ?hRTV=(_(}+ZmQP@_a^OeL*_3b*Q zn#kG|a*`-HIyMxt6}sT4-ZKN{JdQ#w1+hx-(gucAI^Wv8ofAsQ)I2e7HnSZ`Dg9+BgR^^hcZz7{LP{~N?@G7m@sV0O( za22hINTv@^@MIq&oP))ZqapL~C|-WHcMeu6{O;Gk#bVl`LSqC1TASY8Z4>wE1z!aR z|NkC0bs1hiuHV3n;H#rkq1K5{PfqwZ-~S;~w<2$5qOW8eP6Ve$49Z*+U5I$C)LF>6 z>GoT$grP@whM#p#RGYDyu%gZKjY=+wsZ`XON>PxeE9m`9Fo%=E$@vBm!^H(%?1);( zwcvMlTapTvcM~CRP@8c$NV)y-6i(+66_3k8?;~>-=3I&1SW3rGCkPIaz<#%6&$r1S zmRY#K5F*JkvBIE66l0-=_e!urzv>yS=|grg(AUDYYwg6|MS3T!Wx|DsIM}m^hkKD^ zg6hDYBpxi5%;FHM91Rh-cAS+4zIFz8*Uga`Qz(IV`UObZ8N+6d7YqFT`<$C0Df8am zir$V%!4c^3Bvh4s@o0kJR_w=tVHhAMvck}N-h1ypg(ePjCj{)hcNvqCL*!U1ezWDH z-~KLpeTUCmyed}gQq}o-1>p4$2Kv3NN^l(`xO)CgDev`#LV>ESf9u*L$ zY^IU_^Uwba4<9~Y=8TFGeMd=^={&KeG+8_iY^TcEw&FsiY%*yuo;`nc`MLgBD*y7k zzs(}gL}}s$_2SD}LoD@L2i0{z@9LLVkuR|huV3s<&t1=-ZhOu3&khK)R!B1@!rwgl zl&^g4AyVLY5K>ulZmk}B+()u=Y*31TFNyu*HP5z{YBQblJcu42lT23RBl3b78-SRa|g9PI&JLuCfx?Uo9~$L^L?fxC;I(MQg!L%h)|ELThRCF1=WDX^!CgcXU3H{rN5{Jk|I!kiO(KJoCN zXS9w!z{&~tS1VrbNF?tJ15%Xp7?BLY2|6d7G&ScI6bk*Y#&FD~m0iclsNztCVu5MS zq|i!zbFGY<4KL;bs_c2s%Pl;arq;EaCtQtu_Tr=|N2w8lhQc$8YCEedgY`FZ|deEqAu+c|t5 zsnWCr)tc6xC^t^(o4)wfFMq)okSmMAZ5JxLvSTgvjXs3i7J=(InOa3%Ve5py_{k^y z{P`(vsK~To>Gyc_a^&Tla9)^(9&+I{8)Hcv3>_~w8=jtLP-7VaVZGqvCoh?$5O6q| z`NiW`A2R6v-L48u+WnPhnUQT_wdkeD?A=o1HULib|a~Y)?meanzdG?>nBJ zZ>ScjWoFe!zBoC>hk;xZ=eck)mu65hC+-&ERZ0|fl$3GK@#<_#?gq>hF~Oz6S!w0B z;5xR|D845fyFP@#WDY`PPOUppVh^!7ZJBp$wlmr-spfD}naz_m5;U+_REjw?EU3j% z%$Qst$B1_eLf-O?4?pDY(IGO|Rs!E~EvhI==7Q*Qy=rB4dmq7V(ZTikaUC4IXyY0zww%CyJogqeqOl|%A2U@b%gY$8=2KG zas03U_aE`|tQ5Bd7s-nyTUl^66)X-UizFhODyd>mo!?A~RE&q_#$mp(A^b z`2}N9igr}#C>qJ;!S(pKM6|~&&<`tcJw{5AE-I)&Vvvg&N)gcMBfqI0*Y_W%h}_l z{qC%X97rK>Zbk~8traF|;+xqi$+hmaEQKNk*ZJ1Sq!n>S(M%E{BV=tVMOlQYRK}cl zGU?48UaeBnxC7xbP7N&KO_5S@rUaBu15SL)i&G;OX=&2s(YJFH!I`3ESNk`pITM`Q z`8PUhEtK;O|LCh9@%4A_H=IJWNubwea;ul)%f2*Wf0g5EBzqm-x(N)wKAvxyS6|-f zz!k$4LwA(^KmL>NgL%^2!Ub=Ew8;cIqtHxqv=Zb zp;T+FtyXs>!CmoGS~z{v#b5pMzieT+X$8Fr2e|&&^=iS@_qcj)ijM#A{U7qAIPR(7 zciwavKpaVpqM+U*(UWIs5?mPl5E)Y<7okdMJB#l~;;1cNw_6UNj4K!pP zQH7i)e9nkC=Iz`}RmVioKrNM;D^5IV-cqFE1yll-C#qE{inB;g4X7=-5HPeFR$7;0 zu7Z+q6tXltCPW3v6q+| zoB!tFdsuF&!$z|sQmZ@hoY&1gZ$tvSf5>a7{Q6kEzByf27J6GM{N{Xm4M@HLRPLn4 zsu_(YZ^h( zVu6F;=wsxMcHhI#>WSu%%iVuRJ-y@%d|58}rcmj&(B|r7{#A0Q>#OUS92zGkv*sM;@F;@wcWHD>ze51 zEhZi-l_ix`&17?gIn&Qu))-O>HDyAbSp~;=p3zcS64;Z(aex>jzB3MEVLK*f%lL(3 zVH1N*L=ln{76DeBP@_`Q$Wai6^@6Q95Xb(aXV2}bV}3y};ZCnuNGK6G=s8-#I4iz$ zM2#Hw!moYh9wUmE%<&ND>YAw=aL#emc@F)WQ(57%5hCmb$KKwGTphtFcbqVUUCB@? z@2{7v+&fh55LNCd3=bbNio+`$_`t)s;M@e~BTKJHomiRR5IPEnKGF}0p`^Lv{&GRM zcZWKxaHX*4gs&bSu@z-H%j_>ZWDz+u!BVF8LWd*VIYvrlv~&6Z@9Yhblq`XTWWM{& z5Bc5qK0@Z1>?^ZYtQsoHMTy>OlN-BQ9cWK{xr}|=c)n>7xc>axO5ndN`Y)3a~qqDQi&+$$Q7u{ADtC3vxKRYgA!dr6v*ROl?=k>{a+YP-4&o18e`s+fDB%Lss zapn;5B!m)`M=!tNg$UpH+C%D`xU=jz=|%iISC-s%)$vFb`}G3Dq2XgECb^ zqLMVxWnnWX&dKy)MYS!XLEH;X4s8lVZ*FaY%NEt4 z)$#Pn3*2IftIC3bmnTM%8RrvA?|A;=DI3?Mx}zTQ>9bdy>K5;y?5`NlMxI*2OCr?5 zX0^w&(=#SB>bQk_@AC6!PeELxs;cm#Pkuq?*GxI_;e&Vi(dVDz!UD^MI|oZnPfwc_ z8N#~v%$vlsQk(0t&D>w^@#$uRWkYKM@%;SBOEhkgwB@6(e1*UJ`~_JeRp2Av@%&`u zq|O+HJ3b<^<$0Q!s~|SvIOG>kwv3(PHyb`U{3hRe_%6AegKMSEAUnn33lRKr-n%z< z`yGXTH`IdvkX)fbmyk@(?`$wi%&o0$0z4lI3r5n zt3L3vPaZSJK$#&OddAaJPShydEl0}*Hdj8w5Ob`koY#TRzc}4B3{|>Cr4i`I2 zGEF&@k&!y4H)I6-O{>^#H|F}peOtJHoj~!{ zn|0-}F99yJnzIy#sgShravu3Ve((eKKKeRgTX6ll$&?eDU7H`87QT2SctnMOgXqcg zNU_@V_?@Q~htt00>LpWWN7^dB@1S_33SOEQA*G-@)nXOj2q+quDr|B=a1?8wm&-`( zdXi=m3Db-dM;=ECGtLX5MybMFje?RUBd1J=1BQ|fd~{T4s>YfsXlq9;BwSRG#L%^$ z>I#UFYC<%DOO1l91~yU41|I?xa2lvKlgGxB(Ab36gt-A~onbQ50l{E1PxJ;W9|!{K zgas|n#wv~-eCIU8Ui0(!zT)LH~1UTs%XZ!W-d@j_^zoU^_|j5!PnfJ zgj5KwwZMm5Foe!|g2BNM85SM?;n*9zVe%EVzWd|?~XYzu@$^I6nVIj@=j{d<4RJa~c$osD3=r8C*F43*KgEJLK1i6n;Bc7to0 z@oEg#P-thF&>PyfuD|mCk@jZ4l4SXP-{qDu(8y+$E6NyG&1#6x#eC{cSi%7 zu0u9jeSUkwLt^WV*RfAjZ^TmY^X@C}|{^*dn0>Ah;Wx}IBC z&dICmRv~)|x|7U;q$EKJK7ITc+LmwLy-Ttc18o@yI6gimsnUctrw$V&bu%ob;i+bj zTfT8;gp``dfI|hp{I$24hmzK8MW(uQ!1H#a`tVgk-1OS-ilc6R?n{o? zrlK;LfifI*OUN1{1@}gdK^Kt9;2X`?2L^L8DXvnV7+b~LM@Mv4p>pQ9t`YZ6ndOK| ziaU*^5d(TrfH=o0qP6D!onvD3jI>~46o+>YOQ=U?#ySx09+1U=951-r^c+4I5KMzi znG@G>@4BqV96{?Ac{O1t#zj z&(BH8lBDO}@gXdGV#;)+QrMa!U$q@p7*Y;=aQVFM2hR&6q&*KTmVS-XrkNSSM&N- zp1(cMK)$kPU&P=_Y$zb*k`p0v=|c3uhy3`_6M9<_WJOXA?HXe0@T$V=25B2&k|ZsQ zmS;67MzksQE>am18RsSlSox74Fun!;_i|K{<1 z(stLmYx88CnFt_bA~vNv%ejwyaXF*Y;JcpFVet)|g@}-{#72Xs%cZbLr+`|*7t>9=JU%7s!DM&4cu3fuP&DeE%3ghX&RpOu^oPG&?3#N6X^A}jDY5rd*j3gH~f7?DchrKSxEuMJTK zs4bVXmsFE6KFo{iE(FO|#8i9+y%u<*ky#Q#pv{@ymOco5-?Jo=t-$MykhVNe;}F4+ zGk7UbP7{45kq{yivOuJQ;^ci#5+z|un;K^ud{XFCQOO}mEU9FJl{Fz7tgf)CW*L`c zrE%6Gb4v&rYlfxUQUxMwv@oQkAqGU0nYJI}E3cASO{5Stb z>2H`KVg)xYR>(=nk|NJ~0ovfVHBWBy>E`h=AM%Zf`zr6Q{Q|rF3i|}lY6mfc&Vrl; zQ7L}(@khM>#b+p2QFWR?MClANkwv7>9Z`C;&7@^d!WPXr7VWBbrBk&v3aJd4KuSH< zWReVMV-d0d>IQW!xURnCoQq`QW^%=ClX!jJu5`;?gxz)RKGWgqn1kQ@_{aS4#W|rm z02I>I&-r$1}dz^DXf)r3WublI-AUmhkCkbLi#klf;Xk-Ye;4vxio4@fJ z97=~y#re2ybejcu1g+d!?b)r3?&904g-FVq&g(t?gE2IR$*d~P6?eeR*0(> zb|xouOvrehFsQj@+c$yNgxa?EH;=E&J0-Vk4!r^!RcRWb61^@edX*F=8~)_kIe+-0 zkI2ITJ}ybIrNL1-1G**BA)-Lpgp(EgA9QwN&S-X;F!zH8H|Ty0xEVOTb!-wTaRN|dJp6!QVU#4xr& z`FbT^+vID$y`9&$k%g`@3pm%m3!s&Ka*s^KNMHzr{aXqrF(XrJiZ$7;nSx) zy?DXNc+3RL!UsG(mF>BAazs)JnLGz$N62@|YM&A(qXBbmS!M}H#)+(PQd9_m&0w-1lMp#!SKuNk zOTOw`K79X&y!+skpcO+S8Jrw2PZ6aQ6C+VaN6b2bs04$gIBF#3vPahziNV#0p-M!p zvB!r@H0YB9T9rT!IU0@`zN1UI?<83GeiWE- zH5oBWo{Yvts4C4eMvNQ~@~~k2=~7CpkB+%B81ReleiI)wq?W_lP~E=^rsBjJjvCA1 z-6H}T)G;zAMz&g^5h+aNP|7f02C`5XJ>qC+u}Tna=EO9d9yDkvSZ0X|iLut)JG@Kh z0zycRn+BOI-Z(_^jE4=&<&s)x+O9(@Nu?DNU6VS`;NSpbpl-%kYwc-nb2l>BwZ*;Y+c`TECm;fj`Qv%ecy9mjCk4i zbipGCh)(k>zwjN#qcOqztBliqw)hqA-Le?%<>4KR-ZuZ<_>Zeia)oc0cL|CW4x!R4 zt>gX2Px-w+{uA!qKV>>y5_FM-(xt@xqY3k+r_HMn+t3o@Inz#%xR|-cW=xWPtWLN!pYL>aN4(|lyFFt5j=YKw6q6{f~C02=Z~i(tr0nK z=WxPTU%n&>iI9eq;gZE{N;H}*G$UmgB*WZys5~pJ;5yIqeu>jH_zqXS!=HToA$4;| zw^;D*I}iB$i!ZUwm=HWkN*2=@$vAw<4C{&~U!4(E={a~fa5Qzz^XHdD3B!Slaq%WJ<>3hfmJ=7k~CXVthoDHBt5Cs^RkdoJKcg zG0>K}8W7qUN>_wcVpd8XSv7d6k=oHFXq=^MTcUJiSHV0&)<|JUSz@$93rF9Dn+Zkx zh_g=$?%Hk>2>S%cdViGA1IUsEhEU9;;(!0$?<4P>&}mCA9evlc4A2Y7l7y6k9#G0M zm<;KKr(b%qt;jZ#bS7j)MDu|6xPvG|LAoJPRrJXd zgdEj?OVBQd%HXk5-}hUqq%79?{K^T7!^O(vd_!rHDy@Nu=D8 zaz}_6trOZtqzvS6{Z3b=!M>G$`}d8P;`YqLUDp9OdmW_GI92A1$`bD!|L9-*E-y(O zCq?ptC}VMgLBZxv5hpcW%#4j<89YgP%&KHp2!Rxm7}BbAm(m_P1Y(rf%FwCu9L^}t z<~?;?uN+_zr3HwL?>lf3Ex=R`Au>wJl29WIF-eSKH01}L?V$lfz_8j%e15U5OP zIHI*iu2yyD99c*PV@u2(rphI`iA0EVLhf<(fD{}`TC(T>Tiz#UQWE5((KZos@dmex zCEDiV1QH%016>y($JP7y<+>I0xDc5XJz2$4ZKz~fX;=Go7RbuETDZ@eOgp>#r{O1C0nnlFNmZ+)%c4{<9l|B*3f}0?s$Iqq+;}EGwgbtYkGNn>V zof}NM@O=O!sWPSO&eG$QLZ*n5k;S|R zok$_$ghR!Ek^)l2KfAEzVj@ObiB^dFW9>a3BRkrRcOkC67*#VeC0lP*)Y5 zPaGSK8x9CL;jE>x5|JfsD3hjAi3j6~MNGt$Xk_AGIL7!6X$B}f_a|c>w+pfY88e5{ zkn7UwO2ovW(Y!So(N`IlYfh}f9v(8y3PsP@8J4LCx5;FJ%n7R{qj_m~Dn^zAYiJvd z)PfWuN0sBf`){L^A>>esybeyN^ngBl?$nOs`)_fcO8&$_Jz%H;RUJ#lV-`4Pxc~NB zAT&Dr6}wBLq370#`3VNL_kNWJ9}*B&G4u z(+(3+XnceiA)r_+JA!sNXYd*>eBjITbCh(%(9#SXpFVqz(;Emyn-BQ2sy{+(q#5@FH{M3`RQcEbCRHi_HDun5Ob1 zlc`bEDso&8VPLS0;O;e*lun|{Pm`-4n#>9+MlKJeC9EyEu z#uBF_wW*4)!Wf=Ezo3s2*VJ^rCC7xy8YL2ngoqK9A^R3YAhip0^t5d;k?3pud`?mc z5i+qBI2lQ)M}|zLEG;cZ(o$>1q_QNdNfZyhQwk*$`A9RJFL?jcFL6wG`t$;!C86&* zFsD4dyg-W56?!tLd2;>|BNt!<)=YT(~e`S#k(&U@nYVyYy-8* zJh*?#(-&umiv`wd>fBp!Z+~`?7C(huU*5CZ4z{I z;BsEoS_{R;k3Z+nKL3(Oi#efRQYnLznX|86av=m!3EHN{#Keo~9NP>qBC%{e(;jAF z%1By{2bRw-me5449koIz!Yi-5Uz!lSbbvN423%V~&ou`T9B z%pAprix)4+*${mqH#KL^&#+BRK+qi27$KO49%E~qR3M;s11ft+rFt3+_eaOnrqnH* z)D7=Fc$d-e1R)}mfkw&`k~CIr0e?NFgdtg79T(2ylL^(dL?5L~uBfAQ%f+628U z`5Dq#I_b#Tkfp-=NKYn6McoX@tDK5lIb1bDi$GEqpEA<9V&le4PzFzg%CPiHqS6GR zF}4Dwi9(lxB%z2RmQ>u8Kq#T-{k$kd=?L{E3)(Jz-`19IpASVC?9xnb%#D2gy$_y( z5NS|CA%!7CFj10&pvw_rz-dd20u^Iv@!m#+EN$|VEVS_?I^QGph(N|jNgq751|NIS z5K|@wPm(1K8+C10y;6O68y4G*bEQ}nUfg`ytCG)+7rtSKt-Y_SYlBieyEx+ye)uDf z-+7CspJT1UT8%?+|KN}Z6ep6A3S$h%y2e_IwU$Ap==&ZRqm*Je9CB|w#W{ykio>Sn zTcbJFmeyffYku+c?E>*F1WpQg_hHdalv+8zu5-#&0{L^_K}vZ8qyEaYSv9{<;u^Pp z4feVgidU?%0fPCBw;$ZN3$;7ZM%pFS`xmuORo;r6FP6&uq4FR%noz1XbS@!t=${!|L1DmUC|=FQtu~gY}{qC5V{OiBe4GBhoBsLyroMC^R8@d`jG{HRsbr z-?v3`G!hX6CU@lM3$KPbeTay-q{@*hFA+kZ;}Q@UE$I79hyk5IhaS@>8m(Dw0+VdM z_&#F13BfjrzkTj)juhu34~7%|^MC(8paT#qFqF8eKvezp8F_qi z^*cxjqe;2P2D_+LqEiw#+ffO*e%^AfQYC~Wa)HmTrB;ash zm>viqp|s`DWvWR-<2^&vI2#8wK9GWeC`%kic;nAZcj?e#6GNmsrLn~VCBHX2&4yC>(I$x@Q@n)!?AvN@r| zI>fOyb2c9Ut_ro*zc)3iO*82>`fP5SkZjxZTWcFvkFbNT>;GRrzmgzGLs%6H;U-?0z$K|kB5p{YT>>rVT+oi>o|xr3~JCv@utLB;`z4X)WcNxH5_4)j9D>a7I!VJbC$or4W4d^cm6&NhvTI zjdew&W@tA(k$VzIy&L)*4^@0m`g2;g#dLAP9T{_-W$=>^6ZPVe92YY*S0 zYHCvKSVW6Yn)6vCs2Zakxle?gN-OygOVd(SIz9~{ZulOe*q>PZ7m@?kSl2o*j8^Xp!+hJRy}R@r|!CA{xelYRlBWcpcaxtyN!=Rf*0j*brL+m??%{+RR2OMd*9e@=>?x9;7= zd(U`0=7*y{;x~WuZ!($O;mMPy7z~XuH2tC!L($R14#E;`EPdaif=6dh@C&Sj92ZF6 z5y_O;4f+1_Z_ef&!}) zW2146B`8aZAVc6-X_V6?5lz57ZJ0MTLP{`(yDo7s)GUmkvK5sQI8m?;lTrL&_53&R z2=;Basj9p7m(}}bTz22!*o~qLnM?h5X?V0=h1K=_w;~b6M7g$egjj);Y&_GA6?&JD z+G=@y{a(9Qdbrui_QpH!SrxXo*O^|g6Q0}m5~9?jXCm|Y46QZi=jVhFAVp@g8JCxr z{OOZn5NWGUoa7=X~(dPdI;hMqL@&^A|W{xvXn^Nc`oW{*do{_g8rDd%sTi z{1Fp*!n?;q5{4{m#)ARhP!&Qdd}ukY9N)Tgm!Mq%OQ{{l+ROauYzG7iCY1y$a%*U4Oa^X0~*U7w%xs*YgO z8ML-XS8CrYZ$a@PTn+esCc5q2_pLs+36x#JG_0~h+P3B5;(|fl@c#SnlTzaH@{-G! z&w2Lj8S}-IpOJHBe&PB4Kl>;A{`Y^E z2jBcUpMMYtM?=2;^M4JmYbxdV227>{goxxxLzK3+0^imD8@k$EE8`&YU4jLM#r;4?g$+ ziQtLvSuSQgef)$EKm3q(dd}m=Uy?&4#)w`y5=(N4M28;dG*(Nd^9x49h7baMmx(^H zSoSCt`Qp#t2cvk|c6|B4mwfw|f0cGTAxMZ;qEdtJG%7kSoB-93#gK)Vp{oJ1?@`Gh zV)0q{Tq^LA8IePaR0=tt5@QWI619SENvA8KsYueGaw=dYl<+UPbnCvsC#e9G+$I3F z$8vLgin(|#(3PYisZ4?269VbX$^jg)tB%RDd57GU zV!VEt?ShS6Ue?=Gq)no4`w%v-d)?&ut88y#yYI8_HlKNW|E_Cy-RE^`{yuu{5|C>e z$(0buhsbN1pnUwrlnpMCOEKL7l4Ms-bEsiA}j2&mh) zkpKW707*naRE$*Q9B{@m>w1(m_&(Bi3qsc-rABE-N(qn0_Z`bNl|&y~^VLT`<8Zc=?6R@^no_l?okfW5M7+q8Y18NJC* zQcBXQy#D%lLQ(29WcH-w$)Ux_A%dSjfYp;D`m*rEAKXAuK2I0@Ea55mDNt( zPVn1QtnKI7cmA#c*(IrWO}^LN=S`mBO@!Aj^>Uvku+ubH{bfpt5JFLjbIB7(DRK7l zIWL}lg_eSTcFChpe!@rZzt6?_Ih9gqGK;QdG9J_Agc1U&G)hQp_fI=!T+hjhM0X^E8z-}Q8}ONO$*!*!27=l}i5Cw%|^{6Dz&bKl^%{_fw!2+6P+ z)3+VgNRCy&iymagh$Ul}kfyxXi4#aqDG*B$t2I@MR3VYH#OjJl7l0H^!Dh@7$R(|| zY`b%euf}XW4m-vL_LzP<#%`Cnu{}q&|9gGix>&k27G5D3cR7?jI+vy`6XVct z-6JJSpE~YUmiob4pdDT4c;G5d>aXF2B#;@CX~U42wkRYrE*Wc0vZtlaCBw#=MW8oz(%km@O}Blj_payJ-qudR z+phgtpK;$kcF|#zep1R3Zc>Jn0zwF;({5r6c9KVW)xMmw8g1Q=t0 z#HcA9laD83=F25oYc6L~&K{p}aBxUBpW&>fpUycsJ*Mw_&bxC0isQOLkT{%77&Z;F z#e%P1yx{qCij|gnFygXba`xc|{Ez?Df63|nxB2D2{?~c$*Zvw<7*-ReLJ(4DC zfD;-i1xgr9rEoyb0viJ;jj0AD>=**E^f4z=9BT!oU_GXBW!~-2ioK1;UKxWuX@#w>#iouhIfDcxo-mO8=zf-y8gXOAnn_3n{2PkjC>ta?5axJ z_4`Ui+zMT7zr#LtcJqHz3Rg^6Im0I(ea6!-AM?ov@AK@-Cn%B7LXspHrBOO#m8S0t z&cLv#xSTB*4@ZO$SWM3u*b2W`&^X8R>?KD>N8CTX!&lE(jLO_OI^nzD zd6%Dl`U#&s`hulM7;U&%cC^c$7eD!kfBNa?{P0JA%HR9X{u7>g&2r`BbzRS87wJ}+ zsjU>a*@E5{8@3OLxo0G@V%9d964*0TgT=FXoXHI&{-ndS~k5aw}O}MV$3UsO~q*_#42>N_q-$9H< z#FU64;&UK~!rZx1^h;43fyNNy5~(yX^`*j5mbPBnRx4quifjBew0o1WzH!c;Nxc4j z8{fT78xTU=NN)$OoS89av{1wlFwWuoOim@)C#DW99hI&~Ns_ZdXN}GVB^7;)SYZ)T zA%#W@NnII2C>_j&Gz1?I$`F()G#8}{wKk3*6n`Cv@TJC&=-aekhQc!`cxq)>$js6&QGUTt2(nNJJSmsZu1pAuV#KMIBNGXLtPDpk z(^sOv=PSvfQ?xo^MZgNfKtcnM5-~@l6O2{hxRG>5p=IPiMV5`C*8;H(XTFOucd1aX ztn!;LkGP7&tqHN#6mBE#_8{##@3ujD-AcTDuiN|zZ)!r@%(Bn)+1!fS znjl|e>nkDo@BfE?$oK#GKSSh1B_c*eeDa(ejQGYoU*ogSK0^qB_a&9pN=3|(#k`|( z6(?VRm)T-YicrhMU@&0Rl)|Aw(=Z+nSxgrkPbM6UN6Z&f4(p=6SI#1o1O?hTP7Vi5 zx&a5n0hQFGFP^fzn4ts=jp55b`2oYB<~RTT-{J0I#l#)pRcXgPFcLYenZ|_7iJ{0; z#&I;95VAsaOAdybacxnl*t1Cpij}QME7tP3!|% zX*wTKC_)G*RT|w$p^+#;NFX)YU%&S&P-WXvPO^LdF2cyIve>+J{5D_1)it-=f7k!- zQ@h_}^}kK<-L}1{nX%8Aw9k*Q^Ered<%pDuAOFQ)@DKl+|CX0ezhtZ>gR16mP{Mrm zWC$tK^-GSA4tVzL8Ab@C5qKY|>zbpZBl^ClolhAEK{c#6J{hxEESQW3G^;K-qk6zW zJs|X+ATpDK5tY#;eI#WXTd`Oyuu9>Y1BCSj+D!=tjpX>rIUhbc=e+eG6My#oKj4dx zKIA|82mdK&x~6j{Xf&sFX4+0kog^89HG+Ydb3X6srJxpYC)C_Kyu(;16dBfS&BO{_ zm@WG5;Dv3CVS8NmX=vNyyoo2VJs-Rri=yibka zcYGIa{`UE|X%e@+-?jkQH4Z67LJ0ih|Lq^~zy9`bL*Fy5G_^HUMxrFV_wAqK(WB21 zIrIFhXGGu8x9v(WE3{Ii6j(0jEM}MFoEZ%U7?+sOW;}TCfZ7@kCkI5|LCOq<17?>~ zszFl#TdiR@s39h%(?#*|(UqXVkZIY0jCXLM&5v>|f#8+3^S8hEtNixref0JV?z4%uU;1^$8@Ca6 z^O}9DfOVR#D=_V$@2IU~SXZmUuZYa22qHf@ z>sa<3{j@0tTdR_1*8xQ_CwpFa>k-*gIHDJLWM-djPgKE1zpIOPn86{57a`C z+O}v#(PNt-qU+Gol2T@16f*U6ERbGN(;@PVVVv>z{>Hz<;o0TYb6(*QY(M-8PVKYSV9C_a?&Ww)_07&$zkW<`da91~EqZzUTe--^aHtsb6w*?*u0k z<3YtQzV~gMHb{|a=a;;kPdPalGoQ~fT2t4KK3!M38J(HW=cLec@9te{>zF)zn;0WT z3XTpBST1G^hYh~%Fjf${j3O`?3`!Si=a^1=yzdwf8cbCaSNQmSyX5%bklAuU5(yWXeW;1Wp+iIElS~<3SAa@#;NigH9^R){8YL5l+VG%$z*1VWfI3IUN${4Gv>{VXmfUGHf9spy zq6v|O-pV7mjp1*Lt8NO2Z53)C!L}#kCfLa4dHV#1Yd-L5k_w6%LwAQ>ldydtL&p-Q^hxbo$GE*tRH^2T4M+ZavvLp6^!{Ly_LCt5M zeTI<=-z^G6dsPv;p6UD&DFmlSha{gE4<`(pAtxtCT)aF3QTiU_9I>{PwK^0%9#SOv zo~ka;XXEjZs;Oz)7DOy@Z>uq8jK~RTG)h}?lDvJt=X@S{|BIK*qh#7G@Q=UbU;WPi z#lQFW|3jovv=Q{`{oB4LQlbGGQ7R~}#wnGI)ve*WZ31tO?`GBLKCN=|n(fbh!eW;> zuzl~C(#oXzr$x=JmE4Hhw9y7gJ;IsTo8q2?C1O&|JHBNI#po7m^m_^YUHuhUL;t>U|c!9KyTYyU20+$C&djJ$mQoPYX% z{|?7T6JobOSjDgZ+OKl&&LO1CuyQO?#Au1thVOj)+w^@;d1P)d{+M=Yv z2!Ym-qsakX^4vX`@%(be@^Xn%0@3&U==Xk~cOKlu{rr3Q$rxfp=87K4JpX^3y;rYf zS$605+wQoCxISG~W>$5XwpC&gE3fokW6s{<6$IZ<>a(Y8a1dlu}HZ5h(?<5)MWax~_v_>HeKF5A7E@5Uh_men3nC zJD!lxbbX-nbChVRs>FxD(P+Yl@80Lp^XI&{40wSq_H>f?KmO-`#ee!=y^ES0(sdp) zD(L$;ZH%Z0MM|V}o#jt*<-n6Y`nJ#Kw$OPuahbd3c^z-qR%X}SuI4mdkB^Zg$6Jgk z<)l5XL5A@3PCKG@NQAPiS+qS)85Bc6UoWVnhBWsU)q_Ek0*Fr-(K)~m2BW~Dh%sUH zg8$?Xe~aU^Am|8UC_~CVAj7rO>1fyHeI1Iv{BIY<+(kIn>)*vOY}WB6*udst{dv8Grvbf5Xw<9?7?S^wGC?`_3IkMTOBCrxj&c;+&(M z&+>Cp4uO?YLJOQ69-)T-rb-D#F`)c)MP1i4^}(tQMuV1YhN=;)Hbk8u#eu8HxP{i1 zh$r}j6^(J0t`9g1$PgB-tk^#o<}Ij%Z|D5k|L{NYPyWmQ zf>ATVd5?=8={-&~wK5oU-85S%wc-er;+1#=n{&N6ck5%kZSCB|1#A-mHVMqOHMwkW zb{@^2i@IWOf1k1diHbcPII0w#&GntsiUpc7X(CYCf_;^kSB9t@7R`|p?v5;2NAi(< z8+rSnWTtaa>3btfx;WJeIulpqzo3ajW~u*D5|*W%uk$A4Y<_?k?-xlPzVG55uGM*ioVIO}H}Bmna}&q13uD;TzFlou_Ic@JpVMXMYthd5@BiEXnx-1z zQsQfGy~RiGeT}NLXsZdKXEYgOv|tOvq}oT3&_e=GZF8zJt2Nr@T!hwI9GbGMh%vIa ze@Ib{na}4aEvp2kJ_OL3vZ|1jNIvA)`pF|PC(N)4lmV|m2q+!%X{9x;EVA*6c8m`9 zIh$Vc*6lkyJDc;odqf=+USQFCd-pcCXLH_C5LMz(gs3$8RYQT! z1Zj;s&?48s!(E5MO`Pa1F5xD^u=)S`!LoUXp)(g?({gS#WrPBlR1R$-i3&#|+JesK zakN!LM~%gzbj0=@;zlGC+A55X%)_WY*unCt0|17uBz;rFG7-tD@uw%I{+D9 z(AH9Dvx@p;6gZO;yVTW)y3Px$EK7{DIZ=s8s5P!Eq?`cO7)9@gg>Llf87f739|oB= zV6382C4HY=o~x=ton26u1@Aq4z*jFWY5NNrB{dm4Dk}y)(eod;<9Ubc7Dms z7&I0$s`z5MAlix;gtAXOJ-Z~<6EKl73QhE!r2>*c=AMz)Jewzy@ucWEA~9Vky2>)^ zr~H!#?@$*@aZ{~Csyqe?*ob1hjh)#g9^7>8VyiZPTMm%u-K^cN=WY^*H(3a;t7}(3 z-n8G#vb%ERZDUi{?^9?*Le9yM5`EwEzy9lgP3a6yM}G4=-(Y`SF)9pN3C?O1g4Gsh z1Y-&+XR#({DR9n#bD%XwX|x@3JEVj)1;!YPswRrUID^FO(P#(11g*18dfL|D6h~z9!XmDci|^AlUCPo0TH>v3%I^E*4One?r+z8Y+DO&x&~hPE&>8d z=X@JcvVl++6N?n+6{wJq6p`2yLIj-wLu|swo+OdIszOK51T-3L3{DcJsF@C-%tS$( zB6=qLv)}t8ZWje9wwaS(3&OiOZUB0hy!s|=?&}8QrVXXkmAmpyC+N2OUUv$=3D>Y$ zZq=qO1m-5dXua%BqQJJki3n+BjD97s{nhvWlILGNW_o_c?ZXN8@0`$-4yV8T(+sl zlvP7gPz>d?Hmg1@3EvXeF(%9ORaFh{(h(mbMNwoig~+YLF}Dsz)P=?<7?}dwd;b34 z{w1ytlt$x%V7fr5vifkzF+XiOa;NHYaZL4du-fe@q?b&a-u{UM7Z5+>f*==&- zW?eUlFgLYl*CNTF-1YeQec$uH{HuS-Vmjqu-0lXeAQX=Dda8d#tsqu;(#GLW(F927}TT-z|utALc-> z@@K{vvKQT2Qk5kGZ>?q8b-6v(U@OaHRB`v#0WTMxMQphY0VRQFpZ|)pFFxn)x4%PB zCBB_g*9uXG*o`pZ??%&R;yo5V?1JhkLh9NYPUa{`pA4mIc;Y6oS$QWevs| z7;M;$u_&c8D60(G8q&ZO!15%|8IB~W)rq@IWv8t{`5dFrT1VF|kfnWm7=WiWkW55Y zD$gqu--J>c@B55ZR1Nb!%d*aBERhsF#%cN}Nb2}^fBt{-$Hzy6VgkWqY(qDl=F^{S zbQG3jw`Hu~bTe=Mx2=ww=JTfdUzzKrB)nEefS1pn^XWxLTWC_77&Q<0$% z@4R!ur;naNxkn#c-nn(c^u;L`38GaT6a}SDJeyr2W=t`?;9vaF?{eY_Bt?`cl5*(l z;em4;5%p?&udx7cA`jg(n9D(WWl;3?L4H&DYrVeB1-Ps1O(*=eGH(I~E$iA`G}}ao z&H8TSIEKu{BEnz%#h*ipOq!bGg9&w2uATOf$g;esY@?qyUQT+NhT!c9$pk>z3>50j zNu-ok@K9#s%_;+Q2w}CMv#QVz8`)oL?|MRw{XOXHzOj~?;Y-}@eymzNwK>~VaszslT{>&+~9 zKB=>MP&=FR8frxvjvs}|Y@s!z1byG5wOwu4<)$#^YI7`Y53X`1nt=m|Lo$x*#yUw| z5ry^srzAOj+@Lm-n1~@{qZpOjZItHT-8+=Va(8b+sbOR^{n;fy`|;066hvKusZiGB z(^L%thaS|=N?mE5w#@ZSWB%)2+ql_XV&CR7%~}+orN$s?=p>Sy0nx-LfJPaIHV#Ci zwWaS9%2;|IC|rfrj>;7{G_|deK4JUFfA--=d}lI2#~FIa_1W1(Q2lC+YF=HJ>ut_X zM_i>8TiJ6XAbKrL_|>3n%0PK6u2baILT5RHWPVN!b-!|7{`|^jV|z-nZJk-acUQi} z_0PLD_O55_k~`P`dqoc8I>C5_eI;hOUm5=9`#(UZ$kC*x)X>x=Itt1_bXhbo%Au4& zYn9b}3fjJ7T;;OJ)x?Vk+GXi4MGr|4R3sr3*3tI~Q9UAZb+Sp0KpjHn1ibG_5(d1% z5G0_CMM8iqoD2jYq9k)Ge%>Ku0^}vfSq!lUB`BxSwZqKj+&!K!#V|6KX$d+Br(gVt zZ|U!{kb*ja_dOMY9e~M@1U&$&YDk5*Z7#NP2%Gb{Nw~L(7VGo&3MaQg9M<2LpN%Av zirG9^z=}sCGAT>$CdHxaW!HOW={ z@x8m;yEV$W4AclEg5XhNaH8}2QbTUf4O+0?pX_vmSpf&Dg`9>#$^q7{ZrrTzmA#S6 ztJSxSr!Vhc;uZS(=6t1*Ynp}44f!UV%&&_l+*Ix+PHES3cM*YAUqxp?M=SpJZ~vB} zur%6oa&kglRx7`C$fvf|nVnx|aMD_%huQT7sLUW8@P-VX}f+XD;VRl3H134>onu!n9mkG z|HbE=G!tkJnOLD$5nUCeWh%Sn8WfhN$BpB^Io_LudKe47IcdiuN*kVW#1#Bm`(%AXfz9c=fOK19PDM6 z=HY<7T5CD^3-V@I#*NuPZep|E^qy^U*tOr1TD=hc>TB)3*RkNcCV0J$UF}$}W83#_ zMBx9=`0Tn;N}RoTi4tf=6{D&|B(658F;|>Xu3ukUxG`q=UfV2J$0)oNu1^2}AOJ~3 zK~$(A0jfxr)35CBGcKS9Fc1{RN>c(xdOIfG~2j? zU333Bk$7AAZO>l+%`dG+F(}b!$=aOhV!=h*@+>62YJ1L<;iV`Zcb=yqai$Dkv>m6( z@O05LHSl!N@-ie|%sSq_`!;tbV|0qybz80{c+K;C{lL5l&(KSmYnhH5HOQJ;t>m#K z$dSP)x&Hf(f!TF!W5sq2@=fgau6y3(#NNaiHp{I4ziYDJl+)P7T5k61<%<`bpPl8P zphbyu20M`HE^ok5-#S;^BWL6qzT7h_zh3^M?E)z5WK zB*j<9aG8iyYkRGq28H*YWt>Ip^omQE&t|xRpiCwcVvLMjiF1}9kz_R&^BFHM&uMjH zp*QAWH5Y@`=M8ha-llEh+f8%!Ca3@U=Us=NQdjv5WUcK=DUwe(W3WaeBtq<0T-Rc; zSk1vS_M|9i8Ir%o!0&ziL*Bo0hoB-PK`Q~3t^v7lwQe>K(rta&2vxRh@OHiG*6+MJ zFq_vVtMxiId$YdHf!@Y$Z$4|2J9rZ@;!QjWU-$odnb$3-^|sIFb5e>pr>M)EC@iD= zS0_6IcaX(_VJx}YxLT>~raB<(CaLVIy4Gh=OIv-7F#~=u5cuU}P8B9tjN!M}^ieiPx-!$IKx!M(rV4IA;Yp%9o1H0}O5zJsaAZj>Rmnz;Ei5GK{ zR+tF7Q>0cfoL{=ujitVTLHd*+l6Y+KI`L846-!zf0t9SGC*wwx_~JyzhHlRjuktDTnhmW^hr}8a2GKy@94IOQKxOs|*AsXF$ro zg%n9au4w?4{nlDTl1wm?LhFcgC7oZOk|Apn@?uLV5eMQBC7UP5C|FYvb4Z56%AhPvthO*wzt{jcK`Ub#=LIR_~Q0BP_^ zQ=pW+M$NZr6V~h8r0B0BX1n^mxoCDhSI9WPC!c&mS(aIMJg5`3&Z@$U0i@Ll8&blV zq0OREdaw%^%zp)qHhGgNvwZHA8L-He@zAoZA>=e_ODtmfJ;T27N(ZmZfZvcqVylQ? zNGgjN3WJCrifRl{6xr)dYt7!?9;c5V(~K%+FQ++Oy%q{>keEl7Kl;U|Jl7Sf zROl$Yb8C-Zy}Zcz4m`Yn?}$%6drUKKpuOb%@BRk2CJib2tb&v*%&&ud%Otr=O~H~t zuh!a*Lk&RZ0gbPAKn-lN%4wamiZQ>hzczncmS4YT^L4HKj!AeEJYXA+u=#nj%=#i& z|GYkl+a`S%x3Q~j%WIRcuD4qTcH4W;lP6C|DKVeVG1@U6k5~6z+4Sd4yxE_nO@R!c z+>-DtxdC8hpt2-LA;lFAu*4pgz~XY#U;QrxA4w^*{L8V(qQmw4kgIyvbjDScGZk5# zjiSo3%s9bbPRpGX6n5znE1b^HNn^*fNVGBFB_~B)*%H7iOZ4U(ZI1u0^|Eb#Z{pZq zck1rCKdHgUS2Q~5oL4{~Sc8lkbUDH{2L$Cvt|F)sU5)5GBvTQj;N$nc&cnlflmrBg z363fn%)l8f`HU5#G;s4uZa%cvzYlj9P}$-ssti1>XpLm{(2B~cDbXM{gF%wZBFp5I zIZJDeifRMC8V;~xWvP7jZ2}GqqJ{@TL(qM#~<|)4<2i9OHt8_jI0Y!<&kVIjE zLM4kI+M?qyQCdI(iZpA%ivE{Ne)ZG)W27xT5!dP!(DPO_ISPE&3cgKxwS9XqQj+B#ICcK4uXh ziXx;84vJ*2#AWm&l>rE13@bv=d!N@pO0xlZQNM{;u*vam6AL%XZmV-i0Cts6Dh?Ky35>@ONC`Tlh>ID$iqvUF0jQJ- zvg#Iyu_zb#?c;*qe)nxmFW8vX{K*A+14$VWvs%kb&~T}eUs-%^>4QdHvoy3?DfIH> zSaxWQk}RXD!=;o5XvyHA2J=_NaF47|Vx_MF zP-GiP4YaLKCp) z0ihiRJPj%v5-1OtoTf|b99SZONt({4os+TpZD7s&zNap94mozPx3cbwG2*NNk<41g z9REJ1go^n@HfoUZiK`RdT1)3MH&JMfN@;bXCj_Iea~R(H6&H{r=f;(0Vc~nyKqThv zl)A2I+m_N5l+F@UcAr(IBlcNKkb)pO_e~FLpsFgGkXS?^^gVS^p!J+y=RRqjU2W5J zMzgoiTw7EWoVNLtS{Dz7IbE&A4c7mr&Ag3RY_j;j&b5u}1aPSuIGLP#0F|&Ya(6u8 zNF1puc~}%U1#u68v+Re&o+RGBeVdQI`2mD9M3~CNYCW^^mAv$7dp83QU+Z7m^gdj9 zAPGt`2sj)WnNuLHbxyxBPj51iPk+}zzWS36{`PPX7%vH|0CCy_=suWfrhy|U$t0)Am2h21e zN##^q1J`6E6O@Q08HE*viV3A0NerSBol@Wwc8%(8TWE%yjx5BKPtie@R}PLqi9ud3 z3@RjyH90jpntAU*S+r6(mz{o^vRLgE?>)+7D@1f=rI!XnIxV#%dL^PLrC2N$^f9f( z6k@_h;bMBp<7dxF2&boKE04vKlM^PR5%u5=skK2_hfCm7!22+Omkh+IpeO>?7PzF) za+yyN*qi=+qTU57DCN=Rp7e?=SDNVT#!=YJMVqSgIl**_<)h@zMMod;RejGcEgGz zx&G`;F?jubTbpel5!K)ru{xmvrAR8~O}jeX8N8R$8YhqtB}iHVVuPM^0C&_NLI79R za6>gosf<3O@@Xs)CqhywXTwF40G+aYm;gJ-pGjxd+)K)Gm(~Q812&380(pZb0!jv* zI$(tC_#s2q8T$MjtqDdU!Dka|Z3sGpQJR#cA#o_HQ6UUgdKPUoI(W3vh<5qZmWYxi zhy?F-guV+@RYliz+}a;wjTy2T>y^x|wZ;4F+b>FUKAm%VenyCT6_m6XvK5W1 z65lVdiX5qU@C>Y~iUG$P2rF2f-H+qI2~4L`=3UR}%X9kRdH(Vo9}`bso^pCQ<#OKA zEqZ*)AZNe$5l$;k4)!@Y+GBrz%!B)H(YOj@JN%+YYssnF(_nan#yN*t^eCm#&XN`# zDnZhM?|Qy^{3Z7u-skDlr=)Lwhzzi0<{FnqI)iMyv5B`W{$1BLaCrT?2^YE3oit%+eh+6^~9|5`$*iFSx%q;ma2< z(B*{W1Mj|bi(h^A8KJ7_7adJmuoD<&&TOgwGzm;MwUJm-7X)uE*6Qn(>IP>lly65F<@lPs;G3NIN-$_5W9ZViwz+Hh@7XgYRZE+Hhz8gg^e~ zcQA`-R+XlR8V<3fSc%JN$pxr%#ZeC&!;(7WN4+W%Z38y#tXBjDtReU!apjhZ3V6{h zd>+6;gHgh~TM#iAmFSbu58#j%K^w!Y@0fNys!+rTk`#UDsGMe8S3EzzWF8fbDcP&W zoc43N7-)Q=*`M&MXHPLnQyMs$9P`!XIY}iBlm@4{2t77hD50k0`J(5tYuQ6_us`DE zqD4!VpZA-6zBs$24Lyh2Fgh6X`22!WEM>Fcu-Ic7BEHZ#@40ty$m6q9+K?#v$k!jf z#V4PC398QhPVlQ2r>I(EBr#qDzPy~$d!e+Ba}sCWg7N4ei!L`UDl&_HaCAtN#CSZ$ zIk(d5r)(-n5KT;xAOHBr*rMXguby#sdBJCopCKab?eC+2;>$`W^9A?s-o_`%VuJ+EE-sN6c=q%KfB3tE{_wLesV5Vrvl$^pnx@7YgYOm?B^V208ZH(gJBL&S&Im8hFA-NT)<99vCLxAE zE!XqUK^c!?+4v6}Ym(mI|jGlLjhXV7fqofeuQeTr0iN$2f9=os4;rhGSPv9BsdL~8Iih#Re}9-AE^vc!2z10DUbphQ&SXk zZdFG-J-=kCJ+&3yKAK=m#9K$2&e+L`q|GTmq1J-}?r#m|;{R z5P`vF1Fk@Hme#KW%&uO|M7E1C+;rI|eW2_EFWZ&`Ov-{vE84!pDL8O7T}*s&ex5^M zj|vXo0>OkMM+ol*qNq=u0m@#yjrRcLN&gKb+L&t{aWpmcCSF2e5rWe zw!HuFK2Khrp^^d4Sk#)Yrc(mKG$ao65zqS$-F1{UvT!q=oK5K~MIC!aRm-PeozWKs zx^L+v^6B$4T0ch_%?J1I^ZAQUxj0Q!2=#|=@%iJY#L^Q&qP%;|J|*mp5V=Ysv28&q zl~s00Ww+hwbc)FFTK)({S=Rj7|MkCdI-BwA^nw@-Z5OggXDbw%KJ-{?7&jG@QJpP7 zljh=L%A^@lSVL(c4TeIFY~+(9ArhI*W?WvLbACBvu~<-66;)HS-v#ROHUWh?6GkGG zWl2?+9PI7qz@lmJad4JJ-_b8xbj(3mpFDZO@$oTkz&mmTrEFNUHy(3(`Z<$vMca3D zu|+gkt?(B!{MnSVr%$op_yCq{I2^$iP?pe5sOW$ElMR$45lRi;ZBT90dyT0Bd%zIAln7u{I zLf23ioJBZ_0dGbi9lo#}6pAOU!s{B-D(;Lc=1oq1**V3$yQGaEMM=OhDZzF%vC#zM zSV&76HGuFkCdQKJbd5Fz3+b?>qP33RN7_{LKxuk0bO8F0N-Kh`P)2j10^<-!y(5(c z!Os}Ez(t)mM(GNC0qwZPNMarvg0b{=f~qXG_k_L&+u({4(Uz&#Ozj?3wNI5ib7PtH z2FrC@^le~H5(UX~I6fc*O*xuSl{s!;!s3kL-~ZrmIG-(OryhsHIg4{8eGDky(fN*( zi9=%IsCL}muc=g|GzpStIy*w9jbL;IP=DM0~iWjHnbV0Z{zvOg!!T4|=g~Ld8i#BBO zGo?t-nmTEsu5qqo&wDNf#Aw>8Vqq&57;14K85FjXu#)h4nF72+2?*tIN_K*INtxIUCvcL0XoZrj63s$M0ZC!;SsAD-NhS1XLEM@Nm!a2jBh6#rKc~P@S%>fDR8>LSE`U8$Qh2WjzQrnwA`nBsl5vy1pOc)% zq{O5tiG52b7C0-23Sc5)B81&Q)$+U6n)~+oGq-!F*%>hy?7VQfj&>|?8%QCXn}6KC%`X6=H5gFSrA^U;UItZmU63Tt5i zDjiwnYbEX~~|82Y77Ul_Q~?E0;gStaZd3`r72@JP~# zF<5~zfeBEF=Ad-^$wwcfx<0E2qsc0Jm5u3)_XtZ<@BI8F(aqS10uxE%bKD7ps3G8S zN)I994JdFn5>h~P%zL zfWqs@N!if0Elp8?*1UDFj}LRaRp^j7C^ZKz(v*tQ7St+GDnS`VVKleLBc47#r$f;= z%|TJ{*1-W6+TuhpQHp)%PzlN;j9fvfR91EF&}nZHgNF|v=IA~Hh=<9G`}y;ioSj|Z zs*<88nbb8Wdt;0QtX9mUp`A~Ggzp!0^OkITsgGk`JJ=M`H>Br7Z_1CtP+N&n`Noj?B)^c<1hIX0s{tcFN)2gz=<7 zcO6Cr#-oz+^GnXo&Zx_h%h`T@Fr#=|*$bc`X71THwh5-;(gu?(vVzwWV3{WbCY#gxh$%+wAJ=FEgQrv)*L&>9qEf^^((U(E;=1Nu?#>L2JAbIs&u4Wx5FL-909v@ImOip4)1SSB8WT zLt@tTO#7bbV9^T;RpO1I3)x^MN|v=HYLbumFj&edgZ7cqjX65p%ltT~882RgRz-A<{AL12hdw%gURsCD62t3$V&t=p1d^p=`Y6FP~pBowbZkZXr0_bV?Tkm4SKa>Af(Q$Wf8CQz>SD4(l|tu4fShi9%CY5|Qbm!9c2u za|G#mcyP>c0u zluEEo!>I^91WZi42#IIjb2;}o5z5-}WWLDOc|LLwJh zoz5tA0kP-AS3JI$;R}n3kq7sVcs!lcha7$QeiA-EyC6Bin2b(~;f8c-B*a>j zE&1eUzvSW9zrnK~{)oxQ;KqCOFU}Y>6|O4y$)}%_`UT(l@O}RJd*A2xf9JdGjYrs` z$QF(=cuoe7ElVUsj0RU(NS?j2V!s)aykKofuML+m^74GnG+JV?C>@x^m|6R{Koc;% zVf-M^UF_3g+q0L_wT*M=Z_!JYekctu^n!Wsh>Ht;=lzF#`jcNGDyNnI_WcL^_|u=$*@AiK`Ga@g<dC6liTZY8)bw%RUmNr!JvaC0`}OvO~L!dJamlTxMDC1A{ zJ{R%)iV%pgLtM4NR^1p}(Qw&aVpBp>AyOj}22F-Ta2Va7wW3|jiMk}%8Xtt()Fe|A zbs!NDlSmedrlw6ETWF-P%%jIRL#+lA-IQ$&Vn|plPH95lqqL$@784ZFB#ao!m^ZX3 zDhL6K9l)CG%k4zbUoLRAq+jHiaK;!?Tv}Dx>`_O^GM5%YSm4Tnm^t#iQB}gYB8O5F zH8}ZLk|-{tcsr`&q$g!}Kj%NM`+1(&@?pDi${=kDVlKAwN41mU;jHAOJ~3K~(?b6Mp+Qf0L7w zedddn@niyMLhrFQr*cnAcWQ}@ng;tqG1}YXtn28yj<)Lvqa*&CzxemmM85X+J$~`{ z5i?`3MBY0-;>q(T_^M>SXgMrP3N#C{TCcH&MjX%j1q&b8)0TH#$&=}f9!QIX_lciP zTaqcLlHj!Cb04$0c+$Kj1<$2qA&y!Z?zx7koiH~FuY}`r!dxPAr!l5r&y5JG!zV)! zOKB6jaJaIdaC@}TqX&=7Rw_d3a&8J!5Nw&nQD;yoB4vdVgH{C!%fdrZ0+5bj7NqS-|FescvjJmRMvBpQn+EDa~XcR@vKt^L6UEk5B z0HQ!$zZq_Sg6~_BRrnYf7yJ0O#RC%+85^MrJyvN<3`}%G5&MkF;yEr4c=_^-$|_>t zvgc~**x{l^t3XpUNSxzTfzwczpk+aADxA{n)s9j^&L^J|qe4;XMDT5PTrnq@zQ+_o z=sgXBlR$_D*UuS~C_|skf|KXCbc~3Y5V4XdQ^%f3_^!oxaDKr^du;Luma&6c0wHK1 za8O#B=n*lLDpC8MQ3~`vfD(-FscngkJ#j;|^NLlQf+$%m`1m^?@$(=4Alnis&2-j+ zUr?3>N`#;N{8OrW!oT@9f6md}`~1g$`cL_*zx;ps<_GWd<4-=p&o6lE-YqH=fBKLA zDS!8a@ALfW=X~_hM;N1d_T(`S-@1pAgv3bnnLFwG942eBH)66kqONPkP0gdnU-0tr z8DG2qHb;{QN27-K9^B*Q`8n_0I;5^^4hzkP@7~Au3%>F29^brw!eVyL$-zF+Pf>lz zy<10gKJxPH9IFk%YD(*{R%80asBU=K^(+>1Mxz=dk=h8278Fx#<%oR(XXulFEuinH zl3`*B&H~xyL^-7MU`3Su{hG(}TUIfYe%N_lM^)=-;B>4cDan$WXf zCdM}4Oi419k@g&p3{ELR+cP1sXA&_gY7Iw)qU$3_L>WWb7zz^^)edVk6$Q0TG?hiH z!jfnR9F`7UX7S~~YWD0}rlXG@9P)OPP!EqVRe|!6Tcd)WF@X`$NA4dq^y(gcB~-p; zUq`-u{|-|GCoP8~&DY*Oq$lBm;;?}a9vtJ7r;Lu{vSx8&Sr{R89S8M@uid$eH5J+f z_KTW(2gd{rbrkko!-J#Sh_N6YwM6dhHORQc_MW@@V_r-bq^cl!&wk~2=k^hz6IL`6 zt9WpHh&KiLxZ&imp$&qv3h^bSj@&tz5G#vHj?xtzO%AhbaZnsgYVM?p%0M3jqsH;@ z;a$A3#MG1Gf}^7`d#=Ig#H6ykefOB&jz}hQv{%rC!7EYLHoaU|CoT!YGSYBe=aV|i zg^H$WsL5%}&QCAtz2@}v1@GK{z&C&6H*f@wClk)jPq}wkQ`e4)j&FbcThw*UJMVtL zQ##JhPWkZtuTg5@?K`(|=vC;jww)1U4qaYVCC7&cjK(#_Xv~wy$KU)WpFMtziJs?Q ze$Maz=Et00UT|=9!pX^PY~S+57mskx5hf+kFKFs}I44*I))-1-sOy@P5+P(jt?kWWchHnO3eBfZpk1;%8o$gJCns5F{{ zjGom(yaLew^6HjsTfTjJg+ODB=gTLTeD&srRJDjO)3*(OeftJeS+o@B)1Ggx?-5o* z@SLnR{PE=*u$B}uUz~6F`pq3!jm#NaY5wr~ExD<2(}cA(udW`5Z5hp(%JTAX1g%g$ zaxo=dUhSD0g-Dsco%!zW0X=mn65Fok{V)-eW*SGftHhi88*H<}&oh-d;nm{yEB#Fw(#rSlbqZAjW`5GoL&^r*{QiN5%p=}!U;#71gAdD%{jF70aDT9F+tS1aWq(t>R}^ApXNYu=O+c?!c88kvG5OZoA{A>9JXpIpgiy zQW~TbNb8>C!z0I}a8R6>ZsyuWOjXeb$HjKXyW5GN1q6p*b$qiQ$;zSpk>9CHUS1zS zd4_31H5Gq&b&a!{7!&_Z+wh0?4`d~=DEfNM*TaFycc_?Yh2!?&K(-BrBL^LjUU8Q) z);L58WF7f_7zrrC6lnvzJPNWJAtuf@JHEM7c(ErahiXsw;a*~@jF2!KF)!gx+A3nIY%Io zqNkR{AX3*Ywl>W3j1-!j6%vJ10iQhDNU|3AFqb2rl?6r_i+Dt9NmO99LP-j}RS8l~ zAVDcX(3Cn}3$n^&4az615!BY8D@}4URi#P6;rvMH?`EpXpkyKtsEjEXr^OkmWX2dt zj3A7nG6E?|vnr*4wHjSXv=IoYuvVgVfnVe((L&MpE1Xl*bxW8_LT?lrBLqrHYEy$U zC^FX6-~(DJ{4(MRqIfSwUL24MVyyZA11^ z$Nf(fe~LyoBq0uwJH*1bpd(z>+<+kCe7JOc*LMVz853j!G_TV`C zZ~q5|s)U1wlnZFKNg1;8WTl7^q}8al zB4kBQCDcV}TlyLc>me`dN)a;I2m+Zo1*}w186PAC557c@HycH%xR)-JF-j6X$F(YA|iAq zh{T*6A_~ypvM0!&lm@!cJBU7zD?yAUd?NaUHj)?|DNKm$i4m+3C@pYqLd&XXOLNgg zrwC#hv5*p4OHznfZO9=bGq?~?LZc{|eJVl~KzYi8GdnDjJUZ&e5`sgc$T2QidJ6G@ zyc09oL-MK6aq^N3EChb`C@mR}`||Ul2wA4%SR9TqW2_>42>1vYDv8LE;EF&arGym; zog--;v9f144p?=92mz%%!axchAxokS3MPNV%0N<)7zKy|=zy{ah=u9{yE)VX9MC7`mT6H)V==&aP ziz+mQg2Db^Ec>8;*IJWuWVhKO5v*4oIZ2Mkk?}Ax4I|_29d%==>$;3mLqyIJV>PR; z<^1BD-rBO*Q3O#jX2yj}&@?5IeRAc2A~=*5A9;XTSR$_2~sCe|N%zkXS8<3ubS2BSJKU=x~eiEhSG*GfEUdjaCNdhoZPsC8$NE zfFS|_azdnlBoe(VPT3ramLLmcN{HxCG7-}ZF~gh@K4FE#jU#H)!<13AKqf)o)I8oF zkj9oqX=Bg|w5JHvfg8%pc&>3GQ7g}r&M=*=iAq6^yx7zju_If7aG9r_=J<3=s0=c$ z_+;JSFSbmT#DvVJD+_UhGlJA;PGsbFpFL%=0wLBsZ4J};j%X|d$40~7Tqw({MhzVs3 zPo6xXZd($CHQ4t(`^S5{cR=^?6fhi)gy0GV$rw^92}aMKJ%N;YJSL=QsI^D!V4BB| z(2@d474&V(ZnNV2^n}VNj21{))N2aCFi%LO3l%4WTPR81J7NZnX00ua_x#tt`z@b6 zKP6hlzrOmO$!qkPg$wH!1!>(?a@{X7#$8q3P8~*0>jA+W@`su1=o+4BR z86}skC0?8|nFgIC&sxpq$q7!H;??O4&U6e)qGXw5Xy;k=4M8Ym%A8fus3$mz?_(!3 zzx(78uM#%Gr>lzU)2Dc?&`U4mRznswCpmCxC0ku{SjhD!7=(13@3w@LXoY6067^?I z0q%sznN@s#y8dw?_{-ZXx^Bhqzk5f*pyb5gef~Lr`0gE8gGhl@|0#d?{;#OYmRYzA zeD&&%tR)sO=90g@dnBkrkg1j7+pC8KG7+e?;ZHwYks5=_f=#pHPcPq-dqYZKYQsN& z|F$&mVxZe@`KKRVlRJaOaMFItpI+S%OcC^~nwtOe@&<1VGE1y#`0CvqNh%bA5G;TA z<}K3nDCJ3)&-wG~8)VhvoTL71&AYuv97hgu0;l=ow{MVDgH{60;k)ZQPz?r8r8D2X zeuGjQ=Hyr_!Rz-oc{eI7|KX7m!KRb+6Y){TOJv}80 zN^Dk)w3SAiird?Jj4VBuk5h~farH&N`Vo1S2)Joxv+6iKJK=a7nP*S%3Fjw_F}RSZ z>xQ~f7^!HjDYPdgiP7WzTnsO)Ic5>j%${HypzkGJa4?kQnm@)W@BUx!w%#2Sq{Oh})2#Ufo4-IAHjnsyjM79c18M3!bNfK3!uyyHZH!J3NkF9Ea znsFqKA%HCL)eWM(3wGDuzO)MOPw37T3LyqHorAqZ|-9AO1gqC`Y$flv$JM2ccj zQHmr5wlO59@WK#8#T3CuNTy~^l88ZiK~5GI1fp(m!IMSJJna$GAVR@{siFm!D3VMl zB0v1;Pki^E{(-smr*A8ox+0^<$+PQwo}QjE&Wkr8 zrbVPv05IAZ&d<+L$#H#qw}35k!HJR4QjlXJ`1wZ%Tgs&_l?ss~({QA&B)fGFRD=XB zG-z${v4oLSN|XhLgi#t|V$Pl{B{3VURan_DxS7$rkJMwWHKPwC7QcS+j-#yR@&1h?5EtBT?2I!##5@`0zwUPz^3gvepEl*iR#q zupkXVHaz5kL28sK7V3vA8FfoGr7ZQLVip>VE-V3A6R`+uiAfSA2&0jeK^sU)pel=3 z1-GZ`ihS@$W03+xWtrT8agj?~BbZZIuu|Uh(GG|}XmxV^i1t$EH@Ee^&1|&IANJBY6)+iKi4rry2 zWSXWz=t7JUM6}9inTS~;bycjE3u`cEK@0+EEy2ekh!C0>5=JPJPedOI?=RV+C-4HL zN`Imf29p$(G=-lRV*xm3$SToji%Ap`FOd{HRvRL!c+`C^JCuZ!f6NF>DPxT$`GAqd zkFQijlc|&@rc8)|;5<2%K+#IGh?XKbr}FtYhs=pEkEm6T&k>}+B~N2ZVz5?{C{nT2 zesH`kpp+mICQSVPfBOgitCJ3IYHq86KmPIetj?Z63>ecEzeq@&ZZ|YldB~KhsO%DH z79#8Z1UJpV!XPBk_bpawq!R4+GdTvdDE$bf6iNv6vS56OLH|G<{$PS)F)0No|YSn?1BC{-|IN*2hiTtZevDm3VjA|=6DlhRcB7fO*`#D|%XBFAwq&9fLu zIS}TN%jci5K3!w|f%o;1PM#FNs~fQ*qeCVu5V|a~s7!Ow{& zR^$7cpb|vIrB$S-=ZwzdqT@_vety0!jjxpWq_xD;b#ZY-_@psBo~($CMTW@pTH?>v zk;_WbJ>8Ln1{F9{70rtaT(+bfdD2)`WO79m7JX-BprL&o&&Y4iOy}U4se}RTw#lh|VnDd4&)XAtKkWUvYT- zlK<)7|B=7{`@hF@E84mPB;Mx*x*^$aI;@l!QD{QeSX?L%udSOx^0WG5W`Q6ha#=W7w)dRok*lXE?QzoEos2JZe5&H)y>g3WWwvD!~`08yuFDEEkPHp7jg{v{pQ+ zD|Tkh0~!+(tF}gmNbd_gwo{f96UgBwJ%Y!ei2?Go$16h>VfK!39vDN1CK7xm`-xf9 z7@wJknKa*lY)~=~BHTUR6K%(w98V^=d$?sZ77<`w84kk(11sV%vuZTghdcbxGUK`2 zuK51u6;8Fd7}!)5-(0?`{dIA-j=Hd&!?(e$TaTs8q)2hWGF9h)s=i z4lN~b-@ak0G*whwH#L9#{xyRrrWf8XSuq*Wv+Gz8F_aQOvw?0Bqf2=f@wbDv_bknBBQe*NXU6cBN>jK z@y&bGKJvf+&;OoZ{=0vR=nPXF(I$bLv3*^n-%=rRkzFekl`6HpQDspneMg4~r4DyX zQj!Y=l%lm}nkK9<^lgh08t)?A`h<0JB+d6&TjTsdOl8v1)P_nG`E|;3(O+P&wkBgh z8;}AM7YEyN+EGyQ50yk@fy$cT9a)ItZBPqcNGd{vDZ-dE*N<(y-}kR2JhBVI~+)uIKgR}E1>O(r^zs1!y?>L{6kP@8hhcL|jvbJRFlOhMB)ayMi| zd_=~~v9i3I4me$Q?P-{JH;n9;Tnv+o+2}4#L^6%B2x)L(#=9dn!u@#9>+1obR1s`h z!OeawqqgLTbIbQv_k^w{r9gd}d2=%n$Vg>@fxJI*SEwh9UB!&xxFF{M^!*&Tb%D2s z0blp@(r`?YyU{Ty12Xe8MBa=OUR0QnI5UR#-jj3%F)|@JhKQ(Oh?!%Ej2R9-l8}tn za1?@lOe86oY|UP%0wj%!Lx3R(Qe}xk;g#hW1*t9#s3}Iq7?&@kBWcZ;64F+T!SU!k zUMiw8BrD0fCJ2qHd;IK>Rb3jN%Hn-s%!!~>0gePgkTtpLp{~hE6J-VU3Xee>!I%Zf zRG?et6q&PP?;}o^n%t|J{hUA>M1*;QFiVK~BO5L)|2{a{3SC&2heavce#N~XIQW^i zs)?z@m&aHhDx(cbhyvMA3KqhQkBLZ#;@=O!p_D+z5`WgNS14(gTt&@1&)BNL zSch6%f5SK-CCpw>*%o6yM4**G)EFaDEvZDQypJ-5{ICf5kH)Iv?d zVoJCiNn{R(1C=(IEcou5@7Pr}+b2(ubxYMWG`kh6Rma|s?33f&;huio^L{8q<=JPp ztMdP-1R)AGO~<>3kx7?K261}AI7hsbcoI!WjK_&vrEw{9kdnTxcsnG7)l|_Da^me& z`bpMjWTm;Dm&C3q@;nJ{19&OOF|*H_NAySjVo(*wxWIOO;M`P&R%{K~C*~{(p*%y0 zh=>`lR0-`-ihDej(oELkVj$(jBn<;4R4BxR(}rV)*++zgNlK166ICHE1Z|m+98#h( zhDj<6aQunyMT(RWN|zWaAyFTXn2QC|CvsNcp^=tcB+lq1VMR(wOdcg6$AFTcBoG%{ ztr8SpNf~pgrM4&KQuoA2^0BDtd@Q*Fsfc}K&Pb7{D~lGO$c1MY999ZMET*9pBl9>R zQqd}iT%@fkeL#VEj8@3xF(M;VvEEv%>D#7QtEC{ja{bB8gmI*+EHOAlOw`&IeSVA> zyWqwJWLKJW#7qi5#)uU_r22S0AL?%?*VJ|0@;4-PU9(zs7^NACl+^~!~2;SOD!ARM2=IFVBRSbF@3P+JH~4y!^nQWXSeE+ zDG_JK@&3T^=AQX5AcSE1w5M;O5*KZuAVbDW4WB2+3yHyIE*kz_y`@WO%02n{hi zrZ|#xAQFh#k#j`JVt$e$l9NZPj1rMbDMa?jMN3d=Fd{*6C=t;zA@L|27LSZGA~{5K z5N1RyOoy0L2|!))C4P*O3&={9a2H#e*cgcukx2%|=)p(g>=7~1NR0^@?Grj=nh#L{ zsq}S>DtTjCh=S7>nG`&g(WP&t6?2$Ne=DaS^DF_~iHz|xCw0X`6tqgvipbNx=4vi0 zm&CK}D)w%mwqRvuZ50QZutLz1IH@fY8Kh*b1gCAqQA!Y*ofKTQ4YxU?Y{i+>%(fyo z6{C{utmf&eW0V$1tR!5nTY_!~F|$(eWYsf>qFY}X&9lv#R<|7HkzHlz&UQRxh#|5v z5?5CxN!BV>N^#Lv*tyi!=Y7rl!vjhvAkZ6w)EPx2gvd%~PAWl66Kz|u)rA<;*EJ$% znjG2c0x_A#fnH>MV|mPOfnqs?3MA!!%%3aM!ve<0lBVhCR~us2A+%(-+i;>X|Mc}& zT)y~}kcz7j6gdf$QN&P0CQ23mfyf0PAD2wY7$T5KiGpn#N9NgK>mHjb*1H`zUjQ2+ zENZ%ptt*_LsVhUs1uXg@%G^80JRhhkPv7^XTy*YI>YprbvRvyjnv5|bwZeJN>^(?D z%rgm?oMVoO!IwoKD8b_}a6BG4+4h|7w!H4w>~<$~ZOh|vV0|L!nwIf!r0G^%WsR7j zcFT0YMN$TpWdW+Bgp8t~;!q_>Cnt)0unM9^)8|F9@rWtK2 z8mW*Wp<@9A+5|>utSAH}P-seMPIeJP(E+GfL`6nO8c}`*pHWe;Qi?i71PU!Aof6a( z8hBEfb0K-mxsa@4NjPew!^aF6WNm0=qAvDa>c*giqp<=d6I%(rNSs*Bq{|5jQQ(BY2hSJ^eJF&4sVqoQR9D6lCG3ZhfWYO5h>GJl5p#L15E9-+rVzP1OoTYI zsh%>-0VfqM1jeag&O*vqr684V?i>qaeq18G0GhVw+?%GtOSSkl47zJS?*2Kag*jVJ zLYa)I8>-ccrf+Fh6{eA#$rW~C7R)gqlt3)(e_%POeTaG!WHK&IAfhE3H^n0b^@YG)Spwx(;JCl1Nk6Y&R=r1;R&~s-|15ktpUA=<9~t;Yd|A zKQ08{-rV9;PZ%cdogn3ik}HN`;B7qMV_WraVZfUP=NzZ&o;Qa>F@{9R zYH(anfumY><~i_Yobh#opC;DEF{I2fBz#DyyDe(S5!hV&og4xFAIqRSy*;b^D*$n$AHKX zmK*>d12JT-uWz}#e=G}M(;<}N@Oa?yIPm`Vf!G-}AF{#$T=;5lS-7 z9{=eDfBxYOy0SPI`0ev2{J-D4Lewpq%$PK9-d+=`hUgPd*DGGWdyQ{e1d2~r9mnH= zI}%cAo>n!JbG&jHAv1l}JX>47J5C6ZsW3clYTi7|L>VDOtgZRO%PTO7JOzSPe06g} zY+I5K_@?ITt9O`Hj|d7?@A&ieHDlY-BuH8_9}gT9sA#B(7~!~@^}?-~nAMga#(^-7 zv@x^pTVCx4W(CQQoHfsRb^AzYG)$hh+wj%98(OCxJ%Z-6gC;?U7kx@ux$;yzkAPG&|t(XcQvP5HxayrOaGx>xzRpGAbl7JMK zI?<<8K#@X_QOnOMw6R2CN!kB6mzKIrqpT$@zh4?t0woLLD`i2|Htdg&C~fg`z?iyN zFLN$ge3=EHStxiegwlx767L~EviqbUNpRWvcOqoqY$-4H5J*pB4Sezbw*oTsMK}ElvDA0C`Fb6V=O`_gfgT& zVyq#hNM$TaiKT&>kQt`s-chpL!!ZYvD$X)vH9AQeRdEa;J?JD^n-(ahtmeaOp~xX% zm1a(vn3o(*TM>OAh7x;kRYUX{O^r2{AP2mV1Sw0}Skee%h(eI004+(f#H=Z4h$Tu3xNm@r6Bl;MhZkKWa6008=vP1Eg=jCDk;d`BMIo} zX=G-Y25KzprSUa+Mn);x6?$D0v!WQL93SJT<2(nB&TBTXhouvnaRy4Eilp1 zYIt-5oe(rJki(44MZ8nRNGAm2@la|vD^N=wp-zD+ImCEGs|qPRb)HZg3h|A2@Ti`E{>1AX@V z8RK96!ghDcemLT%8H48T_KuWg!H9RB!(pIamx!_$N_pafC;GrV2fUwoe0<>k{vMwK zwr)wz^ZMOuPQxjWhdqyvBgf-NYc;_Qv|YtGj@;bca~vjIDy2_Ik!gQK=g6w6INTli zAOGFI1z8$yZ{NM<_Ue|y!-$&$`~9BHc15@9v9`>@l{Li45p!ZZ9`HWmVr2h##FGfi z>kQ+}<1iwXp;@r#4>#BR_7}fGWywlqu5NGWx`wO$UAh0piP{LNB&aAn1EH5(#RMjc z@_>YhjZg_g4uYIACJSWDM4!ud(+E-$AT(*A6UC6o$`TW(%AiH*m52;RD%>=aLg5IS zED3WcX1k9G*(EhQx(F@*QYwjz9-AUMN1_j?l#$V)$wW5;0i7b6#4t}kE(E_k>uK5* zyH>FpiYddU%&u*b$BY(%&ep7@qwZ@$PV`lWGLjC1Qj*igqUVtZSwo&VskW??;@U`L zhI3hMjZcwHEm`*x<4Sk@ywNndVOA|cWHz-TKh7l8pp>IFir+my(@Aa%^W?pR@6cA>(4H@!D75%Q)N=t?2F8eRV|UiV?!XJP_eiY z0fI0HA|@pC?i{sQVT~eQthydk3qtbP=Pw{gzW(OV9L5KB+Y6>?;yi+_D|B5$D5c9ZO&=!& z!!+Wu$7h&RV2+8$VPJNdV{m-2U87XMd(H0R45lM7II`Yicv@S=vu)8Pm<^va3eL{KYFrXL?F?1CV9be_BcFFQ zy*lM66w*j8gv8q|r$Qn`W~&s|ZrCkTm{m;FCh=}6_;8aG=iQ3@EMatwQIhjcBE;uN zE6G0d*-Ekc>;+jtgWxS`o;HWGqO@vj=!_CNCDaPnIU)79PkKE=Xq|7YWg!_pbt;t?+ z-q*Z)cgL73w2>TA#lyYlVct_o&wVIj%)>k*D#H-qaC49EPhgyRwr#oJKX6Qnc@8|; ztdze@$r$-IYLN`ZboRs>_+bIAIq*dIWAAm$-|5cnK$2khYS-rM^3ti(I0sI!}omg z^q2hS{m8qAz}x$Kl!w3E-4Mu_7&zIqeE)cZkQE}#sAm`a>HX^^fhizgJmIVBw+O4r z(h_O;_Wcb(E0E9|#dkOF7#690*sQs~zvrM0LS!!cp2PbCw+nUpS=XVn;>wk=w~UU< zP2ykQzC((_#Q6Esj<4R_5@i{SR=@a?Kfb*pkWnu3n=d})pT2!Vl%~+NpKti)%?(jV zq)0qD+w%B+&x0x&j?+y`8{xg1h-l6voVA(1+&>_dqKP9yuK44dcSXiLkLaI$#$R8* zX2j#?%xP=*>g6k<{|S#EE>H|9%h8i%_G^qqN{7~^E1!rMqfl01j6z3=L@f0QCC#`t z1Tv!xj4q27Ir=%q-0o79PX-kRGPDovmqc2S@S!A}Z^vyxRZoOf0ZfVkG>ZZbvbE(gh zM2M0mEIycaq`+=Evdm2zxxf(Ke^!C7X_mb4H-jV{xBJ17)vSWd}I!R$3-Kcg~W=? zxZm@)zxWNSzGFH(@c#COCuYsJ-~N@YX^>L$&~#j@8mC$w5hT?jlq5_8Ly#PUB4vRL z8ZTRt?uk;8ZN`a?z0)+!ijXqGY)EnfZSctxWKEPUS=%zfvTHm8!WP@M&>dbxP`dbB zM2#kvpqM1E+7e<3fYGW*jOV10)v9O+RA9;$Cz{gN(3x2_cwvdgA}UF+7H?`$76e$+ zlI4Wa7OgUEy&@e4l&;ab!Q}(TO9v28{6VeyLx+T9A9XNZO3)7Lw$_xB_+K2LO&LO4&#k>mp!MI7gkG?hwfl=mnk zVsNx5jv!;wa7bW9il zRT2!32R7>+$$8>1GaE^6Gr(g=+hmN@HWK`0~A(g3t=hftDX80fbfyr0pz zm`;X$iDjSWkrXtyAyVt&y_jduI6B_Ezv1`4|2@C{< zzrK9S-X~tadCSxDGqM_~jYc9FhKbw9ft!Z|bz{p!LrYe9&BHwL^7;m=;QaK2{r-qc z8K1y(8_qs?&P`1GFaO8?#lQLOuleoIU$ARy`d*-n#7BpZj@yS@veE=08Aiu&oXA4* zFi#*etF{o6bYt0%d#3rwF$Vr}b;mR$e)-wo^3Si|!>@kB!9d6!vcynQgrY1ShH|DZ z&AgN-fiY1)E(mvRiz@Q}r|ZprHM`FIyl2gO_{K9=6{|Q&B&C+STOIe{A#f1nGKMdL z{E(_) zeJw_nL@I%h!abs{kft57Oq7xdQ>@{zxI-&JiUDm}(22r`R1&8P*KtRZRXj869AS)1 zq4soyR(0^Lswa|MJtCU>dV9_=hU#C4;dc*$2kRNmI36q-5_5#8gO~@sA;yj@1&uZw zwTgH&s|husIA}F)p3zb3bNUVt>2x#^hYz*(;Q=_6UoE*CMPlwmCdq9is|X~Hsk zI9hX#p=4O+2^KvU)FZ-yjF`g(7oo~Z4h-ZJxQ(y}PIRH<%=JBS<;V%f{lrc<0-1#d zHIJ;4L`y-N_pBCcX1P#GPbUL8CdOR1AWa!L>z51|hAFXb8agG|CCQ{Dz0jO?Yc`^- zcSS8YY8AI$fRJSpyY&1h3)MfDHo;` z$h!LVB9;^~+ufe$uh03v{?p%Z_UMeu{e-%{rJp=kn-SM`gphc5dBb++`TXmrytugL zdYEvo=X&oMLqw36&*zL&WS2|DfEU3gMD#du5F)qFU+}T6Y|5f7@2)QC7E5loJO2KQ zuThO8wGC=^$bb0Tzr$zvC!aiF0+#c{6zhW^35YooQ)ZY(u5WL++iWq~qHV&17VYT4YNN5vLR`uASDjezpN+7aeo&t|% zwP!Gmi9?-u*lRo<)f*0_XWJ`+68HoMx^UVVCZ))-aBKy7-f$;C7R8}0G;_yQsVCgi z))2RvnKL+T=$ynwXr!(dCM7sAndWFoQ4%EtXGRj&Gp3S|5#Dba#PKm+)C&9)rx5D{ zP%T0h-m{MR!I}w0qHyLK4%TZ1AqZKqY7*KcX4#>PW+okT32D}%gaA3`r0EFj;|jwG zaMtz2#l+};us;0q-7T%_C>p+edtE!xA)?-I5&cxb$08 zmONZ`Y{!ACAtSZnXx$O6H|$D-#Ul&EQmSQ!`nJh{Fc#W|?VCNxR~O{tkDhS#&1)`q zySg?qb&HdwB&T{3xV+u+*MIY$*#(L7nY540vAlWpjgt-E z4^^inVK+@^H^&d2p=^*+<5LZ12`RCzWi#w~etyAv*7A2>ena216xVWbbxpjw;ch$d z;_`-e)$-!qB|}V@*_yxp#phV(_~gkUjVs*kC(3=sAPL17BTrwx;^Jyo(Q`#%Qs%*8 z&9d*9H7%VL)mxYy>^FS*=7OiXBY*HIS8;~U7FB#zwCzTc7PLa*eE{kPfshFyP;$H{ zj@6TE2np3xaEZOQN-1mZ@pqYV92xIHGO6pix!W*WTiFdw%iYZ_ds$n2IK#~txXB)a z@cfjl2jwD8M zP8`f1^6cszNmlm8!f2k~T(T>GbQCcs-%Y$twOqDPiM^J*+>VF>tu2_8cyo1A`5+!n z7lOO(9m6#J?m=L!t9fft*MjoCvo6GUyn$3jjHM#4zY~#4T`R1?3Z|S%st^rip$H0u zQwXPUvz880wKZB`8i)ghramq?<~@8AY)gltMZQC8A{Y z4c7gCA={dh_f!vDM9>I@(1Pt|OBANQnM%ePO^Kk4WegD|z&LyFl2fD-5E4qR_$ccP zV*%2A<{=BLcC>AaP&Ff#-mK5_0`-NUf{H!fLkLEr(}EC}Fv^ zJug20H8BJR1oOrqwP2bCZudKW^XwU4yn08oJiuRVXg3o#yOFlBT<^lYry%qC{F2cZ zCL|sZT9NNP3fDKcm1z(Hi`kqIYFFv(YEKC z=P$8$Gp1=`+6A<2aq}g=_|GS`^EwrjHZXaXXx?Q>mXKrS#5!(; zC1=?C$dPQgMAt%B7F?paDuoadAr|*K>i?E znC~aWq6lOWq;L=4h>1J}ijf#JeLJJ1JCcuer`c-46z|EswSZK7MjAoMna;E{at|Ji zQn<#l36PRRj0NW!WSEdLph7~Ukv`NC(g2MtF#5WNp+ZhO96l6`l4!t%Le!O5t1+lh z2Y5mXTHSFMYx~iMh&3I=?@>bEe|dof zS~^5l_%UKy%a9XJRSFVHvL8LOXh=TZ+oSUL=|Z?S?Uvtp4ou&2_~xCa#3=%iVLLFJ&G`D+OO~samv7zxj$8zrZH-?` z1%=3F2t--vx&=gu>MUs=xW3u2^@+C^SKQog7<~oTcp1^H#pgu1C+{Q;Q;J+{Zus`( zBc9J!EKNrYBi;;^Q;{Xn8=Oj{BG72+Dn615SRqlV=KU3Q=PwiFDWR<+rwSFRkX1=e z1(^~mr>aR8idJf55;&_#(?lyQ7KslDYYe?M+{${IkU%%PPi7uk5(Q@6$h$t!@{JzKF60DmZDeBLgEKojyNN8zM+9B@2C{jw4mZT}x zKwAbQ6eNul72G35BxivUuG*5ndl3Bmy(L9B9v;nbv9Qx1i{@zEqGQ6hwq^l3!5^Ki zX#0+744f=1z0{P(qEq3)q6JwfQqc*)hfB@Mu92c3rDo|Qy{qb`Mk;3PIBpgsA?QTQ z+$7ff2tv>c&GAfeG}N}(LR${BU^OXXPAm+pbmX-c2x(~wm^kp#D}>d|m0*r%J}9z= z4ndPg+F1`NGnbZ`*wanbu-ogFnF)-YVF;d;KE!Iz>oL&?Ln9?BkF;7d$-=^9bU)|H zOH3!xC7`>8*JC6%^;)FPj>yG>kkxjSD}^RghnF=TTzK!}&-h}qrGN4vRuqzuXsbYY z-dtbv=y*SqlBE!%9Ud8R;yYmc(hmZwBmgP96)^Nfu4VyK!G>!X+V82Lud} zdDk-JhzOa%d%pVi6{4N->f(+e6s+sn><5aCy#MF_1HU}qf^0c;p66NcdK7T{2`?6N z3edHNaTn;LB8Ws&e3ht#>e4haqtb+o9-}~}3C9S@J7S#ZUF1kh-n9y)A{N7(%)Dfbt1skM?>TE1L}dtRyMF%mEym4h8hCpChRGj1L}`hUhLdH> zm#?lsNGy_%PkWx;+%XBk%FVE0;MG(WPIGA)F?@NqBL&T2E4eEZPd5o=G$*}d%gE~y zlD=hS9SnDTv(F>}>&CE>i5G(;1C$AcO zxZ<|BDp+xr-exx5ayxAaU4vodYI4NO!h^#lSKDiDlSF0B*hF@>ugRbNjN;5c5T5?< z*Xf5J@$J`NV-@7vD>k=R5Ikw}eD%!>X6*;4PO|KlgmI{rVQaVIA#gY&In@@OgS2!>bN@3PYX1b+S4MUnZ zo-Gkmq+9e%_mI&u?a1yFAuYB9R;KXr!$Wi`7<+~*@X6y7glthd(-Qdb;VCiQE8leD z$M2nxRUwAVX#?_P$=+6z_Hk#~uG@MFO@gH@Y@8z7dX;vzU}grDGg&HnXR*<9;${pf zu#^^O0&`)oLLjq3`fFx3p*n?G9-zv|(X1tlOp^qqOtg(8G2s+w;aSct9!U``%SMov zwm#&MEE0C`2jMgo$u0^${2*CqT!&B&r5mi75w*ZHFhzx@fmRSh zW>T6-)i+B*FgMYT!p`8Y#Jmf=dt5S{Mok zZAS?8IGx8#+bM?9kX2%nJyK=76G&OumVgw2Noop~fF)!Frmeyh6L9gk;Om^;ug1B`Lp34}WCe2UCQqwiZvrp&12G61mGFl>-)?qjAt@zux?J-0 z#VtZilosq6p42lI|E zudh+Yph7~J%?GI|msRWD+2pK?lau$SKz(B;~l%oWXB7ol`ttF(0lQTpd$XZv( zVlKp-DY?EWrj+ryAd;;Ae$kY%QiDT|$ljo`B&NzRXl;uawkRQMU`aVj31k#LRXy00 zGQm&G%#4rqMve_wbC|ImmWMWX3v{K>!k@A=z* z`@eH|{E+eXn%Qd2yNeCqzI;pPI-DpR%?%}G{`{Z*Dc`*McSvhF=^GxNo^f@3!K*iK zxVpMzKL(b4$AjY&9!bfQCr`M%yyVe)AMol`^%Tx#Gg9>2U2bSh%a1>L!qLewUw!)x z^ZA?y4<7LO=b!Vz2T$1TcI@+n-0qmIR($c**9=48{U1N(FaG!whW#BOEjhn?$@*}` zr$7FXcGj{RcRYRdj`OQKitaFWMu`4?D0~ljQI^Gg%@m->o^251Bxtfj?*m(R`68O2Nr&gLzJ5g{5DN^m-#QLa5`K`%1vWk=ctLe3m@3KI<~RO9U0IgaOoF^~7G zdd=D>!nMZ~fzq(Hg3uIV$t-2zaJ@ua59m_RLNPajL3m1j|C;N(A$iX~`RPwt9Au7;j_4k&`0Uf4 z(0x7U;NXC+toE{z^Lc+(y*=)`q{pHX2 z+0TAP$y6m7zVU%>Y7kHa!SMkDp%oZ4ikRA!O4#76B3C|g`7P(d58%S z64ul(j?S4ThZ<0m)#NR5A%<$zs)Wcw3cgZ;3zU?Y^*t#RtN@*3E$B@NIZcG!u5Oh= z6#|#&A!kGmNMQ(mzz>R4+fw8~P{v3Rsgi4aK>CqXz~ox|vpJH4gi>%NV^U;HiR1@N zDX3D2-Xna*ltT73i5o*euN)$55HeJEL(@PSQCX1V5155toL^$y$it=K_G-sQ2y#*+ z<~%b1?yE0n&(c3nR^it9i&`Q%Qfi8*0DE2v_ttAGJk*4zW zibRQeI?$~{HID1uH6BTdk!9CobY^)_72Hl5Hv22GmLwsuUC%D=QC*8cvTQrX;hJW# z0F_wvEq=H`_8m%PIxA_UWKlB8wAfO&CPM1}-}%6ICl)2deXc+v=S%+EfAc>vZg2U; z*UxzM%fBN;X)XS<_*a;zvLJnCsgc+U2~if>jlaLD%Nj_3#E&a!)ZLEH`; zX~+8Hh(G(}GnT6rY1lD4bSxJw=GTVt-8I%)N)cS&Y+UT&q`4o8VRRIOd><1{vJ+_2v%aU zAuwo~C|mr%|zrox2ddS4OTdOz`4TCRL1-b*-Fs~I<;5Q%i9 z&}GL(jFeQc3GfrownLp5$B3|s%T!s4cRq3#;psL~tmZZbjvCF2ArOch^_FmV%f2~6 z`ba^eykHXzB`dCnh;oG?>AG%e6?d`jaL1I^Lr41 z!}Wssy4s_D^!|suz1lHrJ2tz4i@P1y`-$CHPie|%Hv0`q76g*E=@|TkT=r~*;Q7rh z=kKl<+luJIUL#GPMUUEJZ zjF9B)Ip}9R-`vvZ895Dv;}u_CZt9=?RQU0uBYyS#9YGgl7P!X`_%AQs;T1?Y1vM;4M)B!B$)kpKMkYm#f&k2~bYpYn?@ zpHaFQYDoOahfnygU%zB94Js9W^5lfKuV1n=mXZo*iw^7I&EVPj;ddv3LZ}14JkT}} z5vZvk@_Z&=!d*0+BMBO8(VF;A}%tre+>; zH4Is)s)(a@mQXo?sz6n%G(HuaG2b8IrL2Z$WTB)g=}-u))b+la1XD3csgTsjuF)DH zWtDlP-@gj{;lQwzLdM=pHtYN%D?urShmYPzV3Be{Di}iK;(E)hF?GBOty ziv_lGD6LS+A(iB4eu(e^HJ0z;rT)(Ilhq@_`Hpw*ep5dH%GQ8U$;@Um&e|D2{n@{S zn0W8ug28WVj=gCRtz%mzQYolb(ylv1i0D%NhmEmZUS6T(0T-7y+-&xYp~7NfuGfJg zE9-GTjpQO&A0LBjh&U!3*;S~mH9e+m5w;;lk7*p?c0?J2mDT36+w7rf5kPhM2BdQ6 z=r9Jn7)i!dlCsfkbD&sDGzyUo`{EgN-Q{BnUMu9hMJSjyJAxK?Ye}XC%mx8oS2Ndc z+%d{Ex}T$zL8bs&(RD4wYMj)#dzp$cEk)J)ei6|3J<3X2B^X^~@TrE@bi=M>O52c~ zB9ib30+K0ZoOMJgtJ%mHaxw$~s%;sBKpKN^hNLC3X((fDdSHsCYTwxn@DTZa=r zXdm`K-za9pfW~EPOW8kyQLA9 zPJ=9o$xk#&VZCRrBqP4sXp*2)nN8dw_Y-#3qg6sq1yMXxQOreT7p9uRyyp!5;h?a7 zFd`Hxn~!_qamjr8$&V0PV4OrN4LLIUfw#AY`N0WqZ)y#B(JxWbvh0?uXC0f}$mA1U zH)A%RvrujI42D!W12G}8KwC>ju$(X0?6xcqmdsa6`dQ1}-5uALS6~EM7-mYc%YnBy z7o-wtm15bn%!*`}_NZpY^VhFHNyb?C_U#Rq+sJl5p+v{1JTimK1*FFNn(W-gi6=k* zOJdAe6(J4G(*mCbA$g38q!MYQz~n@biLP67b9YReXgvmpvGGd&_euvcuI080jlrIQTDaI-X8qu)v5qzm(Bb`Yl zQu0KfVJ{UDd7n!4q*4n|go1TdI5UJhOlg@p%`7_3!$?t*J|`pw9VfOo6N^??=!n(m z0!Dd+2PrZ!M+k)!cMM}9yHu%0aYPr54||Hz_ut=)B?FOJ5!}d{FjPN)=joUeoBe=I zp6DlT!j9lQ?dc(bsy0s{flQ<{;qyHvxr}u4rtVLr!P&^FH$xb}WM6**j3jBC(||< ztZYV^o-CjjnI2D<8@x=|lyQ0B&^pM4W2bT9miHeWF$`N~LedFCuq&jL^vckpaIvc2 zR@Pv{2GwekgoT#O(TG9dx&ur}G%90zjgXau^w>&P_nqTE92EZE@UZ+)Gxoc`KR7(( z!;e1Vn=gI~q7d(GL*w9i`urt#n=Rf4>|s~y&88ZR=3UEO9@%U*^zN`4tLHt%N8)}& z=i0o}S`$kq$xOHCE3=Tun~Qg7Es?Gc_>xpyZEm^QZ5StyZ5``_1xiB9g@oqitGAU` zStKbHF0U@x4ZcRe5p=F)zuSD@x-3!AySe+$%IJ>?Vw48Wv8&x zqP##TOOqpKjbf7;icri}Yt{{Xa(X~%1dM^R*0Nd8*paYBbLJ#s(PLeUAamAQ8o4Bw zI#55-ns`9sDKeXN_>wp_jyO!59IY90rWJ_;67$m|Qju6) zI1w6ud`Q#=c?chOGwk~xkPYBH@7o6P@IAZ{gj6`~9OdkkNhx$HoHZRw4QIwM?SHU7 z++>B(hE6)RK5#h}lx}%9Bnp;o%=lE$lj3}zs*0S9iH3_|N6d+$1hcu|^#Cb?h=Id} z;;V}tQdce3(QL_Amm6efKuW}V!LMK6(9Bn4KcU|{;y348Qe*K$z_^~@UheQkpr(N8 zJHEah5Y*}K*|Ou?tAVTpE2TM^DZaVgqpiW@z^dW~DF8fg)I1LyzYY#}orAr)k2T^VncE6TMN)wB$U%xW8rAw3xX; zJN3Pw^bfBG-~IaTi~rqe;rkhal>F6S{S{BY`jW|y^j*iW+mK4;?)94*3pWkdH#c10 z-f**Utox3bJeODRs#D@tF}kM8R1jz<$w?CP1hJl0w%c2pt|e@C#JhKBYw+VxI~2L_ z{N|<#Po}y)(^@l30qZowcFXNB@Xd=ioL}A{v|}7Sx4V(eP*vzoR>N<-YE`+cQB{1} zuU7oOub&aLrJX!>%?D zomueq@`9~stM@Pp!r-||nUbJ$5}n~9WNaxU8pt~~Q^mVaIk7%mvfb}UCA0Md5Bdi@ zy?8@V2^BL(z2)oIF9}A|OUI*yK#|25MpFAo1>-V+4&vXH7vA1EIPh^`IaCQS{0_n0WWuV z3^}7yqB9TqFE5^xZ1r+*})NJ3LYMw6=mG7dNewlW!z#bZ?=OGAkD1Fb|Q@sxWwXekA)Eon;kZ@l_} z2);JQWRdt7(D!YwBB+D2``?qug`_1xWTsM6e@ZK$?u;h_+IDzq@hB@n(GrScDxN4M zA|JkSCIeVFZqwm4UmGAGXLyf{B!=d|Mh=Ccu%GvlwlZ0N`b~z zC3f(hXRls!&|4Y<23du*LUDb&;a2Wgu2<~Gsj>{Vdqk>*m$t2~(A_wojX}E#A@zP_ z-nRrlvJDBV4dZshaxue5g>x-;+gsjUT`~&IufKi4tBX5i)A8!{JEABR5@Q|v-GJ$< zK{@&f=?tR4Fi!l_KlxME>qiU`3@wdW;6s5Z$-$D61J{rvcyCFiBg;9eO=Mc~eb3() zh^Au{9YJ>_GLzIKZJ0_%YRyPO$V{?|kTa816f&c8NCcF`R<{hcN0f$~GPgw$?VM=9 z??(2;64bo97K_G<4yl)96hdjHIPk6{gYiODmHhGgfJp-9Bbo?sS4 zXJDKtZbdX(T;uRRJP|Zyq*IESC?u7bR3c~3OlfjS?29JldY@>uu5ACD(K(aHv66yA zqEQMRJwjPhDu@sX;p^J7NaDt7-mjjhw20rB4h2GG>xDWPFMRe_rsW~A^XP%hu@tI ze(ywZ|MR1xBYyIepYY3H{*s&uLRQ5UfOQSq?G{xE+I4iR15DFF2+S8PH`lk^-fk#p zzI^tqu0(fxLa0F=rF9Lmq`)*yxTeE<&uTem-uJw^Jg?V`yDf`(&$4aF-qSWsT_JBI zUq5}$ZIayVCX{QrxY-Z|j8jBegAWN|>-{L*yC9+uv`t%6iT#=(jFfEZ16tMxy3!6| zB~fL{{bx^7Hz)OvQp}Rj^dxho%rqLP~+w5`xEv38mXQ7t)4dm;#3#%c$t#&u;931m*}Qbb8rjo7wAK~M&(YX`vU`VtZM;kS9y zp_HMNgqDSUi4^0AIg*rM>qm+;j42X@z@zbGrc@|e5>+i`)t5*G-IN@WT0oAqdR-Dy zNraM=91%G|6i6yyM^oXqGXH=_(6|<*EseG4nPk{ZNZDhI0HyJhXVo>V+J;UhylzM- zaxiOXZ+?xYUT(YE;PF9P)cFK#L{GJQ%H@Z zDX=t|W?8>%^O893Bz970xk8MY!$z_k0;y!?%Ca$`?wKaukd!F$#>GgkAK)(DI|Bu*nkNgVY(edD;ie21N8T;FXd((>)Im&78u z*?E%EH6kvmu1<&wWCd1GK$mB?}K14PGRa)2wag;oRUAs90EP&x6j?9)?yN=D?XVXxC8Uz_BPC zTT|=vrEsVvr7`TKCda}9XTZTu1ZX5@jil{07t=t~Hk@`2ClXr{b9*m*O#{lZiBIpX9|?^%BH<`&acD9EBYi+hi8A1|0+Iw&C0B0U>hj)o*tk_6vS? ze0=}r|NV!-cUOk*PXzpKcqjmMZ`t|evrn1NmW)GX3}{_LN_Tg6)kl~ULOWhxT%k%m zU48Q5V`Rx_DOhxlY21VN9Q6yP$#Z;gz|+^Sk=8IO#S{Y5Fk_RD^)kBoQ&Do_16!^sYgQj4FcOc37^t}U}Fw{JO1M7-gP$Zk@;t3p*}0lCCE@xH&`^K_`O zN9&5)*4E(0o`|5FMXYDqB_>tSU8s|E<4H1-ovS1o1-dcJbcIf)ev5LBFt?<(P{xF` z2Af)pQFR{R6}ve8gY1B0`G-&b-@6k0|E~<+>ch0w{OAA0KjxqR(|?A(!kXE#}O-hH*J#F`v=;z}4jzWh#i}$_EBXb+a{27}1;@uQ=Xc zve$Y%k>kC6_LfV!CeXAVZ53&gxVXIL#l&4==xAz7nK z!8=D(By(u9001BWNkl!bY<7xkZ`k%dL}51xQDxGU$@3ZC^pUlx-)kinE+SQQ>MhkjG;}MFKz~sQAiPv zvgLf#jG{yq8hG=}s zNbXS*D9&S5gmFuw9EFI>!bUPdDO3Y_8W7`f75xZthsiBL5^Cz0Wnnu+R4I_b=N(sL z!WoUx7B}wd!9b0(MfPt^WXmb56I)lPmfn@jpd*GyZ;MO1J^3zG@t~Z6Km0kt?-smgk-87 z4#|XXy_@bXNvREG90^{q#$&8zNY^x`Ma7A^1DA!O6(-eqd!GzN3IT&FJCf|vnwH4K z*zb^TppFpgJj$2al`sf{2&!nJ^R@Z9>oIab%n*zrNnfkM2sYL0l%36qyU1XwH1=!? zY)T>EiA89Ts?#JgiQ-6G`jml$(E;lU#2umyfkYYxRNhj&gFKB={(G#}1pkn5G z2Xk6q$krh#^K2O~vY-TyNrh8yQOA4ec0rrqz=7@ul(jWrq$A2LiD^U?&BM+T#Icn~ zt1Ty?!TXM}WcHk4)nuG)(OT0X90c%!n&ij#n^?&~*N=FWy z;q6T%s}b)T{IKPlcUP4as0|Me4tTj;(}X!)fIVY)zV2~4Gp%npdV0#MPd0VnL#b~~ zVn~2@p{mFB=NulN@bc|Bx)hde%i-Q3Ap}nC327LahZ$|#a`WjY{P5{BVy>&fwr$y) zHym{Lc=qT%jkS1Z7^W@OIhNgw%{cMp*I#q-{*o83&Us|QcPY_Q3X*fh*QHnoiXs?q z>p)d&luk5Gcyw~e(mTd?H<)gT^pT(pP7D%DZOfe;ptOb9*K&+ZWXXtB+xDRd*Zss$ z6kS#qN)xsiS`B-RXByY+#x2?z+Tbd6DkZElv`!O>BBVqr zHM8n+^^2C6u@Q7E$acaQ#nk^Eq3G51KrxZlXm;DkH^UCfgvpuJ+;cf@u`197g`N^O z${^bvtHULm^+2y2Gw0~{THah-lI@l)#XENGf;je=Gtbv= zZipdLl+dapp1-|hx_kZo>C-bleRToeBV%OGH~gnhzeKu*wCyoZ?(>^B7bL4FS!kc0 z@ps?6W;9?Ue0=YOzkB_jK|79I!=wF%-(FplRK{h^v*SH}{mliKj1ibUJmq4$p)`)| zZbM0$&)?l3$}!WR@9*>ac8m8ld@{tsC-2^aO3ZzORx{pghsvw(6LL7`#r2LX8p$IM zS4-Z+jIo-f7*^dLb``K%P+7>{6TG7o$H2&Z*5X_PO5vN9fAr`7HUHwv|B-2&P+Efm z69VIQAXAu9rgZ^j1NYA!(Rf4CwS4vFC01$XP2lukg~Y`1>X1M9=p!~mPY40D`flC3 zTHRxsrg{e-Ct}XTGV$`O=WM2g*ud3#i}5Y5FW!@sVu%snHnmdz4~C$MMQFJlGEr(d z>!%-mz}ex9&Kn-we~4=gK4n&o=IQYgu?~x3*=Zh}?Nta$ir-P4yjGm8R_wJM&mKJ{ zy2KFSD1bg%lB^+3!f|K#{{0n$t_S96*WejJ&zMx^v~6e)57~wmRSJhev+rk&I$$;I zd&{ut341d{602Y^DWRKvvKIE8qAk$w?U9ubNF3^W^v;sR+l5eHJ*L ztWL1a98KcDH9TBZXzUbw&RT( z-;gCTS;wdxlQHC=8MPxiPiSX|ni#Z3nidJ6^4;2w$y&5uASp4Z4)OaGZ%8UL=>?OH z6kE8RN)^01M=>6WFe-;?W_POf%w#&mDJCH2fu(Jj%m{u?KMoaj?)RCL!dRi#nciAv zraqNL&xn#K#h^@JGa35SGAJmyup_Y61@8)4J9La(j*-!3n1td2@5Tx1EF~v$%)A~G zKJ1aF9sRCw{J{@-@#|kR*O^k_W;0;#5ajPJudzo5Y=_9-e)3!P+J>9=?>N|>v+QQ% z70}zUJ|>Cn#;0#(~$bUvsd3!1?((Na5n*g6($8{&J76zIll8hL zjG|C3u1W3n0%O?Hl7 zzdENFkG7ti;G3%*u?R^E7RRge8?JnhSBm?Kz_7h$P#*6sr}K{UHy2#kDmOW8Eh=W- zjf!Fl`%baYp4Z!3bTEV>-0uosUJbQKrwg**^4aZ{X`1N!4gRAQpWXE2t4K@(>ghxN z)9VXz&PWz$0QT^!F_)H#Y>V8#3GajXMFYQHR3%}$^7{A9$&w@;C%t( zEcY9SE``fDkx+Cfj=F{~u6MQ6G)A5t&-watgEfk2^LsU9lO{~E1fyt;#g?kva!Lrw z(5D^7?~zJoDv2p;j4H$u5nU)bQ7D+4u_8=4p{2I>tkg=W)pz&)DIz9<)Xeob^@#K2 z7*RQq$SLBQfTRk0n8qHl8ik;!6X9YetRB#+p+-;ykz9)|jKtDXM3_pf!K1s$ zY*NCcQk8S+f42h2I44Qmu6sWD;w$FfvhG?+%rp~pt)ZFkF-m5A^}Y@+jl+7!`OCL-i#>VkZLNOKep`AsN&^Slev~;fhZo?vIvQ|}SVlB6Eq6;lC z3&zwyRCXGYK^a}|>aLJvz_bezJ-YE#L}M~|!8&)By7Wxzf@*9vGwDjZE~ff1UDuG- zJG3=qE%?Smf~XT(DZEt-G9os@9q>d)mD@LQSS@Uq#G3_UMW0)`Dv~AcOtcWV(n+2y$ z;C6pWAz_2%#AKw^Ow{1Y{mzqeU3N7=bF2%SR6Fz?g(K(bLt#?F+y+)wkwc}!Sgkpo zd2X+65!>LUa7bot1jz#jZbmcq#Oq6(59BH1Oo!|?wPd2ETK67yxMXN@4}GS!;GHJB zs$`q8B9ywGOI6&)y6;&mPPo|(Ea!7>w>@1qqhPsOuW8%Ba(|ECJpY=;2i{*@aeTO9 zOl#KtfX$Bi{sH*F7tddC9Y-ENdB*wM3(l`L%ydJa3*+StZByNh$~gL6PY4d9?^345 zkW(g_LStaHKf}a{ew_*39Fmax5pNa538qxraw6DbZ~{$Hv<_5>h)O73$O&4b3DZO~ zOvF-9lfq2`+X|EoBnMlIlU6D@{0z z)!orV!*1N*l0#`|LM^iy0b<4*j~Ws>Ni}4vLK!n|r~$4So+c`qsL9G8k}*@kMZxGo zP6e9^YKSOZXsDEK6$?%qa+(OmqLUDJ1IlO`<npwe7c(hva#l;mVT4ql3@OYnL8X3z(jD`KsFisOW3(gC- zH#^Q%OOrrjSZ}wykAjxWa8P*n?mc6uQ+aO#=a)NfoF}J=);7F;cgtjFi1f_w9rDHb z6&qbwCCBqKKK=3)GM|yhggQOo({Ik1yhTlkg@3^3udhkLpfVhE_c_1WF*!wk;$k&(WG`>nu?j4?TKI~AfCs@U;B(BqlQjQ@D3+tJJ zuR)(un5<ak$UdUw_SdyTwNj)-kPjyuMl2wA+~3jEVQR zJ9@Vv0VXsg$xJy_rPkfk#h9v^%c))uS`<&uRy;jhasTv?(r*#q?D&X3+V@yB;bP{& z!XbGd6#_cffLc5~Ah?Fgk}qggX9Pd~@I&UyCEtH+(KC%C!@bTEo}IBX1<8uj&SE}% zSPj)$apWET{ylo}WUDytJnnQw@4=hEstqjM30pjx!u@5(q1W`PBF2t_CN4Z{98ndH zI!n6Q(y2g9!oph)N@1B>vT}6RvJ|1|!X1Ai@nB||g#+@P2JN&}{Lu#wkfNYO?#~>{ z?>}M^RYg0kB|f=NQWj$i4?2f?e4pezBEpkdgMNC#*3@jtz2F!p$JSJo`N{_JG_qP9 zASKZn$AQfp%o~(M(lqhEeRnnJ0;UVdG!a!{C}qAHBK5Us)%$EZQ9Wv3N_W2X(1(`;3hij2l^nF(_u}bSBgPHb}b^2Q9Cv{qneIHB>RrZc#3GOZHVG9ZjUGhjb$nhA+Rgv zj%*z0b%PX7p9*_4Y$emSf%Vlp4%Lhsi8RJCjy-L5Y+_;5o*`#$qhp&JaxMgAxE|qp zgfS0v(}ZsvZ&Sv)!g@EdRD~D2EjbF_cvcH|v0gK!4PHhb?d|jFt9PVs!J!>E+gtGT zM?c{rPki*Jf5J>MpT2m{7EPhB-EL`*jv!}lH*314<;APlJbkdwyPNmOZlJ^oA8O=x zu~;zgX8h)hPgt$?_~NV2E90@9u{c=q=JJx_8-{V<<=bm<}0MYe%r84i8r|i)6yD4JB_@K7Gn(BB#L;xI)BGh4CunNI^dJn z@6gszWI{iB%x5p3Q>Z2;xqr%UU%bG!GsbDh^6^uC`|<_4t#R<>nc{E1dPDC#0K>^K zZ{NOQXEdcK9`CP+x9_>aljFp)>9{e8>sWABDC6&~5A7HsjKoPWCDG^^*m`Gm6Ufvf z&5T_cI4T1!N3wG4#(~a)Nsvl4>C958WsYL1O~@$9B;>pPf=-!W9it>b(`e6_2VxdP z&(Y%rN@rXVw6ZmAm0^;?BnG8MY;I5pNi3rzd{!uB$#>8TDG87}bB|{dMRt|=>WN?~ zvMCsi5~1jT%;{kmthx8&`+Yf!?QtM~ZD zf;U%J?54krAUnhn~vGs5e7qJ zTKsH=DTYWQ*cnP~$f5Ep_T8Mz(j%(cm_u+3vPH4S73w;Q=e<79`Fu&-Z1AdK)fyVp5mcSpE*lG~;KeXV;&c{ROf$SFL|Kl#BJ6dntpQ~? zbOn37$E|6|X=KkU9vm(Z*D$2au~&@CIpPA6GAF_EaNaTLg3^V3l{oeW-CBxL+-ogo zogp_C6(c9D;kL2l;2{=HTh9;9R_p*729AQ|y;JnIrWa2-%VtnyB^c2hc+H+IWSIyS z_D$x{6($2-6f;+7bYdvAK-DNskS$_8t+qG}WvDx8Ng3}=H7c_vO$j?Yz?MjJr<${Q zBwtr{g#DROe*tdzxZRe|MCCjYQ3vOUy+*iFA7azv)Q2V$i)TWQgb+; z^ZMc)M~C}tH@6(_A26oO%Qv5Kd40=}3zHOXcRg?4U*emF+lxzLPDH7Z<5X(yz*<|A zjR;z4id2yeC1Vj5t>Y&jf5cv>sY&A<+G&&muM2vda4{0Kf|SX_gc6vBNSTB<#+qo< z)HeaBP*AOiX@oQpbRp&mMXvv^QN%oAO&ul=!wyXIT?q*hN{meXh?Ypn32OzJCia>0 zqk|UX3$1TBafMau7<>R#crh-+e~T}M zWp|I)H&+y62{@eVcz0Wo<*kn7F0$R+_8Z9c3oy0)3jezP(}62Co(U6zO9oDNWE-SfO=Y z%jm3_QY4l_%!Qy0#(LVeqf_8Tvlkr4d!9iFA@lj^2G@5zIoHUlwb`&KvIWkK< z>ggG&WGsq%b4wRz2sJmq3X0=VVbv*4EC(&j{es&sKf#j8UeO*j{G&hlDgWoc{r6-9 zDF&^paI~V{q0fa*X^e4fVkY)IyD71p&vJ@Ocvkty<|f#$(6ldagg zhn;6SJ)}2|k`qU*<;iMB3JrQ5IGGuSvjfBgBn^Cgy5i{30(3-YM^+=@-T_JK%*Pf% zFFTU1KlsYPpFVuRyWN(rU%$aMmN6W%%NAc0om2F)%meG|0M-^l8ko(Nc;#rPp6?y5 zSpD#asFKOkh>=9P!<%P7p@=$R1X50DWzku9yl8p+%uS(1?w8#PKs#Y{B}#*w!GR-#H?s+ z?N)q#Ju+HhmJ40$`22c}m_(Nn+t%`Yn?Wn)N;q`Fm+xFt#*kw|qgd}oVtS9) zhOQ0dVPtPPCmF~4cjqYQ(Pc}{1zUtv;Ob^g%Jo1UbH*44rZO0F0b?9lCi=do6kW6S z!6Ip3Z#m=R??0t;1xF?u!Dzu7gGFQSzTV%wyX31~1g9_&hW!PSZrAtO3gXQi%P4-_PX$<#iMNrEm0Nfj@?GM>XH z-{YI}SNzS(7hIbbNy2K;a@lXVo$74hWWQmadfr^!@L+GnpZwtu>0*LBRu>4hrmUn= zt&J!&ibTNH@K&mlV)jhwbcF0w! z;)rjFJgQK`E?S{V9UcYi*eZoc`L0lduEmsTO1~@LD8-ZnWi-ZBo2{nOesZbbpjuT4 zNm3f8HO^HfdXZ}C5enLXGPUp_BIE+G)G$uIvkz(QC{mMj&Kcre=Hc7eY$DWmc__8O(*Qc? zjp#)FmL2hJWn2pAy2&tVMCHs6?w#=B`YqSFkewnrp+r#9kd$MxmSH{dlgH2a#j_95 zab1bw#i135Dkv193cCKPG7yYIlAzSx5Vn$g5v@oHnrY&=9dxXl7;A>o2S%;(@ zz71HVF~%ZLhm1MbD~zsJy(uSBuI@``Dyb^wg2Up(pp(?kTNFZ3Skc&G$x;vhdL~~1GIv#D z$shy8RqsWnfKn)<&{^S&!IX#|Bmejhe#WP7-`+h)%^m!t7OuRmTff7m1&Nqq$)y1P zcL%}w)q8a6kW^S5cD&qNL9bcZhP6ykQmv^Xq^!8!4Oj=$IB|NspeS&`qp5ThRbbY2 z6cSC-VC#YaEty%?}sxjXDtzy#IY{qCDCQT^G94=?5*&Jf+ z{Wqb;m}jmfguwC90nsYLB!pl%K0d|~FgbG6I-VULFdA5BIBYD>?j2KfCS>7k7RWlF zy`#$`N3Np@3z9F`Y&d8X%2yP6(1o)_z&MRH0hQp$XZq4{`Nb!w5}8y&d56xL;0#v) zuRu`0w_Bb*sOqyJ7N(T&zOApfcS^ADNXi9@)H}VD`o=e=T0qfS-yzWQcQIkOV+!1n zbxOJG&;#C1JbUtx`=>{k6d8vd2YU-rN?5P367bd|xjuyqnrYZ_e=%p*DHxPN@gzMpf{I#StCieeEm2Q!5up^dQgk&~q%A*f)v z*9bRlVX&$`NYs{-u8*hp26~kaFhTlltq75;!?sxR#4r2^n4DDiu z4RtovrlqoX6Pm8(~S6uD;%Z(~J}si_Co@OGCl23jS=q<3oMInS>)#L!~m!0EE( z?Pdp}C{eN6+vDXXG8#d}OcxrSU#}~#a5tfk_W0GS*I2tm#trGwJ^t>^C3?{k(uBEp z$S>dA5LBVfnS6Y}7neJXv#8yg5B6vL^7%PCNm#Lbcy`3+?{1ha<^-iNF7WxAYkHlS z6~`YQ&w2C3b5^Bd!3%{r^xO_R(1xS^1+ysp@y~wBFF*Z^SO%ihXl|1H9r4H*!`SzD zTZgsD*s4jl7RmXJru4gmL#cXqwa$HaRVundOxrf_2Opi`m0?`p;I$zb!`Kfj_U6RY z)4CZ&6xKV8Gu3jnzUA-#!@s9Ie9AlB;|1uiE@2@bji?^Dm^km-i^l=~}UDI_Wy z?A`X7c4N7`9st3)Kx!@1s2GdJ6-ADgp)aHWwitG?Fl9|&3a)r|lVZ~gt`)j&R%`D{ zBh+gMrEWw1r@#Iy);jZ}Cm-RL=vVL4x5(e&%a{n9lO3~ zoJK-){OseO({8WWx$5!M%0RM&lu&KMmv7Jc?b}z}#tCCBt@8wB_{Jy#=!`BVJj0>CvSQ?u#hAbvPv?ogiln8moS1L)N==!}ZWJ zmdsFuMs^57)QPM!x>&4sC=;L*?6gG{jj}UJPRO80c|?@MYJ*j#D%`S06(KabMmBwm z(swaYB9pZ^RVXUgJid1XiS_Rojd+9eRbyqUg_=ewoYGjOD?}yrh)qPJ5gqCsDn^X2 z`{z;$DhZ+-Q&Hrk>#RXp&<1ZBJXL(El?Uw+1u^x+yVuFAGg%2@V3a~~H9Ungw4uRj zMbk8x0>36@R$GWf8fAZku1j7w~f#;^b=D~jMJ9=nd8s?=qEfoS#TIKPC@70-F!pX4LzcS zmUz7({=%C z42`cK80$2pBpi3yb~W*@|H;2#|K^gDg+-?w>*(32mMiBOQf8Aq7sjx*4lfQDEv7`Q zSh85w1TGX@HI}P>WGjj*;7ST_c0K3A$R@*(6`MY@PKs+3y9{r4J(mI-aomm>+d7h} zOg~*5sEMR9mulidTQ1d%R2=W=IM;Lj;y?U~p{a*uqM&s`bRD8M^Mjzy2Hk-Kz^Oo#Vy_-doG1C@!+%GDWV+oR_-cFWO*UFK4Wj@X_&#d%<#l<~g#Odu@F!J@JJjo7q>HWtrGli9?;)?=;I!v1l^;U14q` zGd;2AGOJnPKxtOSu@J>cXjm4_yeLA9tbD^jibi3urVeTs-GamAg5$jf zt7XT-qXT~S@ek-MESF1$X~a24N)v~NhxM8l8g!{wLWzl4XfPO5fizBBU0(7R|MFk) zi{*;{?9oG(GQfC)H;JN#S`h08iV`MONXC#1q+DU0MIx=KWieZAB9tt6qbn%q4$`T} z^+8l>)<7$vv6>LzcH;J(j`$Rc2&U zL$;sn%F2wYj5&NB z&D@6f-o5vXEY5xA9w~eiA#*pg_wGBx_kI6~J*zpdT4L7BWn`8-hjvPGnRyG_&5TKq zxRBVjuzhWh7XecAY}bmr*A7@Jfl8V-58S=B$AuDrWv^A-+S_8#mPBUTChlCBlPZl8 zGY%$(ZhuCu8bnOA(s5&V%AkR^Vr~*|9WKb)Am=RyjpFSqTf|CJ4GmYPhCwXwXhd!~ zoCxk-nU@vAYaL8T3T2>9Od`R8A7{@_b)zW*+79lgiw(=T~BbWG|7p9)nkyo80K|n;J0i6TWO3@g@L|Hz#eS{ji zl4vE%TgiZshL69zhqD!pu>?Ig^Fy;%%eOYl3?Xp-0FhUtno3io=;ewopNSsg7fsr^6=>? zzNyI(?3G0d=VP?D09dEr*=BX8FbaW6WfN7Lvv6h+o`$ zK%UizA=1=yK7D#YG*D%YRhnNtJ|R~UJvi#4L;m{FbF!+y4NQ&>d2q7C$C7$9LG#Je zGqMKZJse%@WW;2qIqi0~|`yaf=wS!%rzC7dUixX<8 z@v+!<_p#WFTWvs;_P|Qe+Mq;cwl$%xH8&1+m^2!zGQ9{)=34+P*TpdQU~i}71BgIy z9xXsCH9~P?`m+)sRB;~460I$N`tzUgoge)zMC|zc-}yEVo<8Hn@{F_S>AN+%)dG_o zDoau3>}eTCzf*AsIP`XtJWDvnXS6GF4a;{8-a0|oCK(hOyx2?UG-F3J7{H?S<9{M z1#0Lo(F}zkX2F2qQQsrlDK(kJ+;D*)U@<~6F$GH8*CoGV+GZ-}*fA5TAbGi3a?$}OQt zL!sG9atT6>#aJUphs=~bfP1Q({c`oC+TSiInA5Gn)aFDE({Q zw9u8|S0p2~MxYS{q*7RGOAa6)l)`7qYs`gnAhkkUP1i?IC1rSXgGyykrXouXA|j;1 z7=zLp?>#O=gfSo$NhN$qFeNKP-}?e{DFsHOq9n=Us5?XfTBB@LG9Qd)hy%jdLWVL5 zDGhx}$ZCSn29Ko2kj;dp%Gm4)!SU|?g2k+1tIag4HCMKF7|xDMUS1IFUcZ5|6@FMV zscWKJ;zIc_tE$1L$k03bZeX#yhqc95B1O;9wSBJc?{jf$&G|*g+1VKn?mwcbOhF1L zUVFwEtkJC3Yqqwg?93TunHF)r^^+cmK+Zr zDD-C$G%uGuNePA|sfj#%wPYc6@pAlD^%gl98&lJbty}LS#giT%S$o&IV3$V4Xcz_gl=_InSdchK#BPu1&9@ zT=B+8IbX)fJ$v?yrL?5^luu4iF*&2}-a*6!u}p!41mqipqPvS3XR;!a*&`xaL#Jzc zH?Wf(+wCX{@f|X*nbrcAJ7Vgol%o+HzVDeT!$f#y(wCr;9GR#oTe3`4n*`I8sfWIp zlpL?`l9`LXL*#^wj+ufBw?_Gl2?J_aBcj53 zf$2N)@|f5QL%NB=7^W~@QK;k(7^#pVQrnHIa-jE)rkxTg7H@il zVW*RZ)%gXcs_1gD8_yx4lpG<*(ZM-G-B@yt7^`^s{DgTmBl>}u1M|t8Af|%K#brx}z$377LJli}G~`yXiXc-(mK`z+ zKotXEnW?Lam6zqBv=$jd31)E#A&L(}7LnIx`k>eAH7i}1V<{I#oe+ZQv_%@t(e45l z6;jQaYs0OBD_o?CrmdJ7&7Fg*gtm}!lqxW-P+7LP(HEB6glG#r|`7(K|$R(r^KPGm2*Iq?lxG^{MS9ge&M63o5CX!pbGlDS0Va3&n;{B_;AO$iQ4jakayK|z}EX0(f2J)_D z&?Q*oidwTwr+oPSZ}P)$zePTMffX8=EsN!a(K8!@ZkD^$)tf);K8O|aDIMHQ)_f(X_}IlT-P;S*A-6z zB3esoQzdD=K4ncN`*P{j^9J#T`9~HI$mHZ9d2~)xeud7FCIw92(-LVFEM(1je~vK{ z-Dl=u%E}GYG9sN|d$JgVM#bg8P~?b6AVNp2T4eGx-ZR&lS|kvWh(yRu#wM>1f@eN+ zK5EG)srbw5AS{PNxtg55@FL38~Izj*SPY%RjUe0Gz+dhifi zD{`_N9qjUx$Hxe1sA8l$+~MP=rzPq;CEnfN<>wENF=k2?*WB8k^YPg+B5SrPffboY zeZjNu?r!0iD^4iX-|O28zJC0e&RAqrFiiR4$x|+bfNU^tUFDPe&r!`37d+~4k6(TL zh+qo*C~q9_+2d1stqCq5jt=?w{&T#Qm|;|KY#qqyOmN$7(|WCX*R%xujB(HK1joOp_zi zNg3d2Rjk+6t5xaK$Af+{o6`3^yQU;h%^Hi3jud)!7JGDEhcT9_s?Zb#n>L$aVn9p5 z?v*PALUW!Z1V$C(*|uqbj8+<>Myhu32r8m?T%4cL)TM1|rwvL;P-Xg_g`n0JV-y-i z-xX^+ofBcX=DouMn)x0-{p@q3DfISQYFgp2qX|iy1T*akW ziCcROH>V49jKuobdrm_Uh&l-Ee9=#%2X@iDh<-$0~> zS*@w-Ep*|3mN^NKR57bvG!1u;Zm`UPn#7e!OZ(PcoKonpVlio$*dtcbVROZztq7BA z97s*;;o3x#lt<Vnz>q-5iX#cVYh;KdReonXX?T8of^(7>1(lJ6m@rweie+<8s){~%QZ5i%UDrUQ?;X?WllV zs;+U)v7;ov{r=nhpMUbt`FLn(tCr4XPIHMvo5jq|WWvMs2~Hd4G0?R$o;pu*9+d;D zcE*#Fa}K|=g-aftB59lt1D)*ia{xU{`fvWISF*< zCxu0O;|f>13V)E%sSN03Dg!zn6VKO_?@?p_~jS(=_VQ#Ge0=I#>e-c ziI zC85{EOcN5;1w0OwVS>OqM>d(*4OBx*6+B|SLIpt^X6QbVr9*_od}o4Mp3>;T+n;HJ z=m%s<E&EdT} zcleDvH`#71-TIX5mh?U#6)5qV#V3WJGWN1PQ%Vs<=F0v7QV%3Dr^^ejZfR5o?+0eH z8SAbq2AfimgrKQwE|%+Zn`>P%6Rj<>YFX5Jm9-4Rz+^Jv9Ct2AS%b(syMOpF2NdR*VJzq8GQQ_roV zn`5$5pt9zY0V&zgniX0YhG8J*Ok36DZb13O-}{~4GacTu38v2}Zsu12%jyNMoy1@1o z38@v{NYI*js5zMJ6Z_LqJt8p)qKKTFoMNp-iHwqh+C=sj6J*RNsYgvoB9U-${rVt? z-Vw4Qi!#-Ze!%F8+E%n}8Khj~OeH0)%-p@c$4ZsObj3>4l^vXDXpCmJk$m^|HO_TS zc7dHn^5NUpa9N--9M%bO`x;7GtT0@igMIe~NgAq@*{c)D)}RxO6zt^8ZcJpQndwLq zi+8(GmT6AZ2NkbUr1OD2tMCiUnY75X&0eM1f9Hs^KCl`LHzpMeeHE`Kq_E?8Plr=KWiT{PMGh3VO)j1!%cf?P>d_-MMu}Iv_1wa4l0ji#m zhk*~?y2?+#eu^*x;XSt&TRiJ}9I!jFs6Oy@jAR$MGHrWZO}pi8KsKtv=$aM4$nMgLrPILe~htwxZ@3ybL1Dl_ys@tvp>f+me1}z;J3ef z7nKK)5-kNv*`f|4qpU?sjdQNRxU$HKD{Tm&$dDC+rY*jA)@Ho-7%eZWl8wYT=ZrCi zZnZ}15w_J5k}2;;6cUn>vJBviCiy^R^?0ci*f-{~xKs3{Q%;d-Yw4C}JbwHT?+2tR zAuCcbvTo#MbxG(prO-uyO(E9d_w?$7;U&(GPjKT=6eI|B|g`M%D|g zh|Frkfp5!@P$ep_*{fToMv?q5%HfMiy%6xlix)hN;8IbK&ML!`m7|YqWRz@ATF!R& zxuz{9IS!{aAKpAfT7iz4YZJ@4h$L;%u0y4ba8S9cct=)HFc%8)~5zm`njev4!k zIY+M5lD*s4SkYkOz@j!RZr>)P$cKm5XxtiS0znFlC>HS{CwBJ^_-l7^T9DQToGs=zFZ_grhBi-HoRp2&m}^eGHMma;Hl zaUqb5DR{b&gq%p@!&OQlv?2*va9m?ZF{7%A>7=;I2BC@-wGzbyLqMu)tSe**N%1_$ z0h+2oqcJM6G(~CH3$U|UQ4=PRxN_!H<7Tpl7WEQ70;=iU7@Oe){kUfAQcEuVm(jS8wz9;R9-|_~_s& zIroqYJX+{C6aMPnqt^$)t?e0{JF=F{@<44Bgh1yy8X2gxD2q&KtnXOZl8zITN4Sz9 zA4Bo!ll__|1wyxCrUX^;)UhK+L7-s&HV)`GAcjCY=DVdVS^G$p1a&OKnG_;*7Cesu zVJs;^ZEM2%j36XK_O!Ah^c~52EDe3{(QS=N5uLy=vg?#V$A}I^P(LvhsdrRDk+m)= zt{7?Cnxqs#h)cSubPiI)q~b*pgNHC+bV5nb)F<|$=f~gu7A+BJ0?{N)(x{qr5l)+mF0jUI13bItBP#pDADj0uso=M%{y(gv705*e9v7|~2fUD0IKLbtZa)AD~=KOA|tBeirt5Z z*_!g{vzL5-YYUNw;&UJ*SrlgOcW&Lr%a{D==bs=_N3@w?Dv+*tX0%%sRy7Rkf?WM; zzx(^_nHqdVDuW#oF-xLMI8pJ}_nwlPIhue~ErOcKc6%8ZWJE4@en^taT)fF6&=Q)u zMp(%-OR5@VAK2cSvt<-pDnM1-YIiGznN3)T1|K8`%?#H>uBw)0KX7ek*uHy%)2J{4 zuC|)_?JEq*;9X{~hVR|Ej?@)XWtq`)w7X5P6{HD!t>AmNuM%=V%gkO~F=-@1Dkf5} zEi2}`b5t(bb7Dwr2S*lg*jUm;ag0Ev#BLqnpdrZ$kKjg~X%6R{bb+>>aC_Eb+2a)@ z+4#mx;x{|Tg&FIjpei%?Ko%cEz{i|bI%RP~fkzW$0kS6V9D z;2F@Su+6kCe)c(+_G04}MJ|fSO~oNcxOlVqi_~~D3<=?~C14ziS|GG=5zgJu*@iH*VbE;^Km)Y0B%^XdO~%Q9_PLDbPZa z5hF<|jZ|3)*<-ar*DY?(Ci+-zQv@<}T${qb^@DFArRL$qD?b0~0p~+1y>ree zBuQqHh@|YuDT0qA88D_8zz6|C79B?R9Wks?(O@;C-oa>)B7DXMfk=vf`N`*e@V7rI zQ++Zr7A7sCs62mo^%~a?c6jpg5tHmmeL#AT$(|XRnTQ-79dYOCKJ^ev>>I^{Qzbx@ zS<=gs7r2yg&f)1v#&f}vJCkj24xtJIR|a6_u!o zI5vpcAca((ktpsxa-<|n zGC~%1XA%jN04XunV3VQ?#mH7_N$+~vdO}rM?DUkw z{c@8xY}%%h2jTRR9VxhZ{TkmpdY9fMLKKx zFv8GSiE};4z?zy#bY!Jihk>PY%(WmBN!b%bK-(InTD53Qzy3}BDB1nm> z05sA@v~7twQR$YXo{{aGzFUK~WMv3aleH$)65m-&qv?%g5*-MrYeSFcB1sZ0eO?o+ zDBJ`y16Q%uHNvckN|39X&R9~+n5xCoF$j&3iops*jtr{!Dxhc3t?9eSRSW;lKluAx znNNtPr{vRTM3K?9WZr8zkh7#${Rrt;at>%w^bVUzxHhHy%{j5*oo#Np&1Tqm19&{4 zUzhKf5v>yEL*~Kpns*K*+BR$=$ukmS@q!f5V@*K?HiJJQ#HCildtWwgNMw=mq2S9} z>#^il_?XZeLQslGp%JN=l4z+=qj%zldk~3a4Jo8i;{j5Fj}oFsC12iGyUm|{@-;{A zen8jvOs9oiC=iGd&dufOBD>=Eh>{58=yj>cW<(bR*wNfGnmh)sZ2EA88@e)kkQG{F z{1|{b_;sm#T0-orrbAw(^8JaR24OlE38%7TAyPj{Jii6k_&_f%5TNXt3|{E$izMHf-2JbY^f zqW8!ch^z7-^DyAuKv)f!kQqirnwSRY9N9Wjjx@?3d_<{&_voP7V(t3rKl2&MzgU9HWJ`@RUh@N#m$I1c~ zC233Ogvc0Kqm;pRCmgjc|Mo|}#aoLx!}64Lc8)QIK9``_vZ?cH41B!Z%LdPvx9DaD zu;IO5LS^IEH=BR6aW^-y5aVQCsgf08TE6)D0k`(P#iTB%z^0cjz5oFz|5ds$0qeS^ z??$__QEIy>{aq~KD&Bk4Cb7tel1e|l;fqZA!AD*Qb0*fp9(e~ zgQFWF>uC7=(KFh~7T3Twq> zd$VbQHtkT(86}I);s#A&h^SQP&W+Ld5Xh-ie$8lIjxnrrCe{_b5GXsP3xQ}G$eN%M zJ(6TJ*%SzN5CS!6X;UI=!JmBk*L-mIT@Fo+^iY%WIRgoi3wx1qrks#v=8z**Rya!P zn9~ZGGl>E{-+%Rrzxe!1dNaYxil7=W70&l0)qrZTwq%KBp^ynwF8q$Q_gu)=#w2>G z;c#n$G7S>TOewBTrwCJ11!!&HoojpaW8lKgS~KkeDLb~B8MD+=O)Oa{7DkX3nimeF z++n{Kq{%*OQ9(-V)|$z;Z*wk6=KWj-esFY+PFiwG9H_*%_O}RXf;!mY=B%Q!h9Q+p z;jl3@bwcP&t0g-sGwTvs!j^_u8D6X-8P9H|nC{Lvjf&P(>`ycku}3E?%o?^UMP5va zs$y_U+88;QPVrJwNtj<8^ZRdIl*|WfEk>J5oxnF*jd36} z48sPvAVrD;^k`vba@oWilwbqnrIgX4z<&aX62-qjjf2gmF1n8#Uqg-x#V~ZGf2UZg zCrS|Rd7t>%Uw_5X+uvc;cf51wc1a>0p~=lGA;t(J(MoH5$!REu=j+(@vcX?74stFE z%F9g-Bmdxai}U7zYmFgMvKyt*C|icd_0@(S3B^DA>{DI|O;c++=TNC^%sORAkrV@? ztpokA#0N(}qBX?i==&v7T4I91RQ%Jw_%nX|-FLXXa|JOh3&Ss!UcUf*n@b~&YQo~| z1RgCCF-qk4>_30{kUxL)lr)>uuX|i5IUXr1Li7j{N&a|ZW@ zi}6XSc-A=x0yj9^q~??3HBkpzp}C_iAAk9fq$SE$*!>yD#}_CS>AS$v2);PIAmqeO zWr#s=?{tkcnwyIW3@graxt(tBF8Jc!1Jw2&!Szhr>wJFy8G~(b{XqNn9e#2D8M4{N zcRd_k;VXLhy91ER0vD7o40fIg=9C^@N?R z(dN3xyPjr$!TREyGiGR!Sg+TdJbOqMo`3ZR-{ZHx^=?^|=RNu27+VRjiXkO(^k^Zd zg~IXr=Ghzsn}xSo+`oP>Y;L+YD}v3}%h!1Q0U3j>DqH|P+PRZ8J|(_-@Q4q-b?0^8 zUmM789xw$g+8k1scJUOyeg%*PLaNIfee-%^j2NXzBjltuuW@`2l`Y%_sYQVck%f+) z0!nCvisUS@IdUEnuLjSb{^c(TYEI`9RaJ5G=3C5Wvv1t&-uvR2I6k{KUyo9noL@iN zZw_ByKkv=om1^pn)z+_9U`ZFJXBP(2kkC?53&Hnq-Qec6tNh6?KPSn^g_g9nB5BPP zYf;(K=7h-&vsz(d;H-5dDL7~<>J0mJO+e5@!L-s?)$-M|W1Ne;zq?JPEM1Q1SkRfg zaU5bJP-2`X72QTJDvnQ2`SRgI7W*^i+j~SZ+sbm?X!`k#Xf@tzc5|dYJiy4&6gG>I z;;)J$mz3OE?7UuQIrSLnitN*r%=jcd${5ze3ZE_2q{ZcoF^bA)W|JCHN2QB@ek5a> zmXIBRh@I3JTOq458;DUegh-&^-ojY46gVWkR4jp9Sy{T!pD-9h3Yx8GICYX&ZOuF< zx@E`v*N^yv-}#71>T%~QbX6m3OBN+UOh!>~ZJ?@avXqE%F!$yl?ajru*@T6t@_GTj zS^k$G4e`cCEjL?CiP~z~Nkdq6rR%!$&0fK z{^r3myl(if{?R|;kN)U?0 z6!S(?3s?=Fq$O#nu_^Ird4{wV+uEWNe6>m#9e8lQ;^o;ntF`Ct{T&Xsrp)UabPZ&b z?~o!x(!30w#-4LmEq~?9N$Z%${YvFqtloC>Zi}q zA@k1Bb?!ZRMAVklFS&aC1`k$euh&~6C0n|}6+D9~!$eSWE7V+$}=CnhN|uFPxx!H+)TFTS|PPaZx%)eBa- z;lgTKQHXRd2V`53L?%i@mjbDofYx+lgXC>Zr9h|5I%=NB#Fr1AaClO~FmT={Or@F1 zz|L&O{YNJ_BbZss^@9b+wk6pL`hi_xI1YkARXCSfCBs@&cqz!vv&@F2ZgI6jUzD)c zwpuXAV$$Q1BD`TNS`jF1FdGO}Z@urvnmB8M}{)|CZewuOsuyI07xLYWHLh;lP1g;5$C%4{TSQwTOjA+q@E1{#?nj35`^jIKD4MJZUsW zl_S#=q0qMGv1U{9m&4M<@ER4kd?aGz zRJ?wWZ?;}j?GM4nYnmtr><684^-vR7`Z;1x^<~x;FP@(hGNcfh*&RN6{2V)JP<_Dd&iTtHFOW?|lPvEY zO!&o@PpH}nby~5#HRqGZFEG`FgQ}(yE1vYnq^vlaH>{SYbhat+WI5xO7o1*nxZu$T z2Ry!5mXOBYF`d->{N7`*mh4s-b&bzooRek7rht@+&!0V`G26Th9ar*{`!7xrLbEro zKsfq5kP-~N$8{@)b4R5FfB1*L&tBCq^cPH|L?a=ZlB^>GK8{h8A|j=xcSGT6Yl9yH zJ+lCrzFG3;%Nz7{zq(m;Z!W^inSyvd9ltynDD^{(5hW!@M@M}8*Po1wyWGw`M()1z z9w(pwC9Bnn`E)|lR-`m8_WXJ?D5VPX?lPNT182&ywu6-4s3LMMbkwm*DO`tCzUQ*M z&V=X?Num&>G3!9+(ud9$yZr9&{ayaA|Mb6w`8l6_@;Ce!|M`E0H4|>!y2Jj#4%Jvy zC{;*T<>r^)*u-yc>Ni`d*NRPDKBvn=_SY)3Q7-=G;PK6QLXmo_5>21VAuB~;+Q}G^ zzM_+mjX=bK>$PD2&UFrL#b3RA#=2@b+?wM19;qt=f`duRS%{qJG638`kZq=_w?On9 zPHU!dK*j%$t~ZO7Exqphe&4jGsyg#M=iIUT-rHn%bEYIxq2$;SO-UXU#DSFQDS?1E zuYm#>f@Hk}5d?&i93TMRPDXLDG%S? zRr}Pvs>Vg1sdnw*TkBivzy9mLa#~Zep**u$Kzl(GBReaaBBt)zHBmCoB!-&RB6R_8 ztc=*qCG}XMA{1J&A|0~~Vw9|C!$vzJWPe;sOYI>fy@lvR0xq|m9;X|RfZH9wvDV89w#(xB)InHPOe5sQN*b)7 zBu8E%v|tu8&=94;`hbsy)=6qr5Q8CdrPXIJC}Cnc&*x zUGChu$AOjn!~gmp^S}I0zXwnDxxTweZZd?F1gUT_kmZtk)-vh{LLsJ@gNKSouBy`R<2#=U;X(v`A>f7 zKjrs-|MyWQ=O6vbud=eT!oU2N{~ISKM@XZ|iVEjFjk7rC=cs>jqH%t|g-8)rPnKHT z>zDw~=j`-An#rkp05zh!U9cxn>BxN8DH7;}I`jSvzg1Fv4+;MUFx zZ#{a%{_!FA4rZL1j3!#_r43GwPB=g#RfAYrBQ}z!ZjX`H9LB)WwB?9EJUt^@DUprG zYKd_ITYE-IQhSRRk|HD!e$6Oak*0vPt-{)dS{PJ31zk`G!>LR%#Cn&z~wZF~3|4aWl`T9D( z^?dyLJG}7XE&hxD@*gr@S*55-zW(*!<`4hy54m;g);vOS&RsC@<$IJOfW@;}en!hb z>m6u+-vPex4t_u|sL6X~u-kIF1sZ zmCR&8Eeak_Tc%NS)J7VabL`;ANe-gsgq$ZW+&^pB51JEE@Yo8DV#b~gJgQsvUE~apa=aKBn1~Zf4o0grC;pMBBa7HrOtk@ZAPIot;s#wvQ?UCf>r4?kB zQR#vgRy6rq%XDU0H-@nZJUMSUwHcfFh_WU7w*UYj07*naRLSKRIdD0az$PueTwzm` zcpKsfE+?o^=dWV>4aumC{CaW|vZ!p1gHO~>}Gd4CQ z%FVb@W~{gH>dT+tGgmK@+ZlPN=L;qvkRm?UXoopi{Jg-Z_u_aC&y>}`8U6rj8-d(vYZ>H zwTtS@#pjU{rJ)lYI@M*cwy$jT>BEpa(5E5kIW3&SGLAER20~oKd8AAlj7kV9lVkDN z`h=hQ%q@QO)mQkVZ+!>nTMqH~n5JkMA<48x2A8xPV^Wq@GKs840W;U4OoWE;GM?<8Q7eN8fzi0-!@WadZYcZ=Q|<8XqkU{XMYb*C6IXcW;ZtOm z6Pw6%cg)*Qj`2dWDg-+#C3p7EhAl_6h>o0i_B8z7cu2ld6YE5%?*FKzCTCS2a9RB4n16q&x;V2oxu=8kWv!4mUhHO`IIb1?%cV<=H@1QdwcxlH~$S^{On6)*RGN&%}@TFe?SI&{QkSV z{pRbOKY2iwWe8y~LZg*Lr~XcycQmm^7{Sy4$v`&0&%iH4K(xsSGEh;XghEI~8wG8Y z-sKqnyAO3z$W*R)ZWrA3Y5j-dv zu^}LgCc1{{!9G{lclgi#)|dF^yYIkMbF3A)Hf$G?YGN3v0^iKIUKx%X!(oh^H4VGv z7*h%iNf~>`9eL%0QB7(tjPOCLD2`bM( z$~3ulQV~XmU^1p!QD+%yRM0eV93ypDL6391J*AF@MvU;*^Ql`m`LWxd#x{?Mp~Ya* z%myJqM!Za784TEHLvXKO5IvoC-a!|_g&ljDS-AZF=PkHpFl_l}%VBW{j_cR2bNtpj zhzQfuGpN$+yrU#9&YiwQG;mQjyuyge)BFmXIEl1X4!wfAY8bx6Y zd7guk+daCKnTIjn>Q(n45^X~TJLasM>urMiD=XP=R8s* zVGlxTv!}s;iVL8%Mz{CggtYYS89Gx7od3B3R z6Giy=gjz}(EIU=jc|Btab7th!Hh7sOU{VRP!mz4FN&Gc4JUKcfiX163CZm#Bv_usN z&QKLOv$|$7u0SZ(MyUXy)2jF+@^1G*c!A|*{@$&0*u&>C+# zHbRgx&uU{8WabW@&|%T)bhTwa*VdHyg|9ftn> z-##xy9ln-JeEkCM7hhjWeD&p5c;k&Xk}MdJFMjsZNU8WYfBI+q@XiCqYb%s1D+B>r zfRBQcv*V;UP?lVJ=@VRe`PDRnTcpxoUDwQ-n&3RvCQZOR&&i4$(;0PCdVU>s-E!Op zgl)Q$SE!f-Y>Y8vd4V7OM`ac8K>EcqV)WXVaarv-Pt?xWy4-nP%b))#q(Xzo8>Wp>6TBCepS3N?*f+pL(~z6w== zXlLvcf?L}Yf;JedxIETO!zy`EQFzPFxL}-RM5CyJppfURHU&`|HgRYzxlWGvp6ya# zCyLXkP(pBJWDqwlQ=5qNaJ^D|@y0fd2t*sXK2{vA z$f#IPx`DaGc~6ReK{!$m`XB^c-UXI->EVJ}-u;Kpp+8=~i!5UV&(^*d-}ltm{v~A^ z^>yRMbzE!t(wBaWr+bfi;|H(tGe7e)2&K7q?;fvw`V$=PJ!N-i8?uxV&)jA^mVWwv5ODS<*FwM1pv+=!LYqz1^yJMX-Q zk{TycUqiZ2DbiY7Tf<~YgRpH|dfvs*Nc-qu&Ukz#TI!>*bnk}r=>ER-_jUNY#j|_% zxmn0o8*L&1?*iAaU+43m`z*il-~Kn$^^}8y19oVCh!9M%Dbl;z)d@tU+XbDG%PTp(rw_0mLbSM;SAwv=Iq2YrkciEplA&)f^X}Fq2 zX7w5yDzYXlF)FHDa=FkPi+~Q6s9+o&BOJ8n#OPTO9#x+)%2%)K%b6Ln@CjNvX%m zB%$0WNmfocjS($!&b;PG);O_FX$(_SVKYmU=LlVpE6t%jBaTXxDJk*_p)+a^tuUx; z#JLZsGDo=@CBXWO%zL5=SfCMLyU|ZVOHOrQUqyr}@iWWjlvi zO(=7I{K_q&cSxCmg|>C%Ws$~X`Hnn;1eIpgFNgpA!(QGgdSmSkba?^I4RHA% z2Ktv$D)H+>Y6_83ce|7vEYv{Mj*ZO~_7C^?AO6RG$~XV*xA@xEzRHuQkNNq3?`M;q zWK?WytPz4GI7?P#NkzCv%XfW5gEHO<4EGHz&g+UAAU?#IJ^wV=(#Ku zCYw>YHbthHB>INjLao#NyJid%xy_}JVQJYa6i%)&K63nDy(19y zIjbub4`$P@Kec6r!1?qXf7TGHZL|=`;F+FI@lA`JO;e4&@yNy@>xQU2y0)m=QAL5D zwFKXisSSknwCx#Xo<>pY05&-A0i9{;>X)2R; z1uv+G4vSNaPuk`c1#+`i0c*?tfj**_Q~H zOIbreY3Mwb4Qcp0qD)$UgGD+-ubH>$O3Je2%U}L7-}~P8_@h7iBYyu6zCl(P{_Icx zAHMtD@A4o0$Gr2J$--q^5uno0X)N_ST6Yuo%6Dj?#V{OU4OZn^E?b-_`LdOKkUGa zA%j9G4& zPLCLm*Ldf!CYBktnK2%1@Y;i?*i0g=Lyii5@Z^|Q<;V~zS6BIqyAP?)12uu*0-O>8+LxGCGEB)_>!5Q$p4TSnrIOL&u`glD(N$ZuXn znUW02)sbV8=LBt-9Urk;Wvop~keaPr5Uk-;WGHFaDh*e4;It8-;CcpfXO&hIOl!}r zN^*8-m5jirU;Q)_C6hXEH&ND#$idMOH($7ph!UM=sopwRDB(FdC@dOVhWTZm3-_q< za8dORqF-G7zo7#eI)HhPydpU@5mUpC5X6{}`(zNkOqk&I?c4l|fAPOk*EKFUKKSTE z4i69cr{DNpHa9o~nTy!V8-sEG82(;H%cp7Z-47DSyMkvGO9 z5?4%)v^T2WLB8?ETjW_uKy^E>>;r2yH#gbd-o9Y4%VpF4XTv;S4xZ5vr=dG;e-6W{ zfphjk^tK$84I{x}szywykm{SR;>BmERGQ>emPzP!IyTR{03RDB+B0pA z$fTmqN7VHcp;AAFrNHP0DWNbLFC!?44-Ha9Bpwt9)s30UOT0~z@IpoqA*FmeO%b!* z02?O*K?yKvo@riY*yxf{xD=>N(Vlzaf?44yXDX-m7IAf#k3PPG%__8tw3jz{_v3qH#fZA`nA?~6&Ifl=yJKwm%jhrF{{T^} zfe2h`C!Fp*;BS29bG$g2AY({mnYdUUUP#WSHI-ge1uoK5FV={kw`24_*WC#9=T!)X zyUlXWI;>3(D-ahVgKn|+yU;>qN6!JoS6=xfN*aFiH-D2q{^LL9wbx$bAN&WuKtyt| zf6ToH582wQqr*)b+W3g^+&8OEfvu8a|;rdO zn^MP!$OsW4IPY9idSEKl|T6X|Cx_J z{+M6*4}X!r`}2PXlUM9)UtxcLpLgH+E7rgAWt?-JBsp`ZD1<=Bc;T2SEPgg5Pv_DZ zcRE=@STy#`&n*>T62<@!C5OjH93Gq`97Y12T)LL2-T3Csn{zp}-uQb5v`B{*uQ|pc z)%@Is&nlg}9DIGTIxsxWu!6IkE)0*kTXNc7+1lPj?5MW))22f-B+_{o=E#2Q0eH@q;Cti5!DR%;sDaIGrXs;<+9jMg^n zjttu)MQaUz(p|F_ZA;-Sh4=W_!n9>vRZN|OPV^%aicq)2HWC|;_TXJ0QyGQI@zz1K zpmdtxV;#aPl=l=~kjIFSX;(gvO z%K9o>n>#!`*heDy)?fSuU;gnQqir2hwiJczX5Dq&h%t$SrpZd_cQFn-_ZHVZ#7t5O zAm)ZUyifH1VyZ&iy>lOD148%FKq`Os#&-Mm?fK`;%Z}Z35AV&gQ4%jY;e~TuIOU;} zSO#tT_bf*O7aT4uaDm}9vH(fF_X)U^2`qj0z1Jzrj5bXRTm#Rh&H=hXs`A493Q+)_K)_nhd+)!G%JNj2 zoZpLNq(z={>C&YO7)yVwWoJ0NkLl}Yt2pVo#QE=*do_l}zI@DKGqNL$+HQ}A7hd7yWZDdf=asO57>&tslsYgCElFfL;G3F9 zb)dB#!59@H!gbSuY?>{vZQzqPZ?a}eMrfRjcr=Oq)#bX%cZ(#_58@;&*QiCJtS*K6 zLr`fL+W&RVU_`(LV!yz`*cbPG2tp38v0nqj>mQzv6blfs z=XjvftjhP_eFrI%augxSxrdO_vMeizQDB6}BhnP@5V(}Xo;|~KirT_COw0-Gj9lk< zX9>1N_#~>T6u72_U}@_#b0UTjh(K#+sE|~{vk(!^#v{E4{ zv5aZjha3e@WeTi_Oo5PBs2-;Cp}hJwEs8&m?Jb<-5|}MYW=#fh{-MBtz<)T35B`&uM5p!@(s=DnzGN z{OHj`5N>`iwakemAoTL(T_mYGqLe~N`CRZdh2NcnR$~6F=*Tc8lCEK8B&&JGrP5HV$ck626*=A%Sf|KC&84z} z%ZVAA3&~~%aeEW51d}-CN}1!Y?-I4dww@~$nB8lfx(4SA>jhj{nb6t+p(u1sCc$~U z5a0twX=Je2S)`Sce0@aL!~}kXh*oLLxfDs@A%xJ4af+alvX77+>m8od%%YSc(4vjR z+7_}5+cY@erhfD`V4_Dki&6zH_{0QMnive;DP*n~1;I~z{&V=*IivjfAW?5%F~+3& zD+JT&l&s1xa?(RUD~*cayD2}zPPn1r4tJtq-q^o};r%e&?L+AyVEEVd#}AKH6vc&| zuYc|A?69%1!RhHawsRb=BP1y)_^S`zM@Wehsl9dRn1-Lb`VC+J$IKDT7we-_7R$V!X)f5Fw?0!{>e>!t0%0 zRG6$+KfKue+0S4FqGlC!_nU-u;C2|%CLb53( z*(eg~8B)TQ$=Kam<;9f>dwPa&*_|Uj42%bkzjCsTsQPY-$e^f8l_(FH&;&$A>7V+vGEvm6m=gB?lFT9t8V z6w<>?IAX3-RHY=12vFqEsZ~#f$7zkq3w*R#C6QHy5E`ihP4qY;K}(dD)FL3O94`en zR7_RLkw2zIVT0#9W;A+)XOJ4ab@wq@QS$u{?xTtf69rt`=C2+;rCOlQlKhFEu( zZPRd6Im~gTAUMaDzVs#jzd!$TQhhFI^7#%|5L)rx`+vpX*!l7Kq8x_y%YbGGX?pTd zfTh<3fJ8`HPJf1gqY#N;WUb}xx8Ei+1IcFOv5UxnbafH*TU=Y5<1YQHFIUD6_!~aIVWc)U{;=p6Ewd!?<^>3;5|HN` zo<6;gZ_c=L=MLN3TWoD@5JHjSEV}>zAOJ~3K~%tXY2|b}O`j72HZ%lj2vTB1U=%Hv zDA_-4h^0z`wGm_#2wa*JW*dkaQD}nm^T>j!=R{&=ssMyE4GibOLDZ>J)QAAy zcDfW169R=4G;VQ^bf^lZBH}ZR%nO19Ulqvlh)|}EGMh;nnTA2sQcx>_6A9#LbO7&g zxyA-fV+6h`IdT@X;#3HHRbY+Ag}_vTHJUa$POarUtT0m}T+rk)V=8k_T}@sZ4w@FN z$LzHNEe%(6MqZ2%(Go3zWwcQ z^R>VI)3mO^i;E?{{@gEo7K>)5o`cZum|A7epz$##Y#@f785uA-=gtrBbr?-5>s`Hk zg@c2=Zep@#YikQ71KB_#F2?7V`gGq+BxOfWeiqPN{@Ef5Ogq2eBA&6#4_J22{WT7w z1tLV5s!&QQWQ0eL?h}2(;|KQ{k1IAeH?g*zpKo2)U7D2xTZ})>M^}NsODOK;;iF9JN_!#ExtKLVXgp<>=E_Ymj zLCbBZ&ZQZEap`aR@0W=`{cE{TVU9rzcCFzqGu)B-1-u;Y_6{k;6yf-8Cp5-z>Cz>x zUcJJjM~`tf<@JF+#1`DWdyl5J2)PKghgiWdT1uCZc3#t^O+y14o@;-d!}J1?LVw#j z?%cW4U5m&0!1e1_xp)6#goy0y>|m6}x*0L*j?173?xI4}@OcQ4CPGKzg`K)TpJBOm z9u-7L*hKFr-GzHAxJV`&%Be56GN)b;L6WiP9eLo+$L|q><=(?beCkuL;CwreLKZ}+ z6jdo9AxLxt={*`j6bd0M4?ljBlYE1jE_vLw{a+gAsHWzTYstJ~buxz88T&#KLdI69 z$h_l`_2fF|QkA3Xa~@d9xwotmTwn;AQq;d(WKT%%mWjZ(w<3bSAtDa}N9CRNTj zO16bZ$AFNUEEtaJ7FIe!juZ>cektdR$91}dZC$4a*%@UIj17$fQnV1AzkmbuyT~#Q zF*YFrzj&6Th8QDKbQ5^`6huT^fR{hQa*htWIV?w$@)wm#bH4SpDn4ITc_NzcV+eC=jj1a!u=;Fs66f9Eo;2_@ngs(vaR8T8~otTV?vfuD#b~g^WoD| zg7fT_8N2JNJU%}IDX4SF!P%5Oe?$y{s=UH`cOK)7CX*RbuJhr81L`a%ipWkO_~G6@ zvdAc9WM_4gC+Da5OfmD8EM`1D+2^xA@*_wW2u7gMR3hSM=ko{H&j*Oz1L-^Z1Oo5f z{K2aby1e@$NobBIgn;)Ub#V<0v;W)Y<(I>dc8Dts7whoc`W>oYoXbr&{jnDY8FMj^RBpY(m4V*>s4gf#bSem%qM zAHKBKb3?v&?_TE!72bNPs^b0k-%rNmJU4INykO{aL*t@eL;rQJ+B}qzTaKcZaSx@` z93PrHTrRRW`{&h16ULZlp6!K*Nttw=Dfr>^=#bN+L!RzE=GB)!g%E?mt@P69y`Dry zlnGQvNums-R6eOeSD~TQ3VSleD~)g@VbY^1!6-tjFd}E#dV&(Pu0gMjuuQ6nWzJ|;vb(aHgfhHEDS^ubMK^t@52LkAgED%4 zeF%XdB1&r7C^?&1R(-BRN@T?-g)O8l+qyVh4WaZ z;VyPng;L3pq_hf@))%g|H^}~+rIeUXpyb_m-$lrz4^ZS8)>=;X57B6x@Z7w04Wvhq zBZUDXG4;+}xF@=sS19^CJ;V#=J~Y_jGl<z`$GEx~J)&ImDZ_wId8Pp4!$M=MK+;62n$8dd`WqtmCQ<&-0(oOGrUut5XH!&@Q&>mi8iIv#bwXA*sKO%g6e1vI z=Lo5Y)>EmBEIPcaaUr5aMcd4hAVZes@5xRZuWjqpvmOI=)1YIduBXIuObiK_$&JQG zPqY>jBUwxhPs%$?GvoI4t0>!|VnSt`#v+P>teS9qe9Xp1LTm$x7$rKxRZ8K4n;YH9 z$qD0)6=E+=*)5LVAltT?zpt+~_dCY(YW>S$_i)GQzwUVgL$#s{IqSe7q@Rawo?sts zBqTfp--Y7Iscdg=v$nRz$w^J)EJAdVNO#STpFUxKf1hfUv!w4kC zBw(WesU?peKV)z3DO(%sT?)F0;;c{7dnuY*;4;p+M39n^7$Aty0o$JX#PZSceIAPw zl#W~p8{B)mj}57X`<2~wPEL-frN+9zjZ16XdGMI?nBk=03%hIFd-Ra=&_ymA6(=Vr z?A0!TgO}E5&d)e%6V14s6tu0U_JWxmXcpew+2qD*#d)Q$y2L5isU+s5Ycytr_KqvY z^TivxI8$JRS&A!bi50N0|u?fz`akw35}B5tQJv(Ofe-><0*bm0Kgj%9S0C zWeWK&j})J|vO%i~M9jHX2xgVRmlehv)-uhFtyPS7C;V6JlpB5x%kVsqoD;cE$1h2mOD&P6e>uB%s#JPw_i~=n)UVH5|{?y_=Tfw+x9|KHpCUu{ZE5i1p@#vb|j>D zkviPpZ%Cw}woRyimSyw5OV8IJvn;*8Z8M4z*sN$%EDYz!P$hSS3X zY(Ap39xXI~_2411a)S33Eq1tjZ~}Qm(y}+6@X_HJ?J10u_U$m7|@n`Cf{&jIM5mJ5K~5Ty?xaBy(I%@=Po zo7MdCFaI*%_{KN*{eSk)`0cNMog&M4>E^Aja+G0AHjhMxpF4DPBB5`1Vw!FopY4e3 z&+#JWAv?XrL7BG445Yl!SCW9wGz_*E9udgFu`V`$g&5gCc*@hq_gPyVqv)BdDNSmc zHYqt9g|il!WoRQYI;XB{+BW?@M3UT@4@41YWCSV5f*`hu+mNPIDQx1_&!zhSG(zD8Nf|{7 zN?oS!qoDSlyvV4fgla@E8E4MXC`qdoW_3hU&+uhVY(tv9Diuyc>nt`3EE2TA3yCx- zZ}D2;m7s1s&S;!g=)%x?OQSV2qiBsH1WS>XY3K45*YN{H3^?m(glBtun|t@}@#?Fu zUf3muyIOjng45|4AqqxS1qa^-AIss4jf(oz-|eraqtY-h1ycoz}?# zxTM#xNJR#DbXc_K_EAL-R7!P`UOhCx-bvoMbC1_w{{e5m{SF~`e*M?~F`xhZ=Xve5 zA7E|E&6_tnD-U?-pX&@27gH-C(#*x-z3pH9J?_uD|3@cON?7m;LJaiM<8cXGlmqqT zessKW7e}l0sh9xn{qSQRJp3WIZtf8A_!tvNhoY*gBwW+hC?&}A)KJyb4adjFtgfzh z*U{fgkU}zPT5c30F6~~S_J-?|5$i8rXO@ld(sH$sjIXTXbcvWbc2_jz)fLWlP7ID4 zRYtzG#*`f6BUj4|y*}ntCS~v&D;2prqm~M11DD5|1232oI#9TC1bMJ%*N{o5eS?XD zEaaHrDHYiBDY+Y=>z2lWBw~U?)Ms!a2+mV(tTH=3MdSvnGAIrHyiFl`o}pFRd94d+ znv#@A1f#M<2gpK119hDqM3^~baFhzlEbr>+0h~n&NuK9~=&((Vl!m&lX_{s(Beq=E zx7H`ol(waD7U^1wJfCw0dK9@|Bzd0C2XFL7(Jzc4k6@XgvbW4B)YT#%a?c1iGm4p zLz8pP!0;RgYoj~oXUS5F-$79ny#9kX`ITS!RetApeg|tUKl^iE)$n>SHPk(C9#VsUZ=11w@tp&3?XdLVZhj~SlR!clabl91OZz~0kGI6Gryr2-+4QDD8BQ^`+HPRMgbmQ`fh5S(W^Yaq%C z>np9F&H+k;YiGRu;X5445zUL&_~_0LiKBI*J4aoAg*QKb#0*0b1mT5iy!-foHZO=x z!`h7z?>~Nm%U95?XJwLeXa5jaP4IQg^|E09^q7#33Eor3oa3gZRT)h^T{wc>)sn5T zqEw13LKXz;m1eTD$$`ko;wrnjK)iUBS|zmia;eEbc@wK8(hIJQ4EpvpS^^`HF_Dh( zWJ3J^+k3NE%hK~a@A-!{?0KKDPR&(aRctn!Y*Hpg+JPK7x{CoB4B*Q^fsiP-iDdyH zg1~TqIB^6Sc4R^bpbO{L3826TqQnAB3W*?!gG5T~ncZD;oq62Dn*Jdd|5|IWbDBx+ zlU_ift55B-hqeE2dcXI3KP?$cNj#l$VGLeNwqn8c=}3O-fel~s~TI>Uz9~E#bTbJ z(uhdg+AdarT~$wGNhw=r(6sitX>oIPi8b9ap_}%$k+tJQRx)IlwfE^fcQ-IAc2l{8M^Y8$re z9IkRUx(-UJj*g%?g$?QdJ3Miz9NK01hkH_~6+ty~zZbXT*1Q_>0HS zDHRMw!u`!L@9&@C@QjpZ(o5K#%|I*eO!~asKOk2LgD7FPHR8$cE|m_^IdTbq_4p-G zl`nZ9(tp# z|CO(Ng+KU%KR}4E(Km`Be)`jQ7>!1lvf?K{`3c|r<~I={U=U5DTfL{tHF0;LNOw-5 zi*a6`e&aWOgRQMCzWvYtd;aPtZ}Z^cz1pA~ZA2I3*QqyD zH3lp{O?>L&G~H<0+?Ou4(_G=TB(90@w#h;-&scQvmxdA8d_PeVht?|%CR0$AIlH?r z`P`!&g6N0{i$?M#hx-R?tgqAW_lRp?(Nq<)*^K2f*#lQaYl&3`wI!@L>`tMRapQv*r|R>dGAMA}CQ&oYrzN)Zds7q+*MW%rtIofkrc zZM6Y+CRQ4&E^FO&I|Wz&Tm`S1gVvCUlv0-#dA98?F011R8I+R(CeVpi^#D*4@r2Yo zxOazP+NZ2Sw*+fgEM|;{6O8vfd$z}7xg_n$HZloOPuPhPTwUULaJ4}+8Bi2OH8&st zwYF~2x@PB~k{lnNu*?d)RQ#9!=)dCI|NNhz1U!5C6zL`RUb~AI5Jd@6)Y^xd*0Jg6 zG6rxJ7`)n=ZJc(urP!8%2&{1k1&+F}FE49FDy4%%^zPF0$d*@N!cb4mRE?qtfSiO^DEousS^4vx=AQXQ}!Y%MgR!ho0xN>JVj zB$Az|V)MakjCv8`-rew-%ZQzkpty0LT!OcT>wS;eUPmM`vYK)|aeQ&>CZz(L;g*7G zV+W@-)xdK-cG!*U?} zV&n}I5tg4Us*=<>;=G`&&Zv|_It!J>=3r|TVOtbPf<|E~g2dNzbGl9UXD|_TBb?G=^l1!HZC*PN!3zKY!jv|Hj~ikSz^X z2*GSVr?NJv?+T6AI?OxJMe#d`bSHu|Qe)k&L6h=djabdqO>yC}_~zC2;Z-ff=5?>Oh}4bmad2jtQd&idm`1$XROMt=69OMUskYIv_k8hQZDc{Xu-m=^6c;L zF4|I6J#wKA-dO;loS#MpI_BpIaKdR48-7;}3tr z%|~zW&XZ%L3c*a?^}PRhADhHDV;SAu;*(eVVf%O~*o?08_~k2X6y`Rz?%iVV_<~$G zibcs-Z}Rf!BxFS%iph}NROG%42!UEJ>Z``Y>X<43TD_V(ePVUKJwI zwSng(8sTIQlw^IRkT*7XboVw?7sSZ~?>&pfBCN}jt05ZKsqvaG;^N|>B^ZS-ARzF~ zjjx=iG?r9CQ55Z$@BOL|9}d06+A#Xt9F(gyYkLzrorf+G-u?T}D=99G2@@sq=Z8Q1ArBtj#XD2i zsCC3;HQ&%g$8PHEoI_GaQy(Ijb3wPSstO{l>(OI{v0)(Rd*AyWfBeUPOfMPWk=(m; z7cE6AKoUi9z3-4q_pj;oH&dV8`_z4J|Bqdoy5{x`o3N9eHEI9VJqL|3G+5B5_D*^O zLh$(UW3KH?S>_kuByrTom@~X}q)EzfIKUAYnpIiyYImRQog3}zHlMRB%P{yRLg{I} zMW9HvVcM6J(o*zNh!mNL$aJ4l4{%yzTty~QY&ynjg{ds3LXq{y809Gz8M7#1mZX#l zmZfLz6*H$1Q3RFc+$xSMs6<4y?93W`d^RIFo%87W1|J;EiPMOo@ND)4&yEgB6kHqk zI6XMwmp8br8V5%nPN`PnLg}M+0ZsyUt42uZ;uBL9<+whe3@OKZf$Li zgM$MmlgVn#Rx5lvlmuz7$LaYwo8u8xzGOb1v$?rR6lsiKMZG3HZe*;Q*XzD!W1!6e zx*E-|at@SIpW^j*2Voj#(d{U-b$!<`>O=3nr!o~^{pwfwSO4mN;Sc}t4=IX*|M)ll zL)O;TxOQ!eS9|-s_wKu45ovAw2wGaLyfSlf)yXx6(QU;_Ap&YHB_DnGamVpFyb`2o z4{IHx(U|dg*Z~}aI?(EKTD-3_Dt~!YyKBhZd)XLu_a3#6m8+SH=JDNoceNGiy>Az| zbidoy>9}T~OR#&e&-!{2DBD)ESmey+7fdD-#=}8<4FA zN=PCq91^J_N^9$7tOBiKDqFScO#s?>!5~V|Iu4=_Hl`336{n%_&3G+F^;N-2(ykC{%VpE@9oM^BOf{*`6fQfiwh&>E^#oXut=O43t`<#Nt^ zK4*P>y**G@5$di%bfbN9bwR~X8O@dG)}*W52-h{fZtC0q?v?DKDPI7RIOWcrI~*Jw z@OOUooBWG^@jvhn{=q-wZ~d)*n_vEwU*^~Uqu=1Se(SfG%@*`}2|8MpI8x|K*+%pC z=HDB~)xNf~c<0**#iA%UJUqmd6+%cn67K>g6UQ;vcD4d5Q@DB@e5HWgZNE0orF*}- z4ze-g=I`Bm-JOo?vLc&5O*Ymz_D_8`T$Nqxh@%ofL2DfI`2`yrDN+O_t~@L0^#)AG zqxN_5(uR^?w&4DQ`zV4FzahEsyLj@(Ly20oXsTREH6k+1!WHTGOTD8f<$RzA+SY>6^6tK zROPUxA*uwr@Z`rcbfob%r=Lj7$puLqQ@LXX%5mWeDlc(`Vdud;%E}W7iSVKSI-O2= z`SK;>@%R$qqxsSrL!VBkyn6MDJ9qBXhpFj9*Xzn+!#vA){oZ}f4)#EV8HDk8%!=&c zYvZ?M2+{xmAOJ~3K~%d&(|q~eme@KY(4w^U+0eq_bc7KOFX8#qkJz>A2mxAH zuCK50$-!}$;SmDiOP-$1@mi2t$w+%X+C4_35oGI@ z%2~?N5OsK3dS^IcC_Mu&xHcT(wPvV$jAX*KzD7ha5GCs}!i)k2Fiiv#Sz)39iHf-% zN&e=eyA)WAblmNyY}~ucvacARSxX#A65$2Jm1koVv$nQ|M3A_QD28(qgh;rbYR0~# z#G*)`HugwqCX)$Io;=~vqercZPGf9M%H8kxIXpaE9bhGK#4x}^Ozkd&`Lwe9UA}fna4*b&R z>u4NyKY#PsZaLNbo-wASAzy9Dw%Pz4pil^L$q{u+IcqJ3FcTSYgxcZbdGYKcHaEuD z%2AevqFj(936sfsZQ!0b?Qwn)0Kx|k9#CXUbOgq%UZ-g-I%g3+bU>6hcx$lU;W0#N zNp5Oe)`cX%ydj#8a{t}lfQblOWIF}O2@tHYkY8c zj6cg&bgN1*gepZQlX6}Lk;_lzy6DS>p%N1_;>&Iukw%noBx^* zK75GU-Q7jIn>tu2g+lQ0#~-62U1JqtoSas3)nik0k}Sd~`Y4uO=ioeAhVfUAz-DwiP`{|bohW-+bfzCzmSVm!_F)cw3d z1i@4A^t8sCidVZ&=?^qjnQ?J3Cyq5YZfuj~OQeThuZJ;)-QC?fW388*u;QacQP_ec zd>}lPWsrQ=(EwKl&@xe=ZNbQt%nFOvpks>`2An~n5Dug>2w_OHrp#st>v7f*%M@u# zq^nTAB=VZdgOMPlLMTn;gZ?5~k<{9p06JS1Sgmn#2tFbnOrWUHs)tY~AT4DTQ;j_1 z(GZ~=LZ|ffl9^BllVA`eet}Dd#8y)gLmDI1fKnAGJtU5Y7#xv~Na7JfuaRFu-3_#FuA6+MkgtYEMt;Hq=}+PBC0Y624RtgXnM#iN%JNmHQIh%@T!aEH;1@u zTvv_03wCv*WA`9;fwP7R-95Bn*{er5iHag_-nv6F=<&b*(ZA-8zVlsv?LYYUdF`QR zW9JsnULEjiZ=cz0Mz0s4^a>DjG#N*bL&IOLqY`~W~W55WHz6nbjterm?Fz?r9t*RLTL{7PMMt*+`GSt zz|>h&j8;Aj8F^c`wiBEQWrjqOy9#AXDix!IB{J~Etq~`K4PvR7=+Ght79NWs1%ZjlOOpq*m!E(7I!ZH<>(poC1Nu6aNROrta1tT>jH6>NHz+1x*gPWZb z_hS+SJyViY8AVnx(G`7FGOU)odG8UTTq08)BDhX)wrnT2lu`_bLuRuXySuwwzka<< zyM^}{1IuMj6h#aMBeG?PL~*Yl26gIMu;1^8HclGKgD^c-w48v3?9tS9-GkJy7n|#9 z^t{^M>PDKY9fjt(uOi!5jpb@Diu+ zSw@<^5lqJ^N2X*nS!b+Lbg^I{6-q+STgDqx#yTMN*9Segf0IJ?Fy)->RPc?@-=h?s zffH=@1#jKm#CSs@HGLm3&gQ(abqz7kko~wFKkfF@ncF8&2ZbI{KU4XGMlrE6gZ~>$U48*_o*S^Br@4Qb9NQY&lb+ptf z=BGdXDPRA_S7|mG1w*T&t_vlGP&J{-Ijjw3kFMLJN`~^t8qdN0G2V-o${Q%c29P)e z_wL8AfWqvUW}`9Xdr3dcSQECemU)hgHMR<0W?7bKC0JU|C>>C^1={t<3r!+IR9$B0l%+7<3Vs5N^^R8O0UuDlax5e0XcwG#kaTuR__=v%v&upI6 z5gr^tYRfp!ix)3AJUnE5eZ0zQXv&0DIn(^NVZz~8&LO;(lFQBp{( zu{?P2fFw!U-G$mU(&-(!GkAY)L%Ut~wme zv|z*7?3Q<3qwjJVFoqM43{Y`btD?vH!CaGpL;RhpZ_h_sX}l*Li8-eJV*?F7sqjtC^8SRG4ut9#e&q9^n6L`EM7S%Gg2H> z1>}NiF(YvnmKi!xRCdl_H0JdiTZqLHSpzNow9nF%m@3qz4aK-g^Wr#WGMR96u+Q4s zgeVHV^x0z3ewqC=<=OKK%(bvtwyJDUewBhnw#0bXwsg8tylbS*A?oTJtZ2xqaoDR7 zr5okDHGcE>|2s~7V<=4q(Y&{AHqkhV=KZ#O1u3|5=ML|__aU;L=JQenqL_-Y#__X{ zKIUs*{R-3|VdDs_GqoXI&P24QOw zL_3;;i!*YSAe}>}Q=VU(aPAaZ3Z}h4&CiuWD}h#l@MQ(WI%( zQ53C_cB4pRAl;T>({k(riw)k;HQuYlneKBoKW~82tG#jnYii&OFt+5cf8!e+AaRAn zI~VBIKmPHL+xMF1d0P{ApR@UULtxU8yyWm^vl++7$2e~={xXRN9P8^-hQncN)Xm<8 ztEB+Y-k(PNrRxwOi~?98`S95@9v|(q_1Znec*qiXadb##!=l`9A3{0MI02z9?`-UL zUK)Z^^Lkw}QkPbpE$7THE-*!olF;w>>(X@0haY@Izn`+Pu~v6>1Q!=`mdm{U{7n{F zASI+}Oq!+?MZxjWDRG=25eU&CiviA-q>&?zHC7FY1)56t znWHg!$c2#<(SQXhxgK(11q&}&ddbX5UY;*Ftpta8#ez;oa9VeNvT9aW(+4H zW;b(W{g}h^C4=>KJ~%jMIvz3-5sV`C7nU;eR9VT*(TJm>KnPGp$@45{kxQ(rK*zjy zI79V%#HC|6-QXwBk4V#)2*c}N`URYoIHB=Musl1bni#YWW4lFBTuQeuE-u=ZTEE|C ze}A9d-CeHTxK5HJ%;)pK7tosR?QOpQy`ORG)-C$|KIgLwA~kAne#GU`;uRPtT12}G z^fd>j@$g;3P4oAwU4rHiHYBJn@1UDCG*>(R+KJ4jgLyO#qIvyh&3B&Xy!F;wltqDz zla{2@bOXHiyz|aG?ID*^wsPXC7ANeMD2)SbIt9)9e)jAcMNtq%N&8;927Kqvo%;TV zgWL1@8L|v(pg-d1sS=;jO*Li7(@x)R2XCH z(c`)^;VvsmbuohG=iPgGl}}L=8E5Awq_JW&8j%+Tn_HVadGd@r&$)i{21$~T=Svog z3{$y!)*@^fFUy=}{5(xl%Ch9(;D}zYhf)#P5|2Q55v2H>Bh}!%L1@LYJVT{@DqA77 zulFdrAXXqO$~uIzH83eC^9mP9MCB1ylA8)ONO88rD@pDgMVXT(VF60(2(mm!DuMBW z$j!)ONx!gQ9f>s*OHXDhBo%9srmQR{#&B~oVwh?!svM7^Cp~>Han4XWh@~TQK@8K9 z5G^ajc!Dq`-a~H?Ge@&kR1C*MWVOUvgRha*NIJQH;l9j*pLnfQdKUd+i|~ee?;hzwrjKj#$j+q*|~nEn4{iFm?0? z!(m+2kB#9pR}-b1NY*vtZac8+Ai5aBWm;|Xd+O42gh*0d$`qRCZfki9LR2^+toLXY zv%S5}c+@8^49?ZdL3|*f7%zFXyU+2-IsHL`ln(p~D+sALn0g_M_YNr{gtBPeNWL3B z_~3(f%-dmtZl4n+KQf1q*{U06xLu3#8RPSbt#Ah2d=O-WKzx&Gy|l-TGuHNHP#yr z509zJ1v}Fru~wYV&JjxT>g66gn;UFSCwO2sU$!DSI$8w54Wb=o%Fdg?y;c- zx7P;T9mYJ`n6R!K*ZK+TiDYAx5bFxuoXuD=jRZp+<47>plChSgwj#A96IIbO3vLWG z@$#I3T`(1vVKHajSP4KKZ15Uro!*+8~_K zh_zmgoMl;ItwXDrci(-NrZ?_gaEib5OTX0eE*?I7Sie8jDnvDxG3BLu(!H)?D#jQ} zQ&3bDYwHuvPtSFFiA0F*8 zosMw`9)I$L`}bet-FM$*I291*Q?hVV|w_4Q}4J4ZwIf;>N}X53cW^ogu0TA*N1OMuRago<3{S#L;Mkl#+Rk zA2bFz8ja}ndJKm{ilX4fix+rnSzll0?Ch*H%s1bBlgA%_%>3el(I{+CK07;W2{o3> zX?&MM&>W-&T)J9ct`2$FB-|L&RVUE=f44m7)~~H$c-iU$HW)>dx;DRim9*42i?S?v z^UXI_&c<{HngZ4OM?b11&@DlW-#V(I{8YyxjuV=dW=+>aO3Cx*FEOSuTEY5cofj`& z)YFQRn>VkwTavqmy-K@n?euM%4Rl+xU92GR6&+=s^X40`BfMp2dy_I>qO@d`B#irm zFmq8Gm+ugW8i(8T@ULR*DOSwQx$g_ew_a5@@`yb&fZ0}sdddI=R z9#TrSx3}wbUr}aD<`-uu4ddys#;xG#lb57v%49l3>!$1rD$C6%Ha0Lu<4CZWol!W= zvWh8ef)OcR_p!c5VN-J7VS)6dLB3|W&rA#@g1Q(^|bm>?a#k>$47M54b zisy@pXA8rj)4a+YPtP*;myX?8#opZT;=JI=(FO1C9do`ATmX{)MgQ~AbtuXYr=WkMj2$iR)T zAy{gu+HQ!TF6r7(N z0(F2A5!QG%Hnu3slEaf@q9|f}do!GavT7IT8dI^kxsFnbMON_i$t$dZ>2!)S71o6e zOG+7l%_dM-LlP-4CD;;0K@tPn<0vS~ImTsJSKxe(FEgYmiEs#$BTb1f=J;|+Z+~&%VhB8ZfSjG)?qrvVg`gilS(rr&(;#{Jc%=>uBF~4&CV4q^Zr-El;}ds|&UT z#5tsuH*a1iP199p!CFjBIx4MU{~)YGYog`V|ArP}a>;0&a};^i%E2}7#~8zn8#j3V z^cg~W?%uxhDS;7`#Nyk`tNAyr^`%Us>mXXq1naRy#r)_5Z7sJpwzxK)5(8`fJ{!X! zRgt$HrJ}N}6uq@!15{pypF5y5hN7ydti@cxeHy22jG-(`PEL>Twq*Zcm)m#l@oIk` z9S3#mShlvdkW!PC6}!9p93LOoYu`cu(RGWn%W3dFaAbsc zcw3=_=ZotJUsxaVrEBZlOyTnzeIAT^eDT@__xhT*?p){1Tibl@+LWzWaCh3{wapQ) z?`*Ip4O_z=Yq8||AZ4OF8>58vQOx`Q$9Fk7*l$0-26+4@-{V*Q#@}E&o}eN{Dm9Zx zkR=(fiG->uxG5#ct?QI&N>OH9SFnsF@i3t@6*tlem0QwF6Q+@5eUdOM!+7dAmJBC7 zQU|6eSx*IdD!4I-&=RaEgBWAe!jlrBh{9N=(<{ppLGJ3k_uk{nU;Z+0yzvHq`hWfjZ@&2@(lq7%{rl|g?ICt{@MX!eC=t%K64Xsp z0?<*^QfQlYWP|8;2}9m{%Cc-7QuEmE`mA=TrW2PUQI{^RH0=1@sEE@oM@ag+<)yJRaKyL-HR6iqv$$@ZtL~ZAXR;Jg;8u}5Z)0> ziI$SVAZ2SZA&DZat*EjBXDpdrNzsS0CJv>PRLCUId>bd-tg=%|;kCy5RS77iuG@Z| z{rz2L^K;(((gXI74#RsZ3#|04udg#5jVX$PzXMg{Y zwe<}K{T@Pql$zyoNtlpwC^RS)#7*M}=L||mIPW<pfmy{H#jUxYz0PCT$@aI z{_22ArPyr2&g-{1on>SKR8_D{VvbJd_()-wmTcPR)$ti;hkJbg-+brNJy)a2+CK#N z$@hOqE;Uaa?48b7nu7ha3wAH&oECG&!-$`~+U3k<%uLSOH09MippM>45)ZqlIb~Ia zF-d7T%YvFwtie_#x%I?avpz^DmovWh;1Ox6D6)dVaE!4ITUAIAP;^`G*aJ8^I$}H? zw_kFTwl+q&SS*-b%oy|s^!j~HPfs~JJ7eqGHO7-MKl;HB*x9+p=H@2vz5gDAejg)zp*mG~H@={INZR-IPc}2F&DT@jvHCjb=+fiaFi_({Cc_}W_ zhOasw=K^5leAwj|+ICmglCfH3ig)NJZso_UwRjw7XLEk^<39%!?#gU|(vtP{319mB zfkZ3-00VVNL_t*In?X`sgjoUI0Ulebb4PMqDb2t9m;WPQ|N1W?gyi`67=W|W6Otr! z5&rJq{rA|~+C=HV>T_OF7FE4;r2Y&|yH3bfO}KGJO^MaE@M^-7RGK)Bh?D|nan^wK zNP@bu7h!vIGj`kriEe4tINoL#rq-Gyj!{asSxB={xiSSm{NbOmJU?W8bHw4v30YPV z$CAzUG1JKuEfvef5>u5#S`o#Pwdq>TQ?VTEAM@hH9)m%T$z+Jujf|V;?ChNWV1N|h zoToH~G)YiOVvG$tAQ9wZ#IYH$urbr=gu`WtiY64+urZ#nyDZ6MLgis|ZN#h0b8ew> zFid+Kl%7gy@B$6|=udyZ_y4E=xwWh2Y8eI27=G}F|0|*k>+}bMHZ?Abf~pMtd9M_EdjY)J+T7%W z4?du@hA+JF2Cv2^& z9RV-0u!z%Ec<(5yiZ6Zni)2|Az%bzgb=-TjaL6R$hd=re-~8sUwkW8We9!EnR-YQSTG!n(_wrGxaiLF%x-!Z}w{~o35u%384E%ow8BZv{^2o`@sP3#GZnZDQ^e#( zvCR7vRfe~kJYTR}oKlu^Dz9;6&iTa=c^)=A$4XKaa~AoM^7sIEc*0NK{!3nc@|d4@ zi5s`?`=9$SpIx6_pI!gIx#a)*Lq5AcyFR=AzkYq@2tK<$yFR-0i9< literal 0 HcmV?d00001 diff --git a/backend/pong/templates/pages/view_profile.html b/backend/pong/templates/pages/view_profile.html index 9e9533e..25534ee 100755 --- a/backend/pong/templates/pages/view_profile.html +++ b/backend/pong/templates/pages/view_profile.html @@ -89,59 +89,61 @@

Password changed

{{ user_view.username }}

{{ user_view.status }} -
+
{% if is_own_profile %} +
- - {% if user_view.user_42 is None %} - + + {% if user_view.user_42 is None %} + + {% endif %} +
+ {% elif is_friend %} + {% if friendship_status %} + + {% else %} + {% if me %} + + {% elif notification.status == 'Pending' %} +
+ + +
+ {% else %} +
+ {% csrf_token %} + +
+ {% endif %} + {% endif %} + {% else %} +
+ {% csrf_token %} + +
{% endif %}
-
-
-
{% endfor %} @@ -422,17 +422,19 @@
{{ stats.longest_game }}
{% endif %} {{ tour.tournament.winner_id.username }} - - detail - - +
- + + DEFEAT + 7 - 3
- Username + Username
diff --git a/backend/pong/templates/pages/view_profile.html b/backend/pong/templates/pages/view_profile.html index 25534ee..95d9e08 100755 --- a/backend/pong/templates/pages/view_profile.html +++ b/backend/pong/templates/pages/view_profile.html @@ -397,48 +397,53 @@
{{ stats.longest_game }}
{% for tour in tours %} {% if tour.tournament.status == 'Finished' %} - diff --git a/backend/static/assets/icons/Collapse-Arrow.png b/backend/static/assets/icons/Collapse-Arrow.png index 2777a51cee1b283b7e35fa4bbcf699f0e8716995..37072a8cec0ca4018cd0950c58ded6f41a26fade 100644 GIT binary patch delta 295 zcmV+?0oeZN0>T22B!2{RLP=Bz2nYy#2xN!=008+(L_t(oh3%8Q4goph? z4Fw62pb#EMw1Px5t5Fc%jA9i>;cjxX@iSw`PcdIP*?Z5KJ9i5OA0Ho|e+y6r8bIK% zX8^Q-ipj@EZrK2l19&LC0Cpw?E#NE#TOiBkkXqJIGBD~ahllK>)Mrr>Sc z1_LFrx7i69`&MdCz|i&r=_E!LOsG;5}=2Mq(@@1c;wKhrl;Z;2DXol33hZ zOj)=To&cTP@Qj3hj+LGSP!{+_;Q4ROX<|`1ts^$`y5XvnZL002ovPDHLkV1mG+eFp#l delta 333 zcmV-T0kZzW0_XyeB!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1poj5{YgYYRCodHQ#}s>Q4oBzoQ|KN^*0nGMB)^}&k?O45ef+z5xhN!G9++1S_U2Kx_=&?FVFH zUWy4vd4-0q#6?XFTxULq6SxztI7KZ5^CE+3(f|bmar2eW z { function detailTournamentGames(button) { const tournament_id = button.getAttribute('data-tournament-id'); const detailsDiv = document.getElementById('details-' + tournament_id); + const imgElement = button.querySelector('img'); + const buttonParentDiv = button.closest('div.details'); + const grandParentDiv = buttonParentDiv.closest('div.match-block'); // assuming match-block is the outer div class + // Toggle classes or add them as needed + grandParentDiv.classList.add("enlarged2"); + buttonParentDiv.classList.add("enlarged"); if (detailsDiv.style.display === 'none' || detailsDiv.style.display === '') { fetch(`/tournaments/${tournament_id}/games`, { headers: { @@ -30,11 +36,20 @@ function detailTournamentGames(button) { }) .then(data => { const gameList = detailsDiv; - gameList.innerHTML = ''; + gameList.innerHTML = ` +
+ + Phase + Duration + Player 1 + Score + Player 2 +
+ `; data.forEach(game => { const gameBlock = document.createElement('div'); - gameBlock.classList.add('match-container'); + gameBlock.classList.add('match-container2'); gameBlock.id = `game-${game.game.id}`; const user1Link = document.createElement('a'); @@ -77,28 +92,37 @@ function detailTournamentGames(button) { user2Link.appendChild(user2ProfilePic); user2Link.appendChild(user2Name); - + if ( game.game.nb_goals_user1 > game.game.nb_goals_user2) { + user1Name.classList.add('winr'); + } else { + user2Name.classList.add('winr'); + + } gameBlock.innerHTML = ` -
+
- ${game.phase} - ${game.game.duration} - ${user1Link.outerHTML} - ${game.game.nb_goals_user1} - ${game.game.nb_goals_user2} - ${user2Link.outerHTML} + ${game.phase} + ${game.game.duration} + ${user1Link.outerHTML} + ${game.game.nb_goals_user1} - ${game.game.nb_goals_user2} + ${user2Link.outerHTML}
`; gameList.appendChild(gameBlock); }); - detailsDiv.style.display = 'block'; + detailsDiv.style.display = 'flex'; + imgElement.src = "/static/assets/icons/return.png"; }) .catch(error => { console.error('Erro ao buscar jogos:', error); }); } else { - detailsDiv.style.display = 'none'; + detailsDiv.style.display = 'none'; + imgElement.src = "/static/assets/icons/Collapse-Arrow.png"; + grandParentDiv.classList.toggle("enlarged2"); + buttonParentDiv.classList.toggle("enlarged"); } } From d7a0d7dac0d06482c680e480270acecbfabad02f Mon Sep 17 00:00:00 2001 From: Xyckens Date: Tue, 15 Oct 2024 12:49:42 +0100 Subject: [PATCH 32/74] game stats graph --- backend/pong/templates/pages/game_stats.html | 7 +- backend/static/css/game-stats.css | 9 +++ backend/static/js/game-stats.js | 80 +++++++++++++++++++- 3 files changed, 92 insertions(+), 4 deletions(-) diff --git a/backend/pong/templates/pages/game_stats.html b/backend/pong/templates/pages/game_stats.html index 097e311..5572616 100644 --- a/backend/pong/templates/pages/game_stats.html +++ b/backend/pong/templates/pages/game_stats.html @@ -4,6 +4,7 @@ {% block main_content %} +
@@ -27,9 +28,9 @@
-
-
Score History
-
Ainda nao tenho isto
+
+
Score History
+
diff --git a/backend/static/css/game-stats.css b/backend/static/css/game-stats.css index c439a81..85b3f95 100644 --- a/backend/static/css/game-stats.css +++ b/backend/static/css/game-stats.css @@ -31,6 +31,8 @@ width: 100%; height: 60%; margin-top: 10px; + min-width: 1624px; + min-height: 500px; } .bar-graphs { @@ -217,4 +219,11 @@ .records .record-title { padding-bottom: 10px; +} + + +#chart { + width: 70%; /* Set the width of the chart */ + height: 70%; /* Set the height of the chart */ + margin: 0 auto; /* Center the chart */ } \ No newline at end of file diff --git a/backend/static/js/game-stats.js b/backend/static/js/game-stats.js index 1a12be9..9547628 100644 --- a/backend/static/js/game-stats.js +++ b/backend/static/js/game-stats.js @@ -40,4 +40,82 @@ function applyGradientToSquares() { } // Call the function to apply the background gradient on page load -applyGradientToSquares(); \ No newline at end of file +applyGradientToSquares(); + +var options = { + chart: { + type: 'line' + }, + stroke: { + curve: 'straight', + }, + markers: { + size: 1, + }, + series: [{ + name: 'Player 1', + data: [1,2,2,2,3,4,4,5,5] + }, + { + name: 'Player 2', + data: [0,0,1,2,2,2,3,4,5] + }], + + xaxis: { + categories: [1, 2, 3, 4, 5, 6, 7, 8, 9], + labels: { + style: { + colors: '#c3c3c3bb', // Color of x-axis labels + fontSize: '14px', // Font size of x-axis labels + fontWeight: 600 // Font weight (boldness) + } + }, + axisTicks: { + show: true, + color: '#333', // Color of the x-axis ticks + height: 6 // Length of the ticks + } + }, + yaxis: { + labels: { + style: { + colors: '#c3c3c3bb', // Color of y-axis labels + fontSize: '12px', // Font size of y-axis labels + fontWeight: 500 + } + }, + axisTicks: { + show: true, + color: '#333', // Color of the y-axis ticks + width: 5 // Length of the ticks + } + }, + grid: { + show: true, + borderColor: '#c3c3c3bb', // Color of the grid lines + xaxis: { + lines: { + show: true // Show/hide grid lines on the x-axis + } + }, + yaxis: { + lines: { + show: true // Show/hide grid lines on the y-axis + } + } + }, + legend: { + show: true, + horizontalAlign: 'center', // Align legend text: 'center', 'left', 'right' + fontSize: '16px', // Font size for legend text + fontWeight: 600, // Font weight for legend text + labels: { + colors: ['#c3c3c3bb', '#c3c3c3bb'], // Array to set colors for each series + }, + }, + colors: ['#F8D082', '#336181'], + }; + + var chart = new ApexCharts(document.querySelector("#chart"), options); + + chart.render(); \ No newline at end of file From 0445705841972701cd14879d57b8876a413fb07e Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Tue, 15 Oct 2024 18:44:11 +0100 Subject: [PATCH 33/74] Fix: fixed not having scoreboard on online. --- backend/pong/templates/pages/gameonline.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/backend/pong/templates/pages/gameonline.html b/backend/pong/templates/pages/gameonline.html index bd8e162..5616a17 100644 --- a/backend/pong/templates/pages/gameonline.html +++ b/backend/pong/templates/pages/gameonline.html @@ -20,6 +20,9 @@
+
+ 0 : 0 +
+
diff --git a/backend/pong/templates/pages/view_profile.html b/backend/pong/templates/pages/view_profile.html index 95d9e08..039e3fa 100755 --- a/backend/pong/templates/pages/view_profile.html +++ b/backend/pong/templates/pages/view_profile.html @@ -5,6 +5,7 @@ {% block main_content %} + @@ -203,6 +204,19 @@
{{ joined_date }}
+
+
+ Enable 2FA (2-Factor Authentication) +
+ +
+
+ We'll ask for a code anytime you login again. This will take effect once you logout. +
+
@@ -251,7 +265,7 @@
{{ stats.num_first_goals }}

Goals Scored / Goals Suffered Ratio

-
{{ goals_sored_suffered_ratio }}
+
{{ goals_scored_suffered_ratio }}
@@ -259,16 +273,15 @@
{{ goals_sored_suffered_ratio }}
Time Spent per Mode
-
Remote Game: {{ stats.remote_time_played }}
-
AI Game: {{ stats.ai_time_played }}
-
Local Game: {{ stats.local_time_played }}
-
Tournaments Game: {{ stats.tournament_time_played }}
+
+
-
+
Win Rate and Games Played / Day
-
Ainda nao tenho isto
+
+
Records
diff --git a/backend/static/assets/icons/error.png b/backend/static/assets/icons/error.png index e062ba70d2fdae829b39b9a05ea16f7e84bf5ceb..1b7911dfeeb17902edd88265dbbd55601677dc75 100644 GIT binary patch literal 10840 zcmeHtXH-*Nx9(O16$A?cN)rpxi-6LkND%@Gp?88HT?oAdLR3UR5ESXXO6VfJ=B0`B z7KpSUL0V{1L+9@JyaLVEw6*zL&cnur?&bz1@xdQ+VJ^AkxkeGZ896aT&t)c)F_p&a6U(VP*din?e zN+W3wpHTt;&k988k*?3Fl}VatRs-bx`biP7{Yjr<vxmx5j-%dlE_Q#eL(elSy2HMCMKw6F>kxM_6d zVizN`${nNp0)p+TzrOAG^~OQ3@j?@R3Sb zgbH0c{>N8scqV~P*3DbRI{;$NDt5eFIyQ{iPf&}J#V*ki8zhbSk(K=z*?Nw?u6YE#)t??VP(Rm=0i_!jjt9!~lW1!F#DJ6e-Qri6v$Y#rF5phUuH zO}Du;_1DI~D~jKn$bql_x%_H6KCDZ-p)@dPB&|DbcjOhF>yLp9ZO__OFZLjw8-Yic|!YRUWxLbi26SE9kiWjgB!OZod0|O4)k*Lt;vi zz_t_@q(SYhhDK8=AA~klf3sXa^mG1rD5K2f;Y(Ew2?+E27j2<*hKBqYIR`2Z02E&4CqE2t8taW`47H5btn)cF8r#*6GN` z>0s997dx>*ems1*;LfYS$cf2;6j&6~+4s1J;o^W9TVBXMv_u*${y2@RtILgYk>Tuc zu66l=-t28qPnQqB_wA__52;;D`e@1_2<^lfBV=aT7OK}t$FdMyhnWcqx4GrmgFf)p z4Dxi9M>iyIJcnHB>>YehI?{@2{FkN#B7_9hx9?IjUOxK%Iob3$?D%Jx5Qt9H6mde> zuS)~9wKHLPbPuuPc(nL+{qm${-~UQMw(QO8f!+NX~jaCRQ`kGX&%T;gtqJU@2w)jxhaDgy&M#_ zVMkGglk#YJ4xi_G;^q1#_fRLJ1OqcZ@C&{Zv|Kb5?gT=NoG9MT5zC^PX|cX+fU1+g zRF!eiNl8lGZ`g3UsQYOv!`wSN&*0=I=^%f2QPve&YRslzavV5)2l?5{**9eeD`4D# zu2$fiTEzF?2g&7NW*rc2~Z8L@`M6p>uDW$ZL zcRsJ3S{zT(O_q%@GjXQZ#AihZCt!L?8EW+>?PaWn+Aisfv#qIga z@~WYRE{r%5F6qEKun6~SKI63y0(OU7_n-f{^F3q73F~kD(B59Dt>usI2t}B9O!_P{ zqj542VhV9JStz1l%d4&U=7m|CDO_LO1MX0t#>5>Y>U(%BT%&)5jW>F-m{#ic+>5^G z>&7zliOhtZ4qvy((ImN95U%49Ts;T)`PpW_D;{0g{hqO%q>3Za8Cnu_ZQ1f{7=6rM zqeSnGO|&E{%g*Ad}2Hv5>4tR$nsRN+e6b$B&sQJCs(k}qxd+y6mg@;>}uo2jnz0LPGS z-+g4j;)ZOAyM5ZuJ7qn?AGvOOuYH1EqfOVjn3oWG&5QPCNvuP2dc%*~UzawuT+z>O z`i^fo4SeSZjpy@ljKzxEF!CwJfCwvow|US@dy#0Fl2sW{j6T%vOQ<}GN~%IQZRJkH zz?sY>@7)=uZ)wWAL3c$A;4lHr?T1rZ@xSMb*r5%$;(gn)OSIWijN4&GnO{EEEelvp z{~BnS{yx-qNd&N11=Y>N$+Wfq$lpwP*J7n_MHHM(nOQd}$c@%V61dsks>^7uM2?%!Vo&Y` z4)e9?85ao$mbTA4Fi=B{E%%h9?vc2mzlwK*X!p|gi%^R~rd1i783g~k&wnvuh_Q#A ze#d&piPGY}IkS_ZCmk2QmWb*-yh<{#{x2H8E)-PTXiCH0$hYP#;Jv}GApC4_qypuj zze=$#1ufBu8W}G`Ae0)p%xrWPFP&v@*XA*Yu|$j?FQ_8hzna5icHL^|w%2Ng*k$MfPcwuHG3M*I+WxkTB

%u!4-dD=QPW>V-IW7sp1VY@%=9N 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 F{$HcNo5lbD literal 7982 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 ${game.phase} ${game.game.duration} - ${user1Link.outerHTML} - ${game.game.nb_goals_user1} - ${game.game.nb_goals_user2} - ${user2Link.outerHTML} + ${user1Link.outerHTML} + ${game.game.nb_goals_user1} - ${game.game.nb_goals_user2} + ${user2Link.outerHTML}

`; From b7cb3f15e3668a82d32282124974832de2cff50b Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Tue, 15 Oct 2024 21:44:55 +0100 Subject: [PATCH 35/74] Fix + Code: fixed edit profile script being called twice and linked donut chart data to backend. --- .../Screenshot_from_2024-06-26_22-00-29.png | Bin 0 -> 414189 bytes backend/pong/templates/navs.html | 1 - .../pong/templates/pages/view_profile.html | 898 +++++++++--------- backend/static/css/profile.css | 11 +- backend/static/js/edit-profile.js | 249 ++--- 5 files changed, 588 insertions(+), 571 deletions(-) create mode 100644 backend/media/upload/Screenshot_from_2024-06-26_22-00-29.png diff --git a/backend/media/upload/Screenshot_from_2024-06-26_22-00-29.png b/backend/media/upload/Screenshot_from_2024-06-26_22-00-29.png new file mode 100644 index 0000000000000000000000000000000000000000..7b85d4cbdcfa2eebf31bca19e8546d912073a9f7 GIT binary patch literal 414189 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

nmX|*396s~a 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�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 literal 0 HcmV?d00001 diff --git a/backend/pong/templates/navs.html b/backend/pong/templates/navs.html index 7288969..ee1b8b8 100644 --- a/backend/pong/templates/navs.html +++ b/backend/pong/templates/navs.html @@ -15,7 +15,6 @@ -

diff --git a/backend/pong/templates/pages/view_profile.html b/backend/pong/templates/pages/view_profile.html index 039e3fa..3e8bfb2 100755 --- a/backend/pong/templates/pages/view_profile.html +++ b/backend/pong/templates/pages/view_profile.html @@ -13,454 +13,458 @@
-
-
- -
-
-

Remove friend

-

You're about to remove {{ user_view.username }} from your friends list. Are you sure?

-
-
- {% csrf_token %} - -
- -
-
-
-
-
- Success -

Password changed

-

Your password has been reset successfully.

-
- -
-
-
-
-
- {% if "http" in user_view.picture.url %} - Profile - {% else %} - Profile - {% endif %} -

{{ user_view.username }}

-
- {{ user_view.status }} -
- {% if is_own_profile %} -
- +
+
+ +
+
+

Remove friend

+

You're about to remove {{ user_view.username }} from your friends list. Are you sure?

+
+
+ {% csrf_token %} + +
+ +
+
+
+
+
+ Success +

Password changed

+

Your password has been reset successfully.

+
+ +
+
+
+
+
+ {% if "http" in user_view.picture.url %} + Profile + {% else %} + Profile + {% endif %} +

{{ user_view.username }}

+
+ {{ user_view.status }} +
+ {% if is_own_profile %} +
+ - {% if user_view.user_42 is None %} - - {% endif %} -
- {% elif is_friend %} - {% if friendship_status %} - - {% else %} - {% if me %} - - {% elif notification.status == 'Pending' %} -
- - -
- {% else %} -
- {% csrf_token %} - -
- {% endif %} - {% endif %} - {% else %} -
- {% csrf_token %} - -
- {% endif %} -
- - -
-
- {% if user_view.description is None or user_view.description == "" %} - - {% else %} - {{ user_view.description }} - {% endif %} -
- - -
-
- Enable 2FA (2-Factor Authentication) -
- -
-
- We'll ask for a code anytime you login again. This will take effect once you logout. -
+ {% if user_view.user_42 is None %} + + {% endif %} +
+ {% elif is_friend %} + {% if friendship_status %} + + {% else %} + {% if me %} + + {% elif notification.status == 'Pending' %} +
+ + +
+ {% else %} +
+ {% csrf_token %} + +
+ {% endif %} + {% endif %} + {% else %} +
+ {% csrf_token %} + +
+ {% endif %} +
+ + +
+
+ {% if user_view.description is None or user_view.description == "" %} + + {% else %} + {{ user_view.description }} + {% endif %} +
+ + +
+
+ Enable 2FA (2-Factor Authentication) +
+ +
+
+ We'll ask for a code anytime you login again. This will take effect once you logout. +
-
-
-
-
- -
-
-
-
-
-
-
-

Wins

-
{{ stats.nb_games_won }}
-
- -
-
-
-

Games Played

-
{{ stats.nb_games_played }}
-
- -
-
-
-
-
-

First Round Goals

-
{{ stats.num_first_goals }}
-
- -
-
-
-

Goals Scored / Goals Suffered Ratio

-
{{ goals_scored_suffered_ratio }}
-
- -
-
-
-
-
Time Spent per Mode
-
-
-
-
-
-
-
Win Rate and Games Played / Day
-
-
-
-
-
Records
-
-
- Max Speed -
-
Maximum Ball Speed
-
01/01/1111
-
-
-
{{ stats.max_ball_speed }}
-
-
-
- Max Speed -
-
Maximum Rally Length
-
01/01/1111
-
-
-
{{ stats.max_rally_length }}
-
-
-
- Max Speed -
-
Longest Game
-
01/01/1111
-
-
-
{{ stats.longest_game }}
-
-
-
- Max Speed -
-
Quickest Game
-
01/01/1111
-
-
-
{{ stats.longest_game }}
-
-
-
-
-
- - -
-
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+

Wins

+
{{ stats.nb_games_won }}
+
+ +
+
+
+

Games Played

+
{{ stats.nb_games_played }}
+
+ +
+
+
+
+
+

First Round Goals

+
{{ stats.num_first_goals }}
+
+ +
+
+
+

Goals Scored / Goals Suffered Ratio

+
{{ goals_scored_suffered_ratio }}
+
+ +
+
+
+
+
Time Spent per Mode
+
+
+
+
+
+
+
Win Rate and Games Played / Day
+
+
+
+
+
Records
+
+
+ Max Speed +
+
Maximum Ball Speed
+
01/01/1111
+
+
+
{{ stats.max_ball_speed }}
+
+
+
+ Max Speed +
+
Maximum Rally Length
+
01/01/1111
+
+
+
{{ stats.max_rally_length }}
+
+
+
+ Max Speed +
+
Longest Game
+
01/01/1111
+
+
+
{{ stats.longest_game }}
+
+
+
+ Max Speed +
+
Quickest Game
+
01/01/1111
+
+
+
{{ stats.longest_game }}
+
+
+
+
+
+ + +
+
{% endblock %} diff --git a/backend/static/css/profile.css b/backend/static/css/profile.css index 29bdddf..9ecc5f8 100644 --- a/backend/static/css/profile.css +++ b/backend/static/css/profile.css @@ -366,11 +366,18 @@ textarea, #username-input, #email-input { } #games, #tournaments{ - max-height: 80%; - overflow-y: auto; + height: 750px; + overflow-y: auto; overflow-x: hidden; } +.match-history-list { + + overflow-y: auto; + width: 100%; + +} + #match-container { width: inherit; diff --git a/backend/static/js/edit-profile.js b/backend/static/js/edit-profile.js index a9f60a7..6fecb60 100755 --- a/backend/static/js/edit-profile.js +++ b/backend/static/js/edit-profile.js @@ -86,131 +86,138 @@ window.onclick = function(event) { modal2.style.display = "none"; } } -/* -const remoteTime = {{ stats.remote_time_played }}; -const aiTime = {{ stats.ai_time_played }}; -const localTime = {{ stats.local_time_played }}; -const tournamentTime = {{ stats.tournament_time_played }}; -*/ -const remoteTime = 11; -const aiTime =38; -const localTime =21; -const tournamentTime =25; -// ApexCharts Donut Chart Configuration -var options = { - chart: { - type: 'donut', // Type of chart: Donut - height: 200 // Height of the chart - }, - series: [remoteTime, aiTime, localTime, tournamentTime], // Data values for the donut chart - labels: ['Remote Game', 'AI mode', 'Local Game', 'Tournaments'], // Labels for each section - colors: ['#EC6158', '#46CDBD', '#66DD53', '#FFAD72'], // Custom colors for each segment - legend: { - position: 'right', // Legend position to the right - offsetY: 25, // Center the legend vertically - offsetX: 100, - markers: { - width: 12, - height: 12 - }, - fontSize: '14px', - fontWeight: 'bold', - labels: { - colors: ['#fff','#fff','#fff','#fff'] // Change the legend text color to white - } - }, - plotOptions: { - pie: { - donut: { - size: '70%', // Size of the donut hole (70% of the total width) - labels: { - show: true, - total: { - show: true, - label: 'Hours', - color: '#fff', - style: { - fontSize: '20px', // Font size of the number - fontWeight: 'bold', - color: '#fff' // Color of the number - } - } - } - }, - expandOnClick: false // Prevent the slices from expanding when clicked - }, - - }, - stroke: { - show: false, - - }, - dataLabels: { - enabled: false // Disable labels inside the slices - } -}; -// Render the Donut Chart -var donut = new ApexCharts(document.querySelector("#chart1"), options); -donut.render(); +async function getUserStats() { + const userID = document.querySelector('button[onclick="getChangePassword()"]').getAttribute('data-user-id'); + const response = await fetch(`/stats/${userID}`, { + method: "GET", + // headers: { + // "X-CSRFToken": document.querySelector('[name=csrfmiddlewaretoken]').value + // } + }); + const stats = await response.json(); + console.log(stats); + + const remoteTime = Math.round(stats.remote_time_played / 60); + const aiTime = Math.round(stats.ai_time_played / 60); + const localTime = Math.round(stats.local_time_played / 60); + const tournamentTime = Math.round(stats.tournament_time_played / 60); + var options = { + chart: { + type: 'donut', // Type of chart: Donut + height: 200 // Height of the chart + }, + series: [remoteTime, aiTime, localTime, tournamentTime], // Data values for the donut chart + labels: ['Remote Game', 'AI mode', 'Local Game', 'Tournaments'], // Labels for each section + colors: ['#EC6158', '#46CDBD', '#66DD53', '#FFAD72'], // Custom colors for each segment + legend: { + position: 'right', // Legend position to the right + offsetY: 25, // Center the legend vertically + offsetX: 100, + markers: { + width: 12, + height: 12 + }, + fontSize: '14px', + fontWeight: 'bold', + labels: { + colors: ['#fff','#fff','#fff','#fff'] // Change the legend text color to white + } + }, + plotOptions: { + pie: { + donut: { + size: '70%', // Size of the donut hole (70% of the total width) + labels: { + show: true, + total: { + show: true, + label: 'Min', + color: '#fff', + style: { + fontSize: '20px', // Font size of the number + fontWeight: 'bold', + color: '#fff' // Color of the number + } + } + } + }, + expandOnClick: false // Prevent the slices from expanding when clicked + }, + + }, + stroke: { + show: false, + + }, + dataLabels: { + enabled: false // Disable labels inside the slices + } + }; + // Render the Donut Chart + var donut = new ApexCharts(document.querySelector("#chart1"), options); + donut.render(); +} + +getUserStats(); var options = { - chart: { - type: 'line', // We will use 'line' type to draw the connecting line - height: 350, - stacked: false, // Do not stack bars - toolbar: { - show: false // Hide the toolbar - }, - width: '100%', - }, - series: [{ - name: 'Win Rate', // Added name for clarity - type: 'column', // Column series for bars - data: [7.0, 8.0, 9.0, 6.0, 8.5, 7.5, 9.5] // Sample win rates for each day - }, { - name: 'Win Rate Line', // Added name for clarity - type: 'line', // Line series to connect the bars - data: [7.0, 8.0, 9.0, 6.0, 8.5, 7.5, 9.5], // Same data to connect the tops - stroke: { - width: 2, - }, - }], - xaxis: { - categories: ['Mon', 'Tues', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun'], // Days of the week - labels: { - rotate: 0, // Set labels to horizontal - style: { - colors: '#c3c3c3bb', // Color of x-axis labels - fontSize: '14px', // Font size of x-axis labels - fontWeight: 600 // Font weight (boldness) - } - }, - axisBorder: { - show: false // Hide x-axis border - }, - axisTicks: { - show: false // Hide ticks on the x-axis - } - }, - colors: ['#605CFF', '#83E9FF'], // Colors for the bars and line - yaxis: { - show: false // Hide the y-axis - }, - grid: { - show: false // Hide the grid - }, - tooltip: { - enabled: false // Disable tooltips - }, - dataLabels: { - enabled: false // Disable data labels - }, - legend: { - show: false - } + chart: { + type: 'line', // We will use 'line' type to draw the connecting line + height: 350, + stacked: false, // Do not stack bars + toolbar: { + show: false // Hide the toolbar + }, + width: '100%', + }, + series: [{ + name: 'Win Rate', // Added name for clarity + type: 'column', // Column series for bars + data: [7.0, 8.0, 9.0, 6.0, 8.5, 7.5, 9.5] // Sample win rates for each day + }, { + name: 'Win Rate Line', // Added name for clarity + type: 'line', // Line series to connect the bars + data: [7.0, 8.0, 9.0, 6.0, 8.5, 7.5, 9.5], // Same data to connect the tops + stroke: { + width: 2, + }, + }], + xaxis: { + categories: ['Mon', 'Tues', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun'], // Days of the week + labels: { + rotate: 0, // Set labels to horizontal + style: { + colors: '#c3c3c3bb', // Color of x-axis labels + fontSize: '14px', // Font size of x-axis labels + fontWeight: 600 // Font weight (boldness) + } + }, + axisBorder: { + show: false // Hide x-axis border + }, + axisTicks: { + show: false // Hide ticks on the x-axis + } + }, + colors: ['#605CFF', '#83E9FF'], // Colors for the bars and line + yaxis: { + show: false // Hide the y-axis + }, + grid: { + show: false // Hide the grid + }, + tooltip: { + enabled: false // Disable tooltips + }, + dataLabels: { + enabled: false // Disable data labels + }, + legend: { + show: false + } }; var columns = new ApexCharts(document.querySelector("#chart2"), options); -columns.render(); +columns.render(); \ No newline at end of file From 8e84a9035c6ce13978447887deab4ebd96a41b23 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Tue, 15 Oct 2024 21:58:22 +0100 Subject: [PATCH 36/74] Code: connected the bar chart to the backend. --- backend/static/js/edit-profile.js | 169 ++++++++++++++++-------------- 1 file changed, 89 insertions(+), 80 deletions(-) diff --git a/backend/static/js/edit-profile.js b/backend/static/js/edit-profile.js index 6fecb60..dbf5e72 100755 --- a/backend/static/js/edit-profile.js +++ b/backend/static/js/edit-profile.js @@ -87,16 +87,12 @@ window.onclick = function(event) { } } -async function getUserStats() { +async function loadDonutChart() { const userID = document.querySelector('button[onclick="getChangePassword()"]').getAttribute('data-user-id'); const response = await fetch(`/stats/${userID}`, { method: "GET", - // headers: { - // "X-CSRFToken": document.querySelector('[name=csrfmiddlewaretoken]').value - // } }); const stats = await response.json(); - console.log(stats); const remoteTime = Math.round(stats.remote_time_played / 60); const aiTime = Math.round(stats.ai_time_played / 60); @@ -105,15 +101,15 @@ async function getUserStats() { var options = { chart: { - type: 'donut', // Type of chart: Donut - height: 200 // Height of the chart + type: 'donut', + height: 200 }, - series: [remoteTime, aiTime, localTime, tournamentTime], // Data values for the donut chart - labels: ['Remote Game', 'AI mode', 'Local Game', 'Tournaments'], // Labels for each section - colors: ['#EC6158', '#46CDBD', '#66DD53', '#FFAD72'], // Custom colors for each segment + series: [remoteTime, aiTime, localTime, tournamentTime], + labels: ['Remote Game', 'AI mode', 'Local Game', 'Tournaments'], + colors: ['#EC6158', '#46CDBD', '#66DD53', '#FFAD72'], legend: { - position: 'right', // Legend position to the right - offsetY: 25, // Center the legend vertically + position: 'right', + offsetY: 25, offsetX: 100, markers: { width: 12, @@ -122,28 +118,27 @@ async function getUserStats() { fontSize: '14px', fontWeight: 'bold', labels: { - colors: ['#fff','#fff','#fff','#fff'] // Change the legend text color to white + colors: ['#fff','#fff','#fff','#fff'] } }, plotOptions: { pie: { donut: { - size: '70%', // Size of the donut hole (70% of the total width) + size: '70%', labels: { show: true, total: { show: true, label: 'Min', color: '#fff', - style: { - fontSize: '20px', // Font size of the number - fontWeight: 'bold', - color: '#fff' // Color of the number - } + }, + value: { + fontSize: "28px", + fontWeight: "bold" } } }, - expandOnClick: false // Prevent the slices from expanding when clicked + expandOnClick: false }, }, @@ -152,72 +147,86 @@ async function getUserStats() { }, dataLabels: { - enabled: false // Disable labels inside the slices + enabled: false } }; - // Render the Donut Chart - var donut = new ApexCharts(document.querySelector("#chart1"), options); - donut.render(); + + var chart = new ApexCharts(document.querySelector("#chart1"), options); + chart.render(); } -getUserStats(); +async function loadBarLineChart() { + const userID = document.querySelector('button[onclick="getChangePassword()"]').getAttribute('data-user-id'); + const response = await fetch(`/graph/${userID}`, { + method: "GET", + }); + const stats = await response.json(); + console.log(stats); + + const winRates = stats.map((x) => x.win_rate); + const totalGames = stats.map((x) => x.total_games); -var options = { - chart: { - type: 'line', // We will use 'line' type to draw the connecting line - height: 350, - stacked: false, // Do not stack bars - toolbar: { - show: false // Hide the toolbar - }, - width: '100%', - }, - series: [{ - name: 'Win Rate', // Added name for clarity - type: 'column', // Column series for bars - data: [7.0, 8.0, 9.0, 6.0, 8.5, 7.5, 9.5] // Sample win rates for each day - }, { - name: 'Win Rate Line', // Added name for clarity - type: 'line', // Line series to connect the bars - data: [7.0, 8.0, 9.0, 6.0, 8.5, 7.5, 9.5], // Same data to connect the tops - stroke: { - width: 2, + var options = { + chart: { + type: 'line', + height: 350, + stacked: false, + toolbar: { + show: false + }, + width: '100%', }, - }], - xaxis: { - categories: ['Mon', 'Tues', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun'], // Days of the week - labels: { - rotate: 0, // Set labels to horizontal - style: { - colors: '#c3c3c3bb', // Color of x-axis labels - fontSize: '14px', // Font size of x-axis labels - fontWeight: 600 // Font weight (boldness) + series: [{ + name: 'Win Rate', + type: 'column', + data: totalGames + }, { + name: 'Win Rate Line', + type: 'line', + data: winRates, + stroke: { + width: 2, + }, + }], + xaxis: { + categories: ['Mon', 'Tues', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun'], + labels: { + rotate: 0, + style: { + colors: '#c3c3c3bb', + fontSize: '14px', + fontWeight: 600 + } + }, + axisBorder: { + show: false + }, + axisTicks: { + show: false } }, - axisBorder: { - show: false // Hide x-axis border + colors: ['#605CFF', '#83E9FF'], + yaxis: { + show: false }, - axisTicks: { - show: false // Hide ticks on the x-axis - } - }, - colors: ['#605CFF', '#83E9FF'], // Colors for the bars and line - yaxis: { - show: false // Hide the y-axis - }, - grid: { - show: false // Hide the grid - }, - tooltip: { - enabled: false // Disable tooltips - }, - dataLabels: { - enabled: false // Disable data labels - }, - legend: { - show: false - } -}; - -var columns = new ApexCharts(document.querySelector("#chart2"), options); -columns.render(); \ No newline at end of file + grid: { + show: false + }, + tooltip: { + enabled: false + }, + dataLabels: { + enabled: false + }, + legend: { + show: false + } + }; + + var chart = new ApexCharts(document.querySelector("#chart2"), options); + chart.render(); +} + +loadDonutChart(); +loadBarLineChart(); + From 22c4048feb4ea6ae556da53d30639c09f8f8c411 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Tue, 15 Oct 2024 23:18:08 +0100 Subject: [PATCH 37/74] Code: connected everything in the game stats page to the backend, except the heatmap. --- backend/pong/serializers.py | 1 - backend/pong/templates/pages/game_stats.html | 49 ++--- backend/pong/urls.py | 10 +- backend/pong/views.py | 24 ++- backend/static/css/side-menu.css | 9 +- backend/static/js/game-stats.js | 183 +++++++++++-------- 6 files changed, 159 insertions(+), 117 deletions(-) diff --git a/backend/pong/serializers.py b/backend/pong/serializers.py index f007437..e392ccb 100644 --- a/backend/pong/serializers.py +++ b/backend/pong/serializers.py @@ -62,7 +62,6 @@ class Meta: fields = ['id', 'type', 'status', 'description', 'user_id', 'other_user_id', 'created_at'] class GamesSerializer(serializers.ModelSerializer): - class Meta: model = Games fields = '__all__' diff --git a/backend/pong/templates/pages/game_stats.html b/backend/pong/templates/pages/game_stats.html index 22d9561..db1083f 100644 --- a/backend/pong/templates/pages/game_stats.html +++ b/backend/pong/templates/pages/game_stats.html @@ -9,22 +9,27 @@
+
- - Username + + {{game.user1_id.username}}
- DEFEAT - 7 - 3 + {% if user.id == game.user1_id.id or user.id == game.user2_id.id %} + DEFEAT + {% endif %} + + {{game.nb_goals_user1}} - {{game.nb_goals_user2}}
- - Username + + {{game.user2_id.username}}
@@ -79,15 +84,15 @@
Rally Length per Goal
-
5
+
{{stats.shorter_rally}}
Min
-
43
+
{{stats.average_rally}}
Average
-
90
+
{{stats.longer_rally}}
Max
@@ -125,7 +130,7 @@
Ball Speed per Goal
7
-
90
+
10
8
@@ -139,15 +144,15 @@
Ball Speed per Goal
-
5
+
{{stats.min_ball_speed}}
Min
-
43
+
{{stats.average_ball_speed}}
Average
-
90
+
{{stats.max_ball_speed}}
Max
@@ -160,10 +165,10 @@
Greateast Deficit Overcome
Who bounced back the most goals.
- The one -
Username
+ The one +
{{stats.gdo_user.username}}
-
3
+
{{stats.greatest_deficit_overcome}}
@@ -171,10 +176,10 @@
Most Consecutive Goals
Who scored more goals in a row.
- The one -
Username
+ The one +
{{stats.mcg_user.username}}
-
3
+
{{stats.most_consecutive_goals}}
@@ -182,10 +187,10 @@
Biggest Lead
Who had the biggest goal lead.
- The one -
Username
+ The one +
{{stats.bg_user.username}}
-
3
+
{{stats.biggest_lead}}
diff --git a/backend/pong/urls.py b/backend/pong/urls.py index 2bcd8c8..1712cc1 100644 --- a/backend/pong/urls.py +++ b/backend/pong/urls.py @@ -74,14 +74,9 @@ path('games/create', views.game_create, name='game-create'), path('games/update/', views.game_update, name='game-update'), - #! Games Stats - path('debug/games//stats', views.game_stats, name='debug-game-stats'), - path('debug/games/stats', views.game_stats_all, name='debug-game-stats-all'), - #! Goals #path('games//goals/add', views.game_goals_create, name='game-goals-create'), - path('debug/games//goals', views.game_goals, name='game-goals'), - path('debug/games/goals', views.game_goals_all, name='game-goals-all'), + path('games//goals', views.game_goals, name='game-goals'), #! Tournaments path('tournaments/create', views.tournament_create, name='tournament-create'), @@ -103,6 +98,9 @@ #! Debug path('tournaments', views.tournament_list, name='tournament-list'), path('debug/games/', views.get_game, name='debug-get-game'), + path('debug/games/goals', views.game_goals_all, name='game-goals-all'), + path('debug/games//stats', views.game_stats, name='debug-game-stats'), + path('debug/games/stats', views.game_stats_all, name='debug-game-stats-all'), ] diff --git a/backend/pong/views.py b/backend/pong/views.py index 3ef1d0e..65f1080 100644 --- a/backend/pong/views.py +++ b/backend/pong/views.py @@ -462,7 +462,7 @@ def game_stats(request, game_id): stats = GamesStats.objects.get(game=game_id) serializer = GamesStatsSerializer(stats) data = serializer.data - return JsonResponse({'message': 'Game Stats', 'data': data}, status=200) + return JsonResponse(data, safe=False, status=200) except GamesStats.DoesNotExist: return JsonResponse({'message': 'GamesStats not found.'}, status=404) @@ -502,7 +502,7 @@ def game_goals(request, game_id): stats = Goals.objects.filter(game=game_id) serializer = GoalsSerializer(stats, many=True) data = serializer.data - return JsonResponse({'message': 'Game Stats', 'data': data}, status=200) + return JsonResponse(data, safe=False, status=200) except Goals.DoesNotExist: return JsonResponse({'message': 'Goals not found.'}, status=404) @@ -595,13 +595,15 @@ def game_update(request, game_id): def get_game(request, game_id): if request.method !='GET': return JsonResponse({'message': 'Method not allowed'}, status=405) - if request.method == 'GET': - try: - game = Games.objects.get(id=game_id) - serializer = GamesSerializer(game) - return JsonResponse({'message': 'Game Info', 'data': serializer.data}, status=200) - except Games.DoesNotExist: - return JsonResponse({'message': 'Game not found.'}, status=404) + try: + game = Games.objects.get(id=game_id) + serializer = GamesSerializer(game) + data = serializer.data + data['user1_id'] = UsersSerializer(game.user1_id).data + data['user2_id'] = UsersSerializer(game.user2_id).data + return JsonResponse({'message': 'Game Info', 'data': data}, status=200) + except Games.DoesNotExist: + return JsonResponse({'message': 'Game not found.'}, status=404) #! --------------------------------------- Tournaments --------------------------------------- @@ -1187,12 +1189,14 @@ def gamestats(request, game_id): data_stats = json.loads(stats.content) goals = game_goals(request, game_id) data_goals = json.loads(goals.content) - ic(data_goals) + game = json.loads(get_game(request, game_id).content)['data'] context = { + 'game': game, 'game_id': game_id, 'stats': data_stats, 'goals': data_goals } + ic(context) return render(request,'pages/game_stats.html', context) @login_required diff --git a/backend/static/css/side-menu.css b/backend/static/css/side-menu.css index 8608a46..451c1a5 100755 --- a/backend/static/css/side-menu.css +++ b/backend/static/css/side-menu.css @@ -182,4 +182,11 @@ h2 { padding-top: 60px; font-weight: bold; color: #FFFFFF; -}*/ \ No newline at end of file +}*/ + +.profile-medium { + width: 60px; + height: 60px; + border-radius: 50%; + object-fit: cover; +} \ No newline at end of file diff --git a/backend/static/js/game-stats.js b/backend/static/js/game-stats.js index 9547628..0c3cf4b 100644 --- a/backend/static/js/game-stats.js +++ b/backend/static/js/game-stats.js @@ -42,80 +42,109 @@ function applyGradientToSquares() { // Call the function to apply the background gradient on page load applyGradientToSquares(); -var options = { - chart: { - type: 'line' - }, - stroke: { - curve: 'straight', - }, - markers: { - size: 1, - }, - series: [{ - name: 'Player 1', - data: [1,2,2,2,3,4,4,5,5] - }, - { - name: 'Player 2', - data: [0,0,1,2,2,2,3,4,5] - }], - - xaxis: { - categories: [1, 2, 3, 4, 5, 6, 7, 8, 9], - labels: { - style: { - colors: '#c3c3c3bb', // Color of x-axis labels - fontSize: '14px', // Font size of x-axis labels - fontWeight: 600 // Font weight (boldness) - } - }, - axisTicks: { - show: true, - color: '#333', // Color of the x-axis ticks - height: 6 // Length of the ticks - } - }, - yaxis: { - labels: { - style: { - colors: '#c3c3c3bb', // Color of y-axis labels - fontSize: '12px', // Font size of y-axis labels - fontWeight: 500 - } - }, - axisTicks: { - show: true, - color: '#333', // Color of the y-axis ticks - width: 5 // Length of the ticks - } - }, - grid: { - show: true, - borderColor: '#c3c3c3bb', // Color of the grid lines - xaxis: { - lines: { - show: true // Show/hide grid lines on the x-axis - } - }, - yaxis: { - lines: { - show: true // Show/hide grid lines on the y-axis - } - } - }, - legend: { - show: true, - horizontalAlign: 'center', // Align legend text: 'center', 'left', 'right' - fontSize: '16px', // Font size for legend text - fontWeight: 600, // Font weight for legend text - labels: { - colors: ['#c3c3c3bb', '#c3c3c3bb'], // Array to set colors for each series - }, - }, - colors: ['#F8D082', '#336181'], - }; - - var chart = new ApexCharts(document.querySelector("#chart"), options); - - chart.render(); \ No newline at end of file +async function loadDoubleLineChart() { + const gameID = document.getElementById('game-id').getAttribute('data-game-id'); + const response = await fetch(`/games/${gameID}/goals`, { + method: "GET", + }); + const goals = await response.json(); + console.log(goals); + + const user1ID = document.getElementById('game-id').getAttribute('data-user-1'); + const user2ID = document.getElementById('game-id').getAttribute('data-user-2'); + const username1 = document.getElementById('game-id').getAttribute('data-user-1-name'); + const username2 = document.getElementById('game-id').getAttribute('data-user-2-name'); + + const gameState = {}; + gameState[user1ID] = {'score': 0, 'state': []}; + gameState[user2ID] = {'score': 0, 'state': []}; + + goals.forEach((goal) => { + gameState[goal.user].score++; + gameState[user1ID].state.push(gameState[user1ID].score); + gameState[user2ID].state.push(gameState[user2ID].score); + }); + + console.log(gameState); + + var options = { + chart: { + type: 'line' + }, + stroke: { + curve: 'straight', + }, + markers: { + size: 1, + }, + series: [{ + name: username1, + data: gameState[user1ID].state + }, + { + name: username2, + data: gameState[user2ID].state + }], + + xaxis: { + categories: [1, 2, 3, 4, 5, 6, 7, 8, 9], + labels: { + style: { + colors: '#c3c3c3bb', + fontSize: '14px', + fontWeight: 600 + } + }, + axisTicks: { + show: true, + color: '#333', + height: 6 + } + }, + yaxis: { + labels: { + style: { + colors: '#c3c3c3bb', + fontSize: '12px', + fontWeight: 500 + } + }, + axisTicks: { + show: true, + color: '#333', + width: 5 + } + }, + grid: { + show: true, + borderColor: '#c3c3c3bb', + xaxis: { + lines: { + show: true + } + }, + yaxis: { + lines: { + show: true + } + } + }, + legend: { + show: true, + horizontalAlign: 'center', + fontSize: '16px', + fontWeight: 600, + labels: { + colors: ['#c3c3c3bb', '#c3c3c3bb'], + }, + }, + colors: ['#F8D082', '#336181'], + }; + + var chart = new ApexCharts(document.querySelector("#chart"), options); + chart.render(); +} + +loadDoubleLineChart(); + + From 234e9b43ec2ae24e23f977f5cc33d87ca58ea38d Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Tue, 15 Oct 2024 23:50:19 +0100 Subject: [PATCH 38/74] Code: connected heatmap to backend. --- backend/pong/templates/pages/game_stats.html | 54 ++++++++++---------- backend/static/js/game-stats.js | 25 +++++++-- 2 files changed, 48 insertions(+), 31 deletions(-) diff --git a/backend/pong/templates/pages/game_stats.html b/backend/pong/templates/pages/game_stats.html index db1083f..96cc422 100644 --- a/backend/pong/templates/pages/game_stats.html +++ b/backend/pong/templates/pages/game_stats.html @@ -42,40 +42,40 @@
S
Rally Length per Goal
-
40
- 1 +
+ 1
-
20
- 2 +
+ 2
-
5
- 3 +
+ 3
-
44
- 4 +
+ 4
-
57
- 5 +
+ 5
-
11
- 6 +
+ 6
-
64
- 7 +
+ 7
-
90
- 8 +
+ 8
-
0
- 9 +
+ 9
@@ -102,39 +102,39 @@
{{stats.longer_rally}}
Ball Speed per Goal
-
40
+
1
-
20
+
2
-
5
+
3
-
44
+
4
-
57
+
5
-
11
+
6
-
64
+
7
-
10
+
8
-
0
+
9
diff --git a/backend/static/js/game-stats.js b/backend/static/js/game-stats.js index 0c3cf4b..3897df3 100644 --- a/backend/static/js/game-stats.js +++ b/backend/static/js/game-stats.js @@ -13,7 +13,7 @@ function rgbToHex(rgb) { } // Main function to apply the background color to all divs with class 'square' -function applyGradientToSquares() { +function applyGradientToHeatmap() { const squares1 = document.querySelectorAll('.square-length'); // Select all divs with class 'square' const squares2 = document.querySelectorAll('.square-speed'); // Select all divs with class 'square' const startColor = [255, 255, 255]; // RGB for #FFFFFF (white) @@ -39,16 +39,33 @@ function applyGradientToSquares() { }); } +function fillHeatmap(rallyLengths, ballSpeeds){ + const rallyLengthLabels = document.querySelectorAll('.square-length'); + const ballSpeedLabels = document.querySelectorAll('.square-speed'); + + console.log(rallyLengths, ballSpeeds); + + rallyLengths.forEach((rally, i) => rallyLengthLabels[i].textContent = rally); + ballSpeeds.forEach((speed, i) => ballSpeedLabels[i].textContent = speed); + +} + // Call the function to apply the background gradient on page load -applyGradientToSquares(); -async function loadDoubleLineChart() { + +async function loadCharts() { const gameID = document.getElementById('game-id').getAttribute('data-game-id'); const response = await fetch(`/games/${gameID}/goals`, { method: "GET", }); const goals = await response.json(); console.log(goals); + + const rallyLengths = goals.map((goal) => goal.rally_length); + const ballSpeeds = goals.map((goal) => goal.ball_speed); + + fillHeatmap(rallyLengths, ballSpeeds); + applyGradientToHeatmap(); const user1ID = document.getElementById('game-id').getAttribute('data-user-1'); const user2ID = document.getElementById('game-id').getAttribute('data-user-2'); @@ -145,6 +162,6 @@ async function loadDoubleLineChart() { chart.render(); } -loadDoubleLineChart(); +loadCharts(); From 35d5ff2548b230c9757a527b567ab9c1b866f37a Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Wed, 16 Oct 2024 00:07:34 +0100 Subject: [PATCH 39/74] Code: working around the bar line chart. --- backend/pong/templates/pages/view_profile.html | 2 +- backend/static/js/edit-profile.js | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/backend/pong/templates/pages/view_profile.html b/backend/pong/templates/pages/view_profile.html index 3e8bfb2..a0038f5 100755 --- a/backend/pong/templates/pages/view_profile.html +++ b/backend/pong/templates/pages/view_profile.html @@ -323,7 +323,7 @@
Quickest Game
01/01/1111
-
{{ stats.longest_game }}
+
{{ stats.quickest_game }}
diff --git a/backend/static/js/edit-profile.js b/backend/static/js/edit-profile.js index dbf5e72..4a298f2 100755 --- a/backend/static/js/edit-profile.js +++ b/backend/static/js/edit-profile.js @@ -163,8 +163,18 @@ async function loadBarLineChart() { const stats = await response.json(); console.log(stats); - const winRates = stats.map((x) => x.win_rate); - const totalGames = stats.map((x) => x.total_games); + const tempRates = stats.map((x) => x.win_rate); + const tempTotalGames = stats.map((x) => x.total_games); + const winRates = new Array(7).fill(0); + const totalGames = new Array(7).fill(0); + + console.log(tempRates); + console.log(tempTotalGames); + tempRates.forEach((rate, i) => { + winRates[i] = rate}); + tempTotalGames.forEach((games, i) => totalGames[i] = games); + + console.log(winRates, totalGames); var options = { chart: { From be8ef4b5990006cbc79bb089f797fb00409145cd Mon Sep 17 00:00:00 2001 From: Andreia Campos Date: Wed, 16 Oct 2024 17:25:26 +0100 Subject: [PATCH 40/74] issue 41 solved --- .env | 4 ++-- backend/pong/templates/pages/ongoing-tourn.html | 2 +- backend/pong/views.py | 7 +++++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.env b/.env index a736a5e..74c59cb 100644 --- a/.env +++ b/.env @@ -1,10 +1,10 @@ TOKEN_URL='https://api.intra.42.fr/oauth/token' USER_INFO_URL='https://api.intra.42.fr/v2/me' CLIENT_ID='u-s4t2ud-b82e9fe438563f339a906cd3bc30001cbb1785649c08b26fca0e4c1e2e7eddab' -CLIENT_SECRET='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' +CLIENT_SECRET='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' REDIRECT_URI='http://localhost:8002/home42/' POSTGRES_USER="anaraujo" POSTGRES_PASSWORD="1234" PGADMIN_DEFAULT_EMAIL="admin@email.com" PGADMIN_DEFAULT_PASSWORD="1234" -PGADMIN_LISTEN_PORT="8080" \ No newline at end of file +PGADMIN_LISTEN_PORT="8080" diff --git a/backend/pong/templates/pages/ongoing-tourn.html b/backend/pong/templates/pages/ongoing-tourn.html index 58a8353..4f70862 100644 --- a/backend/pong/templates/pages/ongoing-tourn.html +++ b/backend/pong/templates/pages/ongoing-tourn.html @@ -8,7 +8,7 @@
-

{{ tournament_name }} Name

+

{{ tournament_name }}

Waiting for players to enter...

{% if tournament_size == 4 %} @@ -61,11 +50,15 @@

Leaderb

Group A

- Player 1 - Player 1 + {% if "http" in tour_games.0.game_id.user1_id.picture.url %} + Player 1 + {% else %} + Player 1 + {% endif %} + {{ tour_games.0.game_id.user1_id.username }}
- 0 + {{ tour_games.0.game_id.nb_goals_user1 }}
@@ -74,11 +67,15 @@

Group A

- Player 2 - Player 2 + {% if "http" in tour_games.0.game_id.user2_id.picture.url %} + Player 2 + {% else %} + Player 2 + {% endif %} + {{ tour_games.0.game_id.user2_id.username }}
- 0 + {{ tour_games.0.game_id.nb_goals_user2 }}
@@ -87,11 +84,15 @@

Group A

Group B

- Player 3 - Player 3 + {% if "http" in tour_games.1.game_id.user1_id.picture.url %} + Player 3 + {% else %} + Player 3 + {% endif %} + {{ tour_games.1.game_id.user1_id.username }}
- 0 + {{ tour_games.1.game_id.nb_goals_user1 }}
@@ -100,12 +101,15 @@

Group B

- - Player 4 - Player 4 + {% if "http" in tour_games.1.game_id.user2_id.picture.url %} + Player 4 + {% else %} + Player 4 + {% endif %} + {{ tour_games.1.game_id.user2_id.username }}
- 0 + {{ tour_games.1.game_id.nb_goals_user2 }}
@@ -115,14 +119,15 @@

Group B

- - - Semi 1 - - Group A Winner + {% if "http" in tour_games.2.game_id.user1_id.picture.url %} + Semi 1 + {% else %} + Semi 1 + {% endif %} + {{ tour_games.2.game_id.user1_id.username }}
- 0 + {{ tour_games.2.game_id.nb_goals_user1 }}
@@ -131,14 +136,15 @@

Group B

- - - Semi 2 - - Group B Winner + {% if "http" in tour_games.2.game_id.user2_id.picture.url %} + Semi 2 + {% else %} + Semi 2 + {% endif %} + {{ tour_games.2.game_id.user2_id.username }}
- 0 + {{ tour_games.2.game_id.nb_goals_user2 }}
@@ -148,11 +154,12 @@

Group B

- - - Final Winner - - Tournament Winner + {% if "http" in tour_games.2.game_id.winner_id.picture.url %} + Final Winner + {% else %} + Final Winner + {% endif %} + {{ tour_games.2.game_id.winner_id.username }}
Final Winner @@ -171,11 +178,15 @@

Group B

Group A

- Player 1 - Player 1 + {% if "http" in tour_games.0.game_id.user1_id.picture.url %} + Player 1 + {% else %} + Player 1 + {% endif %} + {{ tour_games.0.game_id.user1_id.username }}
- 0 + {{ tour_games.0.game_id.nb_goals_user1 }}
@@ -184,11 +195,15 @@

Group A

- Player 2 - Player 2 + {% if "http" in tour_games.0.game_id.user2_id.picture.url %} + Player 2 + {% else %} + Player 2 + {% endif %} + {{ tour_games.0.game_id.user2_id.username }}
- 0 + {{ tour_games.0.game_id.nb_goals_user2 }}
@@ -197,11 +212,15 @@

Group A

Group B

- Player 3 - Player 3 + {% if "http" in tour_games.1.game_id.user1_id.picture.url %} + Player 3 + {% else %} + Player 3 + {% endif %} + {{ tour_games.1.game_id.user1_id.username }}
- 0 + {{ tour_games.1.game_id.nb_goals_user1 }}
@@ -210,12 +229,15 @@

Group B

- - Player 4 - Player 4 + {% if "http" in tour_games.1.game_id.user2_id.picture.url %} + Player 4 + {% else %} + Player 4 + {% endif %} + {{ tour_games.1.game_id.user2_id.username }}
- 0 + {{ tour_games.1.game_id.nb_goals_user2 }}
@@ -225,14 +247,15 @@

Group B

- - - Semi 1 - - Group A Winner + {% if "http" in tour_games.4.game_id.user1_id.picture.url %} + Semi 1 + {% else %} + Semi 1 + {% endif %} + {{ tour_games.4.game_id.user1_id.username }}
- 0 + {{ tour_games.4.game_id.nb_goals_user1 }}
@@ -241,14 +264,15 @@

Group B

- - - Semi 2 - - Group B Winner + {% if "http" in tour_games.4.game_id.user2_id.picture.url %} + Semi 2 + {% else %} + Semi 2 + {% endif %} + {{ tour_games.4.game_id.user2_id.username }}
- 0 + {{ tour_games.4.game_id.nb_goals_user2 }}
@@ -258,14 +282,15 @@

Group B

- - - Final Winner - - Semi Finals Winner + {% if "http" in tour_games.6.game_id.user1_id.picture.url %} + Player 6 + {% else %} + Player 6 + {% endif %} + {{ tour_games.6.game_id.user1_id.username }}
- 0 + {{ tour_games.6.game_id.nb_goals_user1 }}
@@ -278,11 +303,12 @@

Group B

- - - Final Winner - - Tournament Winner + {% if "http" in tour_games.6.game_id.winner_id.picture.url %} + Player 6 + {% else %} + Player 6 + {% endif %} + {{ tour_games.6.game_id.winner_id.username }}
Final Winner @@ -298,11 +324,15 @@

Group B

Group C

- Player 1 - Player 5 + {% if "http" in tour_games.2.game_id.user1_id.picture.url %} + Player 5 + {% else %} + Player 5 + {% endif %} + {{ tour_games.2.game_id.user1_id.username }}
- 0 + {{ tour_games.2.game_id.nb_goals_user1 }}
@@ -310,12 +340,16 @@

Group C

-
- Player 2 - Player 6 +
+ {% if "http" in tour_games.2.game_id.user2_id.picture.url %} + Player 6 + {% else %} + Player 6 + {% endif %} + {{ tour_games.2.game_id.user2_id.username }}
- 0 + {{ tour_games.2.game_id.nb_goals_user2 }}
@@ -324,11 +358,15 @@

Group C

Group D

- Player 3 - Player 7 + {% if "http" in tour_games.3.game_id.user1_id.picture.url %} + Player 7 + {% else %} + Player 7 + {% endif %} + {{ tour_games.3.game_id.user1_id.username }}
- 0 + {{ tour_games.3.game_id.nb_goals_user1 }}
@@ -337,12 +375,15 @@

Group D

- - Player 4 - Player 8 + {% if "http" in tour_games.3.game_id.user2_id.picture.url %} + Player 8 + {% else %} + Player 8 + {% endif %} + {{ tour_games.3.game_id.user2_id.username }}
- 0 + {{ tour_games.3.game_id.nb_goals_user2 }}
@@ -352,14 +393,15 @@

Group D

- - - Semi 1 - - Group C Winner + {% if "http" in tour_games.5.game_id.user1_id.picture.url %} + Semi 1 + {% else %} + Semi 1 + {% endif %} + {{ tour_games.5.game_id.user1_id.username }}
- 0 + {{ tour_games.5.game_id.nb_goals_user1 }}
@@ -368,14 +410,15 @@

Group D

- - - Semi 2 - - Group D Winner + {% if "http" in tour_games.5.game_id.user2_id.picture.url %} + Semi 2 + {% else %} + Semi 2 + {% endif %} + {{ tour_games.5.game_id.user2_id.username }}
- 0 + {{ tour_games.5.game_id.nb_goals_user2 }}
@@ -385,14 +428,15 @@

Group D

- - - Final Winner - - Semi Finals Winner + {% if "http" in tour_games.6.game_id.user2_id.picture.url %} + Final 2 + {% else %} + Final 2 + {% endif %} + {{ tour_games.6.game_id.user2_id.username }}
- 0 + {{ tour_games.6.game_id.nb_goals_user2 }}
diff --git a/backend/pong/views.py b/backend/pong/views.py index e057aaa..19e218b 100644 --- a/backend/pong/views.py +++ b/backend/pong/views.py @@ -1118,17 +1118,23 @@ def home(request): @login_required def gamelocal(request): + user_id = request.user.id + friends = Friends.objects.filter(Q(user1_id=user_id) | Q(user2_id=user_id)) user_id = request.user.id context = { + 'friends': friends, 'user_id': user_id, } return render(request,'pages/gamelocal.html', context) @login_required def gameonline(request): + user_id = request.user.id + friends = Friends.objects.filter(Q(user1_id=user_id) | Q(user2_id=user_id)) user_id = request.user.id context = { 'user_id': user_id, + 'friends': friends, } return render(request,'pages/gameonline.html', context) @@ -1167,10 +1173,12 @@ def tournaments(request): @login_required def ongoingtournaments(request, tournament_id): - tournament = Tournaments.objects.get(pk=tournament_id) user_id = request.user.id + friends = Friends.objects.filter(Q(user1_id=user_id) | Q(user2_id=user_id)) + tournament = Tournaments.objects.get(pk=tournament_id) context = { 'user_id': user_id, + 'friends': friends, 'tournament_id': tournament_id, 'tournament_size': tournament.capacity, 'tournament_name': tournament.name @@ -1179,21 +1187,33 @@ def ongoingtournaments(request, tournament_id): @login_required def tournamentstats(request, tournament_id): + user_id = request.user.id + friends = Friends.objects.filter(Q(user1_id=user_id) | Q(user2_id=user_id)) tournament = Tournaments.objects.get(pk=tournament_id) + tour_users = TournamentsUsers.objects.filter(tournament_id=tournament_id).order_by('placement') + tour_games = TournamentsGames.objects.filter(tournament_id=tournament_id).order_by('pk') context = { + 'friends': friends, 'tournament_id': tournament_id, - 'tournament_size': tournament.capacity + 'tournament_size': tournament.capacity, + 'tournament_name': tournament.name, + 'tour_users': tour_users, + 'tour_games': tour_games } + ic(context) return render(request,'pages/tournament_overview.html', context) @login_required def gamestats(request, game_id): + user_id = request.user.id + friends = Friends.objects.filter(Q(user1_id=user_id) | Q(user2_id=user_id)) stats = game_stats(request, game_id) data_stats = json.loads(stats.content) goals = game_goals(request, game_id) data_goals = json.loads(goals.content) game = json.loads(get_game(request, game_id).content)['data'] context = { + 'friends': friends, 'game': game, 'game_id': game_id, 'stats': data_stats, From 1fd8a9334e9e72461ce2ed3a3c266ee3b0c6b810 Mon Sep 17 00:00:00 2001 From: Andreia Campos Date: Wed, 16 Oct 2024 19:46:16 +0100 Subject: [PATCH 43/74] Add user id in the views --- backend/pong/views.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/backend/pong/views.py b/backend/pong/views.py index 19e218b..53a092d 100644 --- a/backend/pong/views.py +++ b/backend/pong/views.py @@ -197,12 +197,16 @@ def search_suggestions(request): @csrf_exempt def search_users(request): + user_id = request.user.id + friends = Friends.objects.filter(Q(user1_id=user_id) | Q(user2_id=user_id)) term = request.GET.get('searched', '') userss = Users.objects.filter(username__icontains=term) return render(request, 'pages/search_users.html', { 'searched': term, 'userss': userss, 'numbers': userss.count(), + 'friends': friends, + 'user_id': user_id }) #! --------------------------------------- Friends --------------------------------------- @@ -1198,7 +1202,8 @@ def tournamentstats(request, tournament_id): 'tournament_size': tournament.capacity, 'tournament_name': tournament.name, 'tour_users': tour_users, - 'tour_games': tour_games + 'tour_games': tour_games, + 'user_id': user_id } ic(context) return render(request,'pages/tournament_overview.html', context) @@ -1217,7 +1222,8 @@ def gamestats(request, game_id): 'game': game, 'game_id': game_id, 'stats': data_stats, - 'goals': data_goals + 'goals': data_goals, + 'user_id': user_id } ic(context) return render(request,'pages/game_stats.html', context) @@ -1253,9 +1259,9 @@ def profile(request, id): stats_response = user_stats(request, user_profile.id) stats = json.loads(stats_response.content) if stats['nb_goals_suffered'] != 0: - goals_sored_suffered_ratio = stats['nb_goals_scored'] / stats['nb_goals_suffered'] + goals_scored_suffered_ratio = stats['nb_goals_scored'] / stats['nb_goals_suffered'] else: - goals_sored_suffered_ratio = 0 + goals_scored_suffered_ratio = 0 graph = win_rate_nb_games_day(request, user_profile.id) graph_send = json.loads(graph.content) context = { @@ -1271,7 +1277,7 @@ def profile(request, id): 'games': games, 'tours': user_tournaments, 'stats': stats, - 'goals_scored_suffered_ratio': goals_sored_suffered_ratio, + 'goals_scored_suffered_ratio': goals_scored_suffered_ratio, 'graph': graph_send, 'page': 'profile' if is_own_profile else 'else' } From 1a186f5246d3944138ff63b9513ed8c76decd262 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Wed, 16 Oct 2024 21:07:27 +0100 Subject: [PATCH 44/74] Code: re-uploading lost changes from master. --- backend/pong/templates/pages/view_profile.html | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/backend/pong/templates/pages/view_profile.html b/backend/pong/templates/pages/view_profile.html index 5ce953d..5663690 100755 --- a/backend/pong/templates/pages/view_profile.html +++ b/backend/pong/templates/pages/view_profile.html @@ -370,8 +370,8 @@
{{ stats.quickest_game }}
{{ game.nb_goals_user2 }} - {{ game.nb_goals_user1 }} {% endif %}
- {% if game.type is not "Local" %} - {% if user_view == game.user2_id %} + {% if user_view == game.user2_id %} + {% if game.user1_id != NULL %} {{ stats.quickest_game }} {{ game.user1_id.username }} {% else %} + Profile + Anonymous + {% endif %} + {% else %} + {% if game.user2_id != NULL %} {{ stats.quickest_game }} {% endif %} {{ game.user2_id.username }} + {% else %} + Profile + Anonymous {% endif %} {% endif %} +
From 476a360759e08c855cd2cf6b20a9883867bbce30 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Wed, 16 Oct 2024 21:23:32 +0100 Subject: [PATCH 45/74] Code: adding a temporary 10th goal to handle the double update game bug. --- backend/pong/templates/pages/game_stats.html | 8 ++++++++ .../pong/templates/pages/view_profile.html | 20 ++++++++++++++----- backend/pong/views.py | 4 +++- backend/static/js/game-stats.js | 5 ++++- backend/static/js/game/GameStats.js | 4 ++-- 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/backend/pong/templates/pages/game_stats.html b/backend/pong/templates/pages/game_stats.html index 96cc422..5efa31e 100644 --- a/backend/pong/templates/pages/game_stats.html +++ b/backend/pong/templates/pages/game_stats.html @@ -77,6 +77,10 @@
Rally Length per Goal
9
+
+
+ 10 +
@@ -137,6 +141,10 @@
Ball Speed per Goal
9
+
+
+ 10 +
diff --git a/backend/pong/templates/pages/view_profile.html b/backend/pong/templates/pages/view_profile.html index 5663690..7b5be14 100755 --- a/backend/pong/templates/pages/view_profile.html +++ b/backend/pong/templates/pages/view_profile.html @@ -341,10 +341,20 @@
{{ stats.quickest_game }}
{% for game in games %}
- + {% if game.type != "Local" %} + +
+ {% if game.type == 'AI' %} + Pingpong Icon + {% else %} + Pingpong Icon + {% endif %} +
+
+ {% else %}
{% if game.type == 'AI' %} Pingpong Icon @@ -352,7 +362,7 @@
{{ stats.quickest_game }}
Pingpong Icon {% endif %}
- + {% endif %}
{{ game.created_at }}
{{ game.created_at }}
diff --git a/backend/pong/views.py b/backend/pong/views.py index 8ec3828..a299084 100644 --- a/backend/pong/views.py +++ b/backend/pong/views.py @@ -601,9 +601,11 @@ def game_update(request, game_id): game.winner_id = player2 game.save() + ic(data) + if game.type != "Local": - user_stats_update(player2.id, game_id, data) user_stats_update(player1.id, game_id, data) + user_stats_update(player2.id, game_id, data) game_stats_create(game_id, data) game_goals_create(game_id, data) diff --git a/backend/static/js/game-stats.js b/backend/static/js/game-stats.js index 3897df3..0d44ff5 100644 --- a/backend/static/js/game-stats.js +++ b/backend/static/js/game-stats.js @@ -45,7 +45,10 @@ function fillHeatmap(rallyLengths, ballSpeeds){ console.log(rallyLengths, ballSpeeds); - rallyLengths.forEach((rally, i) => rallyLengthLabels[i].textContent = rally); + rallyLengths.forEach((rally, i) => { + console.log(rally, i); + rallyLengthLabels[i].textContent = rally + }); ballSpeeds.forEach((speed, i) => ballSpeedLabels[i].textContent = speed); } diff --git a/backend/static/js/game/GameStats.js b/backend/static/js/game/GameStats.js index e4d6ee5..8b8fef9 100644 --- a/backend/static/js/game/GameStats.js +++ b/backend/static/js/game/GameStats.js @@ -6,7 +6,7 @@ /* By: ncarvalh +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/30 18:34:16 by ncarvalh #+# #+# */ -/* Updated: 2024/10/16 20:50:40 by ncarvalh ### ########.fr */ +/* Updated: 2024/10/16 21:19:36 by ncarvalh ### ########.fr */ /* */ /* ************************************************************************** */ @@ -46,7 +46,7 @@ export class GameStats { 'timestamp': new Date().toISOString(), 'user': scorer.id, 'rally_length': ball.rally, - 'ball_speed': Math.abs(ball.speed.x), + 'ball_speed': Math.round(ball.speed.x), }; this.score[scorer.username] += 1; this.goals.push(goal); From 3e243625aad4eb1900c80a59e272e7ed9aa48e21 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Wed, 16 Oct 2024 22:02:14 +0100 Subject: [PATCH 46/74] Fix: Stats show the correct value in the user profile for other users --- backend/pong/templates/pages/view_profile.html | 4 ++-- backend/pong/views.py | 2 +- backend/static/js/edit-profile.js | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/pong/templates/pages/view_profile.html b/backend/pong/templates/pages/view_profile.html index 7b5be14..feaeb1c 100755 --- a/backend/pong/templates/pages/view_profile.html +++ b/backend/pong/templates/pages/view_profile.html @@ -12,7 +12,7 @@ -
+
{{ stats.max_rally_length }}
@@ -310,7 +310,7 @@
{{ stats.max_rally_length }}
Max Speed
Longest Game
-
01/01/1111
+
{{ stats.date_longest_game }}
{{ stats.longest_game }}
@@ -320,7 +320,7 @@
{{ stats.longest_game }}
Max Speed
Quickest Game
-
01/01/1111
+
{{ stats.date_quickest_game }}
{{ stats.quickest_game }}
@@ -364,15 +364,15 @@
{{ stats.quickest_game }}
{% endif %}
- {{ game.created_at }} +
{{ game.created_at }}
{{ game.created_at }}
{{ game.duration }} {% if user_view == game.winner_id %} - Victory + VICTORY {% else %} - Defeat + DEFEAT {% endif %} {% if user_view == game.user1_id %} {{ game.nb_goals_user1 }} - {{ game.nb_goals_user2 }} diff --git a/backend/pong/views.py b/backend/pong/views.py index c36b87f..5a7992c 100644 --- a/backend/pong/views.py +++ b/backend/pong/views.py @@ -399,12 +399,16 @@ def user_stats_update(user_id, game_id, data): if data['game_stats']['max_ball_speed'] > stats.max_ball_speed: stats.max_ball_speed = data['game_stats']['max_ball_speed'] + stats.date_max_ball_speed = game.created_at if data['game_stats']['longer_rally'] > stats.max_rally_length: stats.max_rally_length = data['game_stats']['longer_rally'] + stats.date_max_rally_length = game.created_at if data['duration'] < stats.quickest_game : stats.quickest_game = data['duration'] + stats.date_quickest_game = game.created_at if data['duration'] > stats.longest_game: stats.longest_game = data['duration'] + stats.date_longest_game = game.created_at stats.save() data_stats = UserStatsSerializer(stats) return JsonResponse({'message': 'User stats updated successfully', 'data': data_stats.data}, status=200) @@ -1276,7 +1280,7 @@ def profile(request, id): stats_response = user_stats(request, user_profile.id) stats = json.loads(stats_response.content) if stats['nb_goals_suffered'] != 0: - goals_scored_suffered_ratio = stats['nb_goals_scored'] / stats['nb_goals_suffered'] + goals_scored_suffered_ratio = round(stats['nb_goals_scored'] / stats['nb_goals_suffered'], 2) else: goals_scored_suffered_ratio = 0 graph = win_rate_nb_games_day(request, user_profile.id) diff --git a/backend/static/js/tab-recent-matches.js b/backend/static/js/tab-recent-matches.js index 309e90c..73cf644 100644 --- a/backend/static/js/tab-recent-matches.js +++ b/backend/static/js/tab-recent-matches.js @@ -6,6 +6,7 @@ function onProfileClick() { document.getElementById("tab-profile").classList.add("active"); document.getElementById("tab-games").classList.remove("active"); } + function onGamesClick() { document.getElementById("games").style.display = "block"; document.getElementById("tournaments").style.display = "none"; @@ -24,126 +25,156 @@ function onTournamentsClick() { document.getElementById("tab-profile").classList.remove("active"); } -function formatTimestamp_day(timestamp) { - const date = new Date(timestamp); - - // Array with the abbreviated month names - const monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; - // Get the day, month, year, hours, minutes, and seconds from the date object - const day = String(date.getUTCDate()).padStart(2, '0'); - const month = monthNames[date.getUTCMonth()]; - const year = date.getUTCFullYear(); +function parseCustomDate(dateString) { + // Expressão regular para capturar a data e hora + const datePattern = /([A-Za-z]+)\.\s(\d{1,2}),\s(\d{4}),\s(\d{1,2}):(\d{2})\s([a|p]\.m\.)/; + const match = dateString.match(datePattern); - // Format the result as dd, mmm yyyy hh:mm:ss - return `${day}, ${month}. ${year}`; -} + if (!match) { + console.error("Formato de data inválido:", dateString); + return null; + } -// Function to convert the content of the div -function convertDateInDiv1(div_class) { - // Get the div element by its ID - const dateDivs = document.querySelectorAll(div_class); + const monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + const monthString = match[1].replace(".", "").trim(); // Remove o ponto e espaços + const month = monthNames.indexOf(monthString); + console.log("Month ",month) + const day = parseInt(match[2], 10); + const year = parseInt(match[3], 10); + let hours = parseInt(match[4], 10); + const minutes = parseInt(match[5], 10); + const period = match[6]; // "a.m." ou "p.m." + + // Converte para o formato 24 horas + if (period === "p.m." && hours < 12) { + hours += 12; + } else if (period === "a.m." && hours === 12) { + hours = 0; + } - // Loop through each div and convert its content - dateDivs.forEach(div => { - const isoTimestamp = div.textContent; // Get the ISO date string from the div - const formattedDate = formatTimestamp_day(isoTimestamp); // Format the date - div.textContent = formattedDate; // Set the formatted date back into the div - }); + // Retorna um objeto Date válido + return new Date(Date.UTC(year, month, day, hours, minutes)); } -function formatTimestamp_second(timestamp) { - const date = new Date(timestamp); - const monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; +// Formatar data com dia +function formatTimestamp_day(timestamp) { + console.log("aqui2", timestamp) + const date = parseCustomDate(timestamp); // Usar a função de parsing + console.log("aqui", date) + if (!date) return "Invalid date"; // Verifica se o parsing falhou - // Get the day, month, year, hours, minutes, and seconds from the date object + const monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; const day = String(date.getUTCDate()).padStart(2, '0'); const month = monthNames[date.getUTCMonth()]; const year = date.getUTCFullYear(); + return `${day}, ${month}. ${year}`; +} + +// Formatar timestamp com segundos +function formatTimestamp_second(timestamp) { + const date = parseCustomDate(timestamp); // Usar a função de parsing + if (!date) return "Invalid time"; // Verifica se o parsing falhou + const hours = String(date.getUTCHours()).padStart(2, '0'); const minutes = String(date.getUTCMinutes()).padStart(2, '0'); const seconds = String(date.getUTCSeconds()).padStart(2, '0'); - - // Format the result as dd, mmm yyyy hh:mm:ss return `${hours}:${minutes}:${seconds}`; } -// Function to convert the content of the div -function convertDateInDiv2(div_class) { - // Get the div element by its ID + +// Converter datas no div +function convertDateInDiv1(div_class) { const dateDivs = document.querySelectorAll(div_class); + dateDivs.forEach(div => { + const isoTimestamp = div.textContent; + const formattedDate = formatTimestamp_day(isoTimestamp); + div.textContent = formattedDate; + }); +} + - // Loop through each div and convert its content +// Converter datas no div +function convertDateInDiv2(div_class) { + const dateDivs = document.querySelectorAll(div_class); dateDivs.forEach(div => { - const isoTimestamp = div.textContent; // Get the ISO date string from the div - const formattedDate = formatTimestamp_second(isoTimestamp); // Format the date - div.textContent = formattedDate; // Set the formatted date back into the div + const isoTimestamp = div.textContent; + const formattedDate = formatTimestamp_second(isoTimestamp); + div.textContent = formattedDate; }); } -// Call the function to convert the date before displaying it -convertDateInDiv1(".date-day"); -convertDateInDiv2(".date-second"); -function placement_func(placement) { - p = parseInt(placement) + +function placement_func(placement) { + p = parseInt(placement); if (p == 1) { - return `1st PLACE` + return `1st PLACE`; } else if (p == 2) { - return `2nd PLACE` + return `2nd PLACE`; } else if (p == 3) { - return `3rd PLACE` + return `3rd PLACE`; } else { - return `${p}th PLACE` + return `${p}th PLACE`; } } +// Converter colocações function convertPlacement() { - // Get the div element by its ID const place = document.querySelectorAll(".placement"); - - // Loop through each div and convert its content place.forEach(div => { - const placement = div.textContent; // Get the ISO date string from the div + const placement = div.textContent; if (parseInt(placement) == 1) { div.classList.add("victory"); - }; - const formatted = placement_func(placement); // Format the date - div.textContent = formatted; // Set the formatted date back into the div + } + const formatted = placement_func(placement); + div.textContent = formatted; }); } -convertPlacement(); - +// Calcular a diferença de tempo function calculateTimeDifference(duration) { - // Convert both timestamps to milliseconds - - // Convert milliseconds to total seconds - let totalSeconds = Math.floor(parseInt(duration)/ 1000); - - // Calculate minutes and remaining seconds + let totalSeconds = Math.floor(parseInt(duration)); const minutes = Math.floor(totalSeconds / 60); const seconds = totalSeconds % 60; - - // Pad the seconds with a leading zero if less than 10 const formattedSeconds = String(seconds).padStart(2, '0'); - - // Return the formatted time in mm:ss format return `${minutes}:${formattedSeconds} min`; } +// Converter duração function convertduration() { - // Get the div element by its ID - const place = document.querySelectorAll(".duration"); + const places = document.querySelectorAll(".duration"); + places.forEach(div => { + const duration = div.textContent; + const formatted = calculateTimeDifference(duration); + div.textContent = formatted; + }); +} - // Loop through each div and convert its content - place.forEach(div => { - const duration = div.textContent; // Get the ISO date string from the div - const formatted = calculateTimeDifference(duration); // Format the date - div.textContent = formatted; // Set the formatted date back into the div +// Adicionar ouvintes de eventos aos tabs +const gamesTab = document.getElementById('tab-games'); +if (gamesTab) { + gamesTab.addEventListener('click', function() { + onGamesClick(); // Muda para jogos + convertduration(); // Converte durações + convertDateInDiv1(".date-day"); // Converte datas + convertDateInDiv2(".date-second"); // Converte datas + }); +} + +const tournamentsTab = document.getElementById('tab-tournaments'); +if (tournamentsTab) { + tournamentsTab.addEventListener('click', function() { + onTournamentsClick(); // Muda para torneios + convertPlacement(); // Converte colocações }); } -convertduration(); \ No newline at end of file +const profileTab = document.getElementById('tab-profile'); +if (profileTab) { + profileTab.addEventListener('click', function() { + onProfileClick(); // Muda para perfil + }); +} From fd97af91f67fd70cfc925e21c4e8c54594b16b24 Mon Sep 17 00:00:00 2001 From: andreiacampos98 Date: Thu, 17 Oct 2024 22:38:05 +0100 Subject: [PATCH 48/74] added the url to game stats but I need to save the stats --- backend/static/js/tab-recent-matches.js | 99 ++++++++++++++++++- backend/static/js/view-details-tournaments.js | 8 +- 2 files changed, 104 insertions(+), 3 deletions(-) diff --git a/backend/static/js/tab-recent-matches.js b/backend/static/js/tab-recent-matches.js index 73cf644..f053206 100644 --- a/backend/static/js/tab-recent-matches.js +++ b/backend/static/js/tab-recent-matches.js @@ -25,8 +25,7 @@ function onTournamentsClick() { document.getElementById("tab-profile").classList.remove("active"); } - -function parseCustomDate(dateString) { +/*function parseCustomDate(dateString) { // Expressão regular para capturar a data e hora const datePattern = /([A-Za-z]+)\.\s(\d{1,2}),\s(\d{4}),\s(\d{1,2}):(\d{2})\s([a|p]\.m\.)/; const match = dateString.match(datePattern); @@ -105,6 +104,98 @@ function convertDateInDiv2(div_class) { }); } + */ + + +function parseCustomDate(dateString) { + // Expressão regular para capturar a data e hora + const datePattern = /([A-Za-z]+)\.\s(\d{1,2}),\s(\d{4}),\s(\d{1,2}):(\d{2})\s([a|p]\.m\.)/; + const match = dateString.match(datePattern); + + if (!match) { + console.error("Formato de data inválido:", dateString); + return null; + } + + const monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + const monthString = match[1].replace(".", "").trim(); // Remove o ponto e espaços + const month = monthNames.indexOf(monthString); + console.log("Month ",month) + const day = parseInt(match[2], 10); + const year = parseInt(match[3], 10); + let hours = parseInt(match[4], 10); + const minutes = parseInt(match[5], 10); + const period = match[6]; // "a.m." ou "p.m." + + // Converte para o formato 24 horas + if (period === "p.m." && hours < 12) { + hours += 12; + } else if (period === "a.m." && hours === 12) { + hours = 0; + } + + // Retorna um objeto Date válido + return new Date(Date.UTC(year, month, day, hours, minutes)); +} + + +function formatTimestamp_day(timestamp) { + const date = new Date(timestamp); + + // Array with the abbreviated month names + const monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + + // Get the day, month, year, hours, minutes, and seconds from the date object + const day = String(date.getUTCDate()).padStart(2, '0'); + const month = monthNames[date.getUTCMonth()]; + const year = date.getUTCFullYear(); + + // Format the result as dd, mmm yyyy hh:mm:ss + return `${day}, ${month}. ${year}`; +} + +// Function to convert the content of the div +function convertDateInDiv1(div_class) { + // Get the div element by its ID + const dateDivs = document.querySelectorAll(div_class); + + // Loop through each div and convert its content + dateDivs.forEach(div => { + const isoTimestamp = div.textContent; // Get the ISO date string from the div + const formattedDate = formatTimestamp_day(isoTimestamp); // Format the date + div.textContent = formattedDate; // Set the formatted date back into the div + }); +} + +function formatTimestamp_second(timestamp) { + const date = new Date(timestamp); + + const monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + + // Get the day, month, year, hours, minutes, and seconds from the date object + const day = String(date.getUTCDate()).padStart(2, '0'); + const month = monthNames[date.getUTCMonth()]; + const year = date.getUTCFullYear(); + const hours = String(date.getUTCHours()).padStart(2, '0'); + const minutes = String(date.getUTCMinutes()).padStart(2, '0'); + const seconds = String(date.getUTCSeconds()).padStart(2, '0'); + + // Format the result as dd, mmm yyyy hh:mm:ss + return `${hours}:${minutes}:${seconds}`; +} + +// Function to convert the content of the div +function convertDateInDiv2(div_class) { + // Get the div element by its ID + const dateDivs = document.querySelectorAll(div_class); + + // Loop through each div and convert its content + dateDivs.forEach(div => { + const isoTimestamp = div.textContent; // Get the ISO date string from the div + const formattedDate = formatTimestamp_second(isoTimestamp); // Format the date + div.textContent = formattedDate; // Set the formatted date back into the div + }); +} @@ -169,6 +260,9 @@ if (tournamentsTab) { tournamentsTab.addEventListener('click', function() { onTournamentsClick(); // Muda para torneios convertPlacement(); // Converte colocações + convertduration(); // Converte durações + convertDateInDiv1(".date-day"); // Converte datas + convertDateInDiv2(".date-second"); // Converte datas }); } @@ -176,5 +270,6 @@ const profileTab = document.getElementById('tab-profile'); if (profileTab) { profileTab.addEventListener('click', function() { onProfileClick(); // Muda para perfil + }); } diff --git a/backend/static/js/view-details-tournaments.js b/backend/static/js/view-details-tournaments.js index df9ea8d..ee26861 100644 --- a/backend/static/js/view-details-tournaments.js +++ b/backend/static/js/view-details-tournaments.js @@ -99,6 +99,10 @@ function detailTournamentGames(button) { } + const gameDetailLink = document.createElement('a'); + gameDetailLink.href = `/games/${game.game.id}/stats`; + gameDetailLink.classList.add('game-link'); + gameBlock.innerHTML = `
@@ -111,7 +115,9 @@ function detailTournamentGames(button) {
`; - gameList.appendChild(gameBlock); + gameDetailLink.appendChild(gameBlock); + + gameList.appendChild(gameDetailLink); }); detailsDiv.style.display = 'flex'; imgElement.src = "/static/assets/icons/return.png"; From efa59d72bbc18273e0dd6254572031c0ddc104d0 Mon Sep 17 00:00:00 2001 From: andreiacampos98 Date: Fri, 18 Oct 2024 19:33:33 +0100 Subject: [PATCH 49/74] Add stats in the games of tournaments --- backend/pong/views.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/backend/pong/views.py b/backend/pong/views.py index 5a7992c..afdc457 100644 --- a/backend/pong/views.py +++ b/backend/pong/views.py @@ -945,6 +945,8 @@ def tournament_update_game(request, tournament_id, game_id): user_id=tour_game.game_id.user2_id.id, tournament_id=tournament_id ) + user1 = Users.objects.get(pk=tour_game.game_id.user1_id.id) + user2 = Users.objects.get(pk=tour_game.game_id.user2_id.id) player1.score += data['nb_goals_user1'] * 100 player1.save() @@ -967,6 +969,7 @@ def tournament_update_game(request, tournament_id, game_id): for match in curr_phase_matches: if match.game_id.winner_id is not None: finished_matches += 1 + if finished_matches == total_phase_matches[curr_phase] and curr_phase != 'Final': return advance_tournament_phase(curr_phase, tournament_id) @@ -974,8 +977,18 @@ def tournament_update_game(request, tournament_id, game_id): tournament = Tournaments.objects.filter(id=tournament_id).first() tournament.duration = datetime.timestamp(datetime.now())- tournament.created_at.timestamp() tournament.save() + user_stats_update(user2.id, game_id, data) + user_stats_update(user1.id, game_id, data) + game_stats_create(game_id, data) + game_goals_create(game_id, data) return calculate_placements(tournament_id) + + user_stats_update(user2.id, game_id, data) + user_stats_update(user1.id, game_id, data) + game_stats_create(game_id, data) + game_goals_create(game_id, data) + data = TournamentsGamesSerializer(tour_game).data data['game'] = GamesSerializer(tour_game.game_id).data From d3f005eb788c4e3d8a84e7ff1aa5f830736f1771 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Sun, 20 Oct 2024 21:07:37 +0100 Subject: [PATCH 50/74] Fix: fixed game updating twice via clients when playing in Remote. --- Makefile | 3 +- backend/pong/consumers.py | 17 +++++-- backend/pong/migrations/0001_initial.py | 6 ++- ...02_userstats_date_longest_game_and_more.py | 33 ------------- backend/pong/templates/pages/game_stats.html | 8 ---- backend/pong/views.py | 40 ++++++++-------- .../static/js/game/AbstractGameController.js | 30 +++++++++--- backend/static/js/game/GameStats.js | 46 ++++++------------- backend/static/js/game/LocalGameController.js | 18 +++++++- .../static/js/game/RemoteGameController.js | 16 +++++++ 10 files changed, 112 insertions(+), 105 deletions(-) delete mode 100644 backend/pong/migrations/0002_userstats_date_longest_game_and_more.py diff --git a/Makefile b/Makefile index c0ef9bf..67b2b58 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,8 @@ clean: backend/pong/__pycache__/ \ backend/pong/migrations/__pycache__/ \ backend/pong/templatetags/__pycache__/ \ - backend/pong/migrations/*_initial.py + backend/pong/migrations/*_initial.py \ + backend/pong/migrations/0*.py mkdir data/ diff --git a/backend/pong/consumers.py b/backend/pong/consumers.py index f934e8f..056ce18 100644 --- a/backend/pong/consumers.py +++ b/backend/pong/consumers.py @@ -1,5 +1,5 @@ import json -from .views import game_create_helper +from .views import game_create_helper, game_update_helper from .models import TournamentsUsers, Users from .serializers import TournamentsUsersSerializer, UsersSerializer from icecream import ic @@ -53,6 +53,7 @@ def connect(self): self.accept() self.user = self.scope['user'] self.room_name = '' + self.game_id = 0 # if the queue is empty: (no room available) # - create a new channel_name and add it to the object @@ -61,7 +62,7 @@ def connect(self): # - Pop the first available room in the queue # - Add the client to the room # - Broadcast a message to the channel with a starting command - if self.user.id in list(self.queue.keys()): + if self.user.id in self.queue: return if len(self.queue) == 0: @@ -110,7 +111,6 @@ def add_player_to_waiting_room(self): } new_game = json.loads(game_create_helper(new_game_data).content) - ic(new_game) async_to_sync(self.channel_layer.group_add)(host_player['room_name'], self.channel_name) async_to_sync(self.channel_layer.group_send)( @@ -139,7 +139,8 @@ def disconnect(self, code): def receive(self, text_data=None): handlers = { 'UPDATE': 'send.update.paddle.message', - 'SYNC': 'send.ball.sync.message' + 'SYNC': 'send.ball.sync.message', + 'FINISH': 'send.end.game.message' } data = json.loads(text_data) event = data['event'] @@ -158,4 +159,12 @@ def send_ball_sync_message(self, event): self.send(event['message']) def send_update_paddle_message(self, event): + self.send(event['message']) + + def send_end_game_message(self, event): + game_data = json.loads(event['message'])['data'] + game_id = game_data['id'] + del game_data['id'] + + game_update_helper(game_data, game_id) self.send(event['message']) \ No newline at end of file diff --git a/backend/pong/migrations/0001_initial.py b/backend/pong/migrations/0001_initial.py index 329bd43..c92a932 100644 --- a/backend/pong/migrations/0001_initial.py +++ b/backend/pong/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.2 on 2024-10-17 18:49 +# Generated by Django 5.1.2 on 2024-10-20 19:53 import django.db.models.deletion from django.conf import settings @@ -130,9 +130,13 @@ class Migration(migrations.Migration): ('nb_goals_scored', models.IntegerField(default=0)), ('nb_goals_suffered', models.IntegerField(default=0)), ('max_ball_speed', models.IntegerField(default=0)), + ('date_max_ball_speed', models.DateTimeField(null=True)), ('max_rally_length', models.IntegerField(default=0)), + ('date_max_rally_length', models.DateTimeField(null=True)), ('quickest_game', models.IntegerField(default=2147483647)), + ('date_quickest_game', models.DateTimeField(null=True)), ('longest_game', models.IntegerField(default=0)), + ('date_longest_game', models.DateTimeField(null=True)), ('num_first_goals', models.IntegerField(default=0)), ('remote_time_played', models.IntegerField(default=0)), ('local_time_played', models.IntegerField(default=0)), diff --git a/backend/pong/migrations/0002_userstats_date_longest_game_and_more.py b/backend/pong/migrations/0002_userstats_date_longest_game_and_more.py deleted file mode 100644 index c021a0e..0000000 --- a/backend/pong/migrations/0002_userstats_date_longest_game_and_more.py +++ /dev/null @@ -1,33 +0,0 @@ -# Generated by Django 5.1.2 on 2024-10-17 19:00 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('pong', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='userstats', - name='date_longest_game', - field=models.DateTimeField(null=True), - ), - migrations.AddField( - model_name='userstats', - name='date_max_ball_speed', - field=models.DateTimeField(null=True), - ), - migrations.AddField( - model_name='userstats', - name='date_max_rally_length', - field=models.DateTimeField(null=True), - ), - migrations.AddField( - model_name='userstats', - name='date_quickest_game', - field=models.DateTimeField(null=True), - ), - ] diff --git a/backend/pong/templates/pages/game_stats.html b/backend/pong/templates/pages/game_stats.html index 5efa31e..96cc422 100644 --- a/backend/pong/templates/pages/game_stats.html +++ b/backend/pong/templates/pages/game_stats.html @@ -77,10 +77,6 @@
Rally Length per Goal
9
-
-
- 10 -
@@ -141,10 +137,6 @@
Ball Speed per Goal
9
-
-
- 10 -
diff --git a/backend/pong/views.py b/backend/pong/views.py index afdc457..9d1514c 100644 --- a/backend/pong/views.py +++ b/backend/pong/views.py @@ -548,7 +548,6 @@ def game_create_helper(data: dict): return JsonResponse(serializer.data, status=201) - @csrf_exempt def game_create(request=None): if request.method != 'POST': @@ -566,23 +565,9 @@ def game_create(request=None): return JsonResponse({'message': f'Missing key: {str(e)}', 'data': {}}, status=400) return game_create_helper(data) - -@csrf_exempt -def game_update(request, game_id): - if request.method != 'POST': - return JsonResponse({'message': 'Method not allowed', 'method': request.method, 'data': {}}, status=405) - if request.content_type != 'application/json': - return JsonResponse({'message': 'Only JSON allowed', 'data': {}}, status=406) - - data = {} - try: - data = json.loads(request.body.decode('utf-8')) - except json.JSONDecodeError: - return JsonResponse({'message': 'Invalid JSON', 'data': {}}, status=400) - except KeyError as e: - return JsonResponse({'message': f'Missing key: {str(e)}', 'data': {}}, status=400) +def game_update_helper(data, game_id): game = Games.objects.get(pk=game_id) game.duration = data['duration'] game.nb_goals_user1 = data['nb_goals_user1'] @@ -598,23 +583,38 @@ def game_update(request, game_id): player2.status = "Online" player2.save() - if data['nb_goals_user1'] > data['nb_goals_user2']: game.winner_id = player1 elif data['nb_goals_user1'] > data['nb_goals_user2'] and game.type != "Local": game.winner_id = player2 game.save() - ic(data) - + user_stats_update(player1.id, game_id, data) if game.type != "Local": user_stats_update(player2.id, game_id, data) game_stats_create(game_id, data) game_goals_create(game_id, data) - user_stats_update(player1.id, game_id, data) data = GamesSerializer(game).data return JsonResponse(data, status=200) + +@csrf_exempt +def game_update(request, game_id): + if request.method != 'POST': + return JsonResponse({'message': 'Method not allowed', 'method': request.method, 'data': {}}, status=405) + if request.content_type != 'application/json': + return JsonResponse({'message': 'Only JSON allowed', 'data': {}}, status=406) + + data = {} + + try: + data = json.loads(request.body.decode('utf-8'))['data'] + except json.JSONDecodeError: + return JsonResponse({'message': 'Invalid JSON', 'data': {}}, status=400) + except KeyError as e: + return JsonResponse({'message': f'Missing key: {str(e)}', 'data': {}}, status=400) + + return game_update_helper(data, game_id) @csrf_exempt def get_game(request, game_id): diff --git a/backend/static/js/game/AbstractGameController.js b/backend/static/js/game/AbstractGameController.js index 9b16923..5f2dffc 100644 --- a/backend/static/js/game/AbstractGameController.js +++ b/backend/static/js/game/AbstractGameController.js @@ -2,8 +2,10 @@ import * as THREE from 'three'; import { Ball } from './Ball.js'; import { Arena } from './Arena.js'; +const CURR_PLAYER_ID = document.getElementById('game-engine').getAttribute('data-user-id'); + export class AbstractGameController extends THREE.Group { - constructor ({ gameType }) { + constructor ({ type }) { super(); this.keybinds = null; @@ -12,7 +14,7 @@ export class AbstractGameController extends THREE.Group { this.player1 = null; this.player2 = null; this.stats = null; - this.gameType = gameType; + this.type = type; } registerKeybinds() { @@ -47,6 +49,7 @@ export class AbstractGameController extends THREE.Group { update() { this.player1.update(this.keybinds); this.player2.update(this.keybinds); + if (this.ball == null) return ; @@ -54,13 +57,28 @@ export class AbstractGameController extends THREE.Group { if (scorer != null) { this.stats.registerGoal(scorer, this.ball); this.ball.reset({}); + console.log(this.goals); } - if (this.stats.winner != null){ - this.remove(this.ball); - this.ball.dispose(); - this.ball = null; + if (!this.stats.isGameOver()) + return ; + + this.cleanArena(); + + if ((this.type == "Remote" && this.stats.winner.id == CURR_PLAYER_ID) || + (this.type != "Remote" && this.stats.isGameOver())){ + console.log(this.type == "Remote" && this.stats.winner.id == CURR_PLAYER_ID); + console.log(this.type != "Remote" && this.stats.isGameOver()); + console.log(this.type, CURR_PLAYER_ID) + this.sendGameResults(); } } + cleanArena() { + this.remove(this.ball); + this.ball.dispose(); + this.ball = null; + } + createPlayers() {} + sendGameResults() {} } \ No newline at end of file diff --git a/backend/static/js/game/GameStats.js b/backend/static/js/game/GameStats.js index 8b8fef9..1b3d077 100644 --- a/backend/static/js/game/GameStats.js +++ b/backend/static/js/game/GameStats.js @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* GameStats.js :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: ncarvalh +#+ +:+ +#+ */ +/* By: nunomiguel533 = stats[p2].maxLead ? p1 : p2; } - async sendGameResults() { + assembleGameResults(){ + this.calculateSmallStats(); + this.calculateAdvancedStats(); + const now = new Date().getTime(); - const formData = { + return { + "id": this.gameID, "duration": Math.round((now - this.startTime) / 1000), "nb_goals_user1": this.score[this.player1.username], "nb_goals_user2": this.score[this.player2.username], @@ -136,30 +133,17 @@ export class GameStats { "user2_stats": { "scored_first": this.goals[0].user == this.player2.id }, - "goals": this.goals + "goals": this.goals }; - console.log(formData); - - this.winner = this.score[this.player1.username] == MAX_GOALS ? this.player1 : this.player2; - this.loser = this.winner == this.player1 ? this.player2 : this.player1; - - const response = await fetch(`/games/update/${this.gameID}`, { - method: 'POST', - body: JSON.stringify(formData), - headers: { - 'Content-Type': 'application/json', - } - }); - - const responseData = await response.json(); - console.log(responseData); } - gameHasEnded() { - return (Object.values(this.score).includes(MAX_GOALS)); - } + isGameOver() { + if (!Object.values(this.score).includes(MAX_GOALS)) + return false; - debug() { + this.winner = this.score[this.player1.username] == MAX_GOALS ? this.player1 : this.player2; + this.loser = this.winner == this.player1 ? this.player2 : this.player1; + return true; } } \ No newline at end of file diff --git a/backend/static/js/game/LocalGameController.js b/backend/static/js/game/LocalGameController.js index 5e304d1..36d50cb 100644 --- a/backend/static/js/game/LocalGameController.js +++ b/backend/static/js/game/LocalGameController.js @@ -5,7 +5,7 @@ import { PADDLE_OFFSET_X, ARENA_SEMI_LENGTH, STANDARD_KEYBINDS, ALTERNATE_KEYBIN export class LocalGameController extends AbstractGameController { constructor({ player1Data, player2Data, ballDirection }) { - super({gameType: "Local"}); + super({type: "Local"}); this.registerKeybinds(); this.createPlayers(player1Data, player2Data); @@ -47,9 +47,25 @@ export class LocalGameController extends AbstractGameController { }); const gameData = await response.json(); + console.log(gameData); this.stats.gameID = gameData.id; } + async sendGameResults() { + const results = this.stats.assembleGameResults(); + + await fetch(`/games/update/${this.stats.gameID}`, { + method: 'POST', + body: JSON.stringify({ + 'event': 'FINISH', + 'data': results + }), + headers: { + 'Content-Type': 'application/json', + } + }); + } + build(ballDirection) { const ballData = { ballDirection: ballDirection, diff --git a/backend/static/js/game/RemoteGameController.js b/backend/static/js/game/RemoteGameController.js index 77f9ff1..06f5f44 100644 --- a/backend/static/js/game/RemoteGameController.js +++ b/backend/static/js/game/RemoteGameController.js @@ -3,6 +3,8 @@ import { RemotePlayer } from './RemotePlayer.js'; import { ARENA_SEMI_LENGTH, PADDLE_OFFSET_X, STANDARD_KEYBINDS } from './macros.js'; import { AbstractGameController } from './AbstractGameController.js'; + + export class RemoteGameController extends AbstractGameController { constructor({ player1Data, player2Data, gameID, socket, ballDirection }) { super({type: "Remote"}); @@ -65,6 +67,9 @@ export class RemoteGameController extends AbstractGameController { this.players[data.id].move(data.y); else if (event == 'SYNC') this.ball.sync(data.ball); + else if (event == 'FINISH'){ + this.socket.close(); + } } this.socket.onerror = (ev) => { @@ -92,4 +97,15 @@ export class RemoteGameController extends AbstractGameController { super.build(ballData); } + + sendGameResults() { + const results = this.stats.assembleGameResults(); + console.log(`WINNER:`, this.stats.winner, 'SCORE:', this.stats.score); + console.log('SENDING DATA TO SERVER...'); + + this.socket.send(JSON.stringify({ + 'event': 'FINISH', + 'data': results + })); + } } \ No newline at end of file From 6d7135ecf543a585fa5f437ccef8261867adcf4e Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Sun, 20 Oct 2024 21:19:33 +0100 Subject: [PATCH 51/74] Fix: fixed goals being duplicated. --- backend/pong/consumers.py | 11 +++--- backend/pong/templates/pages/game_stats.html | 36 +++++++++---------- .../static/js/game/AbstractGameController.js | 1 - backend/static/js/game/GameStats.js | 7 ++-- 4 files changed, 29 insertions(+), 26 deletions(-) diff --git a/backend/pong/consumers.py b/backend/pong/consumers.py index 056ce18..9a677ad 100644 --- a/backend/pong/consumers.py +++ b/backend/pong/consumers.py @@ -145,6 +145,12 @@ def receive(self, text_data=None): data = json.loads(text_data) event = data['event'] + if event == 'FINISH': + game_data = data['data'] + game_id = game_data['id'] + del game_data['id'] + game_update_helper(data['data'], game_id) + async_to_sync(self.channel_layer.group_send)( self.room_name, { "type": handlers[event], @@ -162,9 +168,4 @@ def send_update_paddle_message(self, event): self.send(event['message']) def send_end_game_message(self, event): - game_data = json.loads(event['message'])['data'] - game_id = game_data['id'] - del game_data['id'] - - game_update_helper(game_data, game_id) self.send(event['message']) \ No newline at end of file diff --git a/backend/pong/templates/pages/game_stats.html b/backend/pong/templates/pages/game_stats.html index 96cc422..f130ef1 100644 --- a/backend/pong/templates/pages/game_stats.html +++ b/backend/pong/templates/pages/game_stats.html @@ -42,39 +42,39 @@
S
Rally Length per Goal
-
+
0
1
-
+
0
2
-
+
0
3
-
+
0
4
-
+
0
5
-
+
0
6
-
+
0
7
-
+
0
8
-
+
0
9
@@ -102,39 +102,39 @@
{{stats.longer_rally}}
Ball Speed per Goal
-
+
0
1
-
+
0
2
-
+
0
3
-
+
0
4
-
+
0
5
-
+
0
6
-
+
0
7
-
+
0
8
-
+
0
9
diff --git a/backend/static/js/game/AbstractGameController.js b/backend/static/js/game/AbstractGameController.js index 5f2dffc..2674cfa 100644 --- a/backend/static/js/game/AbstractGameController.js +++ b/backend/static/js/game/AbstractGameController.js @@ -57,7 +57,6 @@ export class AbstractGameController extends THREE.Group { if (scorer != null) { this.stats.registerGoal(scorer, this.ball); this.ball.reset({}); - console.log(this.goals); } if (!this.stats.isGameOver()) return ; diff --git a/backend/static/js/game/GameStats.js b/backend/static/js/game/GameStats.js index 1b3d077..dfd07e6 100644 --- a/backend/static/js/game/GameStats.js +++ b/backend/static/js/game/GameStats.js @@ -6,7 +6,7 @@ /* By: nunomiguel533 Date: Mon, 21 Oct 2024 14:52:07 +0100 Subject: [PATCH 52/74] Refactoring: rewrote game main.js --- backend/pong/migrations/0001_initial.py | 2 +- backend/static/js/game/main.js | 31 ++++++++++++++++--------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/backend/pong/migrations/0001_initial.py b/backend/pong/migrations/0001_initial.py index c92a932..8482f21 100644 --- a/backend/pong/migrations/0001_initial.py +++ b/backend/pong/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.2 on 2024-10-20 19:53 +# Generated by Django 5.1.2 on 2024-10-21 13:26 import django.db.models.deletion from django.conf import settings diff --git a/backend/static/js/game/main.js b/backend/static/js/game/main.js index 8019630..81a49c7 100644 --- a/backend/static/js/game/main.js +++ b/backend/static/js/game/main.js @@ -4,13 +4,17 @@ const gameType = document.getElementById('game-engine').getAttribute('game-type' const userID = document.getElementById('game-engine').getAttribute('data-user-id'); const username = document.getElementById('game-engine').getAttribute('data-username'); -if (gameType == "Remote") { +const setupGame = (data) => { + let app = new MyApp(); + app.init(data); + app.render(); +}; + +const remoteHandler = () => { let socket = new WebSocket(`ws://${window.location.host}/ws/games/remote/queue`); socket.onmessage = (event) => { const { player1, player2, ball, gameID } = JSON.parse(event.data); - - let app = new MyApp(); - app.init({ + setupGame({ player1Data: player1, player2Data: player2, socket: socket, @@ -18,15 +22,20 @@ if (gameType == "Remote") { gameID: gameID, ballDirection: ball.direction, }); - app.render(); - } + }; } -else { - let app = new MyApp(); - app.init({ + +const localHandler = () => { + setupGame({ player1Data: {'id': userID, 'username': username}, player2Data: {'id': '', 'username': ''}, gameType: gameType }); - app.render(); -} \ No newline at end of file +} + +const handlers = { + 'Local': localHandler, + 'Remote': remoteHandler +}; + +handlers[gameType](); \ No newline at end of file From 386f81d4527f4923b4bc5c6adb812dcd929f7398 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Mon, 21 Oct 2024 16:00:02 +0100 Subject: [PATCH 53/74] Code + Fix: added usernames to game scoreboard. Fixed a bug where the winner wouldn't be set on a Local game. Fixed a bug where the scores would be presented backwards and with wrong DEFEAT label. --- backend/pong/templates/pages/gamelocal.html | 6 ++-- backend/pong/templates/pages/gameonline.html | 6 ++-- .../pong/templates/pages/view_profile.html | 18 ++++++++---- backend/pong/views.py | 2 +- backend/static/css/game/game.css | 29 +++++++++++++++---- .../static/js/game/AbstractGameController.js | 5 ++++ backend/static/js/game/GameStats.js | 10 +++---- backend/static/js/game/LocalGameController.js | 4 ++- backend/static/js/game/main.js | 2 +- 9 files changed, 59 insertions(+), 23 deletions(-) diff --git a/backend/pong/templates/pages/gamelocal.html b/backend/pong/templates/pages/gamelocal.html index f354b3d..160c9d3 100644 --- a/backend/pong/templates/pages/gamelocal.html +++ b/backend/pong/templates/pages/gamelocal.html @@ -19,8 +19,10 @@
-
- 0 : 0 +
+
+
0 : 0
+
diff --git a/backend/pong/templates/pages/gameonline.html b/backend/pong/templates/pages/gameonline.html index 5616a17..682c3cb 100644 --- a/backend/pong/templates/pages/gameonline.html +++ b/backend/pong/templates/pages/gameonline.html @@ -20,8 +20,10 @@
-
- 0 : 0 +
+
+
0 : 0
+
diff --git a/backend/pong/templates/pages/view_profile.html b/backend/pong/templates/pages/view_profile.html index 43895ed..b38f7ae 100755 --- a/backend/pong/templates/pages/view_profile.html +++ b/backend/pong/templates/pages/view_profile.html @@ -369,18 +369,26 @@
{{ stats.quickest_game }}
{{ game.created_at }}
{{ game.duration }} - {% if user_view == game.winner_id %} + {% if user_view.id == game.winner_id.id %} VICTORY {% else %} DEFEAT {% endif %} - {% if user_view == game.user1_id %} - {{ game.nb_goals_user1 }} - {{ game.nb_goals_user2 }} + {% if user_view.id == game.winner_id.id %} + {% if game.winner_id.id == game.user1_id.id %} + {{ game.nb_goals_user1 }} - {{ game.nb_goals_user2 }} + {% else %} + {{ game.nb_goals_user2 }} - {{ game.nb_goals_user1 }} + {% endif %} {% else %} - {{ game.nb_goals_user2 }} - {{ game.nb_goals_user1 }} + {% if game.nb_goals_user1 < game.nb_goals_user2 %} + {{ game.nb_goals_user1 }} - {{ game.nb_goals_user2 }} + {% else %} + {{ game.nb_goals_user2 }} - {{ game.nb_goals_user1 }} + {% endif %} {% endif %}
- {% if user_view == game.user2_id %} + {% if user_view.id == game.user2_id.id %} {% if game.user1_id != NULL %} data['nb_goals_user2']: game.winner_id = player1 - elif data['nb_goals_user1'] > data['nb_goals_user2'] and game.type != "Local": + elif data['nb_goals_user1'] < data['nb_goals_user2'] and game.type != "Local": game.winner_id = player2 game.save() diff --git a/backend/static/css/game/game.css b/backend/static/css/game/game.css index dffe8dd..51a2d84 100644 --- a/backend/static/css/game/game.css +++ b/backend/static/css/game/game.css @@ -26,13 +26,30 @@ right: 100px; } -#score { +#scoreboard { color: white; - font-size: 32px; - font-weight: bold; - height: 100px; - left: calc(50% - 50px); + height: 50px; + width: 100%; position: absolute; top: 36px; - width: 100px; +} + +#p1 { + font-size: 24px; + text-align: end; +} + +#p2 { + font-size: 24px; + text-align: start; +} + +#score { + font-size: 32px; + font-weight: bold; +} + +#p1, #p2, #score { + width: 300px; + /* background-color: red; */ } \ No newline at end of file diff --git a/backend/static/js/game/AbstractGameController.js b/backend/static/js/game/AbstractGameController.js index 2674cfa..2ce56ce 100644 --- a/backend/static/js/game/AbstractGameController.js +++ b/backend/static/js/game/AbstractGameController.js @@ -44,6 +44,11 @@ export class AbstractGameController extends THREE.Group { this.add(this.player1.paddle); this.add(this.player2.paddle); this.add(this.ball); + + const p1display = document.getElementById('p1'); + const p2display = document.getElementById('p2'); + p1display.textContent = `${this.player1.username}`; + p2display.textContent = `${this.player2.username}`; } update() { diff --git a/backend/static/js/game/GameStats.js b/backend/static/js/game/GameStats.js index dfd07e6..e2b6c2a 100644 --- a/backend/static/js/game/GameStats.js +++ b/backend/static/js/game/GameStats.js @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* GameStats.js :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: nunomiguel533 +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/30 18:34:16 by ncarvalh #+# #+# */ -/* Updated: 2024/10/20 21:10:37 by nunomiguel5 ### ########.fr */ +/* Updated: 2024/10/21 15:08:36 by crypto ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,7 +24,7 @@ export class GameStats { this.gameStats = {}; this.scoredFirst = null; this.startTime = null - this.scoreBoard = null; + this.gameScore = null; this.init(); } @@ -32,7 +32,7 @@ export class GameStats { this.startTime = new Date().getTime(); this.score[this.player1.username] = 0; this.score[this.player2.username] = 0; - this.scoreBoard = document.getElementById('score'); + this.gameScore = document.getElementById('score'); //! Testing // this.goals = TEST_GOALS; @@ -51,7 +51,7 @@ export class GameStats { this.score[scorer.username] += 1; this.goals.push(goal); console.log(this.goals); - this.scoreBoard.textContent = + this.gameScore.textContent = `${this.score[this.player1.username]} : ${this.score[this.player2.username]}`; console.log(goal); diff --git a/backend/static/js/game/LocalGameController.js b/backend/static/js/game/LocalGameController.js index 36d50cb..3cbd5ec 100644 --- a/backend/static/js/game/LocalGameController.js +++ b/backend/static/js/game/LocalGameController.js @@ -15,7 +15,7 @@ export class LocalGameController extends AbstractGameController { createPlayers(player1Data, player2Data) { const { id: p1ID, username: p1Username } = player1Data; - // const { id: enemyID, username: enemyUsername } = player2Data; + const { id: p2ID, username: p2Username } = player2Data; this.player1 = new LocalPlayer({ id: p1ID, @@ -24,6 +24,8 @@ export class LocalGameController extends AbstractGameController { keybinds: STANDARD_KEYBINDS }); this.player2 = new LocalPlayer({ + id: p2ID, + username: p2Username, x: ARENA_SEMI_LENGTH - PADDLE_OFFSET_X, keybinds: ALTERNATE_KEYBINDS }); diff --git a/backend/static/js/game/main.js b/backend/static/js/game/main.js index 81a49c7..037e7e7 100644 --- a/backend/static/js/game/main.js +++ b/backend/static/js/game/main.js @@ -28,7 +28,7 @@ const remoteHandler = () => { const localHandler = () => { setupGame({ player1Data: {'id': userID, 'username': username}, - player2Data: {'id': '', 'username': ''}, + player2Data: {'id': '', 'username': 'Anonymous'}, gameType: gameType }); } From 264eafc6228d4e23cc9e727ace7f1e91838d5496 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Mon, 21 Oct 2024 16:37:54 +0100 Subject: [PATCH 54/74] Fix: match history game entries now display the proper timestamps instead of NaN. --- .../pong/templates/pages/view_profile.html | 8 +- backend/pong/views.py | 2 +- backend/static/js/tab-recent-matches.js | 154 +++--------------- 3 files changed, 26 insertions(+), 138 deletions(-) diff --git a/backend/pong/templates/pages/view_profile.html b/backend/pong/templates/pages/view_profile.html index b38f7ae..1dc58e7 100755 --- a/backend/pong/templates/pages/view_profile.html +++ b/backend/pong/templates/pages/view_profile.html @@ -365,8 +365,8 @@
{{ stats.quickest_game }}
{% endif %}
-
{{ game.created_at }}
-
{{ game.created_at }}
+
{{ game.created_at|date:"c" }}
+
{{ game.created_at|date:"c" }}
{{ game.duration }} {% if user_view.id == game.winner_id.id %} @@ -448,8 +448,8 @@
{{ stats.quickest_game }}
-
{{ tour.tournament.created_at }}
-
{{ tour.tournament.created_at }}
+
{{ tour.tournament.created_at|date:"c" }}
+
{{ tour.tournament.created_at|date:"c" }}
{{ tour.tournament.duration }} {{ tour.placement }} diff --git a/backend/pong/views.py b/backend/pong/views.py index 57cbd49..021b6e2 100644 --- a/backend/pong/views.py +++ b/backend/pong/views.py @@ -1298,6 +1298,7 @@ def profile(request, id): goals_scored_suffered_ratio = 0 graph = win_rate_nb_games_day(request, user_profile.id) graph_send = json.loads(graph.content) + ic(GamesSerializer(games[0]).data) context = { 'friends': friends, 'user_id': user_id, @@ -1315,7 +1316,6 @@ def profile(request, id): 'graph': graph_send, 'page': 'profile' if is_own_profile else 'else' } - ic(context) return render(request, 'pages/view_profile.html', context) diff --git a/backend/static/js/tab-recent-matches.js b/backend/static/js/tab-recent-matches.js index f053206..eccdbe6 100644 --- a/backend/static/js/tab-recent-matches.js +++ b/backend/static/js/tab-recent-matches.js @@ -25,119 +25,6 @@ function onTournamentsClick() { document.getElementById("tab-profile").classList.remove("active"); } -/*function parseCustomDate(dateString) { - // Expressão regular para capturar a data e hora - const datePattern = /([A-Za-z]+)\.\s(\d{1,2}),\s(\d{4}),\s(\d{1,2}):(\d{2})\s([a|p]\.m\.)/; - const match = dateString.match(datePattern); - - if (!match) { - console.error("Formato de data inválido:", dateString); - return null; - } - - const monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; - const monthString = match[1].replace(".", "").trim(); // Remove o ponto e espaços - const month = monthNames.indexOf(monthString); - console.log("Month ",month) - const day = parseInt(match[2], 10); - const year = parseInt(match[3], 10); - let hours = parseInt(match[4], 10); - const minutes = parseInt(match[5], 10); - const period = match[6]; // "a.m." ou "p.m." - - // Converte para o formato 24 horas - if (period === "p.m." && hours < 12) { - hours += 12; - } else if (period === "a.m." && hours === 12) { - hours = 0; - } - - // Retorna um objeto Date válido - return new Date(Date.UTC(year, month, day, hours, minutes)); -} - - -// Formatar data com dia -function formatTimestamp_day(timestamp) { - console.log("aqui2", timestamp) - const date = parseCustomDate(timestamp); // Usar a função de parsing - console.log("aqui", date) - if (!date) return "Invalid date"; // Verifica se o parsing falhou - - const monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; - const day = String(date.getUTCDate()).padStart(2, '0'); - const month = monthNames[date.getUTCMonth()]; - const year = date.getUTCFullYear(); - return `${day}, ${month}. ${year}`; -} - -// Formatar timestamp com segundos -function formatTimestamp_second(timestamp) { - const date = parseCustomDate(timestamp); // Usar a função de parsing - if (!date) return "Invalid time"; // Verifica se o parsing falhou - - const hours = String(date.getUTCHours()).padStart(2, '0'); - const minutes = String(date.getUTCMinutes()).padStart(2, '0'); - const seconds = String(date.getUTCSeconds()).padStart(2, '0'); - return `${hours}:${minutes}:${seconds}`; -} - - -// Converter datas no div -function convertDateInDiv1(div_class) { - const dateDivs = document.querySelectorAll(div_class); - dateDivs.forEach(div => { - const isoTimestamp = div.textContent; - const formattedDate = formatTimestamp_day(isoTimestamp); - div.textContent = formattedDate; - }); -} - - -// Converter datas no div -function convertDateInDiv2(div_class) { - const dateDivs = document.querySelectorAll(div_class); - dateDivs.forEach(div => { - const isoTimestamp = div.textContent; - const formattedDate = formatTimestamp_second(isoTimestamp); - div.textContent = formattedDate; - }); -} - - */ - - -function parseCustomDate(dateString) { - // Expressão regular para capturar a data e hora - const datePattern = /([A-Za-z]+)\.\s(\d{1,2}),\s(\d{4}),\s(\d{1,2}):(\d{2})\s([a|p]\.m\.)/; - const match = dateString.match(datePattern); - - if (!match) { - console.error("Formato de data inválido:", dateString); - return null; - } - - const monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; - const monthString = match[1].replace(".", "").trim(); // Remove o ponto e espaços - const month = monthNames.indexOf(monthString); - console.log("Month ",month) - const day = parseInt(match[2], 10); - const year = parseInt(match[3], 10); - let hours = parseInt(match[4], 10); - const minutes = parseInt(match[5], 10); - const period = match[6]; // "a.m." ou "p.m." - - // Converte para o formato 24 horas - if (period === "p.m." && hours < 12) { - hours += 12; - } else if (period === "a.m." && hours === 12) { - hours = 0; - } - - // Retorna um objeto Date válido - return new Date(Date.UTC(year, month, day, hours, minutes)); -} - function formatTimestamp_day(timestamp) { const date = new Date(timestamp); @@ -150,42 +37,43 @@ function formatTimestamp_day(timestamp) { const month = monthNames[date.getUTCMonth()]; const year = date.getUTCFullYear(); - // Format the result as dd, mmm yyyy hh:mm:ss - return `${day}, ${month}. ${year}`; + const suffixes = ['st', 'nd', 'rd']; + const dayUnits = date.getUTCDate() % 10; + + if ((dayUnits >= 1 && dayUnits <= 3) && (date.getUTCDate() < 10 || date.getUTCDate() > 13)) + return `${day}${suffixes[dayUnits - 1]}, ${month}. ${year}`; + return `${day}th, ${month}. ${year}`; } // Function to convert the content of the div -function convertDateInDiv1(div_class) { +function convertDay(div_class) { // Get the div element by its ID const dateDivs = document.querySelectorAll(div_class); - // Loop through each div and convert its content - dateDivs.forEach(div => { - const isoTimestamp = div.textContent; // Get the ISO date string from the div - const formattedDate = formatTimestamp_day(isoTimestamp); // Format the date - div.textContent = formattedDate; // Set the formatted date back into the div - }); + // Loop through each div and convert its content + dateDivs.forEach(div => { + const isoTimestamp = div.textContent; // Get the ISO date string from the div + const formattedDate = formatTimestamp_day(isoTimestamp); // Format the date + div.textContent = formattedDate; // Set the formatted date back into the div + }); } function formatTimestamp_second(timestamp) { + console.log(timestamp); const date = new Date(timestamp); - const monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; - - // Get the day, month, year, hours, minutes, and seconds from the date object - const day = String(date.getUTCDate()).padStart(2, '0'); - const month = monthNames[date.getUTCMonth()]; - const year = date.getUTCFullYear(); const hours = String(date.getUTCHours()).padStart(2, '0'); const minutes = String(date.getUTCMinutes()).padStart(2, '0'); const seconds = String(date.getUTCSeconds()).padStart(2, '0'); + console.log(`${hours}:${minutes}:${seconds}`); + // Format the result as dd, mmm yyyy hh:mm:ss return `${hours}:${minutes}:${seconds}`; } // Function to convert the content of the div -function convertDateInDiv2(div_class) { +function convertTime(div_class) { // Get the div element by its ID const dateDivs = document.querySelectorAll(div_class); @@ -250,8 +138,8 @@ if (gamesTab) { gamesTab.addEventListener('click', function() { onGamesClick(); // Muda para jogos convertduration(); // Converte durações - convertDateInDiv1(".date-day"); // Converte datas - convertDateInDiv2(".date-second"); // Converte datas + convertDay(".date-day"); // Converte datas + convertTime(".date-second"); // Converte datas }); } @@ -261,8 +149,8 @@ if (tournamentsTab) { onTournamentsClick(); // Muda para torneios convertPlacement(); // Converte colocações convertduration(); // Converte durações - convertDateInDiv1(".date-day"); // Converte datas - convertDateInDiv2(".date-second"); // Converte datas + convertDay(".date-day"); // Converte datas + convertTime(".date-second"); // Converte datas }); } From fecff967ff17f7e363eb738d92dff3991eb70ee0 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Mon, 21 Oct 2024 16:42:31 +0100 Subject: [PATCH 55/74] Fix: fixed a bug where NaN would appear after coming back to the Games tab. --- backend/static/js/tab-recent-matches.js | 45 +++++++------------------ 1 file changed, 13 insertions(+), 32 deletions(-) diff --git a/backend/static/js/tab-recent-matches.js b/backend/static/js/tab-recent-matches.js index eccdbe6..99a503d 100644 --- a/backend/static/js/tab-recent-matches.js +++ b/backend/static/js/tab-recent-matches.js @@ -46,7 +46,7 @@ function formatTimestamp_day(timestamp) { } // Function to convert the content of the div -function convertDay(div_class) { +function formatDays(div_class) { // Get the div element by its ID const dateDivs = document.querySelectorAll(div_class); @@ -73,7 +73,7 @@ function formatTimestamp_second(timestamp) { } // Function to convert the content of the div -function convertTime(div_class) { +function formatHours(div_class) { // Get the div element by its ID const dateDivs = document.querySelectorAll(div_class); @@ -101,7 +101,7 @@ function placement_func(placement) { } // Converter colocações -function convertPlacement() { +function formatTournamentPlacements() { const place = document.querySelectorAll(".placement"); place.forEach(div => { const placement = div.textContent; @@ -123,7 +123,7 @@ function calculateTimeDifference(duration) { } // Converter duração -function convertduration() { +function formatGameDurations() { const places = document.querySelectorAll(".duration"); places.forEach(div => { const duration = div.textContent; @@ -132,32 +132,13 @@ function convertduration() { }); } -// Adicionar ouvintes de eventos aos tabs -const gamesTab = document.getElementById('tab-games'); -if (gamesTab) { - gamesTab.addEventListener('click', function() { - onGamesClick(); // Muda para jogos - convertduration(); // Converte durações - convertDay(".date-day"); // Converte datas - convertTime(".date-second"); // Converte datas - }); -} +document.addEventListener('DOMContentLoaded', (event) => { + document.getElementById('tab-games').onclick = () => onGamesClick(); + document.getElementById('tab-tournaments').onclick = () => onTournamentsClick(); + document.getElementById('tab-profile').onclick = () => onProfileClick(); -const tournamentsTab = document.getElementById('tab-tournaments'); -if (tournamentsTab) { - tournamentsTab.addEventListener('click', function() { - onTournamentsClick(); // Muda para torneios - convertPlacement(); // Converte colocações - convertduration(); // Converte durações - convertDay(".date-day"); // Converte datas - convertTime(".date-second"); // Converte datas - }); -} - -const profileTab = document.getElementById('tab-profile'); -if (profileTab) { - profileTab.addEventListener('click', function() { - onProfileClick(); // Muda para perfil - - }); -} + formatTournamentPlacements(); // Converte colocações + formatGameDurations(); // Converte durações + formatDays(".date-day"); // Converte datas + formatHours(".date-second"); // Converte datas +}); From 9d716b7f667209da09f24baef69c2c9c253fe265 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Mon, 21 Oct 2024 16:55:33 +0100 Subject: [PATCH 56/74] Code: formatted the timestamp of records. --- .../pong/templates/pages/view_profile.html | 1 + backend/static/js/edit-profile.js | 180 +-------------- backend/static/js/profile.js | 207 ++++++++++++++++++ backend/static/js/tab-recent-matches.js | 4 +- 4 files changed, 211 insertions(+), 181 deletions(-) create mode 100644 backend/static/js/profile.js diff --git a/backend/pong/templates/pages/view_profile.html b/backend/pong/templates/pages/view_profile.html index 1dc58e7..6bcd731 100755 --- a/backend/pong/templates/pages/view_profile.html +++ b/backend/pong/templates/pages/view_profile.html @@ -6,6 +6,7 @@ + diff --git a/backend/static/js/edit-profile.js b/backend/static/js/edit-profile.js index 7bf413e..9539623 100755 --- a/backend/static/js/edit-profile.js +++ b/backend/static/js/edit-profile.js @@ -61,182 +61,4 @@ function onSaveButtonClick(event, userId) { } }) .catch(error => console.error('Error:', error)); -} - -// Get the modal -var modal2 = document.getElementById("modal2"); -// Get the button that opens the modal -var btn2 = document.getElementById("remove-friend-button"); -// Get the element that closes the modal -var goback = document.getElementById("cancel"); -// When the user clicks the button, open the modal -if (btn2) { - btn2.onclick = function() { - modal2.style.display = "block"; - } -} - -goback.onclick = function() { - modal2.style.display = "none"; -} - -// When the user clicks anywhere outside of the modal2, close it -window.onclick = function(event) { - if (event.target == modal2) { - modal2.style.display = "none"; - } -} - -async function loadDonutChart() { - const userID = document.getElementById('main-content').getAttribute('data-user-view-id'); - const response = await fetch(`/stats/${userID}`, { - method: "GET", - }); - const stats = await response.json(); - - const remoteTime = Math.round(stats.remote_time_played / 60); - const aiTime = Math.round(stats.ai_time_played / 60); - const localTime = Math.round(stats.local_time_played / 60); - const tournamentTime = Math.round(stats.tournament_time_played / 60); - - var options = { - chart: { - type: 'donut', - height: 200 - }, - series: [remoteTime, aiTime, localTime, tournamentTime], - labels: ['Remote Game', 'AI mode', 'Local Game', 'Tournaments'], - colors: ['#EC6158', '#46CDBD', '#66DD53', '#FFAD72'], - legend: { - position: 'right', - offsetY: 25, - offsetX: 100, - markers: { - width: 12, - height: 12 - }, - fontSize: '14px', - fontWeight: 'bold', - labels: { - colors: ['#fff','#fff','#fff','#fff'] - } - }, - plotOptions: { - pie: { - donut: { - size: '70%', - labels: { - show: true, - total: { - show: true, - label: 'Min', - color: '#fff', - }, - value: { - fontSize: "28px", - fontWeight: "bold" - } - } - }, - expandOnClick: false - }, - - }, - stroke: { - show: false, - - }, - dataLabels: { - enabled: false - } - }; - - var chart = new ApexCharts(document.querySelector("#chart1"), options); - chart.render(); -} - -async function loadBarLineChart() { - const userID = document.getElementById('main-content').getAttribute('data-user-view-id'); - const response = await fetch(`/graph/${userID}`, { - method: "GET", - }); - const stats = await response.json(); - console.log(stats); - - const tempRates = stats.map((x) => x.win_rate); - const tempTotalGames = stats.map((x) => x.total_games); - const winRates = new Array(7).fill(0); - const totalGames = new Array(7).fill(0); - - console.log(tempRates); - console.log(tempTotalGames); - tempRates.forEach((rate, i) => { - winRates[i] = rate}); - tempTotalGames.forEach((games, i) => totalGames[i] = games); - - console.log(winRates, totalGames); - - var options = { - chart: { - type: 'line', - height: 350, - stacked: false, - toolbar: { - show: false - }, - width: '100%', - }, - series: [{ - name: 'Win Rate', - type: 'column', - data: totalGames - }, { - name: 'Win Rate Line', - type: 'line', - data: winRates, - stroke: { - width: 2, - }, - }], - xaxis: { - categories: ['Mon', 'Tues', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun'], - labels: { - rotate: 0, - style: { - colors: '#c3c3c3bb', - fontSize: '14px', - fontWeight: 600 - } - }, - axisBorder: { - show: false - }, - axisTicks: { - show: false - } - }, - colors: ['#605CFF', '#83E9FF'], - yaxis: { - show: false - }, - grid: { - show: false - }, - tooltip: { - enabled: false - }, - dataLabels: { - enabled: false - }, - legend: { - show: false - } - }; - - var chart = new ApexCharts(document.querySelector("#chart2"), options); - chart.render(); -} - -loadDonutChart(); -loadBarLineChart(); - +} \ No newline at end of file diff --git a/backend/static/js/profile.js b/backend/static/js/profile.js new file mode 100644 index 0000000..820b44a --- /dev/null +++ b/backend/static/js/profile.js @@ -0,0 +1,207 @@ + +// Get the modal +var modal2 = document.getElementById("modal2"); +// Get the button that opens the modal +var btn2 = document.getElementById("remove-friend-button"); +// Get the element that closes the modal +var goback = document.getElementById("cancel"); +// When the user clicks the button, open the modal +if (btn2) { + btn2.onclick = function() { + modal2.style.display = "block"; + } +} + +goback.onclick = function() { + modal2.style.display = "none"; +} + +// When the user clicks anywhere outside of the modal2, close it +window.onclick = function(event) { + if (event.target == modal2) { + modal2.style.display = "none"; + } +} + +function formatDate(timestamp) { + const date = new Date(timestamp); + + const monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + + const day = String(date.getUTCDate()).padStart(2, '0'); + const month = monthNames[date.getUTCMonth()]; + const year = date.getUTCFullYear(); + const hours = String(date.getUTCHours()).padStart(2, '0'); + const minutes = String(date.getUTCMinutes()).padStart(2, '0'); + + const suffixes = ['st', 'nd', 'rd']; + const dayUnits = date.getUTCDate() % 10; + + if ((dayUnits >= 1 && dayUnits <= 3) && (date.getUTCDate() < 10 || date.getUTCDate() > 13)) + return `${day}${suffixes[dayUnits - 1]} ${month}. ${year}, ${hours}:${minutes}`; + return `${day}th ${month}. ${year}, ${hours}:${minutes}`; +} + +function formatRecordsTimestamp(divClass) { + + const recordTimeDivs = document.querySelectorAll(divClass); + + recordTimeDivs.forEach(div => { + div.textContent = formatDate(div.textContent); + }); +} + +async function loadDonutChart() { + const userID = document.getElementById('main-content').getAttribute('data-user-view-id'); + const response = await fetch(`/stats/${userID}`, { + method: "GET", + }); + const stats = await response.json(); + + const remoteTime = Math.round(stats.remote_time_played / 60); + const aiTime = Math.round(stats.ai_time_played / 60); + const localTime = Math.round(stats.local_time_played / 60); + const tournamentTime = Math.round(stats.tournament_time_played / 60); + + var options = { + chart: { + type: 'donut', + height: 200 + }, + series: [remoteTime, aiTime, localTime, tournamentTime], + labels: ['Remote Game', 'AI mode', 'Local Game', 'Tournaments'], + colors: ['#EC6158', '#46CDBD', '#66DD53', '#FFAD72'], + legend: { + position: 'right', + offsetY: 25, + offsetX: 100, + markers: { + width: 12, + height: 12 + }, + fontSize: '14px', + fontWeight: 'bold', + labels: { + colors: ['#fff','#fff','#fff','#fff'] + } + }, + plotOptions: { + pie: { + donut: { + size: '70%', + labels: { + show: true, + total: { + show: true, + label: 'Min', + color: '#fff', + }, + value: { + fontSize: "28px", + fontWeight: "bold" + } + } + }, + expandOnClick: false + }, + + }, + stroke: { + show: false, + + }, + dataLabels: { + enabled: false + } + }; + + var chart = new ApexCharts(document.querySelector("#chart1"), options); + chart.render(); +} + +async function loadBarLineChart() { + const userID = document.getElementById('main-content').getAttribute('data-user-view-id'); + const response = await fetch(`/graph/${userID}`, { + method: "GET", + }); + const stats = await response.json(); + console.log(stats); + + const tempRates = stats.map((x) => x.win_rate); + const tempTotalGames = stats.map((x) => x.total_games); + const winRates = new Array(7).fill(0); + const totalGames = new Array(7).fill(0); + + console.log(tempRates); + console.log(tempTotalGames); + tempRates.forEach((rate, i) => { + winRates[i] = rate}); + tempTotalGames.forEach((games, i) => totalGames[i] = games); + + console.log(winRates, totalGames); + + var options = { + chart: { + type: 'line', + height: 350, + stacked: false, + toolbar: { + show: false + }, + width: '100%', + }, + series: [{ + name: 'Win Rate', + type: 'column', + data: totalGames + }, { + name: 'Win Rate Line', + type: 'line', + data: winRates, + stroke: { + width: 2, + }, + }], + xaxis: { + categories: ['Mon', 'Tues', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun'], + labels: { + rotate: 0, + style: { + colors: '#c3c3c3bb', + fontSize: '14px', + fontWeight: 600 + } + }, + axisBorder: { + show: false + }, + axisTicks: { + show: false + } + }, + colors: ['#605CFF', '#83E9FF'], + yaxis: { + show: false + }, + grid: { + show: false + }, + tooltip: { + enabled: false + }, + dataLabels: { + enabled: false + }, + legend: { + show: false + } + }; + + var chart = new ApexCharts(document.querySelector("#chart2"), options); + chart.render(); +} + +formatRecordsTimestamp(".record-date"); +loadDonutChart(); +loadBarLineChart(); + diff --git a/backend/static/js/tab-recent-matches.js b/backend/static/js/tab-recent-matches.js index 99a503d..f26a45e 100644 --- a/backend/static/js/tab-recent-matches.js +++ b/backend/static/js/tab-recent-matches.js @@ -73,7 +73,7 @@ function formatTimestamp_second(timestamp) { } // Function to convert the content of the div -function formatHours(div_class) { +function formatRecordsTimestamp(div_class) { // Get the div element by its ID const dateDivs = document.querySelectorAll(div_class); @@ -140,5 +140,5 @@ document.addEventListener('DOMContentLoaded', (event) => { formatTournamentPlacements(); // Converte colocações formatGameDurations(); // Converte durações formatDays(".date-day"); // Converte datas - formatHours(".date-second"); // Converte datas + formatRecordsTimestamp(".date-second"); // Converte datas }); From 3ad6e8d8d4abcffaba3302a9fe99d75f4ce45cc7 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Mon, 21 Oct 2024 17:06:57 +0100 Subject: [PATCH 57/74] Code: adjusted looks of the records . --- backend/pong/templates/pages/view_profile.html | 12 ++++++------ backend/static/css/profile.css | 9 +++++---- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/backend/pong/templates/pages/view_profile.html b/backend/pong/templates/pages/view_profile.html index 6bcd731..3c9ead8 100755 --- a/backend/pong/templates/pages/view_profile.html +++ b/backend/pong/templates/pages/view_profile.html @@ -272,7 +272,7 @@
{{ goals_scored_suffered_ratio }}
-
+
Time Spent per Mode
@@ -287,9 +287,9 @@
Win Rate and Games Played / Day
Records
-
+
Max Speed -
+
Maximum Ball Speed
{{ stats.date_max_ball_speed }}
@@ -299,7 +299,7 @@
{{ stats.max_ball_speed }}
Max Speed -
+
Maximum Rally Length
{{ stats.date_max_rally_length }}
@@ -309,7 +309,7 @@
{{ stats.max_rally_length }}
Max Speed -
+
Longest Game
{{ stats.date_longest_game }}
@@ -319,7 +319,7 @@
{{ stats.longest_game }}
Max Speed -
+
Quickest Game
{{ stats.date_quickest_game }}
diff --git a/backend/static/css/profile.css b/backend/static/css/profile.css index 9ecc5f8..64596d4 100644 --- a/backend/static/css/profile.css +++ b/backend/static/css/profile.css @@ -305,20 +305,21 @@ textarea, #username-input, #email-input { } .img-tit img { - width: 25px; - height: 25px; + width: 34px; + height: 34px; + margin-right: 8px; } .record-tit { color: #FFFFFF; - font-size: small; + font-size: 15px; margin-bottom: 0; } .record-date { color: #ffffff83; font-size: x-small; - + margin-bottom: 0px; } .graph1, .graph2, .graph3, .graph4 { From f73889ffcc37aec7ff323ed654c50b57f320613a Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Mon, 21 Oct 2024 17:26:09 +0100 Subject: [PATCH 58/74] Code: aligned the profile pie chart to the left. --- backend/pong/templates/pages/view_profile.html | 2 +- backend/static/css/profile.css | 4 ++-- backend/static/js/profile.js | 14 ++++++++------ 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/backend/pong/templates/pages/view_profile.html b/backend/pong/templates/pages/view_profile.html index 3c9ead8..22eb123 100755 --- a/backend/pong/templates/pages/view_profile.html +++ b/backend/pong/templates/pages/view_profile.html @@ -272,7 +272,7 @@
{{ goals_scored_suffered_ratio }}
-
+
Time Spent per Mode
diff --git a/backend/static/css/profile.css b/backend/static/css/profile.css index 64596d4..44512d0 100644 --- a/backend/static/css/profile.css +++ b/backend/static/css/profile.css @@ -242,7 +242,7 @@ textarea, #username-input, #email-input { } .stat { text-align: center; - padding: 10px; + padding: 16px; width: 49%; border-radius: 8px; background-color: #ffffff0C; @@ -332,7 +332,7 @@ textarea, #username-input, #email-input { .stats-title { color: #c3c3c3bb; - font-size: x-small; + font-size: small; } .icon-stat { diff --git a/backend/static/js/profile.js b/backend/static/js/profile.js index 820b44a..85152ad 100644 --- a/backend/static/js/profile.js +++ b/backend/static/js/profile.js @@ -65,11 +65,14 @@ async function loadDonutChart() { var options = { chart: { - type: 'donut', - height: 200 + type: 'donut', + offsetX: -110, + height: 200, + width: '100%', + // background: '#FFFFFF' }, series: [remoteTime, aiTime, localTime, tournamentTime], - labels: ['Remote Game', 'AI mode', 'Local Game', 'Tournaments'], + labels: ['Remote Games', 'AI Mode', 'Local Games', 'Tournaments'], colors: ['#EC6158', '#46CDBD', '#66DD53', '#FFAD72'], legend: { position: 'right', @@ -79,8 +82,7 @@ async function loadDonutChart() { width: 12, height: 12 }, - fontSize: '14px', - fontWeight: 'bold', + fontSize: '16px', labels: { colors: ['#fff','#fff','#fff','#fff'] } @@ -88,7 +90,7 @@ async function loadDonutChart() { plotOptions: { pie: { donut: { - size: '70%', + size: '70%', labels: { show: true, total: { From 2766a76d04ccadaa33af4e6d6b1e89998a3d8b57 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Mon, 21 Oct 2024 17:35:16 +0100 Subject: [PATCH 59/74] Code: centered the nav tabs with the content they display. --- backend/static/css/profile.css | 2 +- backend/static/js/profile.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/static/css/profile.css b/backend/static/css/profile.css index 44512d0..490257d 100644 --- a/backend/static/css/profile.css +++ b/backend/static/css/profile.css @@ -165,7 +165,7 @@ textarea, #username-input, #email-input { } .my-nav-tabs { - padding-left: 10vw; + padding-left: calc(50% - 125px); } #tabs .my-nav-tabs { diff --git a/backend/static/js/profile.js b/backend/static/js/profile.js index 85152ad..59d69ad 100644 --- a/backend/static/js/profile.js +++ b/backend/static/js/profile.js @@ -66,7 +66,8 @@ async function loadDonutChart() { var options = { chart: { type: 'donut', - offsetX: -110, + offsetX: -110, + offsetY: 10, height: 200, width: '100%', // background: '#FFFFFF' From af4c2603e8f2165f1628a11199d4837c75497d8f Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Mon, 21 Oct 2024 18:41:46 +0100 Subject: [PATCH 60/74] Fix: fixed profile chart always placing stats on Monday. --- backend/static/js/game-stats.js | 5 +- backend/static/js/game/macros.js | 33 ++++++++++ backend/static/js/profile.js | 87 ++++++++++++++++--------- backend/static/js/tab-recent-matches.js | 3 - 4 files changed, 92 insertions(+), 36 deletions(-) diff --git a/backend/static/js/game-stats.js b/backend/static/js/game-stats.js index 0d44ff5..0c8c6f1 100644 --- a/backend/static/js/game-stats.js +++ b/backend/static/js/game-stats.js @@ -89,7 +89,10 @@ async function loadCharts() { var options = { chart: { - type: 'line' + type: 'line', + toolbar: { + show: false + }, }, stroke: { curve: 'straight', diff --git a/backend/static/js/game/macros.js b/backend/static/js/game/macros.js index 39c624c..6976f51 100644 --- a/backend/static/js/game/macros.js +++ b/backend/static/js/game/macros.js @@ -91,4 +91,37 @@ export var TEST_GOALS = [ 'rally_length': Math.round(Math.random() * 30), 'ball_speed': Math.random() * 10, }, +]; + +export const TEST_STATS = [ + { + day: "2024-10-18T00:00:00Z", + total_games: 5, + win_rate: 1 + }, + { + day: "2024-10-19T00:00:00Z", + total_games: 6, + win_rate: 2 + }, + { + day: "2024-10-20T00:00:00Z", + total_games: 7, + win_rate: 3 + }, + { + day: "2024-10-21T00:00:00Z", + total_games: 8, + win_rate: 4 + }, + { + day: "2024-10-22T00:00:00Z", + total_games: 16, + win_rate: 9 + }, + { + day: "2024-10-24T00:00:00Z", + total_games: 7, + win_rate: 7 + } ]; \ No newline at end of file diff --git a/backend/static/js/profile.js b/backend/static/js/profile.js index 59d69ad..51f200c 100644 --- a/backend/static/js/profile.js +++ b/backend/static/js/profile.js @@ -1,11 +1,9 @@ +import { TEST_STATS } from "./game/macros"; -// Get the modal var modal2 = document.getElementById("modal2"); -// Get the button that opens the modal var btn2 = document.getElementById("remove-friend-button"); -// Get the element that closes the modal var goback = document.getElementById("cancel"); -// When the user clicks the button, open the modal + if (btn2) { btn2.onclick = function() { modal2.style.display = "block"; @@ -16,7 +14,6 @@ goback.onclick = function() { modal2.style.display = "none"; } -// When the user clicks anywhere outside of the modal2, close it window.onclick = function(event) { if (event.target == modal2) { modal2.style.display = "none"; @@ -127,21 +124,30 @@ async function loadBarLineChart() { const response = await fetch(`/graph/${userID}`, { method: "GET", }); - const stats = await response.json(); - console.log(stats); + const dailyRawStats = await response.json(); + // const dailyRawStats = TEST_STATS; - const tempRates = stats.map((x) => x.win_rate); - const tempTotalGames = stats.map((x) => x.total_games); + const tempRates = dailyRawStats.map((x) => x.win_rate); + const tempTotalGames = dailyRawStats.map((x) => x.total_games); const winRates = new Array(7).fill(0); const totalGames = new Array(7).fill(0); - console.log(tempRates); - console.log(tempTotalGames); - tempRates.forEach((rate, i) => { - winRates[i] = rate}); - tempTotalGames.forEach((games, i) => totalGames[i] = games); + tempRates.forEach((winRate, i) => { + const timestamp = new Date(dailyRawStats[i].day); + if (timestamp.getDate() < new Date().getDate()) + return ; + + const weekday = (timestamp.getDay() + 6) % 7; + winRates[weekday] = winRate; + }); + tempTotalGames.forEach((numGames, i) => { + const timestamp = new Date(dailyRawStats[i].day); + if (timestamp.getDate() < new Date().getDate()) + return ; - console.log(winRates, totalGames); + const weekday = (timestamp.getDay() + 6) % 7; + totalGames[weekday] = numGames; + }); var options = { chart: { @@ -153,18 +159,26 @@ async function loadBarLineChart() { }, width: '100%', }, - series: [{ - name: 'Win Rate', - type: 'column', - data: totalGames - }, { - name: 'Win Rate Line', - type: 'line', - data: winRates, - stroke: { - width: 2, - }, - }], + plotOptions: { + bar: { + borderRadius: 10, + } + }, + series: [ + { + name: 'Games Played', + type: 'column', + data: totalGames + }, + { + name: 'Win Rate (%)', + type: 'line', + data: winRates, + stroke: { + width: 2, + }, + } + ], xaxis: { categories: ['Mon', 'Tues', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun'], labels: { @@ -190,13 +204,22 @@ async function loadBarLineChart() { show: false }, tooltip: { - enabled: false - }, + y: { + formatter: function (val) { + return val; + } + } + }, dataLabels: { - enabled: false - }, + enabled: false, + }, legend: { - show: false + show: true, + horizontalAlign: 'center', + fontSize: '14px', + labels: { + colors: ['#FFFFFF', '#FFFFFF'], + }, } }; diff --git a/backend/static/js/tab-recent-matches.js b/backend/static/js/tab-recent-matches.js index f26a45e..44c044a 100644 --- a/backend/static/js/tab-recent-matches.js +++ b/backend/static/js/tab-recent-matches.js @@ -59,15 +59,12 @@ function formatDays(div_class) { } function formatTimestamp_second(timestamp) { - console.log(timestamp); const date = new Date(timestamp); const hours = String(date.getUTCHours()).padStart(2, '0'); const minutes = String(date.getUTCMinutes()).padStart(2, '0'); const seconds = String(date.getUTCSeconds()).padStart(2, '0'); - console.log(`${hours}:${minutes}:${seconds}`); - // Format the result as dd, mmm yyyy hh:mm:ss return `${hours}:${minutes}:${seconds}`; } From 9e3be275dc35968bab2faf582c5686a15c4c13ac Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Mon, 21 Oct 2024 18:50:49 +0100 Subject: [PATCH 61/74] Fix: added a new condition to halt django until the postgres database is fully initialized. I still need to make migrations automatic. --- backend/pong/migrations/0001_initial.py | 177 ------------------------ docker-compose.yml | 11 +- 2 files changed, 9 insertions(+), 179 deletions(-) delete mode 100644 backend/pong/migrations/0001_initial.py diff --git a/backend/pong/migrations/0001_initial.py b/backend/pong/migrations/0001_initial.py deleted file mode 100644 index 8482f21..0000000 --- a/backend/pong/migrations/0001_initial.py +++ /dev/null @@ -1,177 +0,0 @@ -# Generated by Django 5.1.2 on 2024-10-21 13:26 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('auth', '0012_alter_user_first_name_max_length'), - ] - - operations = [ - migrations.CreateModel( - name='Users', - fields=[ - ('password', models.CharField(max_length=128, verbose_name='password')), - ('id', models.AutoField(primary_key=True, serialize=False, unique=True)), - ('user_42', models.IntegerField(null=True)), - ('username', models.CharField(max_length=64, unique=True)), - ('description', models.TextField(blank=True, null=True)), - ('email', models.EmailField(blank=True, max_length=254, null=True)), - ('picture', models.ImageField(default='default.jpg', null=True, upload_to='upload')), - ('status', models.CharField(default='Offline', max_length=7)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('is_active', models.BooleanField(default=True)), - ('is_staff', models.BooleanField(default=False)), - ('is_superuser', models.BooleanField(default=False)), - ('last_login', models.DateTimeField(blank=True, null=True)), - ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), - ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='Games', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('type', models.CharField(max_length=20)), - ('start_date', models.DateTimeField()), - ('duration', models.IntegerField(default=0)), - ('nb_goals_user1', models.IntegerField(default=0)), - ('nb_goals_user2', models.IntegerField(default=0)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('user1_id', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='game_user1', to=settings.AUTH_USER_MODEL)), - ('user2_id', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='game_user2', to=settings.AUTH_USER_MODEL)), - ('winner_id', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='game_winner', to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='GamesStats', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('longer_rally', models.IntegerField(default=0)), - ('shorter_rally', models.IntegerField(default=0)), - ('average_rally', models.IntegerField(default=0)), - ('max_ball_speed', models.IntegerField(default=0)), - ('min_ball_speed', models.IntegerField(default=0)), - ('average_ball_speed', models.IntegerField(default=0)), - ('greatest_deficit_overcome', models.IntegerField(default=0)), - ('most_consecutive_goals', models.IntegerField(default=0)), - ('biggest_lead', models.IntegerField(default=0)), - ('bg_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='bg_games', to=settings.AUTH_USER_MODEL)), - ('game', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pong.games')), - ('gdo_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='gdo_games', to=settings.AUTH_USER_MODEL)), - ('mcg_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mcg_games', to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='Goals', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('timestamp', models.DateTimeField(null=True)), - ('rally_length', models.IntegerField(default=0)), - ('ball_speed', models.FloatField(default=0)), - ('game', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pong.games')), - ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='user_goals', to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='Notifications', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('type', models.CharField()), - ('status', models.CharField(default='Pending')), - ('description', models.CharField(max_length=255)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('other_user_id', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='other', to=settings.AUTH_USER_MODEL)), - ('user_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='me', to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='Tournaments', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=64)), - ('capacity', models.IntegerField()), - ('status', models.CharField(default='Open')), - ('duration', models.IntegerField(default=0)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('host_id', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tournament_host', to=settings.AUTH_USER_MODEL)), - ('winner_id', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tournament_winner', to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='TournamentsGames', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('phase', models.CharField()), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('game_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pong.games')), - ('tournament_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pong.tournaments')), - ], - ), - migrations.CreateModel( - name='UserStats', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('nb_tournaments_played', models.IntegerField(default=0)), - ('nb_tournaments_won', models.IntegerField(default=0)), - ('nb_games_played', models.IntegerField(default=0)), - ('nb_games_won', models.IntegerField(default=0)), - ('nb_goals_scored', models.IntegerField(default=0)), - ('nb_goals_suffered', models.IntegerField(default=0)), - ('max_ball_speed', models.IntegerField(default=0)), - ('date_max_ball_speed', models.DateTimeField(null=True)), - ('max_rally_length', models.IntegerField(default=0)), - ('date_max_rally_length', models.DateTimeField(null=True)), - ('quickest_game', models.IntegerField(default=2147483647)), - ('date_quickest_game', models.DateTimeField(null=True)), - ('longest_game', models.IntegerField(default=0)), - ('date_longest_game', models.DateTimeField(null=True)), - ('num_first_goals', models.IntegerField(default=0)), - ('remote_time_played', models.IntegerField(default=0)), - ('local_time_played', models.IntegerField(default=0)), - ('ai_time_played', models.IntegerField(default=0)), - ('tournament_time_played', models.IntegerField(default=0)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('user_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='Friends', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('accepted', models.BooleanField(default=False)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('user1_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='friends_with', to=settings.AUTH_USER_MODEL)), - ('user2_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='friends_of', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'unique_together': {('user1_id', 'user2_id')}, - }, - ), - migrations.CreateModel( - name='TournamentsUsers', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('alias', models.CharField(max_length=64)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('placement', models.IntegerField(default=0)), - ('score', models.IntegerField(default=0)), - ('tournament_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pong.tournaments')), - ('user_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'unique_together': {('user_id', 'tournament_id')}, - }, - ), - ] diff --git a/docker-compose.yml b/docker-compose.yml index 113f1fe..26927e6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,8 +12,10 @@ services: networks: - Transcendence depends_on: - - postgres - - redis + postgres: + condition: service_healthy + redis: + condition: service_started env_file: - .env restart: on-failure @@ -32,6 +34,11 @@ services: - Transcendence env_file: - .env + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 5s + timeout: 5s + retries: 5 pgadmin4: container_name: pgadmin4-container From b2ddab7f484c81d7a5f8b606ccb03c86e66ffe18 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Tue, 22 Oct 2024 16:04:55 +0100 Subject: [PATCH 62/74] Fix: migrations are automatic uppon docker compose up. --- backend/Dockerfile | 8 +- backend/pong/migrations/0001_initial.py | 177 ++++++++++++++++++++++++ docker-compose.yml | 2 +- 3 files changed, 182 insertions(+), 5 deletions(-) create mode 100644 backend/pong/migrations/0001_initial.py diff --git a/backend/Dockerfile b/backend/Dockerfile index 481a8c2..5194539 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -16,7 +16,7 @@ RUN apk add --update --no-cache python3-dev python3 py3-pip gcc musl-dev libpq-d && pip install "channels[daphne]" \ && rm -rf /var/cache/apk/* - - - -CMD source /.venv/bin/activate && python3 ./manage.py runserver 0.0.0.0:8002 \ No newline at end of file +CMD source /.venv/bin/activate \ + && python3 manage.py makemigrations \ + && python3 manage.py migrate \ + && python3 ./manage.py runserver 0.0.0.0:8002 \ No newline at end of file diff --git a/backend/pong/migrations/0001_initial.py b/backend/pong/migrations/0001_initial.py new file mode 100644 index 0000000..5f20a13 --- /dev/null +++ b/backend/pong/migrations/0001_initial.py @@ -0,0 +1,177 @@ +# Generated by Django 5.1.2 on 2024-10-22 15:01 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='Users', + fields=[ + ('password', models.CharField(max_length=128, verbose_name='password')), + ('id', models.AutoField(primary_key=True, serialize=False, unique=True)), + ('user_42', models.IntegerField(null=True)), + ('username', models.CharField(max_length=64, unique=True)), + ('description', models.TextField(blank=True, null=True)), + ('email', models.EmailField(blank=True, max_length=254, null=True)), + ('picture', models.ImageField(default='default.jpg', null=True, upload_to='upload')), + ('status', models.CharField(default='Offline', max_length=7)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('is_active', models.BooleanField(default=True)), + ('is_staff', models.BooleanField(default=False)), + ('is_superuser', models.BooleanField(default=False)), + ('last_login', models.DateTimeField(blank=True, null=True)), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Games', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('type', models.CharField(max_length=20)), + ('start_date', models.DateTimeField()), + ('duration', models.IntegerField(default=0)), + ('nb_goals_user1', models.IntegerField(default=0)), + ('nb_goals_user2', models.IntegerField(default=0)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('user1_id', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='game_user1', to=settings.AUTH_USER_MODEL)), + ('user2_id', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='game_user2', to=settings.AUTH_USER_MODEL)), + ('winner_id', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='game_winner', to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='GamesStats', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('longer_rally', models.IntegerField(default=0)), + ('shorter_rally', models.IntegerField(default=0)), + ('average_rally', models.IntegerField(default=0)), + ('max_ball_speed', models.IntegerField(default=0)), + ('min_ball_speed', models.IntegerField(default=0)), + ('average_ball_speed', models.IntegerField(default=0)), + ('greatest_deficit_overcome', models.IntegerField(default=0)), + ('most_consecutive_goals', models.IntegerField(default=0)), + ('biggest_lead', models.IntegerField(default=0)), + ('bg_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='bg_games', to=settings.AUTH_USER_MODEL)), + ('game', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pong.games')), + ('gdo_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='gdo_games', to=settings.AUTH_USER_MODEL)), + ('mcg_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mcg_games', to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Goals', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('timestamp', models.DateTimeField(null=True)), + ('rally_length', models.IntegerField(default=0)), + ('ball_speed', models.FloatField(default=0)), + ('game', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pong.games')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='user_goals', to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Notifications', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('type', models.CharField()), + ('status', models.CharField(default='Pending')), + ('description', models.CharField(max_length=255)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('other_user_id', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='other', to=settings.AUTH_USER_MODEL)), + ('user_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='me', to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Tournaments', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=64)), + ('capacity', models.IntegerField()), + ('status', models.CharField(default='Open')), + ('duration', models.IntegerField(default=0)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('host_id', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tournament_host', to=settings.AUTH_USER_MODEL)), + ('winner_id', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tournament_winner', to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='TournamentsGames', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('phase', models.CharField()), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('game_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pong.games')), + ('tournament_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pong.tournaments')), + ], + ), + migrations.CreateModel( + name='UserStats', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('nb_tournaments_played', models.IntegerField(default=0)), + ('nb_tournaments_won', models.IntegerField(default=0)), + ('nb_games_played', models.IntegerField(default=0)), + ('nb_games_won', models.IntegerField(default=0)), + ('nb_goals_scored', models.IntegerField(default=0)), + ('nb_goals_suffered', models.IntegerField(default=0)), + ('max_ball_speed', models.IntegerField(default=0)), + ('date_max_ball_speed', models.DateTimeField(null=True)), + ('max_rally_length', models.IntegerField(default=0)), + ('date_max_rally_length', models.DateTimeField(null=True)), + ('quickest_game', models.IntegerField(default=2147483647)), + ('date_quickest_game', models.DateTimeField(null=True)), + ('longest_game', models.IntegerField(default=0)), + ('date_longest_game', models.DateTimeField(null=True)), + ('num_first_goals', models.IntegerField(default=0)), + ('remote_time_played', models.IntegerField(default=0)), + ('local_time_played', models.IntegerField(default=0)), + ('ai_time_played', models.IntegerField(default=0)), + ('tournament_time_played', models.IntegerField(default=0)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('user_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Friends', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('accepted', models.BooleanField(default=False)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('user1_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='friends_with', to=settings.AUTH_USER_MODEL)), + ('user2_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='friends_of', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'unique_together': {('user1_id', 'user2_id')}, + }, + ), + migrations.CreateModel( + name='TournamentsUsers', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('alias', models.CharField(max_length=64)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('placement', models.IntegerField(default=0)), + ('score', models.IntegerField(default=0)), + ('tournament_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pong.tournaments')), + ('user_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'unique_together': {('user_id', 'tournament_id')}, + }, + ), + ] diff --git a/docker-compose.yml b/docker-compose.yml index 26927e6..cf0f823 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -36,7 +36,7 @@ services: - .env healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] - interval: 5s + interval: 3s timeout: 5s retries: 5 From ffd0d4dfb42b77f13fb24732f5f38b75399c95c9 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Tue, 22 Oct 2024 16:42:34 +0100 Subject: [PATCH 63/74] Code: a new informative div takes the place of charts when there is no data. --- .../pong/templates/pages/view_profile.html | 30 +- backend/pong/views.py | 1 - .../static/assets/images/no-data-image.png | Bin 0 -> 2097 bytes backend/static/css/profile.css | 495 +++++++++--------- 4 files changed, 275 insertions(+), 251 deletions(-) create mode 100644 backend/static/assets/images/no-data-image.png diff --git a/backend/pong/templates/pages/view_profile.html b/backend/pong/templates/pages/view_profile.html index 22eb123..4192688 100755 --- a/backend/pong/templates/pages/view_profile.html +++ b/backend/pong/templates/pages/view_profile.html @@ -272,18 +272,32 @@
{{ goals_scored_suffered_ratio }}
-
-
Time Spent per Mode
-
+ {% if games|length > 0 %} +
+
Time Spent per Mode
+
-
+ {% else %} +
+ +

No Available Data

+ You haven't played any games yet! +
+ {% endif %}
-
-
Win Rate and Games Played / Day
-
+ {% if games|length > 0 %} +
+
Win Rate and Games Played / Day
+
-
+ {% else %} +
+ +

No Available Data

+ You haven't played any games yet! +
+ {% endif %}
Records
diff --git a/backend/pong/views.py b/backend/pong/views.py index 021b6e2..45a2759 100644 --- a/backend/pong/views.py +++ b/backend/pong/views.py @@ -1298,7 +1298,6 @@ def profile(request, id): goals_scored_suffered_ratio = 0 graph = win_rate_nb_games_day(request, user_profile.id) graph_send = json.loads(graph.content) - ic(GamesSerializer(games[0]).data) context = { 'friends': friends, 'user_id': user_id, diff --git a/backend/static/assets/images/no-data-image.png b/backend/static/assets/images/no-data-image.png new file mode 100644 index 0000000000000000000000000000000000000000..f25a512214f616f16ab87c0880eff5de7c250ca9 GIT binary patch literal 2097 zcmV-12+sG3P)002w~1^@s6>PfuR00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yP2MDZr0(b&Ujyaheb3rD# zJ64rRx{I`HL*X+iA9nsTAN*3$Gn264BK(TEtWdPzDv-j&lR5U2Wpv4`U&1U2|## zxLxw*2%S4{_&(l2@f}2Obo%GJkOHh1VA8E#R}gNE88dJD6pqybl+i7sb06C0?6lw$ znaehJ$qrb`ddZtnE2KqnAPRI%O@_v$k|I>Uk-vTsQAA&ofylx z;2gi$^?KTAH$2GKJNpO_UzWL<@&1PM?uURZ#NCxYpnD_W8n5mwjTO8_P>kw%z^dN| zH+o%%@0@EtNibA~?aPGLx(BkfDDDR+M)^cEdJx0!L(FwJ2{9P5O8Wt0bxxB}SF9Gb zgOF&{`#8?E$3FU=yE`|Olf2>3=iBh>&(r3={CH767GDmJU+DgV!8VvzkD5+7CqCi6 zeyr=S(E8J+t{cbC^5gX0?@zdpW51B3f!t8qcmkEbe}Oneqv9ecM6C~qhscuDvcCals~~%}i3Q&%dTFE#N-%0@Keo3T+XzKah{`Tl0!ot;Oqv96 zwt7$Wp;CYj=6-~XCL$}S4s||YKfYfLnRAnAj~a&O<7jgQl7#q#&U+v4ov6GDebs(o zUvNs>3W-7=FdX^zMdKuMQW1YJX!HpO0t)j`pej4A;-19rc; z_dg3KqH9#1-eUnigd`#2J9gol`mu=5tjC*(Zhj${21Tgpf>*0+p4RS-7#=vQX?<9Y z0P~snVzZ^_Ua1ivfs+X^CaCCMDH;Wn3mLKC=@>PBpc(->%AD(?gjYmPf)W&2K(uwI z+wf6j0X0p-xG*3x=NE=pLA3a7wjptFo0>xX%@(8qO#&R)0`5Nh4U&$;6YlgGQ@9T< zD8bs?Fc~_?1ekH8WCF}MQZ)I1J`CvF9CN<|96wV(t~~#}X_I&okbsGi55B4&%UbXO zd{;FY6RgOL(39L)Q`Q3H<0IT~*_qZhjvgpl#|I^->4Fi^y4-k&2dS}uY6NJ=BrAX~ z$w;X%B`69;$Sh!d&<7Vi!sz?hJtd!RFhR5giclp$1X|>ueeZo8WOv!y zW{`wP9bYHBM|x0~nq#Yca~15(f`3r_{LJ+!P=va*U?RE=8681|DcTe+#nA%a>b^2T zr6oC$lzIhas1u-Mf7&X~7yHQ%m^<}p^Tu@Xw~{8n{OP95{NlIvB|xHk8f%BB49DVb zSlu`Mu;IbSEl`L`0ao)NXLEvkP%+C9{gx3ch&Wi9-q!jYw6)UICATFCYDJQix5N{+ zCO~RyZ%aZXiBH7*nT9sGFerR4u7Xn33Q)fBZ%XsGowzyi>RaN(C!7f%HFjStLC`3` zmPA2qFU3COPKy8~m~_8NNv#Qy!T{8>2Tyg#Z)qW~xNe;4ko;{R58_1sQlM|f(*$v@ z@->cp8&NGlSsxC_^z44j#xqDRony0U^Evc_t-q(eYNq;-{E33M*sCiJR{rFlIdCS< zNj!f01(lXqSF_z#KdzBZ$t}aWA3OUP%CVwc ztK<$G&&su`#ENa1(iKa&Dp0f;=KzESt8EaUV9mZ@@r8EDd<%-UBo4ruyhmHAr3+Sc z!Huk!yqOVn?t^_1Ga|mr#|xfSk>S<}P_R&hR*FxsGBt;MP`mc{gubof6Rfm=HKMw5 zVhLT)i67Mh_Q6uDPEI5r+$K*~7>z-!+-8|-u~~eA)fTXk&C<;)h#-NiE+m^Z}es!mGbKXh`_V9Zoh3YAw^(1rF@7C-v8jAG>w%VdJ(ys}&^ bZ=3%CMt>z;-*O#T00000NkvXXu0mjfQO4Jt literal 0 HcmV?d00001 diff --git a/backend/static/css/profile.css b/backend/static/css/profile.css index 490257d..192ee37 100644 --- a/backend/static/css/profile.css +++ b/backend/static/css/profile.css @@ -1,98 +1,98 @@ #main-wrapper { - width: 100%; - gap: 20px; - /*height: inherit;*/ - /*overflow: visible;*/ + width: 100%; + gap: 20px; + /*height: inherit;*/ + /*overflow: visible;*/ } #profile-main { - /*width: 30%; */ - flex-shrink: 0; - width:initial; - padding-top: 80px; + /*width: 30%; */ + flex-shrink: 0; + width:initial; + padding-top: 80px; } .side-profile { - flex-direction: column; - width: 15vw; /* Adjust width as needed */ - padding: 20px; - border-radius: 8px; - color: #FFFFFF; + flex-direction: column; + width: 15vw; /* Adjust width as needed */ + padding: 20px; + border-radius: 8px; + color: #FFFFFF; min-width: 360px; } .side-profile img.profile-big { - width: 150px; - height: 150px; - border-radius: 50%; + width: 150px; + height: 150px; + border-radius: 50%; object-fit: cover; } #change-info2 { - width: inherit; - font-size: small; - color: #f2f2f2; + width: inherit; + font-size: small; + color: #f2f2f2; min-width: inherit; } .side-profile .description { - text-align: center; - margin-top: 10px; + text-align: center; + margin-top: 10px; } #description-form{ - width: inherit; - display: none; + width: inherit; + display: none; } textarea, #username-input, #email-input { - width: 100%; - border-radius: 5px; - background-color: #101d27; - border: none; - color: white; + width: 100%; + border-radius: 5px; + background-color: #101d27; + border: none; + color: white; } .description{ - width: inherit; + width: inherit; } .user-description { - display: inline; - vertical-align: middle; - margin-block: 10px; + display: inline; + vertical-align: middle; + margin-block: 10px; overflow-y: scroll; text-overflow: ellipsis; max-height: 200px; text-align: center; - overflow-x: hidden; - width: 100%; + overflow-x: hidden; + width: 100%; } .text-block{ - font-size: small; - margin: 0; + font-size: small; + margin: 0; } .email-joined-edit { - padding-top: 5px; - padding-bottom: 5px; + padding-top: 5px; + padding-bottom: 5px; } .edit-change, .save-cancel { - width: 360px; + width: 360px; height: 52.3px; } .side-profile button { - padding: 10px 20px; - width: 170px; + padding: 10px 20px; + width: 170px; } .edit, #save-profile-button { - background-color: #1A3141; + background-color: #1A3141; } .edit:hover, #save-profile-button:hover { @@ -112,7 +112,7 @@ textarea, #username-input, #email-input { } #open-change-password-modal, #cancel-edit-button, .friend-status { - background-color: #1D2731; + background-color: #1D2731; } #decline-friend-button { @@ -128,7 +128,7 @@ textarea, #username-input, #email-input { } #cancel-change-password-button { - background-color: #1D2731; + background-color: #1D2731; border: none; } @@ -138,244 +138,244 @@ textarea, #username-input, #email-input { } #change-password-form { - flex-direction: column; - color: #f2f2f2; - width: 100%; + flex-direction: column; + color: #f2f2f2; + width: 100%; padding-top: 10px; padding-bottom: 16px; - + } #change-password-form label { - padding-top: 6px; + padding-top: 6px; } .pass-input { - background-color: #101d27; - width: 99%; - border-radius: 5px; - border: none; + background-color: #101d27; + width: 99%; + border-radius: 5px; + border: none; color: #c3c3c3bb; - flex-shrink: 0; + flex-shrink: 0; } #tabs { - width: 80%; - padding-top: 30px; - min-width: 900px; + width: 80%; + padding-top: 30px; + min-width: 900px; } .my-nav-tabs { - padding-left: calc(50% - 125px); + padding-left: calc(50% - 125px); } #tabs .my-nav-tabs { - margin-bottom: 20px; - border-bottom: none; + margin-bottom: 20px; + border-bottom: none; } #tabs .nav-item .nav-link { - display: inline-block; - cursor: pointer; - color: #c3c3c3bb; + display: inline-block; + cursor: pointer; + color: #c3c3c3bb; } .nav-item { - padding: 10px; + padding: 10px; } #tabs .nav-item .nav-link.active { - color: #f8f9fa; - font-weight: bold; - background: none; - border: none; - border-bottom: 2px solid #F8D082; + color: #f8f9fa; + font-weight: bold; + background: none; + border: none; + border-bottom: 2px solid #F8D082; } .stats-history { - flex-direction: column; - flex: 1; - padding: 20px; + flex-direction: column; + flex: 1; + padding: 20px; } .stats { - flex-direction: column; - margin-bottom: 20px; - color: #FFFFFF; - padding: 20px; + flex-direction: column; + margin-bottom: 20px; + color: #FFFFFF; + padding: 20px; } .topic { - margin-bottom: 20px; + margin-bottom: 20px; } .topic .icon { - width: 24px; - height: 24px; - margin-right: 10px; + width: 24px; + height: 24px; + margin-right: 10px; } .stats2 { - flex-direction: column; - width: 100%; - height: 100%; - + flex-direction: column; + width: 100%; + height: 100%; + } .profile-head { - height: 40%; - min-height: 266px; + height: 40%; + min-height: 266px; } .percentages { - margin-bottom: 20px; + margin-bottom: 20px; } .stats-head { - flex-direction: column; - width: 50%; - height: 100%; - margin: 5px; + flex-direction: column; + width: 50%; + height: 100%; + margin: 5px; } .two-joined { - height: 50%; + height: 50%; } .stat { - text-align: center; - padding: 16px; - width: 49%; - border-radius: 8px; - background-color: #ffffff0C; - border: 1px solid #ffffff2a; - + text-align: center; + padding: 16px; + width: 49%; + border-radius: 8px; + background-color: #ffffff0C; + border: 1px solid #ffffff2a; + } .donut { - border-radius: 8px; - background-color: #ffffff0C; - border: 1px solid #ffffff2a; - flex-direction: column; - width: 50%; - height: 100%; - margin: 5px; - + border-radius: 8px; + background-color: #ffffff0C; + border: 1px solid #ffffff2a; + flex-direction: column; + width: 50%; + height: 100%; + margin: 5px; + } .profile-foot { - width: 100%; - height: 60%; - margin-top: 10px; + width: 100%; + height: 60%; + margin-top: 10px; } .bar-graphs { - border-radius: 8px; - background-color: #ffffff0C; - border: 1px solid #ffffff2a; - width: 65%; - height: 100%; - margin: 5px; + border-radius: 8px; + background-color: #ffffff0C; + border: 1px solid #ffffff2a; + width: 65%; + height: 100%; + margin: 5px; } .records { - margin: 5px; - border-radius: 8px; - background-color: #ffffff0C; - border: 1px solid #ffffff2a; - width: 35%; - height: 100%; + margin: 5px; + border-radius: 8px; + background-color: #ffffff0C; + border: 1px solid #ffffff2a; + width: 35%; + height: 100%; } .record-info { - width: 100%; - padding: 20px; - padding-bottom: 5px; + width: 100%; + padding: 20px; + padding-bottom: 5px; } .record-info-tit { - height: 35px; - text-align: left; - padding-left: 5px; + height: 35px; + text-align: left; + padding-left: 5px; } .img-tit { - flex-direction: row; + flex-direction: row; } .img-tit img { - width: 34px; - height: 34px; + width: 34px; + height: 34px; margin-right: 8px; } .record-tit { - color: #FFFFFF; - font-size: 15px; - margin-bottom: 0; + color: #FFFFFF; + font-size: 15px; + margin-bottom: 0; } .record-date { - color: #ffffff83; - font-size: x-small; + color: #ffffff83; + font-size: x-small; margin-bottom: 0px; } .graph1, .graph2, .graph3, .graph4 { - width: 15vw; - height: 100px; - margin-left: 10px; - background-color: #101d27; /* Light gray background for graphs */ - border-radius: 8px; + width: 15vw; + height: 100px; + margin-left: 10px; + background-color: #101d27; /* Light gray background for graphs */ + border-radius: 8px; } .stats-title { - color: #c3c3c3bb; - font-size: small; + color: #c3c3c3bb; + font-size: small; } .icon-stat { - height: 30px; - width: 30px; + height: 30px; + width: 30px; } .graph-title { - align-self: flex-start; - padding: 20px; - font-size: x-large; - padding-bottom: 5px; + align-self: flex-start; + padding: 20px; + font-size: x-large; + padding-bottom: 5px; } .winr, .graph-value { - font-weight: bold; - color: #F8D082; - font-size: x-large; + font-weight: bold; + color: #F8D082; + font-size: x-large; } .numbers-stat{ - flex-direction: column; + flex-direction: column; } .numbers-stat h4 { - margin: 0; + margin: 0; } .graph-img { - max-width: 50%; - max-height: 50%; + max-width: 50%; + max-height: 50%; } #games, #tournaments{ - height: 750px; + height: 750px; overflow-y: auto; - overflow-x: hidden; + overflow-x: hidden; } .match-history-list { overflow-y: auto; - width: 100%; + width: 100%; } @@ -386,102 +386,113 @@ textarea, #username-input, #email-input { #togglePassword, #togglePassword2, #togglePassword3 { position: relative; - right: 30px; - top: -4%; - background: none; - border: none; - cursor: pointer; - padding: 0; + right: 30px; + top: -4%; + background: none; + border: none; + cursor: pointer; + padding: 0; } .tournament-details { - width: 98%; - margin-left: 10px; - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; - height: 252px; - overflow-y: scroll; + width: 98%; + margin-left: 10px; + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + height: 252px; + overflow-y: scroll; } .apexcharts-legend-text { - font-family: inherit; - padding-left: 25px; + font-family: inherit; + padding-left: 25px; } #chart1 { - display: flex; - align-items: center; + display: flex; + align-items: center; } .apexcharts-datalabel-label, .apexcharts-datalabel-value { - fill: #fff !important; + fill: #fff !important; } #chart2 { - width: 100%; -} - - - /* The switch - the box around the slider */ - .switch { - position: relative; - display: inline-block; - width: 43px; - height: 20px; - - } - - /* Hide default HTML checkbox */ - .switch input { - opacity: 0; - width: 0; - height: 0; - } - - /* The slider */ - .slider { - position: absolute; - cursor: pointer; - top: 0; - left: 0; - right: 0; - bottom: 0; - border: 1px solid #cccccc4d; - -webkit-transition: .4s; - transition: .4s; - } - - .slider:before { - position: absolute; - content: ""; - height: 18px; - width: 18px; - left: 1px; - bottom: 0px; - background-color: #ffffffd3; - -webkit-transition: .4s; - transition: .4s; - } - - input:checked + .slider { - background-color: #F8D082; - } - - - input:checked + .slider:before { - -webkit-transform: translateX(20px); - -ms-transform: translateX(20px); - transform: translateX(20px); - } - - /* Rounded sliders */ - .slider.round { - border-radius: 34px; - height: 20px; - width: 42px; - } - - .slider.round:before { - border-radius: 50%; - } \ No newline at end of file + width: 100%; +} + + +/* The switch - the box around the slider */ +.switch { + position: relative; + display: inline-block; + width: 43px; + height: 20px; + +} + +/* Hide default HTML checkbox */ +.switch input { + opacity: 0; + width: 0; + height: 0; +} + +/* The slider */ +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + border: 1px solid #cccccc4d; + -webkit-transition: .4s; + transition: .4s; +} + +.slider:before { + position: absolute; + content: ""; + height: 18px; + width: 18px; + left: 1px; + bottom: 0px; + background-color: #ffffffd3; + -webkit-transition: .4s; + transition: .4s; +} + +input:checked + .slider { + background-color: #F8D082; +} + + +input:checked + .slider:before { + -webkit-transform: translateX(20px); + -ms-transform: translateX(20px); + transform: translateX(20px); +} + +/* Rounded sliders */ +.slider.round { + border-radius: 34px; + height: 20px; + width: 42px; +} + +.slider.round:before { + border-radius: 50%; +} + +.no-data { + color: white; +} + +.no-data h4 { + font-weight: bolder; + margin-bottom: 4px; + margin-top: 16px; +} + From 9b1f99ac65f436c9bcb03d4931b59fcc0ba842bf Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Tue, 22 Oct 2024 18:19:26 +0100 Subject: [PATCH 64/74] Files: replaced no data image. --- .../static/assets/images/no-data-image.png | Bin 2097 -> 5937 bytes backend/static/css/profile.css | 4 ++++ 2 files changed, 4 insertions(+) diff --git a/backend/static/assets/images/no-data-image.png b/backend/static/assets/images/no-data-image.png index f25a512214f616f16ab87c0880eff5de7c250ca9..43f7e600a37da5e743c12a0f555ae62fd1a8f6c6 100644 GIT binary patch literal 5937 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 TV_93i00000NkvXXu0mjfs|#Me delta 2069 zcmV+w20000?2nGNE0P0D+)R7@He+R}% zL_t(|0qvd5auY`o$Gca?mSYkORRM|=uuiIyTWno&NhO#|j)`;0EfsizkOv5?c>;I> zOpZC39CJY?x#T378;2ANgesg=VME#YL*D6huU4`?t(7d}?b-cR$*`-nJX-zL(=*f4 zjgZk5DtVJz05j<1rjcldPfZdZe@9QdEtjt$kk8Mr0l_jj&SNscavq?J1#b;9I)aeV z#AeBxMZh_}Gt+!~W?=}hFv~=+L_mw<1+NGhbus}$C_2}1oF7;u*Z6P}4i}$qdeM-X zXEFMaa#Ah8(Apv17?!2$7ryz6EX3Pswu-3~;86>&9V!yh)ihefR0&W9e-+z~a|5bf zZQ|e$V1$(vCwJ|X-9?eKd6OR>@diugvV;!C=}7ne1ME#YXv zD}!ZNCqN6uSHnsXS|vb>f5lhBIuTkUKnn&Oaj|M(Vub+1sTOofV88fk_+w-WHcZis zfCWVJd~VkZ(1DTDp94;u=l{3A<>2KqnAPRI%O@_v$k|I>Uk-vTsQAA&of+@#aZ#u@&6W|=b*!6naX*WE`*E{v?%TeC`S22G^S&b7xr`kuQxH#xxI)26N)$ItTP^xp4JxR7JNkfed!P}+C`mA`+1I7Fl3 zA}Bi9#PR9QpP|<0NxZ5q~gf^a%$7uka5K6rrvQ=C0-v zWORh@jXKvvf0Y0uN85#rZcJ($jHv2@32<%@r`36{d5%uz*l6b!Bnk0RWevIx`+#Qs z3G_>t)j`pej4A;-19rc;_dg3KqH9#1-eUnigd`#2J9gol`mu=5tjC*(Zhj${21Tgp zf>*0+p4RS-7#=vQX?<9Y0P~snVzZ^_Ua1ivfs+X^eiq+|ljI8rqEfIbZ9+Z=Ph0~|k7KdwCg zy=jwpe-e;@iIES!svpZ*@Bw^RH5n7E$c)gF+*niA0_5W(+;G{M);5kFC|bt{C8+6w z5zxBac!vk6v4Cm>XvichfG^2NsW2rd3P#8*V0_RAB`E5GO(wvYkfM8~Mu5C9l?gB= zc}4e1jQ~%E$rz~!8NEu6QE>&+A7Z%`^gWOJN0Sv#&q$wk|x0X zf9a;o{NlIvB|xHk8f%BB49DVbSlu`Mu;IbSEl`L`0ao)NXLEvkP%+C9{gx3ch&Wi9 z-q!jYw6)UICATFCYDJQix5N{+CO~RyZ%aZXiBH7*nT9sGFerR4u7Xn33Q)fBZ%XsG zowzyi>RaN(C!7f%HFjStLC`3`mPA2qe=o&8X7_xAP?e1|5BiD#?u6GuJSdGd>c_MKv^FS$n@-f%*HcFE}dhuY4bVsf~~)& zy=tcVko<{)x7e#I4p#o;pE+E3BgaxZ@5T9Vp zzF_f%cFBATinb&Uz?!^ATdJiCR&>FQte3o*5p?c@eGxMvzRSl8o>h_I)(KFsP=r>B zPp~pIhkQ`G_V|Rpt>P1`w173Df4XvF30=^MAJqc(!BVVFP9z`PCQnxwjX|v3W|?ZS zS$u-k7O;`c(##w+cqchk*QqGsWm;qU4nisgSVJmH@*qXlkmuk?NU!i}q*{PA#3D)|YwV~Nu?vUG zT6Je1E!aN5h(jj87DB5iB~KApj5wr{S5%agX|icN&DO3HnE>}es!mGbKXh`_V9Zoh z3YAw^(1rF@7C-v8jAG>w%VdJ(ys}&^Z=3%CMt>z;-*O#T00000NkvXXu0mjfknGn` diff --git a/backend/static/css/profile.css b/backend/static/css/profile.css index 192ee37..46e94a7 100644 --- a/backend/static/css/profile.css +++ b/backend/static/css/profile.css @@ -496,3 +496,7 @@ input:checked + .slider:before { margin-top: 16px; } +.no-data img { + width: 140px; + height: 140px; +} \ No newline at end of file From d491a019c0cbcaeae19bd47a86e18492a1c9d11a Mon Sep 17 00:00:00 2001 From: Andreia Campos Date: Tue, 22 Oct 2024 19:59:36 +0100 Subject: [PATCH 65/74] Code + Fix: fixed player winner getting swapped and adjusted heatmap display. --- .../Screenshot_from_2024-07-24_19-18-59.png | Bin 0 -> 205709 bytes backend/pong/consumers.py | 5 ++--- backend/pong/migrations/0001_initial.py | 2 +- backend/pong/views.py | 3 ++- backend/static/css/game-stats.css | 14 +++++++++----- backend/static/js/game-stats.js | 15 +++++++++------ .../static/js/game/AbstractGameController.js | 4 ++-- backend/static/js/game/GameStats.js | 2 +- backend/static/js/profile.js | 2 +- 9 files changed, 27 insertions(+), 20 deletions(-) create mode 100644 backend/media/upload/Screenshot_from_2024-07-24_19-18-59.png diff --git a/backend/media/upload/Screenshot_from_2024-07-24_19-18-59.png b/backend/media/upload/Screenshot_from_2024-07-24_19-18-59.png new file mode 100644 index 0000000000000000000000000000000000000000..b502303aecd74ea3255f80b58df48a6f4fbeb0c3 GIT binary patch literal 205709 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�ZTRDE;{P`z5B~0k{7Zwb0!Jyj_?7hehLSW-!mj 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 TqX_pq0&#b+rx data['nb_goals_user2']: game.winner_id = player1 - elif data['nb_goals_user1'] < data['nb_goals_user2'] and game.type != "Local": + else: game.winner_id = player2 game.save() diff --git a/backend/static/css/game-stats.css b/backend/static/css/game-stats.css index 85b3f95..d28ed42 100644 --- a/backend/static/css/game-stats.css +++ b/backend/static/css/game-stats.css @@ -149,6 +149,7 @@ .records-title { font-size: large; color: #fff; + margin-bottom: 16px; } .rally-len, .ball-speed { @@ -183,20 +184,23 @@ .squares { color: #FFFFFF; - width: 65%; + width: 80%; min-width: 270px; - padding-bottom: 20px; + padding-bottom: 8px; } .square-length, .square-speed { - width: 25px; - height: 25px; + width: 35px; + height: 28px; background-color: #FFFFFF; border-radius: 3px; color: #836938; font-weight: bold; + font-size: 14px; margin-bottom: 3px; - + display: flex; + align-items: center; + justify-content: center; } .squares span { diff --git a/backend/static/js/game-stats.js b/backend/static/js/game-stats.js index 0c8c6f1..114b8e4 100644 --- a/backend/static/js/game-stats.js +++ b/backend/static/js/game-stats.js @@ -1,3 +1,6 @@ +const FAST_BALL_SPEED = 2; +const HIGH_RALLY_LENGTH = 15; + function interpolateColor(startColor, endColor, factor) { const result = startColor.slice(); // Create a copy of the start color for (let i = 0; i < 3; i++) { @@ -14,23 +17,23 @@ function rgbToHex(rgb) { // Main function to apply the background color to all divs with class 'square' function applyGradientToHeatmap() { - const squares1 = document.querySelectorAll('.square-length'); // Select all divs with class 'square' - const squares2 = document.querySelectorAll('.square-speed'); // Select all divs with class 'square' + const rallyLengthSquares = document.querySelectorAll('.square-length'); // Select all divs with class 'square' + const ballSpeedSquares = document.querySelectorAll('.square-speed'); // Select all divs with class 'square' const startColor = [255, 255, 255]; // RGB for #FFFFFF (white) const endColor = [253, 180, 39]; // RGB for #F8D082 (light orange) - squares1.forEach(square => { + rallyLengthSquares.forEach(square => { const value = parseInt(square.textContent); // Get the text inside the div and convert to integer - const factor = value / 100; // Calculate the interpolation factor (0 to 1) + const factor = value / HIGH_RALLY_LENGTH; // Calculate the interpolation factor (0 to 1) const interpolatedColor = interpolateColor(startColor, endColor, factor); // Get the interpolated color const hexColor = rgbToHex(interpolatedColor); // Convert the RGB color to hex format square.style.backgroundColor = hexColor; // Apply the background color to the div }); - squares2.forEach(square => { + ballSpeedSquares.forEach(square => { const value = parseInt(square.textContent); // Get the text inside the div and convert to integer - const factor = value / 100; // Calculate the interpolation factor (0 to 1) + const factor = value / FAST_BALL_SPEED; // Calculate the interpolation factor (0 to 1) const interpolatedColor = interpolateColor(startColor, endColor, factor); // Get the interpolated color const hexColor = rgbToHex(interpolatedColor); // Convert the RGB color to hex format diff --git a/backend/static/js/game/AbstractGameController.js b/backend/static/js/game/AbstractGameController.js index 2ce56ce..3886f14 100644 --- a/backend/static/js/game/AbstractGameController.js +++ b/backend/static/js/game/AbstractGameController.js @@ -47,8 +47,8 @@ export class AbstractGameController extends THREE.Group { const p1display = document.getElementById('p1'); const p2display = document.getElementById('p2'); - p1display.textContent = `${this.player1.username}`; - p2display.textContent = `${this.player2.username}`; + p1display.textContent = `${this.player1.id}-${this.player1.username}`; + p2display.textContent = `${this.player2.id}-${this.player2.username}`; } update() { diff --git a/backend/static/js/game/GameStats.js b/backend/static/js/game/GameStats.js index e2b6c2a..9fb9ebf 100644 --- a/backend/static/js/game/GameStats.js +++ b/backend/static/js/game/GameStats.js @@ -46,7 +46,7 @@ export class GameStats { 'timestamp': new Date().toISOString(), 'user': scorer.id, 'rally_length': ball.rally, - 'ball_speed': Math.round(ball.speed.x), + 'ball_speed': parseFloat(ball.speed.x.toFixed(2)), }; this.score[scorer.username] += 1; this.goals.push(goal); diff --git a/backend/static/js/profile.js b/backend/static/js/profile.js index 51f200c..71ede54 100644 --- a/backend/static/js/profile.js +++ b/backend/static/js/profile.js @@ -1,4 +1,4 @@ -import { TEST_STATS } from "./game/macros"; +// import { TEST_STATS } from "./game/macros"; var modal2 = document.getElementById("modal2"); var btn2 = document.getElementById("remove-friend-button"); From 77c7d3f245c000e7c30439e265fb9c713818cf6c Mon Sep 17 00:00:00 2001 From: Andreia Campos Date: Tue, 22 Oct 2024 21:11:39 +0100 Subject: [PATCH 66/74] Fix: last game of a tournament phase not being updated. --- backend/pong/views.py | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/backend/pong/views.py b/backend/pong/views.py index c602135..36cbc54 100644 --- a/backend/pong/views.py +++ b/backend/pong/views.py @@ -971,6 +971,10 @@ def tournament_update_game(request, tournament_id, game_id): if match.game_id.winner_id is not None: finished_matches += 1 + user_stats_update(user2.id, game_id, data) + user_stats_update(user1.id, game_id, data) + game_stats_create(game_id, data) + game_goals_create(game_id, data) if finished_matches == total_phase_matches[curr_phase] and curr_phase != 'Final': return advance_tournament_phase(curr_phase, tournament_id) @@ -978,18 +982,8 @@ def tournament_update_game(request, tournament_id, game_id): tournament = Tournaments.objects.filter(id=tournament_id).first() tournament.duration = datetime.timestamp(datetime.now())- tournament.created_at.timestamp() tournament.save() - user_stats_update(user2.id, game_id, data) - user_stats_update(user1.id, game_id, data) - game_stats_create(game_id, data) - game_goals_create(game_id, data) return calculate_placements(tournament_id) - - user_stats_update(user2.id, game_id, data) - user_stats_update(user1.id, game_id, data) - game_stats_create(game_id, data) - game_goals_create(game_id, data) - data = TournamentsGamesSerializer(tour_game).data data['game'] = GamesSerializer(tour_game.game_id).data From 1a91de4ea533d223d0ae1023189aabf4708781a7 Mon Sep 17 00:00:00 2001 From: Andreia Campos Date: Tue, 22 Oct 2024 21:28:11 +0100 Subject: [PATCH 67/74] Fix: 42 images are being displayed in the game stats page. --- backend/pong/templates/pages/game_stats.html | 32 ++++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/backend/pong/templates/pages/game_stats.html b/backend/pong/templates/pages/game_stats.html index f130ef1..a63946c 100644 --- a/backend/pong/templates/pages/game_stats.html +++ b/backend/pong/templates/pages/game_stats.html @@ -1,6 +1,6 @@ {% extends 'navs.html' %} {% load static %} - +{% load custom_filters %} {% block main_content %} @@ -13,7 +13,11 @@ data-user-1-name="{{game.user1_id.username}}" data-user-2-name="{{game.user2_id.username}}">
- + {% if "http" in game.user1_id.picture %} + Profile + {% else %} + Profile + {% endif %} {{game.user1_id.username}}
@@ -28,7 +32,11 @@ {{game.nb_goals_user1}} - {{game.nb_goals_user2}}
- + {% if "http" in game.user2_id.picture %} + Profile + {% else %} + Profile + {% endif %} {{game.user2_id.username}}
@@ -165,7 +173,11 @@
Greateast Deficit Overcome
Who bounced back the most goals.
- The one + {% if "http" in stats.gdo_user.picture %} + Profile + {% else %} + Profile + {% endif %}
{{stats.gdo_user.username}}
{{stats.greatest_deficit_overcome}}
@@ -176,7 +188,11 @@
Most Consecutive Goals
Who scored more goals in a row.
- The one + {% if "http" in stats.mcg_user.picture %} + Profile + {% else %} + Profile + {% endif %}
{{stats.mcg_user.username}}
{{stats.most_consecutive_goals}}
@@ -187,7 +203,11 @@
Biggest Lead
Who had the biggest goal lead.
- The one + {% if "http" in stats.bg_user.picture %} + Profile + {% else %} + Profile + {% endif %}
{{stats.bg_user.username}}
{{stats.biggest_lead}}
From a2be6dfb2b470d51e9e0f117886a29a5b89d8d21 Mon Sep 17 00:00:00 2001 From: Andreia Campos Date: Tue, 22 Oct 2024 21:38:06 +0100 Subject: [PATCH 68/74] Fix: victory or defeat being displayed wrong for each user. --- backend/pong/templates/pages/game_stats.html | 16 ++++++++-------- backend/static/css/match-block.css | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/backend/pong/templates/pages/game_stats.html b/backend/pong/templates/pages/game_stats.html index a63946c..c38e77b 100644 --- a/backend/pong/templates/pages/game_stats.html +++ b/backend/pong/templates/pages/game_stats.html @@ -21,14 +21,14 @@ {{game.user1_id.username}}
- - - {% if user.id == game.user1_id.id or user.id == game.user2_id.id %} - DEFEAT - {% endif %} - + {% if user.id == game.user1_id.id or user.id == game.user2_id.id %} + {% if user.id == game.winner_id%} + VICTORY + {% else %} + DEFEAT + {% endif %} + {% endif %} + {{game.nb_goals_user1}} - {{game.nb_goals_user2}}
diff --git a/backend/static/css/match-block.css b/backend/static/css/match-block.css index 43f6e33..42a4ed2 100644 --- a/backend/static/css/match-block.css +++ b/backend/static/css/match-block.css @@ -38,7 +38,7 @@ } .victory { - color: #F8D082;; + color: #F8D082; } .match-block .icon { padding: 10px 10px 10px 5px; From 2ec3515f8dfe94e125de5eca3556e99a0adbcdda Mon Sep 17 00:00:00 2001 From: Andreia Campos Date: Tue, 22 Oct 2024 21:47:12 +0100 Subject: [PATCH 69/74] Fix: fixed tournaments displaying NaN on timestamp. --- backend/pong/templates/pages/view_profile.html | 4 ++-- backend/static/css/profile.css | 9 +++++++++ backend/static/js/view-details-tournaments.js | 5 ++--- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/backend/pong/templates/pages/view_profile.html b/backend/pong/templates/pages/view_profile.html index 4192688..cc98e24 100755 --- a/backend/pong/templates/pages/view_profile.html +++ b/backend/pong/templates/pages/view_profile.html @@ -463,8 +463,8 @@
{{ stats.quickest_game }}
-
{{ tour.tournament.created_at|date:"c" }}
-
{{ tour.tournament.created_at|date:"c" }}
+
{{ tour.tournament.created_at }}
+
{{ tour.tournament.created_at }}
{{ tour.tournament.duration }} {{ tour.placement }} diff --git a/backend/static/css/profile.css b/backend/static/css/profile.css index 46e94a7..419bda6 100644 --- a/backend/static/css/profile.css +++ b/backend/static/css/profile.css @@ -347,6 +347,11 @@ textarea, #username-input, #email-input { padding-bottom: 5px; } +.tour-game-winner { + color: #F8D082; + font-weight: bold; +} + .winr, .graph-value { font-weight: bold; color: #F8D082; @@ -499,4 +504,8 @@ input:checked + .slider:before { .no-data img { width: 140px; height: 140px; +} + +.game-link{ + text-decoration:none; } \ No newline at end of file diff --git a/backend/static/js/view-details-tournaments.js b/backend/static/js/view-details-tournaments.js index ee26861..04f191b 100644 --- a/backend/static/js/view-details-tournaments.js +++ b/backend/static/js/view-details-tournaments.js @@ -93,10 +93,9 @@ function detailTournamentGames(button) { user2Link.appendChild(user2ProfilePic); user2Link.appendChild(user2Name); if ( game.game.nb_goals_user1 > game.game.nb_goals_user2) { - user1Name.classList.add('winr'); + user1Name.classList.add('tour-game-winner'); } else { - user2Name.classList.add('winr'); - + user2Name.classList.add('tour-game-winner'); } const gameDetailLink = document.createElement('a'); From 3cf09f5b598608a026af1d0363ca9630049a93d9 Mon Sep 17 00:00:00 2001 From: Andreia Campos Date: Tue, 22 Oct 2024 22:02:41 +0100 Subject: [PATCH 70/74] Code: tournaments are presented in descending order. --- backend/pong/views.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/backend/pong/views.py b/backend/pong/views.py index 36cbc54..1c8258e 100644 --- a/backend/pong/views.py +++ b/backend/pong/views.py @@ -905,16 +905,18 @@ def tournament_list_user(request, user_id): if request.method != 'GET': return JsonResponse({'message': 'Method not allowed', 'method': request.method, 'data': {}}, status=405) - all_tour=TournamentsUsers.objects.filter(user_id=user_id) - serializer = TournamentsUsersSerializer(all_tour, many=True) - all_tourusers_list = serializer.data + all_users = TournamentsUsers.objects.filter(user_id=user_id) + serializer = TournamentsUsersSerializer(all_users, many=True) + all_user_tours = serializer.data - for touruser in all_tourusers_list: + for touruser in all_user_tours: tournament = Tournaments.objects.get(pk=touruser['tournament_id']) serializer = TournamentsSerializer(tournament) touruser['tournament'] = serializer.data - return JsonResponse(all_tourusers_list, safe=False) + all_user_tours.sort(reverse=True, key=lambda t: t['created_at']) + + return JsonResponse(all_user_tours, safe=False) @csrf_exempt From d525af05171d5c42d502c8ba64f6b8a4517186f1 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Wed, 23 Oct 2024 15:02:06 +0100 Subject: [PATCH 71/74] Fix: fixed bar chart not displaying games prior to the current day. Also fixed user goals stats being overwritten instead of added to. --- .../pong/templates/pages/view_profile.html | 18 ++++++++-------- backend/pong/views.py | 21 +++++++++++++------ backend/static/js/game/macros.js | 12 +++++------ backend/static/js/profile.js | 21 +++++++++++-------- 4 files changed, 42 insertions(+), 30 deletions(-) diff --git a/backend/pong/templates/pages/view_profile.html b/backend/pong/templates/pages/view_profile.html index cc98e24..8277aa5 100755 --- a/backend/pong/templates/pages/view_profile.html +++ b/backend/pong/templates/pages/view_profile.html @@ -6,7 +6,7 @@ - + @@ -281,22 +281,22 @@
Time Spent per Mode

No Available Data

- You haven't played any games yet! + You haven't played any games so far!
{% endif %}
- {% if games|length > 0 %} + {% if no_week_games %} +
+ +

No games this week

+ It seems you haven't played this week yet +
+ {% else %}
Win Rate and Games Played / Day
- {% else %} -
- -

No Available Data

- You haven't played any games yet! -
{% endif %}
Records
diff --git a/backend/pong/views.py b/backend/pong/views.py index 1c8258e..2d1d883 100644 --- a/backend/pong/views.py +++ b/backend/pong/views.py @@ -375,15 +375,15 @@ def user_stats_update(user_id, game_id, data): game = Games.objects.get(pk=game_id) if game.user1_id.id == user_id: - stats.nb_goals_scored = data['nb_goals_user1'] - stats.nb_goals_suffered = data['nb_goals_user2'] + stats.nb_goals_scored += data['nb_goals_user1'] + stats.nb_goals_suffered += data['nb_goals_user2'] if data['user1_stats']['scored_first']: stats.num_first_goals += 1 if data['nb_goals_user1'] > data['nb_goals_user2']: stats.nb_games_won += 1 else: - stats.nb_goals_scored = data['nb_goals_user2'] - stats.nb_goals_suffered = data['nb_goals_user1'] + stats.nb_goals_scored += data['nb_goals_user2'] + stats.nb_goals_suffered += data['nb_goals_user1'] if data['user2_stats']['scored_first']: stats.num_first_goals += 1 if data['nb_goals_user2'] > data['nb_goals_user1']: @@ -1283,8 +1283,6 @@ def profile(request, id): friendship_status = None user = get_object_or_404(Users, id=id) - games = Games.objects.filter(Q(Q(user1_id=user_profile.id) | Q(user2_id=user_profile.id)) - ).exclude(type="Tournament").order_by('-created_at') tournament_response = tournament_list_user(request, user_profile.id) user_tournaments = json.loads(tournament_response.content) stats_response = user_stats(request, user_profile.id) @@ -1295,6 +1293,15 @@ def profile(request, id): goals_scored_suffered_ratio = 0 graph = win_rate_nb_games_day(request, user_profile.id) graph_send = json.loads(graph.content) + + games = Games.objects.filter(Q(user1_id=user_profile.id) | Q(user2_id=user_profile.id), + ).exclude(type="Tournament").order_by('-created_at') + + last_game_date = games.first().created_at + today = datetime.today() + monday = today - timedelta(days=today.weekday()) + monday = monday.astimezone(last_game_date.tzinfo) + context = { 'friends': friends, 'user_id': user_id, @@ -1308,10 +1315,12 @@ def profile(request, id): 'games': games, 'tours': user_tournaments, 'stats': stats, + 'no_week_games': last_game_date < monday, 'goals_scored_suffered_ratio': goals_scored_suffered_ratio, 'graph': graph_send, 'page': 'profile' if is_own_profile else 'else' } + return render(request, 'pages/view_profile.html', context) diff --git a/backend/static/js/game/macros.js b/backend/static/js/game/macros.js index 6976f51..0e81bf2 100644 --- a/backend/static/js/game/macros.js +++ b/backend/static/js/game/macros.js @@ -97,31 +97,31 @@ export const TEST_STATS = [ { day: "2024-10-18T00:00:00Z", total_games: 5, - win_rate: 1 + win_rate: 20 }, { day: "2024-10-19T00:00:00Z", total_games: 6, - win_rate: 2 + win_rate: 33 }, { day: "2024-10-20T00:00:00Z", total_games: 7, - win_rate: 3 + win_rate: 42 }, { day: "2024-10-21T00:00:00Z", total_games: 8, - win_rate: 4 + win_rate: 50 }, { day: "2024-10-22T00:00:00Z", total_games: 16, - win_rate: 9 + win_rate: 58 }, { day: "2024-10-24T00:00:00Z", total_games: 7, - win_rate: 7 + win_rate: 100 } ]; \ No newline at end of file diff --git a/backend/static/js/profile.js b/backend/static/js/profile.js index 71ede54..9f935ed 100644 --- a/backend/static/js/profile.js +++ b/backend/static/js/profile.js @@ -1,4 +1,4 @@ -// import { TEST_STATS } from "./game/macros"; +import { TEST_STATS } from "./game/macros.js"; var modal2 = document.getElementById("modal2"); var btn2 = document.getElementById("remove-friend-button"); @@ -66,8 +66,7 @@ async function loadDonutChart() { offsetX: -110, offsetY: 10, height: 200, - width: '100%', - // background: '#FFFFFF' + width: '100%', }, series: [remoteTime, aiTime, localTime, tournamentTime], labels: ['Remote Games', 'AI Mode', 'Local Games', 'Tournaments'], @@ -127,22 +126,26 @@ async function loadBarLineChart() { const dailyRawStats = await response.json(); // const dailyRawStats = TEST_STATS; - const tempRates = dailyRawStats.map((x) => x.win_rate); - const tempTotalGames = dailyRawStats.map((x) => x.total_games); + const rawWinRates = dailyRawStats.map((x) => x.win_rate); + const rawTotalGames = dailyRawStats.map((x) => x.total_games); const winRates = new Array(7).fill(0); const totalGames = new Array(7).fill(0); - tempRates.forEach((winRate, i) => { + const today = new Date(); + var lastMonday = new Date(); + lastMonday.setDate(today.getDate() - (today.getDay() + 6) % 7); + + rawWinRates.forEach((winRate, i) => { const timestamp = new Date(dailyRawStats[i].day); - if (timestamp.getDate() < new Date().getDate()) + if (timestamp.getDate() < lastMonday.getDate()) return ; const weekday = (timestamp.getDay() + 6) % 7; winRates[weekday] = winRate; }); - tempTotalGames.forEach((numGames, i) => { + rawTotalGames.forEach((numGames, i) => { const timestamp = new Date(dailyRawStats[i].day); - if (timestamp.getDate() < new Date().getDate()) + if (timestamp.getDate() < lastMonday.getDate()) return ; const weekday = (timestamp.getDay() + 6) % 7; From 4acd171931a9e1e2377e100c6cf6b5fa87fc2e4d Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Wed, 23 Oct 2024 15:30:34 +0100 Subject: [PATCH 72/74] Fix: fixed bar chart tooltips being misaligned with the cursor. --- backend/static/js/game-stats.js | 77 +++++++++++++++++---------------- backend/static/js/profile.js | 46 ++++++++++++-------- 2 files changed, 68 insertions(+), 55 deletions(-) diff --git a/backend/static/js/game-stats.js b/backend/static/js/game-stats.js index 114b8e4..69fb527 100644 --- a/backend/static/js/game-stats.js +++ b/backend/static/js/game-stats.js @@ -2,44 +2,44 @@ const FAST_BALL_SPEED = 2; const HIGH_RALLY_LENGTH = 15; function interpolateColor(startColor, endColor, factor) { - const result = startColor.slice(); // Create a copy of the start color - for (let i = 0; i < 3; i++) { - // Interpolate each color component (R, G, B) - result[i] = Math.round(result[i] + factor * (endColor[i] - startColor[i])); - } - return result; + const result = startColor.slice(); // Create a copy of the start color + for (let i = 0; i < 3; i++) { + // Interpolate each color component (R, G, B) + result[i] = Math.round(result[i] + factor * (endColor[i] - startColor[i])); + } + return result; } // Convert RGB array to hex color string function rgbToHex(rgb) { - return `#${rgb.map(x => x.toString(16).padStart(2, '0')).join('')}`; + return `#${rgb.map(x => x.toString(16).padStart(2, '0')).join('')}`; } // Main function to apply the background color to all divs with class 'square' function applyGradientToHeatmap() { - const rallyLengthSquares = document.querySelectorAll('.square-length'); // Select all divs with class 'square' - const ballSpeedSquares = document.querySelectorAll('.square-speed'); // Select all divs with class 'square' - const startColor = [255, 255, 255]; // RGB for #FFFFFF (white) - const endColor = [253, 180, 39]; // RGB for #F8D082 (light orange) + const rallyLengthSquares = document.querySelectorAll('.square-length'); // Select all divs with class 'square' + const ballSpeedSquares = document.querySelectorAll('.square-speed'); // Select all divs with class 'square' + const startColor = [255, 255, 255]; // RGB for #FFFFFF (white) + const endColor = [253, 180, 39]; // RGB for #F8D082 (light orange) - rallyLengthSquares.forEach(square => { - const value = parseInt(square.textContent); // Get the text inside the div and convert to integer - const factor = value / HIGH_RALLY_LENGTH; // Calculate the interpolation factor (0 to 1) + rallyLengthSquares.forEach(square => { + const value = parseInt(square.textContent); // Get the text inside the div and convert to integer + const factor = value / HIGH_RALLY_LENGTH; // Calculate the interpolation factor (0 to 1) - const interpolatedColor = interpolateColor(startColor, endColor, factor); // Get the interpolated color - const hexColor = rgbToHex(interpolatedColor); // Convert the RGB color to hex format + const interpolatedColor = interpolateColor(startColor, endColor, factor); // Get the interpolated color + const hexColor = rgbToHex(interpolatedColor); // Convert the RGB color to hex format - square.style.backgroundColor = hexColor; // Apply the background color to the div - }); - ballSpeedSquares.forEach(square => { - const value = parseInt(square.textContent); // Get the text inside the div and convert to integer - const factor = value / FAST_BALL_SPEED; // Calculate the interpolation factor (0 to 1) + square.style.backgroundColor = hexColor; // Apply the background color to the div + }); + ballSpeedSquares.forEach(square => { + const value = parseInt(square.textContent); // Get the text inside the div and convert to integer + const factor = value / FAST_BALL_SPEED; // Calculate the interpolation factor (0 to 1) - const interpolatedColor = interpolateColor(startColor, endColor, factor); // Get the interpolated color - const hexColor = rgbToHex(interpolatedColor); // Convert the RGB color to hex format + const interpolatedColor = interpolateColor(startColor, endColor, factor); // Get the interpolated color + const hexColor = rgbToHex(interpolatedColor); // Convert the RGB color to hex format - square.style.backgroundColor = hexColor; // Apply the background color to the div - }); + square.style.backgroundColor = hexColor; // Apply the background color to the div + }); } function fillHeatmap(rallyLengths, ballSpeeds){ @@ -92,8 +92,8 @@ async function loadCharts() { var options = { chart: { - type: 'line', - toolbar: { + type: 'line', + toolbar: { show: false }, }, @@ -103,15 +103,16 @@ async function loadCharts() { markers: { size: 1, }, - series: [{ - name: username1, - data: gameState[user1ID].state - }, - { - name: username2, - data: gameState[user2ID].state - }], - + series: [ + { + name: username1, + data: gameState[user1ID].state + }, + { + name: username2, + data: gameState[user2ID].state + } + ], xaxis: { categories: [1, 2, 3, 4, 5, 6, 7, 8, 9], labels: { @@ -165,8 +166,8 @@ async function loadCharts() { }, }, colors: ['#F8D082', '#336181'], - }; - + }; + var chart = new ApexCharts(document.querySelector("#chart"), options); chart.render(); } diff --git a/backend/static/js/profile.js b/backend/static/js/profile.js index 9f935ed..7d096ec 100644 --- a/backend/static/js/profile.js +++ b/backend/static/js/profile.js @@ -23,13 +23,13 @@ window.onclick = function(event) { function formatDate(timestamp) { const date = new Date(timestamp); - const monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + const monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; - const day = String(date.getUTCDate()).padStart(2, '0'); - const month = monthNames[date.getUTCMonth()]; - const year = date.getUTCFullYear(); + const day = String(date.getUTCDate()).padStart(2, '0'); + const month = monthNames[date.getUTCMonth()]; + const year = date.getUTCFullYear(); const hours = String(date.getUTCHours()).padStart(2, '0'); - const minutes = String(date.getUTCMinutes()).padStart(2, '0'); + const minutes = String(date.getUTCMinutes()).padStart(2, '0'); const suffixes = ['st', 'nd', 'rd']; const dayUnits = date.getUTCDate() % 10; @@ -41,11 +41,11 @@ function formatDate(timestamp) { function formatRecordsTimestamp(divClass) { - const recordTimeDivs = document.querySelectorAll(divClass); + const recordTimeDivs = document.querySelectorAll(divClass); - recordTimeDivs.forEach(div => { - div.textContent = formatDate(div.textContent); - }); + recordTimeDivs.forEach(div => { + div.textContent = formatDate(div.textContent); + }); } async function loadDonutChart() { @@ -162,11 +162,26 @@ async function loadBarLineChart() { }, width: '100%', }, + followCursor: true, plotOptions: { bar: { - borderRadius: 10, + borderRadius: 10, } }, + grid: { + show: true, + borderColor: '#ffffff0C', + xaxis: { + lines: { + show: true + } + }, + yaxis: { + lines: { + show: true + } + }, + }, series: [ { name: 'Games Played', @@ -203,19 +218,16 @@ async function loadBarLineChart() { yaxis: { show: false }, - grid: { - show: false - }, tooltip: { y: { - formatter: function (val) { + formatter: function (val) { return val; - } } - }, + }, + }, dataLabels: { enabled: false, - }, + }, legend: { show: true, horizontalAlign: 'center', From 38b83d479b06e04f978a234e260841f649483013 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Wed, 23 Oct 2024 20:48:47 +0100 Subject: [PATCH 73/74] Fix: using localhost for 42 API. --- .env | 3 +- backend/backend/settings.py | 1 - backend/pong/migrations/0001_initial.py | 2 +- backend/pong/views.py | 98 +++++++++++++------------ 4 files changed, 52 insertions(+), 52 deletions(-) diff --git a/.env b/.env index 74c59cb..38c3e97 100644 --- a/.env +++ b/.env @@ -1,8 +1,7 @@ TOKEN_URL='https://api.intra.42.fr/oauth/token' USER_INFO_URL='https://api.intra.42.fr/v2/me' CLIENT_ID='u-s4t2ud-b82e9fe438563f339a906cd3bc30001cbb1785649c08b26fca0e4c1e2e7eddab' -CLIENT_SECRET='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' -REDIRECT_URI='http://localhost:8002/home42/' +CLIENT_SECRET='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' POSTGRES_USER="anaraujo" POSTGRES_PASSWORD="1234" PGADMIN_DEFAULT_EMAIL="admin@email.com" diff --git a/backend/backend/settings.py b/backend/backend/settings.py index 6c417f8..8ae8ba9 100644 --- a/backend/backend/settings.py +++ b/backend/backend/settings.py @@ -27,7 +27,6 @@ TOKEN_URL_A=os.getenv("TOKEN_URL") CLIENT_ID_A=os.getenv("CLIENT_ID") CLIENT_SECRET_A=os.getenv("CLIENT_SECRET") -REDIRECT_URI_A=os.getenv("REDIRECT_URI") USER_INFO_URL_A=os.getenv("USER_INFO_URL") diff --git a/backend/pong/migrations/0001_initial.py b/backend/pong/migrations/0001_initial.py index c0bab40..4b30e93 100644 --- a/backend/pong/migrations/0001_initial.py +++ b/backend/pong/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.2 on 2024-10-22 17:53 +# Generated by Django 5.1.2 on 2024-10-23 19:47 import django.db.models.deletion from django.conf import settings diff --git a/backend/pong/views.py b/backend/pong/views.py index 2d1d883..042176a 100644 --- a/backend/pong/views.py +++ b/backend/pong/views.py @@ -24,6 +24,7 @@ from icecream import ic from .models import Users import pprint +import socket # Since we want to create an API endpoint for reading, creating, and updating # Company objects, we can use Django Rest Framework mixins for such actions. from rest_framework import status @@ -89,8 +90,8 @@ def user_create(request): myuser.save() UserStats.objects.create( - user_id=myuser - ) + user_id=myuser + ) user = authenticate(username=username, password=password1) @@ -337,24 +338,24 @@ def user_stats(request, user_id): return JsonResponse({'message': 'Method not allowed'}, status=405) def leaderboard(request): - if request.method == 'GET': - top_users = UserStats.objects.all().order_by('-nb_tournaments_won')[:3] + if request.method == 'GET': + top_users = UserStats.objects.all().order_by('-nb_tournaments_won')[:3] - enriched_top_users = [] - for top_user in top_users: - user = Users.objects.get(pk=top_user.user_id.id) + enriched_top_users = [] + for top_user in top_users: + user = Users.objects.get(pk=top_user.user_id.id) - user_stats_serializer = UserStatsSerializer(top_user) - user_serializer = UsersSerializer(user) + user_stats_serializer = UserStatsSerializer(top_user) + user_serializer = UsersSerializer(user) - enriched_data = user_stats_serializer.data - enriched_data['user'] = user_serializer.data + enriched_data = user_stats_serializer.data + enriched_data['user'] = user_serializer.data - enriched_top_users.append(enriched_data) + enriched_top_users.append(enriched_data) - return JsonResponse(enriched_top_users, safe=False, status=200) + return JsonResponse(enriched_top_users, safe=False, status=200) - return JsonResponse({'message': 'Method not allowed'}, status=405) + return JsonResponse({'message': 'Method not allowed'}, status=405) def current_place(request, user_id): @@ -417,15 +418,15 @@ def win_rate_nb_games_day(request, user_id): today = timezone.now() seven_day_before = today - timedelta(days=7) games = Games.objects.filter((Q(user1_id = user_id) | Q(user2_id = user_id)) & Q(created_at__gte=seven_day_before) - & ~Q(type='Tournament')).order_by('-created_at') + & ~Q(type='Tournament')).order_by('-created_at') stats = games.annotate(day=TruncDay('created_at')).values('day').annotate( - total_games=Count('id'), ).annotate( - win_rate=Case( - When(total_games=0, then=0), - default=(100 * Count(Case(When(winner_id=user_id, then=1))) / Count('id')), - output_field=IntegerField() - ) + total_games=Count('id'), ).annotate( + win_rate=Case( + When(total_games=0, then=0), + default=(100 * Count(Case(When(winner_id=user_id, then=1))) / Count('id')), + output_field=IntegerField() + ) ).order_by('-day') return JsonResponse(list(stats), safe=False) @@ -996,44 +997,45 @@ def tournament_update_game(request, tournament_id, game_id): @csrf_exempt -def get_access_token(code): - response = requests.post(settings.TOKEN_URL_A, data={ - 'grant_type': 'authorization_code', - 'client_id': settings.CLIENT_ID_A, - 'client_secret': settings.CLIENT_SECRET_A, - 'redirect_uri': settings.REDIRECT_URI_A, - 'code': code, - }) - if response.status_code == 200: - token_data = response.json() - access_token = token_data.get('access_token') - ic(access_token) - return access_token - else: - return None +def get_access_token(host, code): + response = requests.post(settings.TOKEN_URL_A, data={ + 'grant_type': 'authorization_code', + 'client_id': settings.CLIENT_ID_A, + 'client_secret': settings.CLIENT_SECRET_A, + 'redirect_uri': f'http://{host}/home42/', + 'code': code, + }) + ic(response.text) + if response.status_code == 200: + token_data = response.json() + access_token = token_data.get('access_token') + ic(access_token) + return access_token + else: + return None def get_user_info(token): - headers = { - "Authorization": f"Bearer {token}" - } - user_info_response = requests.get(settings.USER_INFO_URL_A, headers=headers) + headers = { + "Authorization": f"Bearer {token}" + } + user_info_response = requests.get(settings.USER_INFO_URL_A, headers=headers) - if user_info_response.status_code == 200: - return user_info_response.json() - else: - return None + if user_info_response.status_code == 200: + return user_info_response.json() + else: + return None def signin42(request): try: client_id = settings.CLIENT_ID_A - - authorization_url = f'https://api.intra.42.fr/oauth/authorize?client_id={client_id}&response_type=code&redirect_uri={settings.REDIRECT_URI_A}' + uri = f'http://{request.get_host()}/home42/' + authorization_url = f'https://api.intra.42.fr/oauth/authorize?client_id={client_id}&response_type=code&redirect_uri={uri}' ic(authorization_url) return HttpResponseRedirect(authorization_url) except Exception as e: - return HttpResponseRedirect(settings.REDIRECT_URI_A or '/') + return HttpResponseRedirect('/') def login42(request): authorization_code = request.GET.get('code') @@ -1041,7 +1043,7 @@ def login42(request): if authorization_code is None: return JsonResponse({'error': 'Authorization code missing', 'data': {}}, status=400) - access_token = get_access_token(authorization_code) + access_token = get_access_token(request.get_host(), authorization_code) if access_token is None: return JsonResponse({'error': 'Failed to fetch access token', 'data': {}}, status=400) From 4cc7697d42b418dc39d02759112262f002dfd630 Mon Sep 17 00:00:00 2001 From: Nuno Jesus Date: Wed, 23 Oct 2024 21:19:55 +0100 Subject: [PATCH 74/74] Fix: fixed a bug where we would access the last game of a user even if there were no games. --- backend/pong/views.py | 11 ++++++----- backend/static/js/game/macros.js | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/backend/pong/views.py b/backend/pong/views.py index 042176a..5cd7db5 100644 --- a/backend/pong/views.py +++ b/backend/pong/views.py @@ -1299,10 +1299,11 @@ def profile(request, id): games = Games.objects.filter(Q(user1_id=user_profile.id) | Q(user2_id=user_profile.id), ).exclude(type="Tournament").order_by('-created_at') - last_game_date = games.first().created_at - today = datetime.today() - monday = today - timedelta(days=today.weekday()) - monday = monday.astimezone(last_game_date.tzinfo) + if games.count() != 0: + last_game_date = games.first().created_at + today = datetime.today() + monday = today - timedelta(days=today.weekday()) + monday = monday.astimezone(last_game_date.tzinfo) context = { 'friends': friends, @@ -1317,7 +1318,7 @@ def profile(request, id): 'games': games, 'tours': user_tournaments, 'stats': stats, - 'no_week_games': last_game_date < monday, + 'no_week_games': last_game_date < monday if games.count() != 0 else True, 'goals_scored_suffered_ratio': goals_scored_suffered_ratio, 'graph': graph_send, 'page': 'profile' if is_own_profile else 'else' diff --git a/backend/static/js/game/macros.js b/backend/static/js/game/macros.js index 0e81bf2..714e506 100644 --- a/backend/static/js/game/macros.js +++ b/backend/static/js/game/macros.js @@ -20,7 +20,7 @@ export const ARENA_SEMI_DEPTH = 0.25; export const MAX_GOALS = 5; -export const FPS = 30; +export const FPS = 50; export const REFRESH_RATE = 1000 / FPS; export const STANDARD_KEYBINDS = {