From 128ad8936d81618888730d5fff88b8840a305056 Mon Sep 17 00:00:00 2001 From: Matthias von Bargen Date: Mon, 27 Apr 2026 09:29:14 +0200 Subject: [PATCH 01/18] init playwright Co-authored-by: Claude Sonnet 4.6 --- .github/workflows/node.js.yml | 8 +++ .gitignore | 2 + package-lock.json | 64 +++++++++++++++++++ packages/editor/e2e/editor.spec.ts | 58 +++++++++++++++++ packages/editor/package.json | 5 +- packages/editor/playwright.config.ts | 16 +++++ .../editor/src/Editor/UI/SceneExplorer.tsx | 2 +- .../multiplayer-template/client/src/main.ts | 5 +- packages/package-lock.json | 6 ++ 9 files changed, 163 insertions(+), 3 deletions(-) create mode 100644 packages/editor/e2e/editor.spec.ts create mode 100644 packages/editor/playwright.config.ts create mode 100644 packages/package-lock.json diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 840097b..b3ff6bd 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -64,3 +64,11 @@ jobs: timeout-minutes: 1 run: npx concurrently --kill-others --success first "npm run dev" "npx wait-on http://localhost:8050/api/game/health --timeout 20000" working-directory: ./packages/multiplayer-template + + - name: Install Playwright browsers + run: npx playwright install --with-deps chromium + working-directory: ./packages/editor + + - name: Run editor e2e tests + run: npm run test:e2e + working-directory: ./packages/editor diff --git a/.gitignore b/.gitignore index e1631e1..e3aa041 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,6 @@ dist-ssr .env coverage *.tsbuildinfo +test-results +playwright-report packages/core/src/version.ts diff --git a/package-lock.json b/package-lock.json index 36dc583..e6cb670 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10969,6 +10969,7 @@ "devDependencies": { "@dimforge/rapier3d-compat": "0.18.2", "@mavonengine/core": "*", + "@playwright/test": "1.52.0", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@types/react": "^19.2.10", @@ -10990,6 +10991,69 @@ "three": "^0.176.0" } }, + "packages/editor/node_modules/@playwright/test": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.52.0.tgz", + "integrity": "sha512-uh6W7sb55hl7D6vsAeA+V2p5JnlAqzhqFyF0VcJkKZXkgnFcVG9PziERRHQfPLfNGx1C292a4JqbWzhR8L4R1g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.52.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "packages/editor/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "packages/editor/node_modules/playwright": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.52.0.tgz", + "integrity": "sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.52.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "packages/editor/node_modules/playwright-core": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.52.0.tgz", + "integrity": "sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, "packages/editor/node_modules/typescript": { "version": "5.9.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", diff --git a/packages/editor/e2e/editor.spec.ts b/packages/editor/e2e/editor.spec.ts new file mode 100644 index 0000000..a43e084 --- /dev/null +++ b/packages/editor/e2e/editor.spec.ts @@ -0,0 +1,58 @@ +import { expect, test } from '@playwright/test' + +test.beforeEach(async ({ page }) => { + await page.addInitScript(() => localStorage.clear()) + await page.goto('/') + // Returns a Promise so Playwright waits for it rather than re-polling. + // Safe because editorRegistered fires after RAPIER.init() + dynamic import, + // both of which start after page load — so it can't have fired before we listen. + await page.waitForFunction(() => + new Promise((resolve) => { + const tryRegister = () => { + const game = (window as any).Game + if (game) { + game.on('editorRegistered', () => resolve(true)) + } + else { + requestAnimationFrame(tryRegister) + } + } + tryRegister() + }), + ) +}) + +test('editor opens on Insert key press', async ({ page }) => { + await page.keyboard.press('Insert') + + // The editor mounts its React UI into #ui and sets the page title + await expect(page).toHaveTitle('MavonEngine | Editor') +}) + +test('editor opens on Period key press', async ({ page }) => { + await page.keyboard.press('.') + + await expect(page).toHaveTitle('MavonEngine | Editor') +}) + +test('shade mode switches to wireframe', async ({ page }) => { + await page.keyboard.press('Insert') + await expect(page).toHaveTitle('MavonEngine | Editor') + + const wireframeBtn = page.getByTitle('Wireframe') + await wireframeBtn.click() + + // Active button gets an extra CSS class — verify it's no longer the only button without it + const solidBtn = page.getByTitle('Solid') + await expect(solidBtn).not.toHaveClass(/active/i) + await expect(wireframeBtn).toHaveClass(/active/i) +}) + +test('scene explorer renders initial objects', async ({ page }) => { + await page.keyboard.press('Insert') + await expect(page).toHaveTitle('MavonEngine | Editor') + + // AmbientLight is always present in the editor's default scene. + // toBeAttached (not toBeVisible) because the panel ancestor uses overflow:hidden for sizing. + await expect(page.getByTestId('scene-explorer').getByText('AmbientLight')).toBeAttached() +}) diff --git a/packages/editor/package.json b/packages/editor/package.json index 769d753..6bb1490 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -35,7 +35,9 @@ "test": "vitest", "test:ui": "vitest --ui --coverage.enabled true --coverage.reporter html", "test:coverage": "vitest --coverage.enabled true --coverage.reporter json-summary", - "test:dev": "vitest" + "test:dev": "vitest", + "test:e2e": "playwright test", + "test:e2e:ui": "playwright test --ui" }, "peerDependencies": { "@mavonengine/core": "*", @@ -53,6 +55,7 @@ "devDependencies": { "@dimforge/rapier3d-compat": "0.18.2", "@mavonengine/core": "*", + "@playwright/test": "^1.52.0", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@types/react": "^19.2.10", diff --git a/packages/editor/playwright.config.ts b/packages/editor/playwright.config.ts new file mode 100644 index 0000000..fc1bfb8 --- /dev/null +++ b/packages/editor/playwright.config.ts @@ -0,0 +1,16 @@ +import process from 'node:process' +import { defineConfig, devices } from '@playwright/test' + +export default defineConfig({ + testDir: './e2e', + webServer: { + command: 'npm run dev --prefix ../multiplayer-template/client', + url: 'http://localhost:5173', + reuseExistingServer: !process.env.CI, + timeout: 30_000, + }, + use: { + baseURL: 'http://localhost:5173', + ...devices['Desktop Chrome'], + }, +}) diff --git a/packages/editor/src/Editor/UI/SceneExplorer.tsx b/packages/editor/src/Editor/UI/SceneExplorer.tsx index 9f31dab..6b40967 100644 --- a/packages/editor/src/Editor/UI/SceneExplorer.tsx +++ b/packages/editor/src/Editor/UI/SceneExplorer.tsx @@ -177,7 +177,7 @@ export default function SceneExplorer() { } return ( -
+
{items.map(item => ( { - import('@mavonengine/editor').then(({ default: Editor }) => Editor.registerListener()) + import('@mavonengine/editor').then(({ default: Editor }) => { + Editor.registerListener() + Game.instance().trigger('editorRegistered') + }) } } diff --git a/packages/package-lock.json b/packages/package-lock.json new file mode 100644 index 0000000..4ca926f --- /dev/null +++ b/packages/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "app", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} From 46a8779db10d1723bc0a1f1f3190519613ed3491 Mon Sep 17 00:00:00 2001 From: Matthias von Bargen Date: Mon, 27 Apr 2026 09:32:27 +0200 Subject: [PATCH 02/18] vitest include --- packages/editor/vite.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/editor/vite.config.js b/packages/editor/vite.config.js index 4e6aa1f..21cfe5e 100644 --- a/packages/editor/vite.config.js +++ b/packages/editor/vite.config.js @@ -105,6 +105,7 @@ export default defineConfig(({ command }) => ({ }, }, test: { + include: ['tests/**/*.test.ts'], coverage: { provider: 'v8', include: ['src'], From 0f05d5d2b67c8aa133df48298a2b5836abc2754c Mon Sep 17 00:00:00 2001 From: Matthias von Bargen Date: Mon, 27 Apr 2026 09:46:56 +0200 Subject: [PATCH 03/18] traverse scene to verify --- packages/editor/e2e/editor.spec.ts | 13 ++++++++++++- packages/editor/tsconfig.json | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/editor/e2e/editor.spec.ts b/packages/editor/e2e/editor.spec.ts index a43e084..177f63b 100644 --- a/packages/editor/e2e/editor.spec.ts +++ b/packages/editor/e2e/editor.spec.ts @@ -52,7 +52,18 @@ test('scene explorer renders initial objects', async ({ page }) => { await page.keyboard.press('Insert') await expect(page).toHaveTitle('MavonEngine | Editor') - // AmbientLight is always present in the editor's default scene. + // Verify AmbientLight exists in the actual Three.js scene by traversing it. + const hasAmbientLight = await page.evaluate(() => { + let found = false + window.Game?.scene?.traverse((obj) => { + if (obj.type === 'AmbientLight') + found = true + }) + return found + }) + expect(hasAmbientLight).toBe(true) + + // Also confirm the scene explorer UI reflects it. // toBeAttached (not toBeVisible) because the panel ancestor uses overflow:hidden for sizing. await expect(page.getByTestId('scene-explorer').getByText('AmbientLight')).toBeAttached() }) diff --git a/packages/editor/tsconfig.json b/packages/editor/tsconfig.json index d79a9ee..9d49185 100644 --- a/packages/editor/tsconfig.json +++ b/packages/editor/tsconfig.json @@ -22,5 +22,5 @@ "references": [ { "path": "../core" } ], - "include": ["src"] + "include": ["src", "e2e", "Global.d.ts"] } From 731f4cfbe5ab02895e599d7e8e61f3ccb7dab45f Mon Sep 17 00:00:00 2001 From: Matthias von Bargen Date: Mon, 27 Apr 2026 09:56:47 +0200 Subject: [PATCH 04/18] init loadingscreen tests for new emit and add screenshot testing Co-authored-by: Claude Sonnet 4.6 --- packages/core/src/Utils/LoadingScreen.ts | 1 + .../core/tests/Utils/LoadingScreen.test.ts | 95 ++++++++++++++++++ packages/editor/e2e/editor.spec.ts | 14 +++ .../editor-boot-darwin.png | Bin 0 -> 43227 bytes 4 files changed, 110 insertions(+) create mode 100644 packages/core/tests/Utils/LoadingScreen.test.ts create mode 100644 packages/editor/e2e/editor.spec.ts-snapshots/editor-boot-darwin.png diff --git a/packages/core/src/Utils/LoadingScreen.ts b/packages/core/src/Utils/LoadingScreen.ts index 30a803b..7d1a60b 100644 --- a/packages/core/src/Utils/LoadingScreen.ts +++ b/packages/core/src/Utils/LoadingScreen.ts @@ -75,6 +75,7 @@ export default class LoadingScreen extends EventEmitter { // Optional: remove overlay from scene after fade completes if (progress >= 1) { Game.instance().scene.remove(this.overlay!) + this.trigger('finished') } } } diff --git a/packages/core/tests/Utils/LoadingScreen.test.ts b/packages/core/tests/Utils/LoadingScreen.test.ts new file mode 100644 index 0000000..8569d87 --- /dev/null +++ b/packages/core/tests/Utils/LoadingScreen.test.ts @@ -0,0 +1,95 @@ +// @vitest-environment jsdom +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import EventEmitter from '../../src/Utils/EventEmitter' +import LoadingScreen from '../../src/Utils/LoadingScreen' + +vi.mock('../../src/Particles/Shaders/LoadingScreen/Fragment.glsl', () => ({ default: '' })) +vi.mock('../../src/Particles/Shaders/LoadingScreen/Vertex.glsl', () => ({ default: '' })) + +vi.mock('three', async () => { + const actual = await vi.importActual('three') + return { + ...actual, + PlaneGeometry: vi.fn(), + ShaderMaterial: vi.fn().mockImplementation(({ uniforms }: any) => ({ uniforms })), + Mesh: vi.fn().mockImplementation((_geo: any, material: any) => ({ material })), + } +}) + +const mockScene = { add: vi.fn(), remove: vi.fn() } +const mockUiRoot = { style: { opacity: '0', removeProperty: vi.fn() } } +const gameListeners: Record void> = {} +const mockGame = { + on: vi.fn((event: string, cb: (...args: any[]) => void) => { gameListeners[event] = cb }), + scene: mockScene, + uiRoot: mockUiRoot, +} + +vi.mock('../../src/Game', () => ({ + default: { instance: vi.fn(() => mockGame) }, +})) + +describe('loadingScreen', () => { + let resources: EventEmitter + let loadingBar: HTMLDivElement + let loadingScreen: LoadingScreen + + beforeEach(() => { + vi.useFakeTimers() + vi.clearAllMocks() + Object.keys(gameListeners).forEach(k => delete gameListeners[k]) + + loadingBar = document.createElement('div') + loadingBar.id = 'loadingBar' + document.body.appendChild(loadingBar) + + resources = new EventEmitter() + loadingScreen = new LoadingScreen(resources as any) + gameListeners.uiMounted?.() + }) + + afterEach(() => { + document.body.innerHTML = '' + vi.useRealTimers() + }) + + it('does nothing in update() before resources are loaded', () => { + loadingScreen.update(0.016) + expect(mockScene.remove).not.toHaveBeenCalled() + expect(loadingScreen.progress).toBe(0) + }) + + it('sets loaded=true when resources emit loaded', () => { + resources.trigger('loaded') + expect(loadingScreen.loaded).toBe(true) + }) + + it('updates loadingBar transform on progress event', () => { + resources.trigger('progress', { loaded: 1, total: 4 }) + expect(loadingBar.style.transform).toBe('scaleX(0.25)') + }) + + it('adds ended class and removes visibility after 500ms on loaded', () => { + resources.trigger('loaded') + vi.advanceTimersByTime(500) + expect(loadingBar.classList.contains('ended')).toBe(true) + expect(mockUiRoot.style.removeProperty).toHaveBeenCalledWith('visibility') + }) + + it('fades the overlay during update() after loading', () => { + resources.trigger('loaded') + loadingScreen.update(1) // 1s into a 2s fade + expect(loadingScreen.progress).toBeGreaterThan(0) + expect(loadingScreen.progress).toBeLessThan(1) + }) + + it('emits finished, removes overlay, and zeroes progress when fade completes', () => { + resources.trigger('loaded') + const onFinished = vi.fn() + loadingScreen.on('finished', onFinished) + loadingScreen.update(3) // past the 2s duration + expect(onFinished).toHaveBeenCalledOnce() + expect(mockScene.remove).toHaveBeenCalled() + expect(loadingScreen.progress).toBe(0) + }) +}) diff --git a/packages/editor/e2e/editor.spec.ts b/packages/editor/e2e/editor.spec.ts index 177f63b..515de9e 100644 --- a/packages/editor/e2e/editor.spec.ts +++ b/packages/editor/e2e/editor.spec.ts @@ -27,6 +27,20 @@ test('editor opens on Insert key press', async ({ page }) => { // The editor mounts its React UI into #ui and sets the page title await expect(page).toHaveTitle('MavonEngine | Editor') + + // Wait for the loading screen fade to fully complete before screenshotting. + await page.waitForFunction(() => + new Promise((resolve) => { + const ls = window.Game?.loadingScreen + if (!ls) + return + if (ls.progress === 0) + return resolve(true) + ls.on('finished', () => resolve(true)) + }), + ) + + await expect(page).toHaveScreenshot('editor-boot.png') }) test('editor opens on Period key press', async ({ page }) => { diff --git a/packages/editor/e2e/editor.spec.ts-snapshots/editor-boot-darwin.png b/packages/editor/e2e/editor.spec.ts-snapshots/editor-boot-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..2e79ceb518a0e1be60c6351c130f4ae96286c6b5 GIT binary patch literal 43227 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 Date: Mon, 27 Apr 2026 10:12:03 +0200 Subject: [PATCH 05/18] wait for loading screen finished before screenshot test Co-authored-by: Claude Sonnet 4.6 --- packages/core/src/Utils/LoadingScreen.ts | 4 +++- packages/core/tests/Utils/LoadingScreen.test.ts | 10 +++++++++- packages/editor/e2e/editor.spec.ts | 12 +----------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/core/src/Utils/LoadingScreen.ts b/packages/core/src/Utils/LoadingScreen.ts index 7d1a60b..6442fd4 100644 --- a/packages/core/src/Utils/LoadingScreen.ts +++ b/packages/core/src/Utils/LoadingScreen.ts @@ -11,6 +11,7 @@ export default class LoadingScreen extends EventEmitter { private overlay: Mesh | undefined loaded = false + finished = false progress = 0 duration = 2 @@ -73,7 +74,8 @@ export default class LoadingScreen extends EventEmitter { Game.instance().uiRoot.style.opacity = `${progress}` // Optional: remove overlay from scene after fade completes - if (progress >= 1) { + if (progress >= 1 && !this.finished) { + this.finished = true Game.instance().scene.remove(this.overlay!) this.trigger('finished') } diff --git a/packages/core/tests/Utils/LoadingScreen.test.ts b/packages/core/tests/Utils/LoadingScreen.test.ts index 8569d87..fea611a 100644 --- a/packages/core/tests/Utils/LoadingScreen.test.ts +++ b/packages/core/tests/Utils/LoadingScreen.test.ts @@ -83,13 +83,21 @@ describe('loadingScreen', () => { expect(loadingScreen.progress).toBeLessThan(1) }) - it('emits finished, removes overlay, and zeroes progress when fade completes', () => { + it('emits finished, sets finished flag, removes overlay, and zeroes progress when fade completes', () => { resources.trigger('loaded') const onFinished = vi.fn() loadingScreen.on('finished', onFinished) loadingScreen.update(3) // past the 2s duration expect(onFinished).toHaveBeenCalledOnce() + expect(loadingScreen.finished).toBe(true) expect(mockScene.remove).toHaveBeenCalled() expect(loadingScreen.progress).toBe(0) }) + + it('does not emit finished or remove overlay more than once', () => { + resources.trigger('loaded') + loadingScreen.update(3) + loadingScreen.update(1) // extra update after completion + expect(mockScene.remove).toHaveBeenCalledOnce() + }) }) diff --git a/packages/editor/e2e/editor.spec.ts b/packages/editor/e2e/editor.spec.ts index 515de9e..2e3e4dd 100644 --- a/packages/editor/e2e/editor.spec.ts +++ b/packages/editor/e2e/editor.spec.ts @@ -28,17 +28,7 @@ test('editor opens on Insert key press', async ({ page }) => { // The editor mounts its React UI into #ui and sets the page title await expect(page).toHaveTitle('MavonEngine | Editor') - // Wait for the loading screen fade to fully complete before screenshotting. - await page.waitForFunction(() => - new Promise((resolve) => { - const ls = window.Game?.loadingScreen - if (!ls) - return - if (ls.progress === 0) - return resolve(true) - ls.on('finished', () => resolve(true)) - }), - ) + await page.waitForFunction(() => window.Game?.loadingScreen?.finished === true) await expect(page).toHaveScreenshot('editor-boot.png') }) From 7b7108e1fd7dffc35b36bf5ca62ce0386933cdf0 Mon Sep 17 00:00:00 2001 From: Matthias von Bargen Date: Mon, 27 Apr 2026 10:20:27 +0200 Subject: [PATCH 06/18] only run e2e on linux --- .github/workflows/node.js.yml | 2 ++ .../editor.spec.ts-snapshots/editor-boot.png | Bin 0 -> 43227 bytes packages/editor/playwright.config.ts | 1 + 3 files changed, 3 insertions(+) create mode 100644 packages/editor/e2e/editor.spec.ts-snapshots/editor-boot.png diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index b3ff6bd..1d7a6d5 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -66,9 +66,11 @@ jobs: working-directory: ./packages/multiplayer-template - name: Install Playwright browsers + if: matrix.os != 'windows-latest' run: npx playwright install --with-deps chromium working-directory: ./packages/editor - name: Run editor e2e tests + if: matrix.os != 'windows-latest' run: npm run test:e2e working-directory: ./packages/editor diff --git a/packages/editor/e2e/editor.spec.ts-snapshots/editor-boot.png b/packages/editor/e2e/editor.spec.ts-snapshots/editor-boot.png new file mode 100644 index 0000000000000000000000000000000000000000..2e79ceb518a0e1be60c6351c130f4ae96286c6b5 GIT binary patch literal 43227 zcmZU*2RK|`)IK_D)DWF$Nr=v1l;}00_a2=fq9p2QLlPtiLG(@#JxX+jXwiw@lZY14 zdzqQL<@bH}{-6InJkN}obM{$#?X_2X-{Y;0mI^5m0}%uQAys{(qz8fEfw$PB1lZt3 zjztX%ykL3isVG1yh8Z^@5LSq)lDvUm#@|JF#$$&}0rdLcFQ-Z6l3qCp;h~=iUlJ^Y z%0Pc6KlG^ByX12cAyp=+Z;a zT27{~g@r&ulGyo=NdLWsKqg+cjEcSI3;x<2F?{whznlAoXx|%wi;?UuA5_y_$5KVV z=Ks!&H1MVVLDci0Cndl8X6AmMT4wpppWD~-hCn#=7V*G$jog`^D}MYRpIQI=783GQ z4ub#hZAelGgyg>u`RyBnE|gY!)QTppM3=esdn( zBq1p?uix1$%3f;pbX2a0H&#(m2?)3hqqQ`dg#>QNjTrN9KZ$l_QhmHYYdTJg>MvNV zmk#D0OC7-d!$?U8`u`NyDuE6C+3YH(|TC+fe_8t2T>C zD_c9AIb+2P%CW#oNJ!|#w1uzkc71DWtKM|KgzReT=H_N`aWPR=;6PKt)R8jgYW-65 z+3gicE()s!+Q#1%%Z9(XuY&BNbxA57;TQUb3;J}Dia~pJns?jEw!OEe41b+0v#Wk@ zT+f=HpC6!`MQ1D&M-GHh%p4XBe%_ zUOP^}>5j$5Jnpq9A#mrEf0pvZ!K-fY;XR9ioiJuPIy!p#zVu)oOXtBRezNz}E#zM$ zF#c@ksWr_nFb_X_vpw&#K+ae1e1yl`7}iAA3SvkWrlty=872dY+0vU^?fWP?q5W;I zv)NQ#rYo3OSTH-j$n-w@sY)wZDXBratv`P*(5FZi0$i|KO-Hv24bxs?=nl|9buZ58@$o8?ri74?-mGb5HUA$VVOd&* zDZN89d~jYOUiQ~8V!~@FW}oQE4>O6=1y8%G8DHe(q5=0YxM_ABy`9z7FWM35(}neH z1o~$L%i26~P|fwtAv$gGI8f!~vJV4A4u#wO!@_|++Han;nzgdYWsXEw9R_r^+)5J^ zjjQI+J4y292tto77F4`5m|a@=H3l`d^r`s!y2o6F;)pgB`$nKcPQaGMYM@?Cfz?;x zz2QvBfdF0Di04kjGWR>Io$YNVW@fDdJ=6Kl&Q4&3BeIx4?!;g7iA|jUM48BH7!`xo zpYoGYBlgrU$5$;1l8FEOwyk9mZ2#;fVPvvG*5>trE!-rYH7n`#e8N|~OQMxOF?ZARse?{_q{poQn zaMjpoP>j2EQ28F4Q9PZU^%EzW1eg1cMcoJ4$1;Rd$dtMylFuH1oxfi$@M_oMVi zT;aqcK!j0GxOka-2mJJdY7}IBn9*lTj?C`a*6@Mkq~q-^Nz9RXzPtYk98>i3;8v52)dZQ!#*#*)nRP@ZFK z7b*Oi=NUJc{j9g=zFZqkL_`GTTO|ZSmhaV3pLTFH5-H0ZD+{(%3O2*_?Q_ON4cz3XM;Gj9lE)oK1IE^t)%Jvyrx*1D%(2q9d!J_^ z(D1>-e?e=si$MS~?q_Z0?JTnr?CHAH0$(4_#KFNqpO~fXIcGKQ%sOUE0~aQos=@A7 zgIn*$yx1fxKY$HfX|61dflnNFR_K7`5$7(U^90OpPtg#IbXYa)WDo9Fc9hEI@4vtp)N&Ppy@o2`SIlxq@GFWi7)J@O>o5(&NOTydy4y zz1P=cKp?BQKfvdFK^*0#v_o^Mw~@@MQ><=dbB`t^;e6A${DxA@RvYF{Z2uG2LwJg? zGerI-m9%~7YyEEo$SM~HkdTVZ^J*81ErsHazosiRLkh!20P?P?&c>l zo$}B>SBWzG^UUijQC9iV{}=zOK)z7HXg-sNx$4UmmN6~X;h^7F#+)ZaW|YYMAE`q* z4&(gs)=Y(!z>x)vq{ZStDU{7VLl~nBtDn>U_jk@`JmU6JqjIxP>Nr4Gc#8-OiUo7l zOMAf&PFTDDUrHl~qj-S_3Bix&fJCJdjo>`qr~GdokPqD2keJr9PNIiKf|Rk~jauga zcz#cS0NnEW zm`Hzty{9R*_@Vy0BnOK_Vl&Dsdgd6Qjv{0|1+_hiNJp@4~tIKdx!$PgoKCxyTWPJAS5C@`~cs= zjF6Dp`kxq(Pl^sPSUbDB%b#s<$|Jg_u?n9(-jw_oe8F5GjT0OsH~$@^q@-kIWH)c> zK?=VLd=~(Uqg4E-{HE{NP;KM~Z!xz8lP|abXL_GLQkdn`T%UG*$l-8_Lhhl!0@n&1 z$>M-ZfpLyA8b3n*_x)%?Bm<6=lvK;}m4{{S|8w(qr86{6*B&G!DeRy8HytW){wF6L zHTl0+@yUTM`|2hssq4&V8<}eva~upMcW6A74c=lwazqlzLyAw- zF*nJ`4pAFXVA;R9$e5n)^v+W$-%{3%XB%6;*E1PirSdz%V%nS0ar?$igFij*Bf+Jc ziKEz>7NaN>3Wx)Q`Vcy>74?u91~yi<7Ue7U2+d0A7b)iA9^qf9u49q2sd#UegD8SU*+#E_5 z-AyG=?o_l6H;r&5!aSzx?&zY9XWP%L*pjJoO>{7wwrnYSS^s*;8SGl2LkoQ8x;7`E z+9!IGq0N|66$M@z^ClRpYCJ1})RBMIx&S7)tKq^iv=?vMAzGS#)=N2XuXu)B*I`v|T6kWiermjFbn9A4xrVHeWuSS3%WgWbpibB#Ss(ulN4$)pQT{ZUnkTSoX^CFN zN)cQWzsdB_s;Odtr9fDRB-qbo*W2YJ39hJenH}}|XBU`~+}iDs%gakH{QPsUJ`B3s z>-HzjTR%O-8IM#)T{@h=VKfID9ZM|RZ(usYJ(*24$>G8{X;r`r z9gCRU)ujsCU7t-EiFYtfvZ0$Mi>C4R6e)uwlU^HQzmWoD>9b8IaKN7R1OE!zZkG+9 z(PlEIYTnDOS}J{}-YVXx7XrPVQ1;*M8Hc`B!P_+4fBLJhjCn8@^OU}yO4O__UR5E? zczd5~jKfG)C|MZOSJoKrpw_}30cWJlor}kyjs|P>MMQsU$oo(>nh9~WA6UZuG}y-? zxw^u2KFJ}q&^hhC>*YN`CMjuYO{^4#^zls?yS<^I#k3(+w`?NJmEa}oK=q2a?A*k0 zF%Ox*QGgCLoz{QDV{81|nuk_L1lK;>>7pThE9TPvsc{n9TZVLaeT^)NAv~_nUMMwM zme4$jJ@QwlnAAaWFIrBQN^?AK%!!kV2>(^6oZL7}bNmy72A&NfO2pw=Cv+`^wA6;D zU0Hz*Sl@SSkAmxPSes)M)oj`Z7sz+wR;5tZ&kBZjiNy5V3l$r1GsmujC6x91o5o_r zr>Yka5CCH!jp*#KhEfrQb=qi-f5<=6Qu0nGMHZ+Z0RH(9+bLt;;->I{mndp6O*XO`^9;7j^yBZDX2L zlZ1U@mF#m6+93zsghAv=+0#Fzm4zDv=lT^0YIcdAp*T0NLqkfyap2>!gy%~4 zP$Cn(;*v01KNF7{ISd6RF`AB4i-kGRwHe2sP;~ovLwg6aab)PtzVo zjM4jz%~<_drBn;Z;!yqmyq9TRTa$@y)^14Y+3Y)4IM8x25?Wt-!W3RKjyY~Hr4;d)JRKakYcEgv~ z@{nIgJTt0lx1qBd7o#nq0wbcP31ZX+8NW?*5X$O%ovZ%jwCtml7XntwZ@=@7)L#A0 zO1tD@w*D^T~zG)_2#mtLSlHkMRl6H#(ibc1W zmC1t6v+u(+^Itib7Dk-mt0=zYx_#LA<;?k9$7V@?C_N9w?(|8J3IrV*8W5D_C>0jU zSz6czk}=1z1IOBPgLL@^0*S8YcU57@)XVQ3QtMEHDOORDJ*GT&X6v@Kky6fz(sICF zKe2;=91>l6K>M2FN~ zvnJf#sNw$hB!_dyCELFnnK_t7G%E!T#DMHtmV5G3uDoKHP7@eI0q&N&?%Eb)oY&~X zdwRR+KsR+5g9yp1DZxBcWZvFUDJKy|PxnLFjuQg^B=$zq>OJI+=D5_H3m@N601kWm zwSlQ!+vz8(H_h+(UHI-Im{JOzd>AA2_#Gxx5FULZ+4BkmcrIy$oJ7=-@EyZgJ*w{K zjE07u!cYfi<{CIo-8#I(`u&rLhY&aHYe)IvI-SX}WZe;EAu51JEb1Yu|8}xe^A1#( zY25FOAieZ-XC)tnX&O$-v0BfIl687fWYxo&Qil7s+M{R%VtQAixkykWnm52^wAQ*# zhKV7j^;#xL`HsB3#Zw=3Hoejmc&)m=$yx|&YCEI>j}^0`p;^R*x^Nr$wVq2}T2fNz z94g03PVidc&YTfdm@RZSxljU{O_0W~a%ycl^{YFosIZsLP9w#3e3QG?M^=^M6_&ED zj!%Wikrocbo{Jj-vPW>xz7i!>oppO#=Is5lRDBdNwCD)1Xa>I9u|IE7H85&{Uyv_trS9 zm}*eqcQ$QWIQqiaEbmdv=B%=@C7eC|e44vu!<0S#p;>*BZ#^E48eb)`C-AW$Q=!1+ zguvw&T*b52nHZy{Sy4hgAYPI#MPx*kRFk3a`k`)k%UBr2aRC1#NYV)#@(>@KJ{y|L zX~{GsS{t}GnX=MwqxTm_*~U>N0iHJjSj#l(Yul}Q@15Q`QR`-= z7kOrrwT>D;J#DIJel}bE>INAN;;qL0gg$%TfnPPQV@TL4C~MCIP%~3?rPG53KfP&f z&4wpxmu7F3?0ef}K{LSkIM?F`ziA%gjvJi#Yi4I>*I_++UD-1A?hCx_O8!$Iz(wtn zmegktLe1Sc&cHQEnU?eB<|!olV(Z93in%CZ+|chl`AJWnrHe#-h2N}0GAJeZ44A~@ z23a9uH-I22@L>>w=4ElIuK-*@Q~Dzv+tZsqT~La?93> zdL+sfN;hb~7PH~oa#*CEd>eYMvaU8Qtaek{4NwQE}O7ws<*M@yn$FZI7^ z>c1x8$2BFZDiD!y;1j(oK0%~lFeOT>^L^>s4rCXJ2}B1&?rUzUy7Fv2wrAsM+M2l5 zl$2r1&B2JxET1{&>z)oLRW)za{lMW;P@J{4N;BRZ|F#60gV!y~=qeC@6N78)HQ%hd zcUBZIAaFl_202(x1=a14TP|2R@^`krew7G3gL=zLs_bu8Ug^UQNv^U^Th=Fyt$@D~ zz+2w`IV6UD7E%Y=vvyS}d7Le=7nIp&T}aeCaxAiA0&i%fZ={{0tLaZkX;$EY>Kqrr zS8W6}dgF$k2*NJM+XgsiUe;PUoa-$WCSjjec%6FaQdVO6$)>ABT=SSZ5qL zJlURC!ST(8ucd;uN)>|I{RQh)|K&?@Nq_SBP=9;44O@b$84j0AwL^bbUGh(Yy^4+gQa zXg~j>i>*q>)FExcIx^{_+B4KE2kP+1I^{!F?nhG*^n=4m&X z6tzhJe0vQahZFy$R}Q z{%<%8dw|+_JNZx1vXD3 zTmQVXqu|-Ra&qX_a*o&EK9Q=S`AzDJ9^MR62wF*TS>q~(U zDd}@sGja!OH6)BMsnFRVzF^7$6K&LjnU(E7bWjOZ>ffCm z8IK?gcWatLp zC`5+}NObPxV)f!|)TyjI3LhsM6l>8{CcJA+ZoD+a_^L3?-y=IY(8 ze0@)|qyw6onwEkuw}pqr70F-k@9%>XzEziTMzX2iyLV4LnV%H@Rc2;p%M8Fxe(j%` z-xyv5zA&C$J&E7qPg6yqbCt;;G`c`NxvsumC4X#eOxMs*F?Y1uVE}j^v26a00On(= zu%0Vs;Y8Y0SAV{xo0@QRk$H@;=3)3i??6y2)>EuFx}32)AT*2GTZBXstIVD521!yy zJ~i8jnICDsyybg&vJF6wVaeT8$E-2fcI$4?E--`@@ygbdG*$x8&&XN_WksL;-MDWc zaaYJ4{WDo=Xb1$)&(9CH;k9gOXl)Jh@-i5&ef#!pU7hGa_4m!%iY>7Pk5?rn@oe6{ zzQ~g~m*^^eZD~U)<#8D0+b+=a24!2T|8WeHq=clT@9vVOr_+9MjoNBRtzM0lf|qmrcmdR1mjzxd_8^i?wubtmy}CD_AFNBS4bY+q!gyA6)5Ry zuu(8EF$I#c&DUv;f2`3>^R}3-b8U(c2-;K^TMqPOB~M99d%@TXNyW9J4a7PD7EwvN%n%?dMEg z5EFCLVp>vCQhH=-bMtL4%EMp+0{M>%uu|y!rwKiwubm07rHZY{yhqNd_j3v%&rFk? z(*Pg_fXuw}dNqFw%wFrh9IMDh3u#GWIwq}8S!LXM30efEsKszu}beu1{OzfOa9 zPm=_!WCR7{w2I)V$+Dn3IbXLasxi)s9(G5qXa4j^L8KZ^6wI&Gt5v=+4o8iNmHI#a zZekl^6rvy~=Ky>H3<4Zm%8k`ll2EUMzuf;qI3aNF35P_ zdEl5bNGctzgE3b(&x7>v*AxTc{v)LAS0o=5+@YW|&4$m(j16s9P?*9qAusyfwLCmL z+}GDP=V;yg{HkN*IiuR!4-k}U%FQ3!qk+hEIINOd1nMY6pSBpO=eA^NTS7Pf$Rb$o zzW!W_Idcf82z&SrDb?b;tnem7&j(WZAcsfhCy`wcxz7@U?ax4_^7O`Y+8pNJd>DQM z{G}R4ZC;xEZz^z+()O+Fd;QCpK^&;&-)Gm!C8!vg^9n+UKj@uLmM@R<1CRg4^G4OQK7=0PTO%%%A^0ZbZ@Na0 z`bnE-MKyY=(RyrIWjx51T(=l)9AMC07he3l4o^r(s4@W^OiQd`vl}xkA?p5w z5FKgIWYjDige)vCTWv~WebNW}dnmLYS-aij27+dQNkD)kbto5(a8C)-tKQyT5zYLs zT<;Db?VZdxL`-Dk>42k%4E=jfi321>_Xva_Jb1ow58n!$|=I0RlHc`)C=t zFIHN-Eb6<-GWM;3>`)gSqQbL3EHL#+XBkr}fh4e3^lkRhj^nWN(t&p!@FC&TCqETG zY|1!WLt8u1N9uaT2I7osTw=Z?&}FL*N!*a9ifrKzbrm3mS&kQC#sFB`+w)j;Bgvrw zcQWfRMh0nA8B-~DLe(S`zX*E>r5=rBXJ{31tzIMx9SGE>o1=#$egf(X8U&a1RwIXe z_o>K)0Zd7W#5%6Jsq&AKCSV>d$1GO)hMvwIyzk0aJ>|z2zvsi(5ooX;OuXIkEaBk7@>(8uV7$no7a;QVfpLy<1 zV_ul9x=}(H2=59S7!qQo6fOV!X_MvcoQ@A6BPBK5mcd#IYaoUw_w!-m>+0(6(tcx~ z%pyo@%3h zs2gGp`34%H)CLNWwZx^CPgK!1?K-9)@IqPO;{xo1z@dV)e_V6up-i8%;Utz4)qY1n#W=%MFkzDu7LjF+yJt%*a8+kwaVz;ysf`lA&mA+P|0$&qZHr+xnY&+u-Zomm%t zv`RkQ7eM%SWCw1B-6hN7Ljiu14XCk~FaA8BZvA36DtVuYeW3ccqH2mneP0F#Z}Iwh zox3Jz80?!$-U`QJrM)Zoo4Xu)kOL0dpVyY%y;8Es29vV4fP88#9cF1;^E5w@QBrh` zs$DBPzcoUdnN0IzK5WFvh3;567+QP6ww7p=yx z0fG^qcGu;!W-cZhI>?h(OU@~~*|oaIVUMr%$ia;2V6SobaX094%TOH|UA0s($-x`! zIjuCc6BR%iy&BsAcvCX2RF9C}Zo^Qik)!mmub=ZcjWc60wpbxoI-G7?4*1q37uc*j z*m9Za+V~Z27Y@;aK6BKLY{5-IBYsk+cOpAXRnGubjz{NG8nO8^7O`n5>Z$$3P0Y1= ztT?VUVzcx?5t6%Y&zv3fgST&poj#U@Hs#dgKuB@o8s1Ji=}^K*yDR|hVAbJANuiag zkz}(!=UvMnyJbaR8EtmU<&U{+a`-qDc^n^V?E71}yeK;t*E)^?#@#6HV3?ohW4v0qN@r9jACNnJ@y)Ve!48?0$ICKoq-K?N6~6) zY7)Nu?0@`6d7qYK<(myh=4|@urh0NF)W_rF?|@7-X}{&e3V{cQk+n$d3>TTzDT14=7H%eiroov)@}ChpkDVzo?>PaWN(f5Y2OVNPfXkS`v+iNc3PrAmcDE7KB-u-JYU7z0ZkboZp$+k1TY)@TExzc8qE>9VH-z z7=|f4M=3(wbb*zPvaZD`Xs!<<1HK|x`V*gx4>u!q|?T31sQT$SvvvL2Pgd3MenKHp1vB{zu>Z(O6FIk_i zta#Oj>h!;u7{j@-A}nFYOQotgV!vU=zPOZ%QqK+$9+`JCr9r8eqJ?^%&C@8y(cl_^ zC?FEKZf|PDop=x{*tTsh43Fi#cR>MDz-j-gz-DPe&_09@4EU)n7Pf0KbKpgNjdWMK zU(Hqh>VEX*-t_$_?5*ezo~{E9mmDf&gICi#Z{HUdlJcaAKJIy0(o$Wt@^MM4uJ)ZW z&R?h837BxGoOpt&(0!dOwivsC$bJb$jw`fkYj1Y-#n*z0Er}QhZnuEm_~d3)-p^_VUVKMzY!+@JQwwGQ~4+}6+;~stdyD^Y^ivjY7D4cSd z0^7q*aRD!+zc@0~pJ?-$jSo~Sm7nY=>hCrY|zQ>_4o@{$;)8?e_K zh?RWqg^^^B#(ENcTx)eX8^w(JDGW!-KAQ(+y)Kp7=W5>O3Le#XHr1wz2!%UoAJa~i z56jfY9|KsxIqj{It(Vt_s)QGnU+j8s_RN61`gqFRJu~p2kGPL45psnQU zJZ8V9#BBdB{bkOoehkzEa;AUo&aN2-E@bK(F$bf@lCuKrmY>~-)n?hmJ#qYT*j%)2 zcOY;%dd|UJ!BHPsrLF zqN`>|d4sK{WaP=EM-GF?J~UHM*x4ax8;4Gl+~zTEt}XfbiiU=N5QT_h5wmMFjg`4u zeKd-O@1WAJ3kUE?8JL(*OJXr)Kf4ByR6%`UV#>GK9jw#vBnFOg;7!c~Ved%*xE9wy zLePE;`l66X9pult5TdmuUKQKDT6F6>Bue+6S@iR*M7G3jNlc#Bb$5hRr zJ@fgdJGa+LSca#b?`{~!aNOsEg5{?(Ub{8ntM+(5R*-splCkezM=AWQgeN_`D5Hr z=SY}nsu8uS7_VlWfieZ&9Up&zgeRnY?pMFwFy(TjmU;$wBNyLeEM`EA-i_2`%&YYw4`aSb@bN5!mrz)`1A8V_}A3}*S zFgYpw5Fs1!Di-c`!-xjr(E~H~Ur(xdRYpvbR{fX*e$B3aX*r7E&$##f??RBcuVb+~ z?l#=5_x3&bORsLim#lAJ^1jVGbHi;qsUA0Vk67`e@2q|`-5@Mm-jQi9{C7QgzloDT zyA8GTZcOMA$T4V~WY|(}?nzaamk(tJ1ME#|*Bw(bg4n^p4@=>d@Qcl&5g$p8tQ17| z6N~JX1k|@(7ING|PCaN2XQaW|5C1Sf63F3qi8wmI^#nf0NtKV`Iq{={q2FVwDG2o6 z7d_m1SbY7r-CLe_pEHHUKF^RkU4a(_#k3YNpZaTJg9@@@#Wbe0FP@j>ZCvct!7)#z zG>5X)r<*+cYdngHOPJhKXwQ=G39M#uo_V2{&XckCd4|S)#c^A~9zPXWQZ_&0i2;Wm~D$)!0^GdVb~8C$Udo* z$}LTCT=pAqX_VBK+^&6)okIPJ*f_)rzM6$MuwgQNG z8x2egSMk~Rzu||~HfbWG1vT4Hl_O;+2QV2yb4l1~KTqZ8LnDxvvg<#A=1d&jcJ3HF zp{%5~l!Sc9CnV}7Xg>!|5+;ee__UAC$L+9W9WKza_Z7aLDK=lD<|?~(|Ni|?5lL+y zM_(K+Z#SW$I6nA(74phh3RvB2eKwt2l*QsxvJm-KDE6Y>VvSE@-jj53|BLV;O=y%Z zE6(ADQS=&Q*&hE>=1mxhe*JihI{&V_4Pw*c-=vb%#ed`ny{^l`VNC+(YkR z*`ZJXB?Q8X5wZnV^5j=MI}^i%QT(ztw`wec{GM&`G?$zXt;1E?YQ&`LUrE=m^p9Aj z!?&z|{QfKS#52Va|D;}VeWU+72>Ge0hq?ic~wbnxI1^r%}Qo~@=pJz8F((h5`M^I2Ra{NW0jDyj;qKoIs zJ#+yMN;KVMH#7Qal)1fg*Y@&RP)@7;SEUb!l7e%+2znsUhzl+%F*xKQ*c%exnn=0a zJL(wx{P+V?@*X9v8eBd}xnI-PU39`HqfXi%`O9>8JQgV>EWFZGV=2MlqTRJ_X_+E; zKT?mC{Ajnz!gpN2$}u`)10}4HNzMc>+f#Brl{lnj8KaPR zXH=H<-~7BsJl%J+Hy@gd)7|9mt4$Tv=$TV%Qu?_;Oia3J3;9+l8rPtU1HEoj0Uk|o zV0_7f<;FRWUEPui3`#jNk#je*d;Fui%;$@$h^%*Ab9#NROP)qj3~g*WnFrWDkzjPq zX9N_JEUoUjxuT+*y>pTq-#ojdpv&i5M0}z zCYF4?_mJuFu~h5}UM3^faiW($WT}Hvy{|IjOp?00Eq?AR_UTzFIr!PEmbfgRW()ky zO3kWu<(Zl)#(P<8|NVKUeW1kL)U6mL-f@!fukmaH)xY3buI6>FAg#Rr`kt;K>7(jF zx*Fbr=a~k!4=1rf-M|Yl?mW&InjFf)gy$W{Qa!xFEAR@=$Z%I^59dx=;ZL~ML+!rE zr>O;%p^uZgEo@AO#gu0|&RS20P%N+-KJ3SOeYBhPxvbPUa&>T;$Spz0J>WEC>@CE@ zUDr)-J8L!e`DoQ>W+w7bj4A1+WN4*7(YzhvU@9_k^x&1Fmn?_O>6%Q>%vclus?P}M zh~C{1)PB?@y*7r}sxFdDWYHQ!Bu3>SFG*$mL;)E{X@<(ihCEwN2ser_Lb6o!XN&3xt zuHR@VfR>${*_D5VkzK2w^rk88+LN>=Q&8)<5oFmje4c}6x$hZ>iksXVNYcfejTKqx zK74$$)fCT0pBha?imUjiFF7;l4_*=G;4N*hcWJ9#oLvN)>I)08L=7)rff`f?^lt9}|@SF(h+8X6nH^pBNvlc*;RN{rCXRx^Pnp@TZz-tup%xk-n7;+fi zKf&CXR<-z&FgFZy@vdu-8DZn{U0lgnGwbg4{}*j4jRm8iO{p_~K?_Y;012T!-0$cBSP=WpyT!c_25o-Hx)tT3MmJ?c(ID9Vd4jP*CrOo%DjLO#7B zf@7ZhEYZRmI`8zv%6n8W_FzXTo~@+V$Z%tj+BmE6SBi!6A=)u7t#B-x5LZ4& zmS%J-&oG94^P8>0HUIO`Www8Cv4bhg1*#7_xfC^F6C_99%qZ8O{9s zV?DZu7h$tDN`i7Ofbi!e|EBpfF*L+h;`ohKG3Ik9I7gb_)xOO)m*Ll85;g zF|GyU`#R!<&bdkp4$*juy1iBUea>rwrh2bBKDnkgWm!in=P@NQJu3QDvGuK*fgqfV zIV$hd(>ta{dVS7@#N3fj7@C})7>KaGiO>7wFY!~{r(mhzGRpuPE73m-wJ9ccv8ENM z>7KLI6q)xXufcgfk4HeRU#5sdHCCo>p> zYS9zMUZW3kP^v0E;qqP)K6^Uno|M8cr(1T{9b`i-i=)Q2oiq2~)6uErBro5?ViKI+ z0HJbva-MV-5>ohU^@_|I>$g^*2uANSD*+$|XKLv)cro^RTbL#RS`%eNuk;8pem=dl zGoAB*(92w>yTLQw8P?E#I{hzlcY{qPU*>Tt+gZ>{C#q?w*k$H%hTn57{tdHx$;S1P z6(9Sjy{+2h%a^R*!+Ci+bOyaMy`J8u*#7kG@-XvK?^L?@)6?9efqGA|v*aTs)p#mp z_(5Yg8M^w-od$<}sS)qxZL;hv23lNs-P+Vm#SUvF^4BKwckd-=u@~i6@%NaBf2YZQ z&_zdyr)v1>Xnf-vz8x0dUFaQ|AWpjIhfB=|Mi7`z>v zfDI!v2*FAt3}#o%+z(Q};AyAMxO(7g`U5-;5Zjwd@$q{F8`HU_BZEI1U~OUBy>zAD zG{_K48q<%=b2b}2T+m5TjW2t8M>=y)N+6#@gzp<&{)w|8Dci4vXhCTvvhchLm+`qq zYA#IhuKYcksJ`lq+y0(6MAw7+Mikw-c4I&}Me$auTDk2czU#_eNPWjqB~E;5N|}ew zJjuqia7!)5PWZlf43mqwJwubMsAsOnAnX|9=lP|igf=^FZ2oU4`pouZ_^eenpfNh2 z`7}F%&Mq5$D4!LI#Z78x3&=JQlFBu&aezh?6j3?8O9(D!v2a2IcFzGma9&Jz+= z963lXc79*Z`Y2}Qksdq7&UhTAh77E8l*L^1z&$IijPMH+gu(N+K8#{^CUw$V*t#$6 zHAXhP?!`GpxSFqdnQ8al8@nl;>C^H<<1sDnnxDT=ZZGAH$J1|>BsE_(@=|7x(c5KN zv;DeA7-8WcP>{-czNp(XQ(-}22Z$qNZQ7VU77N(<_X?}lhMMS0FMAvqPf!MRRk>CR&fl zyOgdxpj3%@)tqV-mpgHr6B@9oRq;BuKH+i7F%ypMY{ae0h*wn2oDZ1P@Hat74O0I#q~>CEu~zQiUk@{lvfG-uVk(qQo#~X8GKW^AbvZ=I&naYM!)OT+GEV zhT51C?V+>VrN4T$6YrK4#nGRd93}W9HD*N{ZAdH>_jziPo<^Cipzy=7B3ZVOoJG4t zJLH(~Ic-V)#j+`U8tZ=jRi~TgxRW=FX%dPF*{Cn=5Y}#I`PyBXT>-usTNzMq&q0v4 z?vTuXxbwTvQAny_`dQV2B+EBkY%D{=L;lzdk^W>iUMeEpP07<|Xa>nvzU!Wy;=nzt zpnZ)vU+)bMAv>!1xow0o3i0)gk|f1`-$@-grfx+=2K8N!yT~zh)lBVBvdYEg+Mdb{JU7}Rb0H1JO)d|wca=B;!bU*J=?yH;! zxk@CTApnD?Q3~p%`sDZy(|R~+Q+ zT$wmR6_mIeT>$20qwCMG+ub#Jl2**BRLZ7Vm&t8gO>cj<$j}Z~lc-7vQJv4rX4yuA zHr)5fj8rMq_wV3;3d9CmCv|6R^*`PhPZgS*e@RESZ~%>@1Gp$)1LW-ABc3pE2^_fE zEP^c?^V{*;{oUy`K=fQrI6N;*Iw}3rVdd@R&4moC+O76{sOFzn@~z1(@#w?(SrH2( zc$l%Jv#~wU8ZB*Fs_LMLmH9>fY9*BA%3<$f;0W8-Atf>6Ts1D%)O8;K#(D3+bHnf~ z$E>upv~~JFZvdOT$&KrU7UbcTvp45090S0Fkn8^P&?oe~(^pLf;pJ^4Us=1XFS|qq zSf%#~Uh)oT%Pa?MjOJ=1KItqS664yBSGySDCOJIVRZ~FcwzLFq#WtfeGJMsxv9D?r z*H^_o#qQ9m#w+m^iDZ7re4WmH%FKg#HjgKxt(0r@nnF+xZ*V_~9I|#D*?yQbF5f%T zDvn`sCjty`RSCU^$oA>k*JQ{nA=oar0;~#XKb}KYr z3Vs13V*=c>M`k03FipE?={4&(-NCWid5~ z*B(q0Nk&NRhZ!A&Euh;v=&IcSSYvvW=$yhrRaN$1Z5AT<=p^6!H@9x#ztJm&c;kO*LiA$bJpiH>y_f*(TH?28u7h=llqF1YZX8>-- zI0fy+mIVA@pP7Uq`_()NucsLc-yBxFF5B~XrT<&Jy1*)?L@gBVO~o2&HeL1fP5F8; z-!pV^wEB#mme{@FocI(@OuSFJ_y-(fRKP7mo9xBBm^m-(RGiD4B2A9uM{loCj*3M` zzBMFZkHm!^D4=b@5!loY1U$6-#Dl`?qV2-7M>cHP`+oR2pve!cZ`=Q}l3;e~CAqoC zS?Nhw+cwVi%}pK{ zukgi2Q+;8BZ}(HTUo?npM1~pB-}s;4EMSDwbA@uk`E`Np{1t!0p=|ay=Yj)!r|&W! zVTjWovfIuLK!;M_Lx{Jmh1h zx>Rh1wl`*H z^2T?S`Lk`tSTdBi6P_uqhI8)5_!XLo)0u!E(_Y{_J4TMbRX1mc$q0h*w24bmN!ZRW zFxx+V2WmfGtBds+`e6`e=t})}THR;tJW*k>vu$zDPk}npoyhgu;}0=bohf0~g%mgi zhqcsya7F8qF+^mojDUNJ(;jzq{DSB=G7X;ZuUnH?5~@h;I4g$PuY20;4Qe^RadA|> zf*DCW5raqxY7s@=`HaBp7!d7utH2liZIc9C@aW!j3zG7)2Mm!lj&2+|1|F}{iUw5e zDT9C=w%sG@>!2=D%zL!$6fEfCi?noaJ_T2{a(lg^Tf|N3Lrs6egYPEx^14lNcsyvJ zcH=J3i;S+ha^bqeqta;E?QJGQ{)CIf0yF{JM!hs&*W|YkN)o}EgV*UA;N*>LCIu2Z`PKT@OnAaGY-fmSsa)(hYbXZy%b3kusPySk{VqV-K6By)2ttdzqfaSSAcfM(I}~Z z7tn{i`eG)(ffF)KYD%!=TSv@F^7;*4aQMFPqLc1p(l1Z733I>~18#-HIZ~HEos7w< z{WH&GJ9&xh>Zpt8R1sF zFG#|Q8}ejG3pTop(pe=yavUrkqc#1#pbNFi+{4X1;(LZo5UvIxHDN6f8Y6!Qn-^iF1cz6g4>0B21BVbvvz-4&&o@ z29?ExJ4Co2e+Vn%-TnCPXAG|eKUFlmZigSIQc|>v*Jr9Yi$xc`IMuYDm=boz*? znZDC}!%asyPAo%-@|&a-H*m}Z_SFo|;oBIVaL@LSL{K<5(hEibmRaIgc$^>3U9mLb zBk+r~XZ?+~#{0|>W*g-1EwA5}Jhv-1XZyfIA{f#8laNi;;*5Ow^3e6AuK0{1B$I z71iG_Z7$0$WdH2`TEuU*_N^(s_z#wd+>$ix(#4S$3jwT6ni0|IOn2kg0B&=9{Xu*1nb>i;;tI0oL>bEj$X}I6Ek! z8P$E&!?E0-S#l-LKza{p2Fl$avmP2}YuIzO*8@VRmzU|RJ;TQ~to|wT`17vk8>s`> z&CmTl?`C18xGw;g@Pfz9z%+e92m}iO!Hu1$fWRig#l=MhFWBFg>r;7nxv*QB+otq{ z2>(SC!yD)lM+e39Nnn>ZRM5kSe%>*0S0nHIL8f>I$pK|QEzfYGxCD;3?) zr&9FRE;iSA+vJ1Bf>;#69c*DXh!4LzfgFjO3YQ76}J zkkI&-OMWP>`?bvBfQ9mDMOhjiII*oH9ZYa$V8}=l#~ov-G;Y3=yblgyrk?*OiN>n|B9I%Lh?%I zC)Za*yP#*(2c;aul2+Nx$|P;XCM^9fu{eJeh@FErdBgNlb`m;Pk><;`RNmBsPkfLh^;(2yU^w7CV7v#-~5g;jfV05+GK0* z6}~2fiLcCDd*#sm8uQL&r|6|6D2P3A*zh{Sh*fU>0Bf(+_VM{hbFJP^^YyQ)ZpW#T z!R2^-wn@XlC%z?8{(t9*g8Sn?Dw*OI@f!aW;Kp&%69p+ z&BT7XLgpN?2fb>hw2qK?vhOuBppW=c26Vg>IAGWFfac0QIYDp6YthV6`-LZo!qr^k z;joQ;W}X6dz1j5KL9`16efmHGiT!h|R|wv1*w+{Ly%vv3Mc+1*1z?7VpBHcF5aQ@F z8c$zeR9p1$A$+d1y?}O6%g@#KgBaE{diuw4&^|%PQ>Ise2_s z&jgc9VRb)*9&BkA&9?+VF1ulY2lc0$D;WtXm#pa*w$mPL2|a6vfyaiYr59i4>OKeL z1fxj_X7vxX@kWy3@Z8~lES(eD;vjLIoLDzAR4Ec;cOo>v(Ys%MD2^^aqVKuCsTA?d zVV6v3YN&S3`G_Q{_;A2#%)K!$PYQOdQozH_?fRcNYX(0L<&u~exIwI7ozTC%M(C5aL_`G|xNVj$ z@#m-%Xt7+dr!j|ywEjGDl$C8O=I@R}Z#y&>1x`vSI>SBj_* z|8T5ty-AX&{HX%+o5Syjrd z3&Kg8`X>vD*BI%7CqxE4I$YY%3s%xsTqzt~E|S`c(0g1o_wog3b2zYsAMzy+D{qs* z{^}U;_eycGgmf+HNMOPEZYoRsBhP+uD^0x3f8~0ZQy%^TX1`2rxHiRIPIN^ap;`3t zo8a#BoS)TtCAX=pNIOBdb7P-;ma?jdr~?)*uH$UoShMWNPY}m@-U(tRJo}qTD~w62 z>;cvlysim&?hhPRNw8yM>;FMqxGmK??#epCJ%S0D=M3~=GIVPi&;7h@_xd$M?0rMt z2@A*W+9^IG;H%>D=C_le%~U5RBSRO~bDf|&4ue2nMqY(;;{ifl4`09!)(Z!sG-R8M zRxrPs*T#<2j@=kQebphDG{K+!OX{apNer639NaeI^C?+(Yj--F%6~LgzTooVNIxz8 z>wB==1;QC&ur6Vv=jh zAL+vmEx1F*l21;B%#(arY&yQL+W1FrI_tZ8^Gr{tD*Sddg6kwL6}@2KVY7H*i&LMC zgV)0Q&Z5wAOPB|b?)SuRy-KNaCYI^MZz%&LPzuo$cCDgoN?K#nF33rx!>;}8Od@rf zh>OR}@!Y}ghZV1IvsiT|V*Tyjjo5nKM(EL2Ht*2f(29>F%MP&#l&5p4T=^lvM%f(9 zUN%cUBAci4CuPo~OiKN5tw7!WK?&#AMG>qf>lc2|WuGE0_2ix~7jI5(-4Cx{ZQDQK z9u1;?-SKSo@BVna-`SXZNeM62;+f@)0FrV}y{xnQ)jC$WJ{@zfmH^9=9iWeybTtVj zxzCbK|NQ)LdZIkgH0+NqcbjS+dmlfvC{8IYDK(9S_&{4sR^OP5-c&L3`(q zR#hJJtk-#7Tv9qaFJJpt?@z{7L(&ZKpUSR?G|=|dfhw0bd*~)sb^1?kT|4xZ(eh!D z2)ho^QtTnGW;14c?`p}cr~NjuIC^I|VP!$VRwCw!-(uhS^wpJ~rDwXS?vR!cx8U~t z#Fvi_(}Qy<9Ipkq%8KTl?b^`Ixe18gj7#$qKG3}RJvzQxZI%i5(WhkA&#sHg{u0wP zmunM!2k%|iV$v%t%||E=Qw(`X3Ldk%#-v^FCbJfA7Ag=~khTYZpilC^=6OKlQ>T*o znJpL(O7E`kla|+2;+q^ySpPa2fhC3Bxo;uWan*B2)BB1qU(F@g@{qMh;p;eU4>Xh7z{*$$TF{sdt zi1rrqLd)pK(YafQenngRn>5pqy6HpvO(fm3%+!t96fkOgF|@Suy;PaqQSyaWX>HMb zO^7&A{anx7wP!(TFO4Oh{)@lf>SvgND>dfDV(K1vLGXnUhY}+`HByuYm#e)o`kQmf z1-jTp8(f+Xt=QESoIzqsBWm)X00gB$DB#Z~!6mlVV>_}Q!zeT&k_TaO7C|UHOd?ie zcRkwV|DKLS?4hcqPdK(zBn>Mwt{llhr%)dRTRkO=NE)L;gA_kd&?tGZ6-q7!Ay9OW zxV|^@!Ho$&I`ObprF@y?hep|>VYnOJqB)DV05ntcjFf>f$JokvWRUr~8=^#=UzXJ3 zP!rX1&ne5l0rRd0nUgKnD_a?UT6Y_8%10nG?<6W-#Msq3?HpsS8KkE^+SYAuYt|oepRGBl*JsSZYef$s z7U47ty`FA+mcUr}F2u1ucO!9fe}CvOfj!M`ck2{5K15%!cUMa@@|JLlltXHsi%@82 zD|v`r_e1#3qO8TXI3e*P!{gk3H{THM4k82?At88;{<=L~Zu_m|{%}w99E#34XkCBW z3me^>UnRaWIpR<8$*JqteX`Eq>5oNfu@G{F;8oePdOJQDiW?a4Ht;WQG3Kn~JL~DHj`;l0>{1K5r39o0J=AAfn5%+>blp>5e<$VQuH;s2sDRErHitcV678X+1;fC@f^>wgm z4{IBj-+?AvlPPkQateAbDSixQNsH35vYnuhBBJx-bCei~S+pcVr5AYu@Vc)bl8p~p z(*=O4JdvuaUjc*Wd1*6yyaR!_7Zg6fB5Gl>B@RH>qA0yHWl--cnUZmIZc4vzxa1{m zIZ~xG$wSf7J=d!$F`ZpLdmVV;X0){3_Nvoo+&(d>=4tSU&SXic{)?CD&xM68;y;e4 znu>q$da^Qa6?!zj`pvvPYDt}&P`#kYGFH8tzsfuTY^SQKPIl%ZRbvyfluhAPm(i5o zoK)PNJ9VahZuyOk)p>cRGl{hDi|Ql`FAE>Lfw}5*0cS1T7s>ZL(?rgbjPw03=Q%-R zx;fSJhb@bSjY{pPc{y>RnXEGNMMM~`F;;qv=E34o_LuZ7vW(M$mr_#wZpU^MjeZ^_ zp;#FTJkn8P1p)!5wom^xRZ7AHrX=IXj^qmi>oDR@o8A)@ofh3LE*_6@ zxa2X!)|)q8I!_v%$UQ=$@9W`X;^8#iv=J_CDRsFKTZ&F2$xby{w_OE`qDb%g^c91< zOX8_ne(%w1n%{oUIm-f!Otw_is~xOWWDs~(ZRorJ>xCat2POAM6|^fd3#Cm6RXjSe zPbDQ!N>2t$pO#p0#dVUXfhkC=aEZbe;_lJvM1=Y+ppXwN;>zW}A$-|!b;kTB@s-7F zhC(Z)L|X$Z24}}i+TtI6qmjj7ZI~{mqjJf+dooYVDrH z^kne6-|X;l-~kQAw20?LSuXtM?H~zz!{WSPgOTQ)7I(ZhbyaFd|HxiQmd4nOlmx^p zR;5s{xd~3yv2`dXS^sZe0D*oc+)WENx03W81)>92@ejRQUaqnU^VMMTg7H{OgeQB= zR9)A;Tdo`?9$H4DXJ(J~I#u{xZf%*dB?!C!&A@v?CR^jc>TtkybpiBv`9EsABvtA; zW599_@BCv(K4)dJ=}RTu=CH>>Gl48eaao>e41Xyc#+q1T=^Cb?HZpcAYD zA`}oOG)_HU-u-cc78J>&J7TQbUS3u3iSEN-m9#aC@|ipOQKqckmt&n_s1V|!@F$qL zg^kB|om%i3AxgMf`=pR@GVr{u&nF%f3JB;Z1XAWw={|1bRNT%^gT8R@^$`;PxB7$i zVxe|PbsEIs@jr!RJ}ed%EPoP0(Odgq07@7|I)8F=S6fKHyX!>x#0LPe2I;i?bQ+sk zW~cc%MvBR#$a*FU(c+~st!3UZ+J4mW@kX|>HO#ngPxAr#6OnSw&dA2ytJ8|meNFV1 zq=?Qw8(b8}kCLyFs=gcA*(QCGd{rd+q?j-;J}6_!)X!ZH;ZGlAi#3FqQK*w-QrAzT zSNSCVQ}OWo@l9q#SkRlwq;KJsCyT_5#&XD7b zT1MjNkUYyn*TdI6F7buCfel~6oeGxKdP#0f@CQC ztn3&m_;a@G_e_^zyo>QyBoqGg;Q}iu-6w=5J0uW|Px#Qgcg}JL0gnO0Y-6?H>~t#h zL<|C{K}%uv!$e;oqD68DWRx&B#1Rjrf#o}Z>4k`Go9cL(qc0Qz-UQbs$w(_q5`rL` zMW(9Ah~Z%Mi#NK@0agrH^XT7*iJyE%k-Ozi^kSm~C!;&xc98iwf-1zQ9?uT`>sE_9 znuSiy;+=2nxA&4q*6C&#P~=XLOf8nfvyL)+Own@7(U9V*dr8F5YRI!&(lVGfn}gxt z9e`wRNd7~2-yk>af3*(bg+g;fY}x;PQ}9@+wesP=s^JMGV_Ph|$8k$FB(m^Cfe2~< zQN4v!#>1=RWYr@N6T5|DewR^5CkGJLz%{PNEAtH?6M{=^fb1&=3IG`et)dh)TM_^3 zGiMPu>%U6dsK1u|SLx9PnYe$Krmj|My^F+DhGgK(dOaX$L4FMKsrtK;^}q=ESu9J- zL+4))@}%VayG0%-+ASSr;x=f}*3$7cdru$`^*nSVh!`H)b92Z3zD9jBZb-%|UJC$s zd^tWIN3??@@CZ`ofh^LP;YdC#%w$nL=80k#&rTt$ZiegRgz&xEB=kBnSmk{ciBJ@RLs{k264xEf_;}R$j6X@XEP-p166 zxySs5DCvSHtw@*IlrE)#XY4aT*(PBvCeOVuK;+?oF?D}CgZ9pJXx`I@6v7k=xfe7g zv43Z8s12gT35Xs=|47mz^ZXtm6O!2n`wv?$8^n*-8- z1}ZBG1NZgia8PeMsPvMMJxE6q7ZqIqJnMkgj+qhQT*edB0tj4?eAoyf!;Ni&+<6Nc zg@5-#xr+_Hkr9AuWP#vp>0IXcr>BnqtHavCHvvfqDmvFk5>OQ8i0bb=g6{TMmnS| zF5qU-N3crOFu_e?K#&>*=wm)3Xas0a?Pra- zYRv=WJ!7XJ9=ykZ+W0JA6i8&GwQ8<0skIy6ph}1l8`u#K`YQ4Cg=o& zC0sS+t)v(PH3K|ULjzhn{s_5uCjyYUK&;#;!TOB|Mb~xxjhNM!f7&drJQXGg9r5_B&85ihA8FOIhA)_Rq60$p_ z`KriDj-&AJje|-?NsyIvyn29Yn{9(KQxAuaU5q0aWe{YzP#F0ENP#>5tabFefNj8q zhyKrU2I!tf$nOB=vjzD#NbE6KG~jv*`h@(8WF_R^yYG~@QCRwT`gV49%FD}5%4^o4 z1atvrIs~F6$V=AZ7#BHPko#7;67{#wl+2b9$OR5S3S*VinRa=Y5t_DI-d5VQ}kvZ zppgaR0Z3q2u6(lG$f)~l^Jy1-dP;IKf%wtUk>C0&YM?2H!U002WxD^#?{I=KFLER) z5F*tqlm?(;1I}_yO(OCm-9IW~q|JBRuKWytENe*SuA zVnPcz^aH?AlEwwT=JUSS)c}ufq2(|KjeAa z_cE7@*0%SsPojaoB}l{E$=2lI^=@Dw45~kA=i%Zq+zhhyfX7cyPaS7!hIslw;P~pH zH-fFF0%X%^H0_K6#I78kzY4=)%(<$+ckftaOf^>*6~O_X zi2;9*62njHk=*LWZF_(w26S8k{uf7^4Yyerf+|%bP_Cjp8?th8R`wR#bgS&FZEXcz zmZi_31oR5Om-eAh=-an%g?&#b1U-61Gpp5@K%xLXUS0s7<~a4!y5}ov7%ufm`rrFy zxz_t$LR8Vzpq%^c0Vdm{7GQY=>fy@DN?-~HXl`IoK~e?xx!XZ#AuDKq?|c9L{SZ7{ z(W|oN;CLj&-#PuoGyHHcKjViDz!2TACcHb@;QfQTE?lD3IRzk@$jF?(#q~2fTdBjUs{UC8?&C&9qR#s*&;nD5R9$S5cpcAGA7DEJpd zWf|2)1g5IJ4=oT8z=6l0vEt~->3m=y-~rr#z4s~wW=R%o3A&Yi$o&DNI3@{m0nA`M z6zFo_&`5}+53IO=$lW7U{@5-G5kIffomnu{55-e}O4@Kh8{K*NPfUq!H4$wrH@wbN{|596=0rf#QSkFi zCrl3lliVw@jNfi(+64p?gd*$qGz$`k;w9>Cb-p`6d3 zdz|epg5d#t8``!A-VC%-QCoA3^}rleQ4C~LUw{7vwqGZur`Ffw9>W{1gdTNYX5{Od3!XFDIun5bZ#Y0*eui1jrC)3qUAmTn8$vs&YrH1`vKOE(gBzmjw6RKvw@e@ zfdCH?T$44hTWVJJSh%@~N1z#}0=#uaKW+v$@LMN!sZ zF93~CO!c+_cn+!*909Q2-zMeb;~F#)z+Q=*Vla321NZK){P@5OFEYF?q;3pAy*#dW z68Cy^%!6u28k%bja+frpwX-8f8B7BLn>AkMt2yu)ND=Z@L3ajdJ8m8xz!5FryGl0# z2)F~7dD_~!dt;UE?cRoW`D}lwudi>#X12mS0?)+HuYp27-~qePv8IeRzrmt7kMcJ2i9sj*ASB*WNnj2Y|&4-qHa}d;x9gHn<_;A>uC?c|}DXwZ{hs2WMtd zj7gE8;W01+-|gWX*{CHJpAg{h2euNxfkU)Rget`B92e;DxJaZSpli|rZ+yg9TSNITxe2x|ipe~8B((Q$mmbQ5H3kxX{IV*3HYIsHI{_#dGWivuif)dTqrpvFNBMfJWI2UZTzv zQX@YT3`0Q(6xKsR0UNG4W-vGjld0L^&=ruds>#hc{_kfV%1QHUn^TUy%9 z6s&1=-hBE5fcAN}aR4vN>Zaq81J#?q>^FZE5l4zh#9MTlH1E|%G{4iYC({9?0#Um8-gq}hoUNr_7>WY0a?!J2xZR$tcC&Pj z+C4-GEIoA^*W>2@y!ss40oycN9rm4XS&HfoEvgOA%*=3|j*mRiLJn<^uI2PeCC+E4 zEl6&OS$f~CG6@s7YZ0>*-EP`yXhMzkPJ^d`Uj;93Wv`F&aeGBE*u0wK1e}cN*$`ud zxCxY4^J=al>rx^S8ek^Gfcby3p9Zd$AcqZp__y2*L+7fd8mO(dM!8ml!^MRSTM%oH z%{N1FO?)<5l=jC?X}fk=vaysz2D=ShT4M^D=kuc~2vkT87G|g^KdXPahUB zn&2h=YJP9>WqahtCP;=x0r~v@{|xkBlJf6E6zLchq)jFdKL-T|=k5U5;#^W%Ef;$S4mjG2e*13hsno4WWZLpNTQuaunhq!{VOZ zA(GC!ato+hGQwoj2VDr;wJbv}RqFz@b!=tv{LefD$}kV!ku(^p$17#u(Mml(XETwF=|nB$VeU%C}m>R|461*~dH7ElE_i@LomvI;iQ& zYDgR?OEzrwlWs)^s_POA#neyG`TU$3S#!%>;h>PX@TwD_;TG;xhN^B46;slMq+;0z zI5pb~Mr}_dig)^Y+QcYTcHZt1i|E!-wqBfs(^DsOvnoWU-|Pl%zwoG(`YD;Rqh+F> zJnXKBu86MbEe^YnIJ{pde7j-QV*Q0}Q~*!1-n7u->-+i^yKdBNWVG#}FvZZPdxp5$ z&w8yCWe-;kdMaeSdpz`}l@+>%RLdtWPK+q;Bd7c^2U*!scJ3Q}%`{K*HMlq$EvRXB?`ESPP61mzMWk>S}(T;<4RqU1H*uNn&x(2<0B2rpI*jxtE~Xe4)+0_$5lUS9rO)j z$md4t`nAzO|GFvEyMUIUZrgmwR}~CKf@|{ez`ZPjW*^4Nl`82%>x(OEMzf!dt^gUg z?Z(q%=Fnlq=X^`<$rz98hIny_Dz`i>KC6XA+kP-G$|r8*Qu+>)S9j=6TlA+hnsHz2 z&z{@mu2Js(!0?{MN?7GuL+o!*Qu{BrDyAio3or*OrRi?VH*?nRYY(IYWOkX2+O)j5 z!1wA*>fTO(E=ZXG8BOmbv0F(h@RxYCN>cbUEsOrqjp*&O^WyWjg(4CXx!=AJHr4cixON zdpa}P*v~{H=rOOIGSG3)lkng?>eqIH!P%OP<3;3Wmuul_=5q^_u&jss@T@f9YPPkX zNG@Nf15_QFCQM!IBnE7}SgGrd7R(I(?7F7FMAwmxCw`GbpEGkFj#&0dvkm_A*_s41 zZOID?z!8Ln6QepM1F!T}bJm~@P!*Z*8WjU$2OkR=nHWJ|6FF&`knt(+^LEs+*-i3X zwZ%avc)iEBjo?Iuv)xd9@i&X!b7zPv@5;{GGfmO=%sW~Pyyx8mSM1Q41w^!t*L3`J zbif+9xXnhY@5r?0qjT>(t=<8-uWY!{jb372X)Xx@h1%!5dN)7ZI;Eg~v2|Z46C3t^ z|IokmJlUFOT#28@sG*sSX+?}7`w8Jm>%dreomkH@;GCV?b>(M#5|K30PJh7McdiaBpenOSq>PTYMq z`<7~R0^_{8h-umy>>IB(;N6vlLK?_k<>!kj9(hBPeTRxDBp-JcDZ$gL@Gp)j<5J ztSef9?G2fhigbZ3YQ3-G)zwjfs-*&vy??u<>g|hPAKeXtoBqO_E_v!+wd2J$qV0!$ zL6?=Sud_+<)RGRb48Q86gk$I4;ENS6kEW;DYRyg0Z$e_` z^+a`L4ioa?;pG^>I|I095G=R`>o(^FgP%Bf>7DHdE8!>C$>y}px9^xcO!+7*<_%f8UQF)Ob5+x) zlC6td=iE8HcCbd=U|m5K@_Xbz-sZ&hDQ9s%a!~kbr%hrlUngEG^FoGSrUtq;3B~7X z^!4|#OdoxJ@dL>f886X}@vL%!@f0lT2o;0Bb9&n7$wx|#J093|##XIOj8V-q4Q3C; zW7xy@*!@RqEn}Ip;og7y-e=^nX!-C^OpgvVH*NntHAp&Nd9>p43^`~)_a2Tyh@XgZ z7BZ@L_lG_KAwrrAgiL+rvWKo;h2!hpUh>S4{n^mJPR%8KkPLC_BvVDj_%`R?^ZaBccr!@)g!=w z5EI**apA~lU{r1O0O6+{a=b4sjT`0>aBwXiD}zqd+~y=SH_gx!VLg78*DdTB&7E zI}{pFXR3a24R6c1M&t$K+X%p!^6E^H>eC<$j3aTW#0U~e15vx+HV=pXq=9Dw0y^W4 z6&ATg!ccYRn?GG!zkAg@9DE$WZ@+C6Tt57>b*MPaz_C#02oEh`c(<2a$KNLu<^2k) z0X~IOS-16md~k&2gb2yqWw3W9@vJ|}(q(_PX3UOLk;&|OSMY!)Zrj2D5ptk~f(fVb z%Cr`@@t`sMmPqBje{K_PtIoiPLFxPmC)|l)IBEO|jiR(-Y}&K9I2m-hxV&JcRs!)2 zoz3@`W(^?XTqyOpP#1jQrXCC(-8KuA#_O-UTxy4Y6Uf7##>XOXZ6s1lO@N$kE8e+-4F zv)wFZ^Fwbs6k?)eN8&7`F~gGXUkcOd!CduLYSOm7 zqt;$P*J{$rCF^oFRurSD~-gSXJGZ z7D@TSIGSLPu;=EVBG${D9(}6*XuVI{bLqnF#lP-o5&XqztkwDxO)bLdnDFuIN}P;= zD_3lyz5jwj=9`?Zncu~DK+E`mQAlwl`xzK_nrwmxFVe{IpWZIpI+8ue$wyahknwMg zktRF$Q7BZ+RR6M5RkgIKd<`miZ$}!OW-5xms522pxXRn-@O8+h=}t_fRoZRvcOUC1 z)}}E7UPI3TvTH3QG;hNYNig=~K@^tk6iVuCzBZMS__dAP0&5i;9a?<^Q1vdAQZ@?t zy@6GF1}rqnV9nx|7regl2eVC>Kb~S6&rFb%oimw$T9}J9q^r+-Rsv96o zpxR>c%rwC{Dr*}DkkaILxT#0^&y9J1r-QL{!4SX7Fb(6xL~zPHP4}ws>k+JWM5i}Z zewF=w(SWvCcK_nf)*yL8NT(grWdV4BtwS`#Uk~?LHeK@RFc7}U8C@^aXF(_WaL4X> z<^G{%)p2F1B472>kqs-WT*jM8)hx8qOog|%%d;ZLa89zWuIZe%Ia%1ZJ1x<{_fn8{ zvCp53Z@M=Nu=Da;Uy0@Ra?pd7Elgt>qMa6VMjqP8^h2CQG zzzuRg7XR;o+zBG!Z&;4Fv6QY`S$OY*ze zD5Q4D%W{?kGZ>=Y+NQ|xQ7Eir&=W8b$mv866=Q#Qd!#_e`S04Ul=x7#ywi+FS6(M$ zwe1P*Y8d=~&V<_P41^%-OYWF_d4hKuc>Or65WQ>IMv|q(=uQB#1!{j)-&R(W`dp1X zR6&?>Zk`b#`v<9c@SlukgWpgZ9A@i4_IaQn&gJFfn+J&=kuIX(Do*XdS~!Nofc>WY z9s9)0%+(e=3N1z_} z^{tOP0J+M9-PS?+y`8NsLUF%kT590m51@^}ebMtS#Vc&>nzw0d>b_@4;+0S$IZ$V& zr+ugGtA&q8RYfm`qEB{a$s^i>@%FtyR>^cE5kUDBf(J6Q=P9P&j8`|s53HSTP0|K) zU@cvp9|oR!23nFz0=@P;;(8vjE+snE=v$p@9bv!$@NNK=IVv0bozx`a4T$UAX0Lsu zcF8y?7x8x`q3}e|Sw7d=!^1-aw0)}-hUt6K;Xlxa(Z+nhdqRQZn|2Dub-HRBq*G$6 zeTyV{5JE6`;;M(uB} z8v;ZBV~|0MqSJe)b`50hs&I#EFy>e%0r!5SX@P+dnO5m3{v@!nwI&pHjF*m{AFhFf z-s}bq-})@->+4D8+>h3WOv=4BM+-poudV%KBsrt?lKgjdMtETEB(v-M3g>|#c)LJ} zJ2f@cpYj4kXkFcB2G%_=^{;S&g_MU!Sh%ql^CCM={DYs!E`L901L(kro77mD9b?wK z>!8zB`b|Yw25%S>X2g*7TS34K`GF8rkXm|#Cu?ZE4ObMXNJ<0bfC3w6Iu8!h5e;fg ztahRZw&^OwM*5Alnc1=qJD`Pu@QVsl&cV5#NP6H(ykJq{Aj^-tsff)=VoX31{yb8-Xex7)GxP z6#WZ9G>vPmX0y?)3g+Q|*|(=8ZIQ!EBfvLBig#FHa2zRv~V|6q{TMi2~VdDquqzHw- zjTdOV^2~_+%}!Va&~j#Iu{0eG%O>UO!zs10o1Wt#I{+!(;y!ei|1|qM`;JqBl$lyyZ=X()Bjj~ z_HUil|5osyoge;p79aqc>DF`Xf9^r@zZLwC2N4nIdrC>A9)F5*HN)karX87gK&V(9>5IySp*`gifr52Y(nYmpjn7 zOHC5W5gYt8X!la&^z!_DSZ%HAYRbIa!OX7k+8hexjTi*EaRt}^e)``r_`kph8Gl-{ z5Yzs*EC_bo+Z?F3QU?P0g2V#7z5d&uT0XyZb!duD2$fXWHn}?Sn=M%f8R@|#MvnDq zi0v@9xY!;>_Colv#?s=OMz{>7 z^F8lV2KDeU_=;m6-tUCH(=fb3XGdL*=fcYxM5-N1xbA#KD{jWAf@gWGYW#C8?$Ihl zqjl}n?hz{TyEaD;vTNoDW}>KlV`quHy??FLn^R|L$Z$CmVH+4c*3cwy97eUKQRV(b zFS}j3#YW_5ARu(HmlIljk}x}N(C8c3dxCj9pJF>!8^rdods4U$t~j>EUIy+}Dt-$E zLAZJi*PHCdEs7*qQQ7F;YewDxGN> z)yVY6k4Z8w`F^e~Mj045d3lTfsl~8N$L&84jI;Z@qcGYL@&}&U^j(0D{qtMrq|!Y4 z*~{|~!;fTBvy0LtTSu`QHjkE0_S1z)`Hb3Yv)W++v<8nJUa!4;xPqM)I74!ne&~K$ z+Q8s|tNMeSi{Li`4nVXSF4|2arS`9IUzct-;%n{54BlMgzG*+E>M5dcXYE|gdlbLb zLbP@|`~AJ;KHV0Tf!wHJTE5R!vTTX>_vUYW8);^<)!bi-*$im&WbM-w0LsNk04C9M zhD7O>?RpBxuUFbv4az4WLe-w@^ShBy_X`$* z^YI^*vsr4CM+YfPYm|eI+_#(6ojSTKQ;5m zRxn}R6+Nl!cI-G-YuB8Vxt_c?hf3{Jv6=!-egRWMCYN7~l__Me?G*_EJ9Vo(WbO=L zl0`ZDct3jO@AI>w_Cr12yhrZLWVeOpr$~8R)lq)G?TEnL=nbQx9({wkoyBSkm_rxT zUW!)!pmZT9Rk|o3y-Oz`olv9(B1JItNEHx-ARxW>4p$&_g7jWP$An%3kW?TMh>T=p3^#|v^#|r1=9?l$Uw#wP|nhUBbg>q`C4b? zAO*}L-j+DGkv4j%Og-|%`O6QADQrN*uO>u;(^(2Htj&yaKV*;ewbs-+0;_t`n*{$H z#U}o7v(5d$?k=3hlAdm(U0z0v0z?6al1-T}vO4E2MeTu-I1UpB^=o8F2 zKU%dm@u(ClSH?i9(Dr5JZC15A8%t|~)e^Ssq50Or>N_jKJ`w?i3&&k6 z&RWWHVM=I!SPMQ-uQgn4U@~Th+Bw$9aLGMQBT>BJ4Hq=6r3dN;TQ%C*&LcXwH32=) zGWxqOld){M$v{=^ZM;)S3cXBu{43SbXh-hdlc}1#nVQswaHw1Q2E%bDmr7^j6zi8S z)eYX*;UZ_P0_?#Eiuu7+QkuT{Q$AMOIg?<5=kK52?iB_UqY^EiB7TN)pLgc564!=h zs1sTRp1N)B=F#>v;25^P7ui-`H)tO+iuwy@K#ThYfaLRYhfK|6SpuNJNRKr8g*@MH z3s`t~)fUsu-l$BeEb^v@My~2naa><+@!-dkt8Yo6iq*o`j7?iksFDUZ9N=4xnb*rx z@*j3G=ANvkE8nMzN^JpwF^>aa9-;RXfdfas)j;xy%Ww1?@-l6!cut?Z0P46yxE|=h zQulLG(23`0qhH%^4L6oeYk$|bRucb|A#*s2`Yx?ZW^ae`;#J1B@AY4_WVFY5d^~XS zd*+ah^mlUEocEp4kH;pwXz19Y#X_poYc5cBFJHSqOVGywzw~cwrJsx>Y;kC`#;en1 zBsnEKjnci9A3549&B*kzq5nCXA;a&&qPtzKooF6|UL0NG4ma*c(%>Hpo?4%EN4^IS za(x_Ry{$jj?uBYsZQ#2P5->n_*hLhjJOHDRcC(o9J})r%5m(i~hRvZ2uXi7=Y z^lT)};!@nsF5*Ia^fAUnYD}gnph%%p)0vfcK40;MPE{r4ykrCvvrzE{#Pz0XGv zq#^L<(|r_l6DuSh3e~4#;Fy=q{iR>3!i@VJ-uc!aGrzp}kRgpO`ZhepMZ-q3-yRHi zT|&u&8E#f=st#-wZP}ZCxqeB>V!H6)=-@LOzivHJnM3u-Oq%WAl-Q>o%D0H{JF7`| zD_-uqRi#SW!&82;{ewzNV3`V+C%c;{qSdzv1Xx0miwu;j%nZcwcC@qq!tW)e2A%9E zqg)sB)HQ%`+r(kAY5==1XC)CWUe9kS?YV`d)N$1Iq};6XZQsiY;lZnohtrnNg>X2) zFv=hVfcYOSAyW<9WaNqdC+25=P&Tf&`MS!4&=hU!UA(qO0>tgN=#!U6OgS80;hI-Y z8k^npmzf!{ko4kvFhQ>5P8CI<+|pTSoZppK!oOKl9<7EK9O>KzC<(cJtGa{=HB&{*Jt9LCcnsi}@qe+q=IVeuh}z(WxqP@l|8BW}yQB!~Na+iNS8 zEEuP{u$C0iIe@7+oh|I*td=_$ENJv0z5yBd4E)+vc}me;0z+5fKPYK2GZihXqo3X> zY?UJGrM(5}BCcap>2;6fD7T!dd27w;#9LcA2aT}1)(MkOgem~Nk_1aQUHI1T>EjX| zHPl_&)X`1fJU1XyQ(TrLKPSZ_khdVm{!SxdZl*8Oe@9bZw)79nRq>^DkZfmmsOpxL zL0PjmTpyds3YG!l3iWcbC?*h6Iiw%b8cp@mjUi~v9w%=fbjXZ+nXzAu%Uvk`E9gGN zYpc$dvg>nX`SZB~7)lCyCeO_8aQbrLJgJc_a$AZ?W8%WqQW|7+!3?^5FNBCO8`=Vz zIrW|5rkr$uK#6TtLI!ZWO$r0-{*1|mM3&_t`I=p9GZdkW(VoFfgcl}ZDO2S+1FTd6 z_Tte4u{&S(2?#$vmMNkQq%6q3i#JGWF!^V|R-B-Ny;xvgFH zb@FQx!wWWD>Yu?ym;x%i?d}GZsl(~1-RkUo27vun+!H)3WZ+4&i!SG!H+1U(^`8uoIA?b++zN(dPdr!)V&Yo`vs0`LqKSLIHa`h7 zr3SR5fH2|LQba3``{)!gp=cDR`Uup4U$S-VXMK=+b`~4e9`B*&RVud4i%KJ#=yodr zghIe0F5`+qD_uoDprcC7N8QeGH&!WX7#POu7g$FEb4vO?U3ZF7p#~wsn4cgdy%ob` zt_64%Z4GE8+NBjie`-_asb<|eZjv3{hl<)eXSB6!PnabcNVO)40XkBB%aNv5^Ql1g zc{Tkfw2jZJ$A~({Vgf{5(qU<_`!cwOF%+!LOW~bZ2d{6*-*z+3pItLN#IEka9$XlY zx~&C+Vi^ijDQX!a3!S6rr*5O63QsrhB29M5@0&f|YDF1H3hkpC+4QaTSovxq)7z>v z<*^jY#yicg?*WIw4dQ6!MAAxL&im4vzzS^ag1iP+ZU)A@RcMrB_l^@-y3Tq4f_ z4b|(&l8{={2#he!l-DKZcOcJh z*P)I#6vY^Ie>hgy`P*#nlWE)YpXaY-WYdYJbkqJ*%cAfl*9i$?z!$b)_$EQb@K<&#hd=MFS)DEMV+bR)0n!3SOH82>g>jNwhkW zw^grk9OcM19uZ_rHU3|H9OafY!Z}fQ*GWK6$<0jA_zLKGd(LN6pV~~1k=nR>CH7ajk-)Df80@XfMC0@z z=SJ#$X56*}*>uIDhFnz@5L=B0`W&_-o%UjhTTEHfhSMEN#LvMs;<+xv)3bmqhfMqU zKmwg0fqdxxd@CWfSm4X9Bj&Z=!Z=E%U?`_Vkzv7CohD+ z8YD$xGR=ir{r*DoKv^uex8HlF=IU7KE-|202B7=Z#p^vFqd$5FTILVsp93FU%eipD zm^MZ#%gTIKje1^Y#E+iiWT|VA>rp9d` zE~N^Z2P=&J#qV0l`DOSZK*c;bz!;e-Zb?=zv!WBtP4ZC(A6(|2!;=O#S6Mf$G5rGk zER6TcavzLwz(g3os(RHwky3pLxG@K0Kmihkh|MAZ2Od`Btx_IM&uhzdH^d7A4Pjw8 zSxK|7xyM^l2$ABx0&q#%jH?>{LJ--0*Aq+~=|(_gp^rItC}+f_v?SpHUgqA;)ldyo zb^U}x(fH;7PdRn?1k1CkvmG@FF|*gCK7bPW!eAqU&lnh(nY}INx@UVdCvU9)E+_%&NgUp`?XwpUca5I`CXZ7*3Gr3(%`qi_CwXy8!R zC=8jgb|^B4w};~i%K~>Ko@t5l$b&8Oo}dGN8Fy+XfUWFSRl$*4^H!z{)HAc?`KCxf zuC3XJH_1v%8yOBQ-ocMyB9Gh&2r9MF@kU<|xtANTacV?ZgPN3hB?t7{g`H;Uo5IQh zLZ_W{I?XyA!l4n?zL~PbHSNE!Lw zJ|ZU%u&B1x^@v}gckIqsZ}-l#j=btLnOeVWUmc@@eCMHQ%4T-i+kV2wZF39Mkr^*_ zWU96MQ53LDS|1F6vPjp7hdpb(R4TH2m_c1kVOjrVoOCAAy{v!c^UCLC4LMr zR|o!BuyuH3^d7C$CUs~S)pDIw%&`NmUmbC1l({m_C$N7$b!U%Er||)LY7t0Fy%*ycpcfsz&=cuDHSJBP%vmfpL<+ zof)?-xv^(p8e-$4SHmy5^w0N~P=?FV7t^g_Uvt9ZvLVeA+73t0n&FfM=JpB5 z5-*dFiQeg`Pgwq}xTBq{X1Ek&yYxG>!bP;F=sj@F9OFr4&ro&aYUi|8;7mqB7DZlo zqNO7~k+bcF@fGADSdEsiYgG6EUGpMj-$Y7QIDZl_+$WA*j-KZmRHq(;k$OFLNgBJg zBfxbs4gDbLOzzCMp_==p>?=vfb{E2LMLpW1lf4aHl8dDn0!6%h{TV?kX`fdqNEDxb zr!PQrI)5wBePP6%Wqd~Q-F$_Isp)DkB+BxF=u+SIh1=jf>I1r*$@JYE=D!(-yN7^} z8lO_^u-j6Hb=y>9)w>~UnN86kSy`OtCwNgi2JlOCXJ^FvD- Date: Mon, 27 Apr 2026 10:24:32 +0200 Subject: [PATCH 07/18] generate linux screenshots --- .github/workflows/node.js.yml | 12 +++++++++++- packages/editor/playwright.config.ts | 1 - 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 1d7a6d5..82cc1c1 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -72,5 +72,15 @@ jobs: - name: Run editor e2e tests if: matrix.os != 'windows-latest' - run: npm run test:e2e + run: npx playwright test --update-snapshots=missing working-directory: ./packages/editor + + - name: Upload Playwright results + if: matrix.os != 'windows-latest' && always() + uses: actions/upload-artifact@v4 + with: + name: playwright-results-${{ matrix.os }} + path: | + packages/editor/e2e/editor.spec.ts-snapshots/ + packages/editor/test-results/ + if-no-files-found: ignore diff --git a/packages/editor/playwright.config.ts b/packages/editor/playwright.config.ts index 029f780..fc1bfb8 100644 --- a/packages/editor/playwright.config.ts +++ b/packages/editor/playwright.config.ts @@ -9,7 +9,6 @@ export default defineConfig({ reuseExistingServer: !process.env.CI, timeout: 30_000, }, - snapshotPathTemplate: '{testDir}/{testFilePath}-snapshots/{arg}{ext}', use: { baseURL: 'http://localhost:5173', ...devices['Desktop Chrome'], From 0deec8dbd7eb96cdcc05eeca80cbbad08cdd4cce Mon Sep 17 00:00:00 2001 From: Matthias von Bargen Date: Mon, 27 Apr 2026 10:35:30 +0200 Subject: [PATCH 08/18] editor ready from react mounted component --- .github/workflows/node.js.yml | 12 +----------- packages/editor/e2e/editor.spec.ts | 1 + packages/editor/playwright.config.ts | 1 + packages/editor/src/Editor.ts | 1 + packages/editor/src/Editor/UI/StatusBar.tsx | 8 ++++++++ 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 82cc1c1..1d7a6d5 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -72,15 +72,5 @@ jobs: - name: Run editor e2e tests if: matrix.os != 'windows-latest' - run: npx playwright test --update-snapshots=missing + run: npm run test:e2e working-directory: ./packages/editor - - - name: Upload Playwright results - if: matrix.os != 'windows-latest' && always() - uses: actions/upload-artifact@v4 - with: - name: playwright-results-${{ matrix.os }} - path: | - packages/editor/e2e/editor.spec.ts-snapshots/ - packages/editor/test-results/ - if-no-files-found: ignore diff --git a/packages/editor/e2e/editor.spec.ts b/packages/editor/e2e/editor.spec.ts index 2e3e4dd..08bf4a9 100644 --- a/packages/editor/e2e/editor.spec.ts +++ b/packages/editor/e2e/editor.spec.ts @@ -29,6 +29,7 @@ test('editor opens on Insert key press', async ({ page }) => { await expect(page).toHaveTitle('MavonEngine | Editor') await page.waitForFunction(() => window.Game?.loadingScreen?.finished === true) + await page.waitForFunction(() => window.Game?.editor?.ready === true) await expect(page).toHaveScreenshot('editor-boot.png') }) diff --git a/packages/editor/playwright.config.ts b/packages/editor/playwright.config.ts index fc1bfb8..029f780 100644 --- a/packages/editor/playwright.config.ts +++ b/packages/editor/playwright.config.ts @@ -9,6 +9,7 @@ export default defineConfig({ reuseExistingServer: !process.env.CI, timeout: 30_000, }, + snapshotPathTemplate: '{testDir}/{testFilePath}-snapshots/{arg}{ext}', use: { baseURL: 'http://localhost:5173', ...devices['Desktop Chrome'], diff --git a/packages/editor/src/Editor.ts b/packages/editor/src/Editor.ts index 8a45131..b78ddec 100644 --- a/packages/editor/src/Editor.ts +++ b/packages/editor/src/Editor.ts @@ -17,6 +17,7 @@ import { applyShadeMode } from './Editor/applyShadeMode' export type ShadeMode = 'solid' | 'flat' | 'wireframe' export default class Editor extends EventEmitter implements IEditor, GameObjectInterface { + ready = false flyControls!: FlyControls reactRoot!: Root activeItem?: Object3D | null diff --git a/packages/editor/src/Editor/UI/StatusBar.tsx b/packages/editor/src/Editor/UI/StatusBar.tsx index a9d39a0..129485d 100644 --- a/packages/editor/src/Editor/UI/StatusBar.tsx +++ b/packages/editor/src/Editor/UI/StatusBar.tsx @@ -1,4 +1,5 @@ import { ENGINE_VERSION } from '@mavonengine/core/BaseGame' +import { useEffect } from 'react' import { version } from '../../../package.json' with { type: 'json' } import styles from './StatusBar.module.css' import { useSceneStats } from './useSceneStats' @@ -6,6 +7,13 @@ import { useSceneStats } from './useSceneStats' export default function StatusBar() { const stats = useSceneStats() + useEffect(() => { + if (window.Game.editor) { + window.Game.editor.ready = true + window.Game.editor.trigger('ready') + } + }, []) + return (
From b52187ab396d8e2d7e29801bdd85ff9affa63975 Mon Sep 17 00:00:00 2001 From: Matthias von Bargen Date: Mon, 27 Apr 2026 10:37:06 +0200 Subject: [PATCH 09/18] updated editor interface --- packages/core/src/Types/IEditor.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/src/Types/IEditor.ts b/packages/core/src/Types/IEditor.ts index b014e92..ae8be0d 100644 --- a/packages/core/src/Types/IEditor.ts +++ b/packages/core/src/Types/IEditor.ts @@ -16,6 +16,7 @@ export default interface IEditor { on(event: string, callback: (event?: any) => void): void off(event: string, callback: (event?: any) => void): void trigger(name: string, event?: any): void + ready: boolean availableAssetCategories: string[] activeAssetCategory: 'Object' | '_texture' | 'CubeTexture' | 'AudioBuffer' | 'Font' setActiveAssetCategory(value: 'Object' | '_texture' | 'CubeTexture' | 'AudioBuffer' | 'Font'): void From 1c9d245076ac019bacad07ed7991a992bdc25ae5 Mon Sep 17 00:00:00 2001 From: Matthias von Bargen Date: Sat, 2 May 2026 11:56:45 +0200 Subject: [PATCH 10/18] trigger editor twice --- packages/editor/e2e/editor.spec.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/editor/e2e/editor.spec.ts b/packages/editor/e2e/editor.spec.ts index 08bf4a9..09b1cdd 100644 --- a/packages/editor/e2e/editor.spec.ts +++ b/packages/editor/e2e/editor.spec.ts @@ -28,6 +28,9 @@ test('editor opens on Insert key press', async ({ page }) => { // The editor mounts its React UI into #ui and sets the page title await expect(page).toHaveTitle('MavonEngine | Editor') + await page.keyboard.press('Insert') + // The first 'insert' triggers hmr causing a page refresh. We need to trigger the editor again + await page.waitForFunction(() => window.Game?.loadingScreen?.finished === true) await page.waitForFunction(() => window.Game?.editor?.ready === true) From 34941dcaf412032c4fd2f9134abe0b8b5fb70c21 Mon Sep 17 00:00:00 2001 From: Matthias von Bargen Date: Sat, 2 May 2026 11:58:46 +0200 Subject: [PATCH 11/18] lint --- packages/editor/e2e/editor.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/editor/e2e/editor.spec.ts b/packages/editor/e2e/editor.spec.ts index 09b1cdd..efb85fb 100644 --- a/packages/editor/e2e/editor.spec.ts +++ b/packages/editor/e2e/editor.spec.ts @@ -28,7 +28,7 @@ test('editor opens on Insert key press', async ({ page }) => { // The editor mounts its React UI into #ui and sets the page title await expect(page).toHaveTitle('MavonEngine | Editor') - await page.keyboard.press('Insert') + await page.keyboard.press('Insert') // The first 'insert' triggers hmr causing a page refresh. We need to trigger the editor again await page.waitForFunction(() => window.Game?.loadingScreen?.finished === true) From 9a5c31cf41c9789ed9d590386a236e628325c72e Mon Sep 17 00:00:00 2001 From: Matthias von Bargen Date: Sat, 2 May 2026 12:02:09 +0200 Subject: [PATCH 12/18] trigger after loading screen --- packages/editor/e2e/editor.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/editor/e2e/editor.spec.ts b/packages/editor/e2e/editor.spec.ts index efb85fb..64292d7 100644 --- a/packages/editor/e2e/editor.spec.ts +++ b/packages/editor/e2e/editor.spec.ts @@ -28,10 +28,11 @@ test('editor opens on Insert key press', async ({ page }) => { // The editor mounts its React UI into #ui and sets the page title await expect(page).toHaveTitle('MavonEngine | Editor') + await page.waitForFunction(() => window.Game?.loadingScreen?.finished === true) + await page.keyboard.press('Insert') // The first 'insert' triggers hmr causing a page refresh. We need to trigger the editor again - await page.waitForFunction(() => window.Game?.loadingScreen?.finished === true) await page.waitForFunction(() => window.Game?.editor?.ready === true) await expect(page).toHaveScreenshot('editor-boot.png') From 2be3371f7d9e7e5487e053bc4b955700ab29cd26 Mon Sep 17 00:00:00 2001 From: Matthias von Bargen Date: Sat, 2 May 2026 12:14:53 +0200 Subject: [PATCH 13/18] switch to docker image --- .github/workflows/node.js.yml | 46 ++++++++++++++++++++++++++++++++--- packages/editor/README.md | 39 +++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 packages/editor/README.md diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 1d7a6d5..5155771 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -65,12 +65,50 @@ jobs: run: npx concurrently --kill-others --success first "npm run dev" "npx wait-on http://localhost:8050/api/game/health --timeout 20000" working-directory: ./packages/multiplayer-template - - name: Install Playwright browsers - if: matrix.os != 'windows-latest' - run: npx playwright install --with-deps chromium + + e2e: + needs: build + runs-on: ubuntu-latest + container: mcr.microsoft.com/playwright:v1.52.0-noble + + permissions: + contents: read + + steps: + - uses: actions/checkout@v4 + - name: Use Node.js 24.x + uses: actions/setup-node@v4 + with: + node-version: 24.x + cache: 'npm' + cache-dependency-path: | + package-lock.json + packages/bootstrap/package-lock.json + packages/multiplayer-template/package-lock.json + + - name: Install dependencies + run: npm ci + + - name: Install multiplayer-template dependencies + run: npm ci + working-directory: ./packages/multiplayer-template + + - name: npm link core locally + run: npm link + working-directory: ./packages/core + + - name: Link core in editor + run: npm link @mavonengine/core + working-directory: ./packages/editor + + - name: npm link editor locally + run: npm link working-directory: ./packages/editor + - name: Link core and editor in multiplayer-template + run: npm link @mavonengine/core @mavonengine/editor + working-directory: ./packages/multiplayer-template + - name: Run editor e2e tests - if: matrix.os != 'windows-latest' run: npm run test:e2e working-directory: ./packages/editor diff --git a/packages/editor/README.md b/packages/editor/README.md new file mode 100644 index 0000000..00e6ccd --- /dev/null +++ b/packages/editor/README.md @@ -0,0 +1,39 @@ +# @mavonengine/editor + +**Early WIP** — map saving and loading are not yet implemented. Currently useful mainly for browsing and viewing assets in a 3D scene. + +An in-engine editor for [MavonEngine](https://mavonengine.com) — a [threejs game engine](https://mavonengine.com) — that provides a 3D scene editing interface. It can be activated at runtime by pressing `Insert` or `.` (Period), which boots the editor, destroys the current world, and mounts a React-based UI overlay. + +Current features include: +- Fly camera controls for scene navigation +- Object selection and transform controls (translate, rotate, scale) +- Shade modes: solid, flat, and wireframe +- Light and object helpers +- Asset browser with category filtering +- Primitives and lights available for placement in the scene + +## Testing + +### E2E Tests + +E2E tests **must** be run via the official Playwright Docker image. Running them directly on your local system will cause snapshot diffs to fail due to rendering differences between environments (fonts, etc.). + +```bash +docker run --rm \ + -v $(pwd):/app \ + -w /app/packages/editor \ + mcr.microsoft.com/playwright:v1.52.0-noble \ + npm run test:e2e +``` + +### Updating Snapshots + +To update snapshots, pass the `--update-snapshots` flag via the same Docker container: + +```bash +docker run --rm \ + -v $(pwd):/app \ + -w /app/packages/editor \ + mcr.microsoft.com/playwright:v1.52.0-noble \ + npm run test:e2e -- --update-snapshots +``` From 3efa3b548c70a9a5a25489d20ca7292a89c3ce6a Mon Sep 17 00:00:00 2001 From: Matthias von Bargen Date: Sat, 2 May 2026 12:21:08 +0200 Subject: [PATCH 14/18] update snapshot --- .../editor.spec.ts-snapshots/editor-boot.png | Bin 43227 -> 43156 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/editor/e2e/editor.spec.ts-snapshots/editor-boot.png b/packages/editor/e2e/editor.spec.ts-snapshots/editor-boot.png index 2e79ceb518a0e1be60c6351c130f4ae96286c6b5..7b2e0c719d207858a16c96f8e44fdaa1e764fd0f 100644 GIT binary patch literal 43156 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 literal 43227 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 Date: Sat, 2 May 2026 12:30:52 +0200 Subject: [PATCH 15/18] platform specific snapshots --- .../{editor-boot.png => editor-boot-linux.png} | Bin packages/editor/playwright.config.ts | 1 - 2 files changed, 1 deletion(-) rename packages/editor/e2e/editor.spec.ts-snapshots/{editor-boot.png => editor-boot-linux.png} (100%) diff --git a/packages/editor/e2e/editor.spec.ts-snapshots/editor-boot.png b/packages/editor/e2e/editor.spec.ts-snapshots/editor-boot-linux.png similarity index 100% rename from packages/editor/e2e/editor.spec.ts-snapshots/editor-boot.png rename to packages/editor/e2e/editor.spec.ts-snapshots/editor-boot-linux.png diff --git a/packages/editor/playwright.config.ts b/packages/editor/playwright.config.ts index 029f780..fc1bfb8 100644 --- a/packages/editor/playwright.config.ts +++ b/packages/editor/playwright.config.ts @@ -9,7 +9,6 @@ export default defineConfig({ reuseExistingServer: !process.env.CI, timeout: 30_000, }, - snapshotPathTemplate: '{testDir}/{testFilePath}-snapshots/{arg}{ext}', use: { baseURL: 'http://localhost:5173', ...devices['Desktop Chrome'], From 1ddc8cdc79821ac0afb5a0f9d4df697f2f2b2e38 Mon Sep 17 00:00:00 2001 From: Matthias von Bargen Date: Sat, 2 May 2026 12:56:13 +0200 Subject: [PATCH 16/18] default timeout --- packages/editor/e2e/editor.spec.ts | 1 + packages/editor/playwright.config.ts | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/editor/e2e/editor.spec.ts b/packages/editor/e2e/editor.spec.ts index 64292d7..4068457 100644 --- a/packages/editor/e2e/editor.spec.ts +++ b/packages/editor/e2e/editor.spec.ts @@ -33,6 +33,7 @@ test('editor opens on Insert key press', async ({ page }) => { await page.keyboard.press('Insert') // The first 'insert' triggers hmr causing a page refresh. We need to trigger the editor again + // Wait for Game to re-initialise after the HMR refresh before polling editor.ready await page.waitForFunction(() => window.Game?.editor?.ready === true) await expect(page).toHaveScreenshot('editor-boot.png') diff --git a/packages/editor/playwright.config.ts b/packages/editor/playwright.config.ts index fc1bfb8..a87ceb6 100644 --- a/packages/editor/playwright.config.ts +++ b/packages/editor/playwright.config.ts @@ -7,7 +7,6 @@ export default defineConfig({ command: 'npm run dev --prefix ../multiplayer-template/client', url: 'http://localhost:5173', reuseExistingServer: !process.env.CI, - timeout: 30_000, }, use: { baseURL: 'http://localhost:5173', From 6b62bc24c0063221e6ac955b5608ec6e6590de12 Mon Sep 17 00:00:00 2001 From: Matthias von Bargen Date: Sat, 2 May 2026 13:06:39 +0200 Subject: [PATCH 17/18] wait and update snapshot --- packages/editor/e2e/editor.spec.ts | 1 + .../editor-boot-linux.png | Bin 43156 -> 43556 bytes 2 files changed, 1 insertion(+) diff --git a/packages/editor/e2e/editor.spec.ts b/packages/editor/e2e/editor.spec.ts index 4068457..e45bb30 100644 --- a/packages/editor/e2e/editor.spec.ts +++ b/packages/editor/e2e/editor.spec.ts @@ -34,6 +34,7 @@ test('editor opens on Insert key press', async ({ page }) => { // The first 'insert' triggers hmr causing a page refresh. We need to trigger the editor again // Wait for Game to re-initialise after the HMR refresh before polling editor.ready + await page.waitForTimeout(1000) await page.waitForFunction(() => window.Game?.editor?.ready === true) await expect(page).toHaveScreenshot('editor-boot.png') diff --git a/packages/editor/e2e/editor.spec.ts-snapshots/editor-boot-linux.png b/packages/editor/e2e/editor.spec.ts-snapshots/editor-boot-linux.png index 7b2e0c719d207858a16c96f8e44fdaa1e764fd0f..600cfbc6386b671aae6e6889168b51931ee3e5f6 100644 GIT binary patch delta 7149 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 Q@tdflrLPH9fAQu&09m~So&W#< delta 6746 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 apZy^fy&Ck##kX_62Q(h*sv?!2zWg6XH4q>G From 36b55c7b38c0af37423b11859c656a7dd7bd8c8c Mon Sep 17 00:00:00 2001 From: Matthias von Bargen Date: Sat, 2 May 2026 13:17:30 +0200 Subject: [PATCH 18/18] snapshots update --- .github/workflows/node.js.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 5155771..4a316b7 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -5,6 +5,7 @@ on: branches: [ "main", "dev" ] pull_request: branches: [ "main", "dev" ] + workflow_dispatch: jobs: build: @@ -110,5 +111,13 @@ jobs: working-directory: ./packages/multiplayer-template - name: Run editor e2e tests - run: npm run test:e2e + run: npx playwright test ${{ github.event_name == 'workflow_dispatch' && '--update-snapshots' || '' }} working-directory: ./packages/editor + + - name: Upload updated snapshots + if: github.event_name == 'workflow_dispatch' + uses: actions/upload-artifact@v4 + with: + name: playwright-snapshots + path: packages/editor/e2e/editor.spec.ts-snapshots/ + retention-days: 30