From 9e5e5163412995500dcffff4970dba37220a08b2 Mon Sep 17 00:00:00 2001 From: Nicklas Ronge Date: Thu, 18 Jun 2020 12:55:12 +0200 Subject: [PATCH 01/22] - fixed a unhandled error if no event data is available --- CHANGELOG.md | 4 + manifest.json | 11 ++- package-lock.json | 2 +- package.json | 2 +- src/app/core/event/event-emitter.ts | 5 +- .../background-window.component.ts | 13 +-- .../commands/service/command.service.ts | 25 +++--- src/app/modules/trade/trade.module.ts | 84 ++++++++++--------- .../trade-highlight-window.component.ts | 8 +- .../trade-window/trade-window.component.ts | 8 +- .../shared/module/poe/event/event.service.ts | 2 +- 11 files changed, 92 insertions(+), 72 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a8b4565..6beb9bf6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 1.0.3 (2020-06-18) + +- fixed a unhandled error if no event data is available + ## 1.0.2 (2020-06-16) - added misc module diff --git a/manifest.json b/manifest.json index 7b4caaac..4e303c88 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "meta": { "name": "PoE Overlay", "author": "Kyusung4698", - "version": "1.0.2", + "version": "1.0.3", "minimum-overwolf-version": "0.147.0", "description": "Search the market and send trade offers. Get current market values for your item. View insights for maps and items.", "dock_button_title": "PoE Overlay", @@ -38,11 +38,11 @@ "transparent": true, "show_in_taskbar": false, "size": { - "width": 1212, + "width": 1242, "height": 699 }, "min_size": { - "width": 1212, + "width": 1242, "height": 699 } }, @@ -180,8 +180,11 @@ "event_data": { "game_ids": [ 7212 - ] + ], + "wait_for_stable_framerate": 30 }, + "tracked": false, + "include_launchers": false, "start_minimized": false } ], diff --git a/package-lock.json b/package-lock.json index 6a7fa0d9..3158b92e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "poe-overlay-overwolf", - "version": "1.0.1", + "version": "1.0.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 06d2ff38..ceb9239c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "poe-overlay-overwolf", - "version": "1.0.2", + "version": "1.0.3", "scripts": { "watch": "ng build --watch", "watch:prod": "ng build --watch --prod", diff --git a/src/app/core/event/event-emitter.ts b/src/app/core/event/event-emitter.ts index fea01c5e..d2356505 100644 --- a/src/app/core/event/event-emitter.ts +++ b/src/app/core/event/event-emitter.ts @@ -21,7 +21,10 @@ export class EventEmitter { public next(event: TEvent): void { Object.getOwnPropertyNames(this.registry).forEach(key => { - this.registry[key](event); + const fn = this.registry[key]; + if (fn) { + fn(event); + } }); this.latest = event; } diff --git a/src/app/layout/window/background-window/background-window.component.ts b/src/app/layout/window/background-window/background-window.component.ts index 5dfbfb81..76d5f59f 100644 --- a/src/app/layout/window/background-window/background-window.component.ts +++ b/src/app/layout/window/background-window/background-window.component.ts @@ -74,7 +74,6 @@ export class BackgroundWindowComponent implements OnInit, OnDestroy { }); }); }); - this.hotkeys.start(); this.game.start(); }); } @@ -118,11 +117,6 @@ export class BackgroundWindowComponent implements OnInit, OnDestroy { this.shouldQuit = false; this.launcherWindow.close(); - const path = info.executionPath.split('/'); - path.pop(); - const log = `${path.join('/')}/logs/Client.txt`; - this.log.start(log); - forkJoin([ this.annotationWindow.open(info.width, info.height), this.notificationWindow.open(info.width, info.height) @@ -135,6 +129,13 @@ export class BackgroundWindowComponent implements OnInit, OnDestroy { module.onInfo(info, settings); } }); + + const path = info.executionPath.split('/'); + path.pop(); + const log = `${path.join('/')}/logs/Client.txt`; + this.log.start(log); + + this.hotkeys.start(); }); if (!result) { this.notification.show('event.start-error'); diff --git a/src/app/modules/commands/service/command.service.ts b/src/app/modules/commands/service/command.service.ts index 6d7e2837..ae8c329b 100644 --- a/src/app/modules/commands/service/command.service.ts +++ b/src/app/modules/commands/service/command.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { ChatService } from '@shared/module/poe/chat'; import { EventService } from '@shared/module/poe/event'; -import { Observable } from 'rxjs'; +import { Observable, of } from 'rxjs'; import { map, tap } from 'rxjs/operators'; @Injectable({ @@ -14,15 +14,18 @@ export class CommandService { private readonly event: EventService) { } public execute(command: string): Observable { - // TODO: Error handling - return this.event.getCharacter().pipe( - tap(character => { - if (character?.name.length) { - command = command.replace('@char', character.name); - } - this.chat.send(command); - }), - map(() => null) - ); + if (command.includes('@char')) { + return this.event.getCharacter().pipe( + map(character => { + if (character?.name?.length) { + command = command.replace('@char', character.name); + } + return this.chat.send(command); + }) + ); + } else { + this.chat.send(command); + return of(null); + } } } diff --git a/src/app/modules/trade/trade.module.ts b/src/app/modules/trade/trade.module.ts index 3c9a1c17..0345caf1 100644 --- a/src/app/modules/trade/trade.module.ts +++ b/src/app/modules/trade/trade.module.ts @@ -102,47 +102,49 @@ export class TradeModule implements FeatureModule { private registerAnnotation(): void { let lastId = ''; - this.annotation.message$.on(message => this.ngZone.run(() => { - const id = message?.id || ''; - if (id === lastId) { - return; - } - lastId = id; + this.annotation.message$.on(message => { + this.ngZone.run(() => { + const id = message?.id || ''; + if (id === lastId) { + return; + } + lastId = id; - switch (id) { - case 'trade.outgoing': - case 'trade.incoming': - this.event.getCharacter().pipe( - catchError(() => of(null)) - ).subscribe(character => { - const item: TradeItemMessage = { - direction: id === 'trade.outgoing' - ? TradeWhisperDirection.Outgoing - : TradeWhisperDirection.Incoming, - itemName: 'Apocalypse Horn Decimation Bow', - joined$: new BehaviorSubject(false), - league: 'Standard', - left: 4, - top: 6, - // tslint:disable:max-line-length - message: 'Hi, I would like to buy your Apocalypse Horn Decimation Bow for 2 chaos in Delirium (stash tab "Annotation"; position: left 4, top 6)', - // tslint:enable:max-line-length - name: character?.name || 'PoEOverlayUnknownCharacter', - stash: 'Annotation', - timeReceived: new Date(), - type: TradeParserType.TradeItem, - whispers$: new BehaviorSubject([]), - currencyType: 'chaos', - price: 2 - }; - this.trade.set(item); - }); - break; - case 'trade.settings': - this.highlightWindow.close().subscribe(); - this.trade.clear(); - break; - } - })); + switch (id) { + case 'trade.outgoing': + case 'trade.incoming': + this.event.getCharacter().pipe( + catchError(() => of(null)) + ).subscribe(character => { + const item: TradeItemMessage = { + direction: id === 'trade.outgoing' + ? TradeWhisperDirection.Outgoing + : TradeWhisperDirection.Incoming, + itemName: 'Apocalypse Horn Decimation Bow', + joined$: new BehaviorSubject(false), + league: 'Standard', + left: 4, + top: 6, + // tslint:disable:max-line-length + message: 'Hi, I would like to buy your Apocalypse Horn Decimation Bow for 2 chaos in Delirium (stash tab "Annotation"; position: left 4, top 6)', + // tslint:enable:max-line-length + name: character?.name || 'PoEOverlayUnknownCharacter', + stash: 'Annotation', + timeReceived: new Date(), + type: TradeParserType.TradeItem, + whispers$: new BehaviorSubject([]), + currencyType: 'chaos', + price: 2 + }; + this.trade.set(item); + }); + break; + case 'trade.settings': + this.highlightWindow.close().subscribe(); + this.trade.clear(); + break; + } + }); + }); } } diff --git a/src/app/modules/trade/window/trade-highlight-window/trade-highlight-window.component.ts b/src/app/modules/trade/window/trade-highlight-window/trade-highlight-window.component.ts index 3a8d3515..b8196118 100644 --- a/src/app/modules/trade/window/trade-highlight-window/trade-highlight-window.component.ts +++ b/src/app/modules/trade/window/trade-highlight-window/trade-highlight-window.component.ts @@ -32,9 +32,11 @@ export class TradeHighlightWindowComponent implements OnInit, OnDestroy { public ngOnInit(): void { this.updateData(this.window.data$.get()); - this.subscription = this.window.data$.on(data => this.ngZone.run(() => { - this.updateData(data); - })); + this.subscription = this.window.data$.on(data => { + this.ngZone.run(() => { + this.updateData(data); + }); + }); } public ngOnDestroy(): void { diff --git a/src/app/modules/trade/window/trade-window/trade-window.component.ts b/src/app/modules/trade/window/trade-window/trade-window.component.ts index d9495fbd..14a1b97d 100644 --- a/src/app/modules/trade/window/trade-window/trade-window.component.ts +++ b/src/app/modules/trade/window/trade-window/trade-window.component.ts @@ -27,9 +27,11 @@ export class TradeWindowComponent implements OnInit, OnDestroy { public ngOnInit(): void { this.data$.next(this.window.data$.get()); - this.subscription = this.window.data$.on(data => this.ngZone.run(() => { - this.data$.next(data); - })); + this.subscription = this.window.data$.on(data => { + this.ngZone.run(() => { + this.data$.next(data); + }); + }); } public ngOnDestroy(): void { diff --git a/src/app/shared/module/poe/event/event.service.ts b/src/app/shared/module/poe/event/event.service.ts index 210e5ce2..217aac9b 100644 --- a/src/app/shared/module/poe/event/event.service.ts +++ b/src/app/shared/module/poe/event/event.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { OWGamesEvents } from '@app/odk'; import { Observable, of } from 'rxjs'; -import { catchError, map, tap } from 'rxjs/operators'; +import { catchError, map } from 'rxjs/operators'; interface EventInfo { match_info: { From 51b49daff4d08e7bdee107833847ed17eee69a18 Mon Sep 17 00:00:00 2001 From: Nicklas Ronge Date: Thu, 18 Jun 2020 12:55:38 +0200 Subject: [PATCH 02/22] - added support settings page --- overlay.babel | 439 ++++++++++++++++++ src/app/core/annotation/annotation.service.ts | 20 +- src/app/core/config/app.ts | 1 + src/app/core/config/index.ts | 2 + src/app/core/odk/ow-utils.ts | 8 + src/app/layout/component/index.ts | 2 +- .../settings-help.component.html | 28 -- .../settings-help.component.spec.ts | 41 -- .../settings-help/settings-help.component.ts | 14 - .../settings-support.component.html | 26 ++ .../settings-support.component.scss | 16 + .../settings-support.component.spec.ts | 25 + .../settings-support.component.ts | 18 + src/app/layout/layout.module.ts | 4 +- .../settings-window.component.html | 49 +- .../settings-window.component.scss | 8 +- .../bookmarks-settings.component.html | 4 +- .../commands-settings.component.html | 4 +- .../evaluate-settings.component.html | 24 +- .../trade-settings.component.html | 24 +- .../component/card/card.component.scss | 6 + .../select-list/select-list.component.scss | 1 + .../component/header/header.component.html | 2 +- .../component/header/header.component.scss | 7 +- .../odk/component/header/header.component.ts | 3 + src/assets/i18n/english.json | 14 + src/assets/i18n/french.json | 14 + src/assets/i18n/german.json | 14 + src/assets/i18n/korean.json | 14 + src/assets/i18n/polish.json | 14 + src/assets/i18n/portuguese.json | 14 + src/assets/i18n/russian.json | 14 + src/assets/i18n/simplified-chinese.json | 14 + src/assets/i18n/spanish.json | 14 + src/assets/i18n/thai.json | 14 + src/assets/i18n/traditional-chinese.json | 14 + src/styles/_material.scss | 12 +- 37 files changed, 785 insertions(+), 157 deletions(-) create mode 100644 src/app/core/config/app.ts delete mode 100644 src/app/layout/component/settings-help/settings-help.component.html delete mode 100644 src/app/layout/component/settings-help/settings-help.component.spec.ts delete mode 100644 src/app/layout/component/settings-help/settings-help.component.ts create mode 100644 src/app/layout/component/settings-support/settings-support.component.html create mode 100644 src/app/layout/component/settings-support/settings-support.component.scss create mode 100644 src/app/layout/component/settings-support/settings-support.component.spec.ts create mode 100644 src/app/layout/component/settings-support/settings-support.component.ts diff --git a/overlay.babel b/overlay.babel index f762651c..aa4827ec 100644 --- a/overlay.babel +++ b/overlay.babel @@ -13496,6 +13496,445 @@ + + support + + + developer + + + open + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + text + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + title + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + + + name + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + question + + + discord + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + github + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + text + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + title + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + + + trade diff --git a/src/app/core/annotation/annotation.service.ts b/src/app/core/annotation/annotation.service.ts index ae0b09a8..51e34ed7 100644 --- a/src/app/core/annotation/annotation.service.ts +++ b/src/app/core/annotation/annotation.service.ts @@ -44,16 +44,11 @@ const ANNOTATIONS: Annotation[] = [ } ] }, - { - id: 'trade', - children: [ - { id: 'init' }, - { id: 'incoming' }, - { id: 'highlight' }, - { id: 'outgoing' }, - { id: 'settings' } - ] - }, + { id: 'trade.init' }, + { id: 'trade.incoming' }, + { id: 'trade.highlight' }, + { id: 'trade.outgoing' }, + { id: 'trade.settings' }, { id: 'evaluate', hotkey: Hotkey.Evaluate, @@ -81,8 +76,7 @@ const ANNOTATIONS: Annotation[] = [ }, { id: 'replay', - hotkey: Hotkey.SettingsToggle, - skippable: true, + hotkey: Hotkey.SettingsToggle }, { id: 'misc', @@ -96,6 +90,8 @@ const ANNOTATIONS: Annotation[] = [ expressions: [AnnotationCondition.BookmarkOpened], skippable: true }, + // TODO: Hide until sub is ready + // { id: 'support' }, { id: 'thanks' } ]; diff --git a/src/app/core/config/app.ts b/src/app/core/config/app.ts new file mode 100644 index 00000000..0434e70b --- /dev/null +++ b/src/app/core/config/app.ts @@ -0,0 +1 @@ +export const APP_UID = 'cijcjjcjilpooaeppicpfibopeefaglkefjaeofl'; diff --git a/src/app/core/config/index.ts b/src/app/core/config/index.ts index fd133515..744d3a40 100644 --- a/src/app/core/config/index.ts +++ b/src/app/core/config/index.ts @@ -1,3 +1,5 @@ +export * from './app'; export * from './hotkey'; export * from './ui-language'; export * from './window-name'; + diff --git a/src/app/core/odk/ow-utils.ts b/src/app/core/odk/ow-utils.ts index 5683f213..5257cd1e 100644 --- a/src/app/core/odk/ow-utils.ts +++ b/src/app/core/odk/ow-utils.ts @@ -1,3 +1,4 @@ +import { APP_UID } from '@app/config'; import { from, Observable } from 'rxjs'; import { SystemInfo } from './ow-types'; @@ -26,6 +27,13 @@ export class OWUtils { return this.openUrlInOverwolfBrowser(url); } + public static openSubscriptionPage(): void { + overwolf.utils.openStore({ + page: overwolf.utils.enums.eStorePage.SubscriptionPage, + uid: APP_UID + }); + } + public static openUrlInOverwolfBrowser(url: string): void { overwolf.utils.openUrlInOverwolfBrowser(url); } diff --git a/src/app/layout/component/index.ts b/src/app/layout/component/index.ts index d9e53a35..d0737a6d 100644 --- a/src/app/layout/component/index.ts +++ b/src/app/layout/component/index.ts @@ -1,4 +1,4 @@ export * from './settings-feature-container/settings-feature-container.component'; export * from './settings-form/settings-form.component'; -export * from './settings-help/settings-help.component'; +export * from './settings-support/settings-support.component'; diff --git a/src/app/layout/component/settings-help/settings-help.component.html b/src/app/layout/component/settings-help/settings-help.component.html deleted file mode 100644 index 7f28515e..00000000 --- a/src/app/layout/component/settings-help/settings-help.component.html +++ /dev/null @@ -1,28 +0,0 @@ - - {{'help.faq' | translate}} - - - - {{'help.bug-title' | translate}} - - - - - - - {{'help.donate-title' | translate}} - - - - - - - \ No newline at end of file diff --git a/src/app/layout/component/settings-help/settings-help.component.spec.ts b/src/app/layout/component/settings-help/settings-help.component.spec.ts deleted file mode 100644 index cd7eeaf0..00000000 --- a/src/app/layout/component/settings-help/settings-help.component.spec.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { HttpClientModule } from '@angular/common/http'; -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { BrowserModule } from '@angular/platform-browser'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { TranslateFakeLoader, TranslateLoader, TranslateModule } from '@ngx-translate/core'; -import { MaterialModule } from '@shared/module/material/material.module'; -import { SettingsHelpComponent } from './settings-help.component'; - - -describe('SettingsHelpComponent', () => { - let component: SettingsHelpComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - MaterialModule, - BrowserAnimationsModule, - TranslateModule.forRoot({ - loader: { - provide: TranslateLoader, - useFactory: () => new TranslateFakeLoader() - } - }) - ], - declarations: [SettingsHelpComponent] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(SettingsHelpComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/layout/component/settings-help/settings-help.component.ts b/src/app/layout/component/settings-help/settings-help.component.ts deleted file mode 100644 index b4d9f921..00000000 --- a/src/app/layout/component/settings-help/settings-help.component.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core'; - -@Component({ - selector: 'app-settings-help', - templateUrl: './settings-help.component.html', - changeDetection: ChangeDetectionStrategy.OnPush -}) -export class SettingsHelpComponent { - // constructor(private readonly browser: BrowserService) { } - - public openUrl(url: string): void { - alert(url); - } -} diff --git a/src/app/layout/component/settings-support/settings-support.component.html b/src/app/layout/component/settings-support/settings-support.component.html new file mode 100644 index 00000000..9692564e --- /dev/null +++ b/src/app/layout/component/settings-support/settings-support.component.html @@ -0,0 +1,26 @@ +
+
+ +

{{'support.question.text' | translate}}

+
+ + +
+
+
+
+ +

{{'support.developer.text' | translate}}

+
+ +
+
+
+
\ No newline at end of file diff --git a/src/app/layout/component/settings-support/settings-support.component.scss b/src/app/layout/component/settings-support/settings-support.component.scss new file mode 100644 index 00000000..43880831 --- /dev/null +++ b/src/app/layout/component/settings-support/settings-support.component.scss @@ -0,0 +1,16 @@ +@import "./../../../../styles/variables"; + +p { + color: $label-color; + font-size: 13px; + margin: 0 0 $gutter 0; + height: 40px; +} + +button { + color: $white !important; + + & + button { + margin-left: $gutter-half; + } +} diff --git a/src/app/layout/component/settings-support/settings-support.component.spec.ts b/src/app/layout/component/settings-support/settings-support.component.spec.ts new file mode 100644 index 00000000..38c8e804 --- /dev/null +++ b/src/app/layout/component/settings-support/settings-support.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SettingsSupportComponent } from './settings-support.component'; + +describe('SettingsSupportComponent', () => { + let component: SettingsSupportComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SettingsSupportComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SettingsSupportComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/layout/component/settings-support/settings-support.component.ts b/src/app/layout/component/settings-support/settings-support.component.ts new file mode 100644 index 00000000..3ce93c86 --- /dev/null +++ b/src/app/layout/component/settings-support/settings-support.component.ts @@ -0,0 +1,18 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { OWUtils } from '@app/odk/ow-utils'; + +@Component({ + selector: 'app-settings-support', + templateUrl: './settings-support.component.html', + styleUrls: ['./settings-support.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class SettingsSupportComponent { + public onOpenUrl(url: string): void { + OWUtils.openUrl(url, true); + } + + public onOpenSubscription(): void { + OWUtils.openSubscriptionPage(); + } +} diff --git a/src/app/layout/layout.module.ts b/src/app/layout/layout.module.ts index a71d9606..33a5e9ea 100644 --- a/src/app/layout/layout.module.ts +++ b/src/app/layout/layout.module.ts @@ -1,6 +1,6 @@ import { NgModule } from '@angular/core'; import { SharedModule } from '../shared/shared.module'; -import { SettingsFeatureContainerComponent, SettingsFormComponent, SettingsHelpComponent } from './component'; +import { SettingsFeatureContainerComponent, SettingsFormComponent, SettingsSupportComponent } from './component'; import { AnnotationWindowComponent, BackgroundWindowComponent, LauncherWindowComponent, NotificationWindowComponent, SettingsWindowComponent } from './window'; const WINDOWS = [ @@ -16,8 +16,8 @@ const WINDOWS = [ ...WINDOWS, SettingsFeatureContainerComponent, SettingsFormComponent, - SettingsHelpComponent, AnnotationWindowComponent, + SettingsSupportComponent, ], exports: [ ...WINDOWS diff --git a/src/app/layout/window/settings-window/settings-window.component.html b/src/app/layout/window/settings-window/settings-window.component.html index 8e977b97..1c3cdf1b 100644 --- a/src/app/layout/window/settings-window/settings-window.component.html +++ b/src/app/layout/window/settings-window/settings-window.component.html @@ -1,28 +1,37 @@ - -
- - -
- - -
-
- + + + +
+ + +
+
+ + + + {{feature.name | translate}} + + {{feature.name | translate}} + +
+ + +
+
+ +
\ No newline at end of file diff --git a/src/app/layout/window/settings-window/settings-window.component.scss b/src/app/layout/window/settings-window/settings-window.component.scss index 9ed81eb2..8dcc324f 100644 --- a/src/app/layout/window/settings-window/settings-window.component.scss +++ b/src/app/layout/window/settings-window/settings-window.component.scss @@ -1,11 +1,7 @@ @import "../../../../styles/variables"; -.content { - padding-bottom: 36px; - - .tab-content { - padding: 12px 12px 0px 12px; - } +.tab-content { + padding: 12px 12px 0px 12px; } ::ng-deep { diff --git a/src/app/modules/bookmarks/component/bookmarks-settings/bookmarks-settings.component.html b/src/app/modules/bookmarks/component/bookmarks-settings/bookmarks-settings.component.html index b6f10004..3494eb78 100644 --- a/src/app/modules/bookmarks/component/bookmarks-settings/bookmarks-settings.component.html +++ b/src/app/modules/bookmarks/component/bookmarks-settings/bookmarks-settings.component.html @@ -1,6 +1,6 @@
- +
@@ -26,6 +26,6 @@
-
+
\ No newline at end of file diff --git a/src/app/modules/commands/component/commands-settings/commands-settings.component.html b/src/app/modules/commands/component/commands-settings/commands-settings.component.html index 4d2c268c..9fcbf895 100644 --- a/src/app/modules/commands/component/commands-settings/commands-settings.component.html +++ b/src/app/modules/commands/component/commands-settings/commands-settings.component.html @@ -1,6 +1,6 @@
- +
@@ -18,6 +18,6 @@
-
+
\ No newline at end of file diff --git a/src/app/modules/evaluate/component/evaluate-settings/evaluate-settings.component.html b/src/app/modules/evaluate/component/evaluate-settings/evaluate-settings.component.html index 8542e439..36731e06 100644 --- a/src/app/modules/evaluate/component/evaluate-settings/evaluate-settings.component.html +++ b/src/app/modules/evaluate/component/evaluate-settings/evaluate-settings.component.html @@ -71,7 +71,7 @@
-
+
{{'evaluate.item-search.query.initial' | translate}} @@ -111,12 +111,12 @@
- + + {{'evaluate.item-search.filter.name' | translate}}
- + - + {{'evaluate.item-search.property.name' | translate}}
-
+ - + {{'evaluate.item-search.stat.name' | translate}}
--> - -
-
+ + \ No newline at end of file diff --git a/src/app/modules/trade/component/trade-settings/trade-settings.component.html b/src/app/modules/trade/component/trade-settings/trade-settings.component.html index c0a90519..deaffbd6 100644 --- a/src/app/modules/trade/component/trade-settings/trade-settings.component.html +++ b/src/app/modules/trade/component/trade-settings/trade-settings.component.html @@ -47,17 +47,19 @@
-
- -
- - - +
+
+ +
+ + + +
diff --git a/src/app/shared/module/material/component/card/card.component.scss b/src/app/shared/module/material/component/card/card.component.scss index 3996a048..52caf1f8 100644 --- a/src/app/shared/module/material/component/card/card.component.scss +++ b/src/app/shared/module/material/component/card/card.component.scss @@ -6,6 +6,12 @@ } } +:host, +.mat-card { + display: block; + height: 100%; +} + .title { margin-bottom: 12px; } diff --git a/src/app/shared/module/material/component/select-list/select-list.component.scss b/src/app/shared/module/material/component/select-list/select-list.component.scss index 2b674743..27982ed3 100644 --- a/src/app/shared/module/material/component/select-list/select-list.component.scss +++ b/src/app/shared/module/material/component/select-list/select-list.component.scss @@ -19,5 +19,6 @@ .viewport { height: 240px; width: 550px; + box-shadow: 0 0 2px 0; } } diff --git a/src/app/shared/module/odk/component/header/header.component.html b/src/app/shared/module/odk/component/header/header.component.html index f35245c1..697fbcf9 100644 --- a/src/app/shared/module/odk/component/header/header.component.html +++ b/src/app/shared/module/odk/component/header/header.component.html @@ -15,6 +15,6 @@
-
+
\ No newline at end of file diff --git a/src/app/shared/module/odk/component/header/header.component.scss b/src/app/shared/module/odk/component/header/header.component.scss index faf2c1cb..4d3bf9f3 100644 --- a/src/app/shared/module/odk/component/header/header.component.scss +++ b/src/app/shared/module/odk/component/header/header.component.scss @@ -15,7 +15,7 @@ $border-color: #1a1a1a; font-size: $icon-size; line-height: $icon-size; - & + .mat-icon{ + & + .mat-icon { margin-left: 3px; } } @@ -79,4 +79,9 @@ $border-color: #1a1a1a; border: 1px solid $border-color; border-top: none; width: 100%; + + &.scrollable { + overflow-x: hidden; + overflow-y: auto; + } } diff --git a/src/app/shared/module/odk/component/header/header.component.ts b/src/app/shared/module/odk/component/header/header.component.ts index 040b2803..9a023ce7 100644 --- a/src/app/shared/module/odk/component/header/header.component.ts +++ b/src/app/shared/module/odk/component/header/header.component.ts @@ -19,6 +19,9 @@ export class HeaderComponent implements OnInit { @Input() public inline = false; + @Input() + public scrollable = false; + @Input() public closeable = true; diff --git a/src/assets/i18n/english.json b/src/assets/i18n/english.json index 4273e19c..e185a416 100644 --- a/src/assets/i18n/english.json +++ b/src/assets/i18n/english.json @@ -402,6 +402,20 @@ "ui-language": "UI Language", "zoom": "Zoom" }, + "support": { + "developer": { + "open": "Open the Subscription Page", + "text": "If you love the app, consider supporting me by subscribing. This will allow me to spend more time developing this app and keep it up-to-date. You will also get early access to new features.", + "title": "Support the Developer" + }, + "name": "Support", + "question": { + "discord": "Join the Discord-Community", + "github": "Submit an Issue at the GitHub Project", + "text": "You have a question? Or do you want to request a new feature?", + "title": "Get Support" + } + }, "trade": { "action": { "finished": "Thanks and Goodbye", diff --git a/src/assets/i18n/french.json b/src/assets/i18n/french.json index 01dcbc95..c14ebbf8 100644 --- a/src/assets/i18n/french.json +++ b/src/assets/i18n/french.json @@ -402,6 +402,20 @@ "ui-language": "Langue de l'interface utilisateur", "zoom": "Zoom" }, + "support": { + "developer": { + "open": "Ouvrez la page d'abonnement", + "text": "Si vous aimez l'application, pensez à me soutenir en vous abonnant. Cela me permettra de passer plus de temps à développer cette application et à la maintenir à jour. Vous aurez également un accès anticipé à de nouvelles fonctionnalités.", + "title": "Soutenez le développeur" + }, + "name": "Soutien", + "question": { + "discord": "Rejoignez la communauté Discord", + "github": "Soumettre un problème au projet GitHub", + "text": "Tu as une question? Ou souhaitez-vous demander une nouvelle fonctionnalité?", + "title": "Obtenir de l'aide" + } + }, "trade": { "action": { "finished": "Merci et au revoir", diff --git a/src/assets/i18n/german.json b/src/assets/i18n/german.json index 4f723aa3..d0509a62 100644 --- a/src/assets/i18n/german.json +++ b/src/assets/i18n/german.json @@ -402,6 +402,20 @@ "ui-language": "Sprache der Benutzeroberfläche", "zoom": "Skalierung" }, + "support": { + "developer": { + "open": "Öffnen Sie die Abonnementseite", + "text": "Wenn Sie die App lieben, können Sie mich durch ein Abonnement unterstützen. Dadurch kann ich mehr Zeit für die Entwicklung dieser App aufwenden und sie auf dem neuesten Stand halten. Sie erhalten auch frühzeitig Zugriff auf neue Funktionen.", + "title": "Unterstützen Sie den Entwickler" + }, + "name": "Unterstützung", + "question": { + "discord": "Tritt der Discord-Community bei", + "github": "Senden Sie ein Problem beim GitHub-Projekt", + "text": "Hast du eine Frage? Oder möchten Sie eine neue Funktion anfordern?", + "title": "Holen Sie sich Unterstützung" + } + }, "trade": { "action": { "finished": "Danke und auf Wiedersehen", diff --git a/src/assets/i18n/korean.json b/src/assets/i18n/korean.json index 2d048538..ee252835 100644 --- a/src/assets/i18n/korean.json +++ b/src/assets/i18n/korean.json @@ -402,6 +402,20 @@ "ui-language": "UI 언어", "zoom": "줌" }, + "support": { + "developer": { + "open": "구독 페이지를여십시오", + "text": "당신이 응용 프로그램을 사랑한다면, 가입하여 나를 지원하는 것을 고려하십시오. 이를 통해이 앱을 개발하는 데 더 많은 시간을 할애하고 최신 상태로 유지할 수 있습니다. 또한 새로운 기능에 일찍 액세스 할 수 있습니다.", + "title": "개발자 지원" + }, + "name": "지원하다", + "question": { + "discord": "불화 커뮤니티에 참여", + "github": "GitHub 프로젝트에서 이슈 제출", + "text": "질문이 있습니까? 아니면 새로운 기능을 요청 하시겠습니까?", + "title": "지원을 받다" + } + }, "trade": { "action": { "finished": "감사와 안녕", diff --git a/src/assets/i18n/polish.json b/src/assets/i18n/polish.json index 46cbc18a..6f2d2f6c 100644 --- a/src/assets/i18n/polish.json +++ b/src/assets/i18n/polish.json @@ -402,6 +402,20 @@ "ui-language": "Język programu", "zoom": "Powiększenie" }, + "support": { + "developer": { + "open": "Otwórz stronę subskrypcji", + "text": "Jeśli podoba Ci się aplikacja, rozważ wsparcie, subskrybując ją. Pozwoli mi to poświęcić więcej czasu na rozwijanie tej aplikacji i aktualizowanie jej. Otrzymasz również wczesny dostęp do nowych funkcji.", + "title": "Wspieraj programistę" + }, + "name": "Wsparcie", + "question": { + "discord": "Dołącz do społeczności Discord", + "github": "Prześlij problem w GitHub Project", + "text": "Masz pytanie? A może chcesz poprosić o nową funkcję?", + "title": "Uzyskać wsparcie" + } + }, "trade": { "action": { "finished": "Dzięki i do widzenia", diff --git a/src/assets/i18n/portuguese.json b/src/assets/i18n/portuguese.json index ca032a5c..53a0dec5 100644 --- a/src/assets/i18n/portuguese.json +++ b/src/assets/i18n/portuguese.json @@ -402,6 +402,20 @@ "ui-language": "Idioma da interface do usuário", "zoom": "Zoom" }, + "support": { + "developer": { + "open": "Abra a página de inscrição", + "text": "Se você ama o aplicativo, considere apoiar-me assinando. Isso permitirá que eu gaste mais tempo desenvolvendo esse aplicativo e mantenha-o atualizado. Você também terá acesso antecipado a novos recursos.", + "title": "Apoie o desenvolvedor" + }, + "name": "Apoio, suporte", + "question": { + "discord": "Participe da Comunidade Discord", + "github": "Envie um problema no projeto GitHub", + "text": "Você tem uma pergunta? Ou você deseja solicitar um novo recurso?", + "title": "Obter suporte" + } + }, "trade": { "action": { "finished": "Obrigado e adeus", diff --git a/src/assets/i18n/russian.json b/src/assets/i18n/russian.json index 3893907d..178d8e63 100644 --- a/src/assets/i18n/russian.json +++ b/src/assets/i18n/russian.json @@ -402,6 +402,20 @@ "ui-language": "Язык интерфейса", "zoom": "Масштаб" }, + "support": { + "developer": { + "open": "Откройте страницу подписки", + "text": "Если вы любите приложение, рассмотрите поддержку меня, подписавшись. Это позволит мне больше времени уделять разработке этого приложения и поддерживать его в актуальном состоянии. Вы также получите ранний доступ к новым функциям.", + "title": "Поддержи разработчика" + }, + "name": "служба поддержки", + "question": { + "discord": "Присоединяйтесь к Discord-сообществу", + "github": "Отправить вопрос в проекте GitHub", + "text": "У вас есть вопрос? Или вы хотите запросить новую функцию?", + "title": "Получать поддержку" + } + }, "trade": { "action": { "finished": "Спасибо и до свидания", diff --git a/src/assets/i18n/simplified-chinese.json b/src/assets/i18n/simplified-chinese.json index 037b3689..4ffe2903 100644 --- a/src/assets/i18n/simplified-chinese.json +++ b/src/assets/i18n/simplified-chinese.json @@ -402,6 +402,20 @@ "ui-language": "UI语言", "zoom": "放大" }, + "support": { + "developer": { + "open": "打开订阅页面", + "text": "如果您喜欢该应用程序,请考虑通过订阅支持我。这将使我花更多的时间来开发此应用程序并保持最新状态。您还将尽早使用新功能。", + "title": "支持开发商" + }, + "name": "支持", + "question": { + "discord": "加入不和谐社区", + "github": "在GitHub Project上提交问题", + "text": "你有问题吗还是要请求一项新功能?", + "title": "得到支持" + } + }, "trade": { "action": { "finished": "谢谢,再见", diff --git a/src/assets/i18n/spanish.json b/src/assets/i18n/spanish.json index da1ec71e..668194e6 100644 --- a/src/assets/i18n/spanish.json +++ b/src/assets/i18n/spanish.json @@ -402,6 +402,20 @@ "ui-language": "Idioma de la interfaz de usuario", "zoom": "Enfocar" }, + "support": { + "developer": { + "open": "Abra la página de suscripción", + "text": "Si amas la aplicación, considera apoyarme suscribiéndote. Esto me permitirá pasar más tiempo desarrollando esta aplicación y mantenerla actualizada. También obtendrá acceso temprano a nuevas funciones.", + "title": "Apoye al desarrollador" + }, + "name": "Apoyo", + "question": { + "discord": "Únete a la comunidad Discord", + "github": "Enviar un problema en el proyecto GitHub", + "text": "¿Tienes una pregunta? ¿O quieres solicitar una nueva función?", + "title": "Obtener apoyo" + } + }, "trade": { "action": { "finished": "Gracias y adiós", diff --git a/src/assets/i18n/thai.json b/src/assets/i18n/thai.json index 1bcc02fb..5e99b7c7 100644 --- a/src/assets/i18n/thai.json +++ b/src/assets/i18n/thai.json @@ -402,6 +402,20 @@ "ui-language": "ภาษา UI", "zoom": "ซูม" }, + "support": { + "developer": { + "open": "เปิดหน้าการสมัครสมาชิก", + "text": "หากคุณรักแอปโปรดพิจารณาสนับสนุนฉันโดยสมัครรับข้อมูล นี่จะทำให้ฉันใช้เวลาในการพัฒนาแอพนี้มากขึ้นและทำให้มันทันสมัยอยู่เสมอ นอกจากนี้คุณยังจะได้รับการเข้าถึงคุณลักษณะใหม่ก่อนเวลา", + "title": "สนับสนุนผู้พัฒนา" + }, + "name": "สนับสนุน", + "question": { + "discord": "เข้าร่วม Discord-Community", + "github": "ส่งปัญหาที่โครงการ GitHub", + "text": "คุณมีคำถามหรือไม่? หรือคุณต้องการที่จะขอคุณสมบัติใหม่?", + "title": "ได้รับการสนับสนุน" + } + }, "trade": { "action": { "finished": "ขอบคุณและลาก่อน", diff --git a/src/assets/i18n/traditional-chinese.json b/src/assets/i18n/traditional-chinese.json index ff83ac93..f6fc223a 100644 --- a/src/assets/i18n/traditional-chinese.json +++ b/src/assets/i18n/traditional-chinese.json @@ -402,6 +402,20 @@ "ui-language": "介面語言", "zoom": "放大" }, + "support": { + "developer": { + "open": "打開訂閱頁面", + "text": "如果您喜歡該應用程序,請考慮通過訂閱支持我。這將使我花更多的時間來開發此應用程序並保持最新狀態。您還將儘早使用新功能。", + "title": "支持開發商" + }, + "name": "支持", + "question": { + "discord": "加入不和諧社區", + "github": "在GitHub Project上提交問題", + "text": "你有問題嗎還是要請求一項新功能?", + "title": "得到支持" + } + }, "trade": { "action": { "finished": "謝謝,再見", diff --git a/src/styles/_material.scss b/src/styles/_material.scss index 0022e501..b73cfe04 100644 --- a/src/styles/_material.scss +++ b/src/styles/_material.scss @@ -6,11 +6,15 @@ mat-label { display: block; } -mat-card { - margin-bottom: 12px; +app-card { + padding-bottom: 12px; - > mat-label { - margin-bottom: 12px; + mat-card { + > div { + > mat-label { + margin-bottom: 12px; + } + } } } From 5c244d86a3b698a75ed8efe2c89531535bee913f Mon Sep 17 00:00:00 2001 From: Nicklas Ronge Date: Thu, 18 Jun 2020 17:24:48 +0200 Subject: [PATCH 03/22] - fixed cards intersecting with each other --- .../material/component/card/card.component.scss | 6 ------ src/styles/_material.scss | 12 +++++------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/app/shared/module/material/component/card/card.component.scss b/src/app/shared/module/material/component/card/card.component.scss index 52caf1f8..3996a048 100644 --- a/src/app/shared/module/material/component/card/card.component.scss +++ b/src/app/shared/module/material/component/card/card.component.scss @@ -6,12 +6,6 @@ } } -:host, -.mat-card { - display: block; - height: 100%; -} - .title { margin-bottom: 12px; } diff --git a/src/styles/_material.scss b/src/styles/_material.scss index b73cfe04..e482c74f 100644 --- a/src/styles/_material.scss +++ b/src/styles/_material.scss @@ -6,14 +6,12 @@ mat-label { display: block; } -app-card { - padding-bottom: 12px; +mat-card { + margin-bottom: 12px; - mat-card { - > div { - > mat-label { - margin-bottom: 12px; - } + > div { + > mat-label { + margin-bottom: 12px; } } } From 31e32ee0e4fbec294d2f4cafe3331359ca381a5e Mon Sep 17 00:00:00 2001 From: Nicklas Ronge Date: Fri, 19 Jun 2020 21:44:33 +0200 Subject: [PATCH 04/22] added `Character Name` setting as fallback --- CHANGELOG.md | 5 ++ manifest.json | 2 +- overlay.babel | 55 ++++++++++++++++++- package.json | 2 +- src/app/core/feature/feature-settings.ts | 1 + .../settings-form.component.html | 10 +++- src/app/modules/commands/commands.module.ts | 2 +- .../commands/service/command.service.ts | 18 ++++-- .../trade-message/trade-message.component.ts | 3 + src/assets/i18n/english.json | 1 + src/assets/i18n/french.json | 1 + src/assets/i18n/german.json | 1 + src/assets/i18n/korean.json | 1 + src/assets/i18n/polish.json | 1 + src/assets/i18n/portuguese.json | 1 + src/assets/i18n/russian.json | 1 + src/assets/i18n/simplified-chinese.json | 1 + src/assets/i18n/spanish.json | 1 + src/assets/i18n/thai.json | 1 + src/assets/i18n/traditional-chinese.json | 1 + 20 files changed, 98 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6beb9bf6..b86410d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## 1.0.4 (2020-06-19) + +- added 3.11 data +- added `Character Name` setting as fallback + ## 1.0.3 (2020-06-18) - fixed a unhandled error if no event data is available diff --git a/manifest.json b/manifest.json index 4e303c88..973de3e0 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "meta": { "name": "PoE Overlay", "author": "Kyusung4698", - "version": "1.0.3", + "version": "1.0.4", "minimum-overwolf-version": "0.147.0", "description": "Search the market and send trade offers. Get current market values for your item. View insights for maps and items.", "dock_button_title": "PoE Overlay", diff --git a/overlay.babel b/overlay.babel index aa4827ec..1e7cf355 100644 --- a/overlay.babel +++ b/overlay.babel @@ -1,4 +1,4 @@ - + + + + {{'support.name' | translate}} + +
+ +
+
\ No newline at end of file diff --git a/src/app/modules/trade/component/trade-message/trade-message.component.html b/src/app/modules/trade/component/trade-message/trade-message.component.html index df59e07f..b2505bee 100644 --- a/src/app/modules/trade/component/trade-message/trade-message.component.html +++ b/src/app/modules/trade/component/trade-message/trade-message.component.html @@ -1,4 +1,4 @@ -
diff --git a/src/app/modules/trade/component/trade-message/trade-message.component.scss b/src/app/modules/trade/component/trade-message/trade-message.component.scss index 95311109..3befb2bc 100644 --- a/src/app/modules/trade/component/trade-message/trade-message.component.scss +++ b/src/app/modules/trade/component/trade-message/trade-message.component.scss @@ -1,19 +1,5 @@ @import "../../../../../styles/variables"; -::ng-deep { - app-trade-message { - &:nth-child(even) { - .message { - background: adjust-color($black-transparent, $alpha: -0.2); - } - } - - & + app-trade-message { - margin-top: 1px; - } - } -} - :host { display: block; } @@ -30,6 +16,10 @@ border-left: 6px solid; border-left-color: adjust-color($color: $purple, $alpha: -0.1); + &.even { + background: adjust-color($black-transparent, $alpha: -0.2); + } + &.joined { border-top: 1px solid rgb(50, 205, 50); border-right: 1px solid rgb(50, 205, 50); @@ -50,6 +40,7 @@ top: -8px; right: -8px; display: none; + z-index: 1001; } &:hover { diff --git a/src/app/modules/trade/component/trade-message/trade-message.component.ts b/src/app/modules/trade/component/trade-message/trade-message.component.ts index b7cec51b..b874dccb 100644 --- a/src/app/modules/trade/component/trade-message/trade-message.component.ts +++ b/src/app/modules/trade/component/trade-message/trade-message.component.ts @@ -34,6 +34,9 @@ export class TradeMessageComponent implements OnInit { @Input() public settings: TradeFeatureSettings; + @Input() + public even: boolean; + @Output() public dismiss = new EventEmitter(); @@ -52,6 +55,7 @@ export class TradeMessageComponent implements OnInit { this.visible[TradeMessageAction.Wait] = true; this.visible[TradeMessageAction.ItemGone] = true; this.visible[TradeMessageAction.ItemHighlight] = true; + this.visible[TradeMessageAction.Finished] = true; if (this.settings.tradeSoundEnabled) { this.audio.play(AudioFile.Notification, this.settings.tradeSoundVolume / 100); } @@ -105,12 +109,12 @@ export class TradeMessageComponent implements OnInit { this.hideHighlight(); this.chat.trade(this.message.name); this.visible[TradeMessageAction.ItemHighlight] = false; - this.visible[TradeMessageAction.Finished] = true; break; case TradeMessageAction.ItemHighlight: this.toggleHighlight(); break; case TradeMessageAction.Whisper: + window.blur(); this.chat.whisper(this.message.name); break; case TradeMessageAction.Finished: diff --git a/src/app/modules/trade/component/trade-settings/trade-settings.component.html b/src/app/modules/trade/component/trade-settings/trade-settings.component.html index deaffbd6..fd2f4a4b 100644 --- a/src/app/modules/trade/component/trade-settings/trade-settings.component.html +++ b/src/app/modules/trade/component/trade-settings/trade-settings.component.html @@ -7,6 +7,31 @@
+
+
+ + {{'trade.layout' | translate}} + + + {{'trade.layouts.' + (layouts.values[layout] | lowercase) | translate}} + + + +
+
+ + {{'trade.filter' | translate}} + + + {{'trade.filters.' + (filters.values[filter] | lowercase) | translate}} + + + +
+
+ + +
diff --git a/src/app/modules/trade/component/trade-settings/trade-settings.component.ts b/src/app/modules/trade/component/trade-settings/trade-settings.component.ts index 8ac34135..0200884a 100644 --- a/src/app/modules/trade/component/trade-settings/trade-settings.component.ts +++ b/src/app/modules/trade/component/trade-settings/trade-settings.component.ts @@ -1,7 +1,8 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; import { AudioFile, AudioService } from '@app/audio'; +import { EnumValues } from '@app/enum'; import { FeatureSettingsComponent } from '@app/feature'; -import { TradeFeatureSettings } from '@modules/trade/trade-feature-settings'; +import { TradeFeatureSettings, TradeFilter, TradeLayout } from '@modules/trade/trade-feature-settings'; @Component({ selector: 'app-trade-settings', @@ -12,6 +13,9 @@ import { TradeFeatureSettings } from '@modules/trade/trade-feature-settings'; export class TradeSettingsComponent extends FeatureSettingsComponent { public displayWithVolume = (volume: number) => `${volume}%`; + public layouts = new EnumValues(TradeLayout); + public filters = new EnumValues(TradeFilter); + constructor(private readonly audio: AudioService) { super(); } diff --git a/src/app/modules/trade/service/trade.service.ts b/src/app/modules/trade/service/trade.service.ts index 0d721460..aaf485bf 100644 --- a/src/app/modules/trade/service/trade.service.ts +++ b/src/app/modules/trade/service/trade.service.ts @@ -1,5 +1,6 @@ import { Injectable } from '@angular/core'; -import { TradeChatParserService, TradeExchangeMessage, TradeMessage, TradeParserType, TradePlayerJoinedArea } from '@shared/module/poe/trade/chat'; +import { TradeChatParserService, TradeExchangeMessage, TradeMessage, TradeParserType, TradePlayerJoinedArea, TradeWhisperDirection } from '@shared/module/poe/trade/chat'; +import { TradeFilter } from '../trade-feature-settings'; import { TradeWindowData, TradeWindowService } from './trade-window.service'; @Injectable({ @@ -23,7 +24,7 @@ export class TradeService { this.window.data$.next(data); } - public onLogLineAdd(line: string): void { + public onLogLineAdd(line: string, filter: TradeFilter): void { const data = this.window.data$.get(); if (this.processRemoved(data)) { this.window.data$.next(data); @@ -35,10 +36,15 @@ export class TradeService { case TradeParserType.TradeBulk: case TradeParserType.TradeMap: const message = result as TradeExchangeMessage; - if (!this.processMessage(message, data.messages)) { - data.messages.push(message); + const { direction } = message; + const shouldProcess = direction === TradeWhisperDirection.Incoming + || (direction === TradeWhisperDirection.Outgoing && filter === TradeFilter.IncomingOutgoing); + if (shouldProcess) { + if (!this.processMessage(message, data.messages)) { + data.messages.push(message); + } + this.window.data$.next(data); } - this.window.data$.next(data); break; case TradeParserType.Whisper: if (this.processWhisper(result as TradeMessage, data.messages)) { diff --git a/src/app/modules/trade/trade-feature-settings.ts b/src/app/modules/trade/trade-feature-settings.ts index 5feca6fe..8c78f275 100644 --- a/src/app/modules/trade/trade-feature-settings.ts +++ b/src/app/modules/trade/trade-feature-settings.ts @@ -1,5 +1,15 @@ import { FeatureSettings } from '@app/feature'; +export enum TradeLayout { + TopToBottom, + BottomToTop +} + +export enum TradeFilter { + IncomingOutgoing, + Incoming +} + export interface TradeFeatureSettings extends FeatureSettings { tradeEnabled: boolean; tradeMessageWait: string; @@ -12,4 +22,6 @@ export interface TradeFeatureSettings extends FeatureSettings { }; tradeSoundEnabled: boolean; tradeSoundVolume: number; + tradeFilter: TradeFilter; + tradeLayout: TradeLayout; } diff --git a/src/app/modules/trade/trade.module.ts b/src/app/modules/trade/trade.module.ts index 0345caf1..f8f33f89 100644 --- a/src/app/modules/trade/trade.module.ts +++ b/src/app/modules/trade/trade.module.ts @@ -9,7 +9,7 @@ import { BehaviorSubject, of } from 'rxjs'; import { catchError } from 'rxjs/operators'; import { TradeMessageActionComponent, TradeMessageBulkComponent, TradeMessageComponent, TradeMessageDirectionComponent, TradeMessageItemComponent, TradeMessageMapComponent, TradeMessageMapTierComponent, TradeSettingsComponent } from './component'; import { TradeHighlightWindowService, TradeService, TradeWindowService } from './service'; -import { TradeFeatureSettings } from './trade-feature-settings'; +import { TradeFeatureSettings, TradeFilter, TradeLayout } from './trade-feature-settings'; import { TradeHighlightWindowComponent, TradeWindowComponent } from './window'; const WINDOWS = [ @@ -34,7 +34,7 @@ const WINDOWS = [ imports: [SharedModule] }) export class TradeModule implements FeatureModule { - private enabled = false; + private settings: TradeFeatureSettings; constructor( private readonly event: EventService, @@ -42,7 +42,7 @@ export class TradeModule implements FeatureModule { private readonly tradeWindow: TradeWindowService, private readonly highlightWindow: TradeHighlightWindowService, private readonly annotation: AnnotationService, - private readonly ngZone: NgZone, ) { } + private readonly ngZone: NgZone) { } public getConfig(): FeatureConfig { const config: FeatureConfig = { @@ -57,7 +57,9 @@ export class TradeModule implements FeatureModule { tradeStashFactor: {}, tradeWindowPinned: false, tradeSoundEnabled: true, - tradeSoundVolume: 75 + tradeSoundVolume: 75, + tradeFilter: TradeFilter.IncomingOutgoing, + tradeLayout: TradeLayout.TopToBottom } }; return config; @@ -76,7 +78,7 @@ export class TradeModule implements FeatureModule { this.highlightWindow.close().subscribe(); this.trade.clear(); } - this.enabled = settings.tradeEnabled; + this.settings = settings; } public onInfo(info: RunningGameInfo, settings: TradeFeatureSettings): void { @@ -91,12 +93,12 @@ export class TradeModule implements FeatureModule { this.highlightWindow.close().subscribe(); this.trade.clear(); } - this.enabled = settings.tradeEnabled; + this.settings = settings; } public onLogLineAdd(line: string): void { - if (this.enabled) { - this.trade.onLogLineAdd(line); + if (this.settings?.tradeEnabled) { + this.trade.onLogLineAdd(line, this.settings.tradeFilter); } } diff --git a/src/app/modules/trade/window/trade-window/trade-window.component.html b/src/app/modules/trade/window/trade-window/trade-window.component.html index 6b864571..0186cf46 100644 --- a/src/app/modules/trade/window/trade-window/trade-window.component.html +++ b/src/app/modules/trade/window/trade-window/trade-window.component.html @@ -1,19 +1,24 @@ -
- - - - keyboard_arrow_down - - - - - - + + +
+ + + keyboard_arrow_down + - - + +
+
+ + +
+
+
+ +
-
\ No newline at end of file + \ No newline at end of file diff --git a/src/app/modules/trade/window/trade-window/trade-window.component.scss b/src/app/modules/trade/window/trade-window/trade-window.component.scss index e0d5911a..be4ba43f 100644 --- a/src/app/modules/trade/window/trade-window/trade-window.component.scss +++ b/src/app/modules/trade/window/trade-window/trade-window.component.scss @@ -18,6 +18,12 @@ ::-webkit-scrollbar-thumb { display: none; } + + app-header { + .header { + margin-right: 10px; + } + } } .indicator { @@ -30,3 +36,39 @@ transform-origin: center; } } + +.content { + opacity: 1; + + &.pinned { + opacity: 0.3; + } + + &.active, + &:hover { + opacity: 1; + } +} + +.messages { + display: flex; + flex-direction: column; + min-height: 370px; + margin-right: 10px; + + &.reverse { + flex-direction: column-reverse; + + .message { + & + .message { + margin: 0 0 1px 0; + } + } + } + + .message { + & + .message { + margin: 1px 0 0 0; + } + } +} diff --git a/src/app/modules/trade/window/trade-window/trade-window.component.ts b/src/app/modules/trade/window/trade-window/trade-window.component.ts index 14a1b97d..2bf9f42f 100644 --- a/src/app/modules/trade/window/trade-window/trade-window.component.ts +++ b/src/app/modules/trade/window/trade-window/trade-window.component.ts @@ -4,7 +4,7 @@ import { FeatureSettingsService } from '@app/feature/feature-settings.service'; import { SettingsWindowService } from '@layout/service'; import { TradeWindowData, TradeWindowService } from '@modules/trade/service'; import { TradeFeatureSettings } from '@modules/trade/trade-feature-settings'; -import { TradeExchangeMessage } from '@shared/module/poe/trade/chat'; +import { TradeExchangeMessage, TradeMessage } from '@shared/module/poe/trade/chat'; import { BehaviorSubject } from 'rxjs'; @Component({ @@ -53,4 +53,8 @@ export class TradeWindowComponent implements OnInit, OnDestroy { public onSettingsToggle(): void { this.settingsWindow.toggle('trade.name').subscribe(); } + + public getMessages(data: TradeWindowData): TradeMessage[] { + return data.messages.filter(message => !data.removed.includes(message)); + } } diff --git a/src/app/shared/module/odk/component/header/header.component.html b/src/app/shared/module/odk/component/header/header.component.html index 697fbcf9..78c6c471 100644 --- a/src/app/shared/module/odk/component/header/header.component.html +++ b/src/app/shared/module/odk/component/header/header.component.html @@ -1,4 +1,4 @@ -
+
@@ -10,11 +10,12 @@
close - push_pin + push_pin + settings
-
+
\ No newline at end of file diff --git a/src/app/shared/module/odk/component/header/header.component.scss b/src/app/shared/module/odk/component/header/header.component.scss index 4d3bf9f3..859e43b8 100644 --- a/src/app/shared/module/odk/component/header/header.component.scss +++ b/src/app/shared/module/odk/component/header/header.component.scss @@ -24,7 +24,10 @@ $border-color: #1a1a1a; } .header { - position: relative; + position: fixed; + z-index: 1000; + left: 0; + right: 0; height: $header-size; line-height: $header-size + 2px; background: $header-background; @@ -35,6 +38,14 @@ $border-color: #1a1a1a; .name { text-align: center; } + + &:not(.reverse) { + top: 0; + } + + &.reverse { + bottom: 0; + } } .controls { @@ -76,12 +87,15 @@ $border-color: #1a1a1a; &:not(.inline) { height: calc(100% - 30px); } - border: 1px solid $border-color; - border-top: none; width: 100%; + padding: 30px 0 0 0; + + &.frame { + border: 1px solid $border-color; + border-top: none; + } - &.scrollable { - overflow-x: hidden; - overflow-y: auto; + &.reverse { + padding: 0 0 30px 0; } } diff --git a/src/app/shared/module/odk/component/header/header.component.ts b/src/app/shared/module/odk/component/header/header.component.ts index 9a023ce7..ca03c1c7 100644 --- a/src/app/shared/module/odk/component/header/header.component.ts +++ b/src/app/shared/module/odk/component/header/header.component.ts @@ -19,9 +19,6 @@ export class HeaderComponent implements OnInit { @Input() public inline = false; - @Input() - public scrollable = false; - @Input() public closeable = true; @@ -41,7 +38,10 @@ export class HeaderComponent implements OnInit { public width: number; @Input() - public margin: number; + public reverse = false; + + @Input() + public frame = true; @Output() public settingsToggle = new EventEmitter(); diff --git a/src/assets/i18n/english.json b/src/assets/i18n/english.json index 6ebd2062..4ac3be70 100644 --- a/src/assets/i18n/english.json +++ b/src/assets/i18n/english.json @@ -438,12 +438,23 @@ "rate": "Limit reached. Please try again later.\nIf this keeps happening please try lowering the fetched item count. " }, "fetching": "Found {{total}}. Fetching {{count}} entries...", + "filter": "Filter", + "filters": { + "incoming": "Incoming", + "incomingoutgoing": "Incoming & Outgoing" + }, + "layout": "Layout", + "layouts": { + "bottomtotop": "Bottom To Top", + "toptobottom": "Top To Bottom" + }, "message": { "item-gone": "Item gone message", "still-interested": "Still interested message", "thanks": "Thanks message", "wait": "Wait message" }, + "messages": "Messages", "name": "Trade", "no-price": "No price", "not-found": "No data found.", diff --git a/src/assets/i18n/french.json b/src/assets/i18n/french.json index 59cbeae8..be2e30cc 100644 --- a/src/assets/i18n/french.json +++ b/src/assets/i18n/french.json @@ -438,12 +438,23 @@ "rate": "Limite atteinte. Veuillez réessayer plus tard.\nSi cela continue, essayez de réduire le nombre d'articles récupérés." }, "fetching": " {{total}}trouvé. Récupération de {{count}} entrées ...", + "filter": "Filtre", + "filters": { + "incoming": "Entrant", + "incomingoutgoing": "Entrant sortant" + }, + "layout": "Disposition", + "layouts": { + "bottomtotop": "De bas en haut", + "toptobottom": "De haut en bas" + }, "message": { "item-gone": "Message d'élément disparu", "still-interested": "Message toujours intéressé", "thanks": "Message de remerciement", "wait": "Message d'attente" }, + "messages": "messages", "name": "commerce", "no-price": "Pas de prix", "not-found": "Aucune donnée disponible.", diff --git a/src/assets/i18n/german.json b/src/assets/i18n/german.json index d8343997..33095215 100644 --- a/src/assets/i18n/german.json +++ b/src/assets/i18n/german.json @@ -438,12 +438,23 @@ "rate": "Limit erreicht. Bitte versuchen Sie es später noch einmal.\nWenn dies weiterhin geschieht, versuchen Sie bitte, die Anzahl der abgerufenen Artikel zu verringern." }, "fetching": "Gefunden {{total}}. {{count}} Einträge abrufen ...", + "filter": "Filter", + "filters": { + "incoming": "Eingehend", + "incomingoutgoing": "Eingehend und ausgehend" + }, + "layout": "Layout", + "layouts": { + "bottomtotop": "unten nach oben", + "toptobottom": "Oben nach unten" + }, "message": { "item-gone": "Artikel weg Nachricht", "still-interested": "Immer noch interessierte Nachricht", "thanks": "Danke Nachricht", "wait": "Warte Nachricht" }, + "messages": "Mitteilungen", "name": "Handel", "no-price": "Kein Preis", "not-found": "Keine Daten gefunden.", diff --git a/src/assets/i18n/korean.json b/src/assets/i18n/korean.json index 21e0554b..4a689ec2 100644 --- a/src/assets/i18n/korean.json +++ b/src/assets/i18n/korean.json @@ -438,12 +438,23 @@ "rate": "한도에 도달했습니다. 나중에 다시 시도하십시오.\n이 문제가 계속 발생하면 가져온 품목 수를 줄이십시오." }, "fetching": " {{total}}을 (를) 찾았습니다. {{count}} 항목을 가져 오는 중 ...", + "filter": "필터", + "filters": { + "incoming": "들어오는", + "incomingoutgoing": "수신 및 발신" + }, + "layout": "형세", + "layouts": { + "bottomtotop": "아래에서 위로", + "toptobottom": "위에서 아래로" + }, "message": { "item-gone": "사라진 항목 메시지", "still-interested": "여전히 관심있는 메시지", "thanks": "감사 메시지", "wait": "대기 메시지" }, + "messages": "메시지", "name": "무역", "no-price": "가격 없음", "not-found": "데이터가 없습니다.", diff --git a/src/assets/i18n/polish.json b/src/assets/i18n/polish.json index 0078d029..f4924a14 100644 --- a/src/assets/i18n/polish.json +++ b/src/assets/i18n/polish.json @@ -438,12 +438,23 @@ "rate": "Limit osiągnięty. Spróbuj ponownie później.\nJeśli problem nadal występuje, spróbuj zmniejszyć liczbę pobieranych ofert sprzedaży." }, "fetching": "Znaleziono {{total}}. Pobieranie {{count}} aukcji ...", + "filter": "filtr", + "filters": { + "incoming": "Przychodzące", + "incomingoutgoing": "Przychodzące i wychodzące" + }, + "layout": "Układ", + "layouts": { + "bottomtotop": "Od dołu do góry", + "toptobottom": "Od góry do dołu" + }, "message": { "item-gone": "Wiadomość zniknęła z produktu", "still-interested": "Wciąż zainteresowana wiadomość", "thanks": "Dzięki wiadomość", "wait": "Wiadomość oczekująca" }, + "messages": "Wiadomości", "name": "Handel", "no-price": "Bez ceny", "not-found": "Nie znaleziono danych.", diff --git a/src/assets/i18n/portuguese.json b/src/assets/i18n/portuguese.json index 310bb3d5..abd7bdec 100644 --- a/src/assets/i18n/portuguese.json +++ b/src/assets/i18n/portuguese.json @@ -438,12 +438,23 @@ "rate": "Limite alcançado. Por favor, tente novamente mais tarde.\nSe isso continuar acontecendo, tente diminuir a contagem de itens buscados." }, "fetching": "Encontrado {{total}}. Buscando {{count}} entradas ...", + "filter": "Filtro", + "filters": { + "incoming": "Entrada", + "incomingoutgoing": "Entrada saída" + }, + "layout": "Layout", + "layouts": { + "bottomtotop": "De baixo para cima", + "toptobottom": "De cima para baixo" + }, "message": { "item-gone": "Mensagem de item desaparecido", "still-interested": "Mensagem ainda interessada", "thanks": "Obrigado mensagem", "wait": "Mensagem de espera" }, + "messages": "Mensagens", "name": "Comércio", "no-price": "Gratuito", "not-found": "Nenhum dado encontrado.", diff --git a/src/assets/i18n/russian.json b/src/assets/i18n/russian.json index 017df7f7..a0ddfb7f 100644 --- a/src/assets/i18n/russian.json +++ b/src/assets/i18n/russian.json @@ -438,12 +438,23 @@ "rate": "Превышен лимит запросов. Пожалуйста, попробуйте позже.\nЕсли это продолжает происходить, попробуйте уменьшить количество предметов в поисковой выдаче." }, "fetching": "Найдено {{total}}. Извлечение {{count}} записей ...", + "filter": "Фильтр", + "filters": { + "incoming": "вступающий", + "incomingoutgoing": "Входящие Исходящие" + }, + "layout": "раскладка", + "layouts": { + "bottomtotop": "Снизу вверх", + "toptobottom": "Сверху вниз" + }, "message": { "item-gone": "Сообщение пропало", "still-interested": "Еще интересное сообщение", "thanks": "Спасибо сообщение", "wait": "Ждать сообщения" }, + "messages": "Сообщения", "name": "Сделка", "no-price": "Нет цены", "not-found": "Данные не найдены.", diff --git a/src/assets/i18n/simplified-chinese.json b/src/assets/i18n/simplified-chinese.json index 4c7cddd2..d949dcfd 100644 --- a/src/assets/i18n/simplified-chinese.json +++ b/src/assets/i18n/simplified-chinese.json @@ -438,12 +438,23 @@ "rate": "已达到限制。请稍后再试。\n如果这种情况持续发生,请尝试减少获取的物品数。" }, "fetching": "找到 {{total}}。正在获取 {{count}} 个条目...", + "filter": "过滤", + "filters": { + "incoming": "来", + "incomingoutgoing": "进出" + }, + "layout": "布局", + "layouts": { + "bottomtotop": "从下到上", + "toptobottom": "从上到下" + }, "message": { "item-gone": "物品消失的消息", "still-interested": "仍然感兴趣的消息", "thanks": "谢谢留言", "wait": "等待讯息" }, + "messages": "消息", "name": "贸易", "no-price": "没有价格", "not-found": "没有找到数据。", diff --git a/src/assets/i18n/spanish.json b/src/assets/i18n/spanish.json index ce9154fb..98dc9ad9 100644 --- a/src/assets/i18n/spanish.json +++ b/src/assets/i18n/spanish.json @@ -438,12 +438,23 @@ "rate": "Límite alcanzado. Por favor, inténtelo de nuevo más tarde.\nSi esto sigue sucediendo, intente reducir el recuento de elementos recuperados." }, "fetching": "Encontrado {{total}}. Obteniendo {{count}} entradas ...", + "filter": "Filtrar", + "filters": { + "incoming": "Entrante", + "incomingoutgoing": "Entrante saliente" + }, + "layout": "diseño", + "layouts": { + "bottomtotop": "Abajo hacia arriba", + "toptobottom": "De arriba hacia abajo" + }, "message": { "item-gone": "Mensaje de artículo desaparecido", "still-interested": "Mensaje aún interesado", "thanks": "Mensaje de agradecimiento", "wait": "Mensaje de espera" }, + "messages": "Mensajes", "name": "Comercio", "no-price": "Sin precio", "not-found": "Datos no encontrados.", diff --git a/src/assets/i18n/thai.json b/src/assets/i18n/thai.json index 87190868..0192e527 100644 --- a/src/assets/i18n/thai.json +++ b/src/assets/i18n/thai.json @@ -438,12 +438,23 @@ "rate": "ถึงขีด จำกัด. โปรดลองอีกครั้งในภายหลัง.\nหากสิ่งนี้ยังคงเกิดขึ้นโปรดลองลดจำนวนรายการที่ดึงมา" }, "fetching": "พบ {{total}}กำลังดึงรายการ {{count}} ...", + "filter": "กรอง", + "filters": { + "incoming": "ขาเข้า", + "incomingoutgoing": "ขาเข้าและขาออก" + }, + "layout": "แบบ", + "layouts": { + "bottomtotop": "จากล่างขึ้นบน", + "toptobottom": "บนลงล่าง" + }, "message": { "item-gone": "รายการข้อความหายไป", "still-interested": "ข้อความที่สนใจยังคง", "thanks": "ข้อความขอบคุณ", "wait": "รอข้อความ" }, + "messages": "ข้อความ", "name": "ค่า", "no-price": "ไม่มีราคา", "not-found": "ไม่พบข้อมูล.", diff --git a/src/assets/i18n/traditional-chinese.json b/src/assets/i18n/traditional-chinese.json index f587c8d2..cb5f5eca 100644 --- a/src/assets/i18n/traditional-chinese.json +++ b/src/assets/i18n/traditional-chinese.json @@ -438,12 +438,23 @@ "rate": "已達到限制。請稍後再試。\n如果這種情況持續發生,請嘗試減少獲取的物品數。" }, "fetching": "已找到 {{total}}。正在獲取 {{count}} 個條目...", + "filter": "過濾", + "filters": { + "incoming": "來", + "incomingoutgoing": "進出" + }, + "layout": "佈局", + "layouts": { + "bottomtotop": "從下到上", + "toptobottom": "從上到下" + }, "message": { "item-gone": "物品消失的消息", "still-interested": "仍然感興趣的消息", "thanks": "謝謝留言", "wait": "等待訊息" }, + "messages": "消息", "name": "貿易", "no-price": "沒有價格", "not-found": "沒有找到數據。", From 9eb002185b43e2377ce5791b3ef5f446b5c7d5ab Mon Sep 17 00:00:00 2001 From: Nicklas Ronge Date: Mon, 22 Jun 2020 15:48:31 +0200 Subject: [PATCH 06/22] - fixed a sorting issue at the market result list --- CHANGELOG.md | 3 +- overlay.babel | 113 +++++++++++++++++- src/app/core/annotation/annotation.service.ts | 3 +- .../annotation-window.component.html | 2 +- .../settings-window.component.html | 2 +- .../evaluate-window.component.html | 2 +- .../inspect-window.component.html | 2 +- .../trade-settings.component.ts | 8 +- .../trade-window/trade-window.component.html | 5 +- .../component/header/header.component.html | 6 +- .../component/header/header.component.scss | 38 +++--- .../odk/component/header/header.component.ts | 3 + .../poe/trade/fetch/trade-fetch.service.ts | 4 +- src/assets/i18n/english.json | 4 + src/assets/i18n/french.json | 4 +- src/assets/i18n/german.json | 4 +- src/assets/i18n/korean.json | 4 +- src/assets/i18n/polish.json | 4 +- src/assets/i18n/portuguese.json | 4 +- src/assets/i18n/russian.json | 4 +- src/assets/i18n/simplified-chinese.json | 4 +- src/assets/i18n/spanish.json | 4 +- src/assets/i18n/thai.json | 4 +- src/assets/i18n/traditional-chinese.json | 4 +- 24 files changed, 184 insertions(+), 51 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db16d583..02908d9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,9 @@ - added trade filter setting (Incoming & Outgoing, Incoming) - added trade layout setting (Top To Bottom, Bottom To Top) - added trade window to be transparent if no active trades and the window is pinned -- update trade action finished to be always shown even if no trade has been initalized +- update trade action finished to be always shown even if no trade have been initalized - fixed a focus issue occuring when using the trade whisper button +- fixed a sorting issue at the market result list ## 1.0.4 (2020-06-19) diff --git a/overlay.babel b/overlay.babel index 6f350cb4..c185599c 100644 --- a/overlay.babel +++ b/overlay.babel @@ -129,6 +129,117 @@ + + changelog-1-0-5 + + + message + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + title + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + commands @@ -16027,7 +16138,7 @@ - true + false {{'%1' | translate}} [label]="'%1' | translate" diff --git a/src/app/core/annotation/annotation.service.ts b/src/app/core/annotation/annotation.service.ts index 1a2801f9..b1e10594 100644 --- a/src/app/core/annotation/annotation.service.ts +++ b/src/app/core/annotation/annotation.service.ts @@ -94,7 +94,8 @@ const ANNOTATIONS: Annotation[] = [ id: 'support', hotkey: Hotkey.SettingsToggle }, - { id: 'thanks' } + { id: 'thanks' }, + { id: 'changelog-1-0-5' }, ]; @Injectable({ diff --git a/src/app/layout/window/annotation-window/annotation-window.component.html b/src/app/layout/window/annotation-window/annotation-window.component.html index 95a1d98f..4ebca161 100644 --- a/src/app/layout/window/annotation-window/annotation-window.component.html +++ b/src/app/layout/window/annotation-window/annotation-window.component.html @@ -1,5 +1,5 @@
- +
diff --git a/src/app/layout/window/settings-window/settings-window.component.html b/src/app/layout/window/settings-window/settings-window.component.html index 1d9b070e..dd695add 100644 --- a/src/app/layout/window/settings-window/settings-window.component.html +++ b/src/app/layout/window/settings-window/settings-window.component.html @@ -1,5 +1,5 @@ - + diff --git a/src/app/modules/evaluate/window/evaluate-window/evaluate-window.component.html b/src/app/modules/evaluate/window/evaluate-window/evaluate-window.component.html index 2ee0940e..d896e84c 100644 --- a/src/app/modules/evaluate/window/evaluate-window/evaluate-window.component.html +++ b/src/app/modules/evaluate/window/evaluate-window/evaluate-window.component.html @@ -1,5 +1,5 @@
- + diff --git a/src/app/modules/inspect/window/inspect-window/inspect-window.component.html b/src/app/modules/inspect/window/inspect-window/inspect-window.component.html index fc0a33a9..78960405 100644 --- a/src/app/modules/inspect/window/inspect-window/inspect-window.component.html +++ b/src/app/modules/inspect/window/inspect-window/inspect-window.component.html @@ -1,5 +1,5 @@
- + diff --git a/src/app/modules/trade/component/trade-settings/trade-settings.component.ts b/src/app/modules/trade/component/trade-settings/trade-settings.component.ts index 0200884a..5b7172e7 100644 --- a/src/app/modules/trade/component/trade-settings/trade-settings.component.ts +++ b/src/app/modules/trade/component/trade-settings/trade-settings.component.ts @@ -11,15 +11,15 @@ import { TradeFeatureSettings, TradeFilter, TradeLayout } from '@modules/trade/t changeDetection: ChangeDetectionStrategy.OnPush }) export class TradeSettingsComponent extends FeatureSettingsComponent { - public displayWithVolume = (volume: number) => `${volume}%`; - - public layouts = new EnumValues(TradeLayout); - public filters = new EnumValues(TradeFilter); constructor(private readonly audio: AudioService) { super(); } + public layouts = new EnumValues(TradeLayout); + public filters = new EnumValues(TradeFilter); + public displayWithVolume = (volume: number) => `${volume}%`; + public load(): void { } public onChange(): void { diff --git a/src/app/modules/trade/window/trade-window/trade-window.component.html b/src/app/modules/trade/window/trade-window/trade-window.component.html index 0186cf46..bc426653 100644 --- a/src/app/modules/trade/window/trade-window/trade-window.component.html +++ b/src/app/modules/trade/window/trade-window/trade-window.component.html @@ -2,8 +2,9 @@
+ [fixed]="true" [frame]="false" [pinned]="data.settings.tradeWindowPinned" + [reverse]="data.settings.tradeLayout === 1" (pinnedChange)="onPinnedChange($event)" + (settingsToggle)="onSettingsToggle()"> keyboard_arrow_down diff --git a/src/app/shared/module/odk/component/header/header.component.html b/src/app/shared/module/odk/component/header/header.component.html index 78c6c471..3e2e1c27 100644 --- a/src/app/shared/module/odk/component/header/header.component.html +++ b/src/app/shared/module/odk/component/header/header.component.html @@ -1,4 +1,5 @@ -
+
@@ -16,6 +17,7 @@
-
+
\ No newline at end of file diff --git a/src/app/shared/module/odk/component/header/header.component.scss b/src/app/shared/module/odk/component/header/header.component.scss index 859e43b8..d7bca9dd 100644 --- a/src/app/shared/module/odk/component/header/header.component.scss +++ b/src/app/shared/module/odk/component/header/header.component.scss @@ -24,10 +24,7 @@ $border-color: #1a1a1a; } .header { - position: fixed; - z-index: 1000; - left: 0; - right: 0; + position: relative; height: $header-size; line-height: $header-size + 2px; background: $header-background; @@ -39,12 +36,19 @@ $border-color: #1a1a1a; text-align: center; } - &:not(.reverse) { - top: 0; - } + &.fixed { + position: fixed; + z-index: 1000; + left: 0; + right: 0; + + &:not(.reverse) { + top: 0; + } - &.reverse { - bottom: 0; + &.reverse { + bottom: 0; + } } } @@ -84,18 +88,22 @@ $border-color: #1a1a1a; } .content { + width: 100%; + &:not(.inline) { height: calc(100% - 30px); } - width: 100%; - padding: 30px 0 0 0; + + &.fixed { + padding: 30px 0 0 0; + + &.reverse { + padding: 0 0 30px 0; + } + } &.frame { border: 1px solid $border-color; border-top: none; } - - &.reverse { - padding: 0 0 30px 0; - } } diff --git a/src/app/shared/module/odk/component/header/header.component.ts b/src/app/shared/module/odk/component/header/header.component.ts index ca03c1c7..f66b3cee 100644 --- a/src/app/shared/module/odk/component/header/header.component.ts +++ b/src/app/shared/module/odk/component/header/header.component.ts @@ -40,6 +40,9 @@ export class HeaderComponent implements OnInit { @Input() public reverse = false; + @Input() + public fixed = false; + @Input() public frame = true; diff --git a/src/app/shared/module/poe/trade/fetch/trade-fetch.service.ts b/src/app/shared/module/poe/trade/fetch/trade-fetch.service.ts index a47052b5..156dc7e6 100644 --- a/src/app/shared/module/poe/trade/fetch/trade-fetch.service.ts +++ b/src/app/shared/module/poe/trade/fetch/trade-fetch.service.ts @@ -57,7 +57,9 @@ export class TradeFetchService { map(responses => responses .filter(x => x.result?.length) .reduce((a, b) => a.concat(b.result), cached) - .filter(x => x?.id?.length)), + .filter(x => x?.id?.length) + .sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id)) + ), map(results => results.map(result => { const key = `${CACHE_PREFIX}_${exchange}_${result.id}`; return this.cache.store(key, result, CACHE_EXPIRY); diff --git a/src/assets/i18n/english.json b/src/assets/i18n/english.json index 4ac3be70..b631b889 100644 --- a/src/assets/i18n/english.json +++ b/src/assets/i18n/english.json @@ -4,6 +4,10 @@ "message": "Opens a webpage on hotkey press in the in-game browser.\n\nTry the hotkey below to open poe.ninja.", "title": "Bookmarks" }, + "changelog-1-0-5": { + "message": "- added support page with discord and github issues\n- added trade filter setting (Incoming & Outgoing, Incoming)\n- added trade layout setting (Top To Bottom, Bottom To Top)\n- added trade window to be transparent if no active trades and the window is pinned\n- update trade action finished to be always shown even if no trade have been initalized\n- fixed a focus issue occuring when using the trade whisper button\n- fixed a sorting issue at the market result list", + "title": "What's new in 1.0.5?" + }, "commands": { "message": "All game commands can be bound to hotkeys.\n\nThere are also placeholders like @char available which will be replaced before executing the command.\n\nTry the hotkey below to teleport into your hideout.", "title": "Commands" diff --git a/src/assets/i18n/french.json b/src/assets/i18n/french.json index be2e30cc..777a81ce 100644 --- a/src/assets/i18n/french.json +++ b/src/assets/i18n/french.json @@ -68,7 +68,7 @@ }, "filter": { "message": "Cliquez sur l'icône en surbrillance pour ouvrir le filtre. Ajustez les valeurs à votre guise.", - "title": "" + "title": "Filtre" }, "message": "Le marché vous permet de parcourir les articles listés et d'échanger des devises dans le jeu.\n\nPeut être basculé en appuyant sur la touche de raccourci ci-dessous:", "reset": { @@ -107,7 +107,7 @@ }, "thanks": { "message": "C'est tout pour le moment. J'espère que vous apprécierez mon application.\n\n- Cordialement, Kyusung4698", - "title": "" + "title": "Je vous remercie!" }, "trade": { "highlight": { diff --git a/src/assets/i18n/german.json b/src/assets/i18n/german.json index 33095215..04b5e1cd 100644 --- a/src/assets/i18n/german.json +++ b/src/assets/i18n/german.json @@ -68,7 +68,7 @@ }, "filter": { "message": "Klicken Sie auf das hervorgehobene Symbol, um den Filter zu öffnen. Passen Sie die Werte an Ihre Bedürfnisse an.", - "title": "" + "title": "Filter" }, "message": "Auf dem Markt können Sie aufgelistete Gegenstände durchsuchen und Währungen im Spiel austauschen.\n\nKann durch Drücken des folgenden Hotkeys umgeschaltet werden:", "reset": { @@ -107,7 +107,7 @@ }, "thanks": { "message": "Das war es fürs Erste. Hoffe dir gefällt meine App.\n\n- Mit freundlichen Grüßen, Kyusung4698", - "title": "" + "title": "Vielen Dank!" }, "trade": { "highlight": { diff --git a/src/assets/i18n/korean.json b/src/assets/i18n/korean.json index 4a689ec2..48577f7a 100644 --- a/src/assets/i18n/korean.json +++ b/src/assets/i18n/korean.json @@ -68,7 +68,7 @@ }, "filter": { "message": "강조 표시된 아이콘을 클릭하여 필터를 엽니 다. 원하는대로 값을 조정하십시오.", - "title": "" + "title": "필터" }, "message": "시장에서는 게임 내에서 나열된 항목을 찾아보고 통화를 교환 할 수 있습니다.\n\n아래 핫키를 눌러 전환 할 수 있습니다.", "reset": { @@ -107,7 +107,7 @@ }, "thanks": { "message": "그게 다야. 내 앱을 즐기시기 바랍니다.\n\n-Kyusung4698 감사합니다", - "title": "" + "title": "고맙습니다!" }, "trade": { "highlight": { diff --git a/src/assets/i18n/polish.json b/src/assets/i18n/polish.json index f4924a14..cc93d422 100644 --- a/src/assets/i18n/polish.json +++ b/src/assets/i18n/polish.json @@ -68,7 +68,7 @@ }, "filter": { "message": "Kliknij podświetloną ikonę, aby otworzyć filtr. Dostosuj wartości do swoich potrzeb.", - "title": "" + "title": "filtr" }, "message": "Rynek pozwala przeglądać wymienione przedmioty i wymieniać waluty w grze.\n\nMożna go przełączać, naciskając poniższy skrót:", "reset": { @@ -107,7 +107,7 @@ }, "thanks": { "message": "Na razie tyle. Mam nadzieję, że podoba Ci się moja aplikacja.\n\n- Z pozdrowieniami, Kyusung4698", - "title": "" + "title": "Dziękuję Ci!" }, "trade": { "highlight": { diff --git a/src/assets/i18n/portuguese.json b/src/assets/i18n/portuguese.json index abd7bdec..2cddd11f 100644 --- a/src/assets/i18n/portuguese.json +++ b/src/assets/i18n/portuguese.json @@ -68,7 +68,7 @@ }, "filter": { "message": "Clique no ícone destacado para abrir o filtro. Ajuste os valores ao seu gosto.", - "title": "" + "title": "Filtro" }, "message": "O mercado permite que você navegue pelos itens listados e troque moedas dentro do jogo.\n\nPode ser alternado pressionando a tecla de atalho abaixo:", "reset": { @@ -107,7 +107,7 @@ }, "thanks": { "message": "Por enquanto é isso. Espero que você goste do meu aplicativo.\n\n- Atenciosamente, Kyusung4698", - "title": "" + "title": "Obrigado!" }, "trade": { "highlight": { diff --git a/src/assets/i18n/russian.json b/src/assets/i18n/russian.json index a0ddfb7f..7608031f 100644 --- a/src/assets/i18n/russian.json +++ b/src/assets/i18n/russian.json @@ -68,7 +68,7 @@ }, "filter": { "message": "Нажмите на выделенный значок, чтобы открыть фильтр. Отрегулируйте значения по своему вкусу.", - "title": "" + "title": "Фильтр" }, "message": "Рынок позволяет просматривать перечисленные предметы и обменивать валюты внутри игры.\n\nМожет быть переключено нажатием горячей клавиши ниже:", "reset": { @@ -107,7 +107,7 @@ }, "thanks": { "message": "Это пока что. Надеюсь, вам понравится мое приложение.\n\n- С наилучшими пожеланиями, Kyusung4698", - "title": "" + "title": "Спасибо!" }, "trade": { "highlight": { diff --git a/src/assets/i18n/simplified-chinese.json b/src/assets/i18n/simplified-chinese.json index d949dcfd..2f0e2677 100644 --- a/src/assets/i18n/simplified-chinese.json +++ b/src/assets/i18n/simplified-chinese.json @@ -68,7 +68,7 @@ }, "filter": { "message": "单击突出显示的图标以打开过滤器。将值调整为您喜欢的值。", - "title": "" + "title": "过滤" }, "message": "市场允许您浏览列出的项目并在游戏中交换货币。\n\n可以通过按以下热键进行切换:", "reset": { @@ -107,7 +107,7 @@ }, "thanks": { "message": "现在就这样。希望您喜欢我的应用。\n\n-敬礼,Kyusung4698", - "title": "" + "title": "谢谢!" }, "trade": { "highlight": { diff --git a/src/assets/i18n/spanish.json b/src/assets/i18n/spanish.json index 98dc9ad9..acf6388d 100644 --- a/src/assets/i18n/spanish.json +++ b/src/assets/i18n/spanish.json @@ -68,7 +68,7 @@ }, "filter": { "message": "Haga clic en el icono resaltado para abrir el filtro. Ajusta los valores a tu gusto.", - "title": "" + "title": "Filtrar" }, "message": "El mercado te permite navegar por los artículos listados e intercambiar monedas dentro del juego.\n\nSe puede activar presionando la tecla de acceso rápido a continuación:", "reset": { @@ -107,7 +107,7 @@ }, "thanks": { "message": "Eso es todo por ahora. Espero que disfrutes mi aplicación.\n\n- Saludos cordiales, Kyusung4698", - "title": "" + "title": "¡Gracias!" }, "trade": { "highlight": { diff --git a/src/assets/i18n/thai.json b/src/assets/i18n/thai.json index 0192e527..eec83ef4 100644 --- a/src/assets/i18n/thai.json +++ b/src/assets/i18n/thai.json @@ -68,7 +68,7 @@ }, "filter": { "message": "คลิกไอคอนที่ไฮไลต์เพื่อเปิดตัวกรอง ปรับค่าตามที่คุณต้องการ", - "title": "" + "title": "กรอง" }, "message": "ตลาดช่วยให้คุณสามารถเรียกดูรายการที่ระบุไว้และแลกเปลี่ยนสกุลเงินภายในเกม\n\nสามารถสลับได้โดยกดปุ่มลัดด้านล่าง:", "reset": { @@ -107,7 +107,7 @@ }, "thanks": { "message": "แค่นี้แหละ หวังว่าคุณจะสนุกกับแอพของฉัน\n\n- ขอแสดงความนับถือ Kyusung4698", - "title": "" + "title": "ขอขอบคุณ!" }, "trade": { "highlight": { diff --git a/src/assets/i18n/traditional-chinese.json b/src/assets/i18n/traditional-chinese.json index cb5f5eca..efa2340d 100644 --- a/src/assets/i18n/traditional-chinese.json +++ b/src/assets/i18n/traditional-chinese.json @@ -68,7 +68,7 @@ }, "filter": { "message": "單擊突出顯示的圖標以打開過濾器。將值調整為您喜歡的值。", - "title": "" + "title": "過濾" }, "message": "市場允許您瀏覽列出的項目並在遊戲中交換貨幣。\n\n可以通過按以下熱鍵進行切換:", "reset": { @@ -107,7 +107,7 @@ }, "thanks": { "message": "現在就這樣。希望您喜歡我的應用。\n\n-敬禮,Kyusung4698", - "title": "" + "title": "謝謝!" }, "trade": { "highlight": { From fb4254907312c2c5bee49e8106de6cef396a1f86 Mon Sep 17 00:00:00 2001 From: Nicklas Ronge Date: Mon, 22 Jun 2020 17:35:51 +0200 Subject: [PATCH 07/22] - added support page with discord and GitHub issues --- CHANGELOG.md | 10 +- manifest.json | 2 +- overlay.babel | 111 ++++++++++++++++++ package.json | 2 +- .../inspect-item/inspect-item.component.ts | 7 +- .../item-frame-stats.component.scss | 36 ++++++ .../item-frame-stats.component.ts | 11 +- src/assets/i18n/english.json | 6 +- src/assets/i18n/french.json | 4 + src/assets/i18n/german.json | 4 + src/assets/i18n/korean.json | 4 + src/assets/i18n/polish.json | 4 + src/assets/i18n/portuguese.json | 4 + src/assets/i18n/russian.json | 4 + src/assets/i18n/simplified-chinese.json | 4 + src/assets/i18n/spanish.json | 4 + src/assets/i18n/thai.json | 4 + src/assets/i18n/traditional-chinese.json | 4 + src/styles/_variables.scss | 4 +- 19 files changed, 217 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 02908d9a..0aae91fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,13 +2,15 @@ ## 1.0.5 (2020-06-22) -- added support page with discord and github issues +- added support page with discord and GitHub issues +- added colors for life, mana and energy shield pseudo stats - added trade filter setting (Incoming & Outgoing, Incoming) - added trade layout setting (Top To Bottom, Bottom To Top) - added trade window to be transparent if no active trades and the window is pinned -- update trade action finished to be always shown even if no trade have been initalized -- fixed a focus issue occuring when using the trade whisper button -- fixed a sorting issue at the market result list +- update trade action finished to be always shown even if no trade have been initialized +- fixed an focus issue occurring when using the trade whisper button +- fixed an sorting issue at the market result list +- fixed an issue at the inspect frame not showing dps ## 1.0.4 (2020-06-19) diff --git a/manifest.json b/manifest.json index d68640ed..15139b61 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "meta": { "name": "PoE Overlay", "author": "Kyusung4698", - "version": "1.0.4", + "version": "1.0.5", "minimum-overwolf-version": "0.147.0", "description": "Search the market and send trade offers. Get current market values for your item. View insights for maps and items.", "dock_button_title": "PoE Overlay", diff --git a/overlay.babel b/overlay.babel index c185599c..1d725aca 100644 --- a/overlay.babel +++ b/overlay.babel @@ -3068,6 +3068,117 @@ + + support + + + message + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + title + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + thanks diff --git a/package.json b/package.json index 9dff9a94..91183f17 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "poe-overlay-overwolf", - "version": "1.0.4", + "version": "1.0.5", "scripts": { "watch": "ng build --watch", "watch:prod": "ng build --watch --prod", diff --git a/src/app/modules/inspect/component/inspect-item/inspect-item.component.ts b/src/app/modules/inspect/component/inspect-item/inspect-item.component.ts index ebe42861..1d04be25 100644 --- a/src/app/modules/inspect/component/inspect-item/inspect-item.component.ts +++ b/src/app/modules/inspect/component/inspect-item/inspect-item.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; +import { InspectFeatureSettings } from '@modules/inspect/inspect-feature-settings'; import { Item } from '@shared/module/poe/item'; import { WikiMapService } from '@shared/module/poe/wiki'; -import { InspectFeatureSettings } from '@modules/inspect/inspect-feature-settings'; @Component({ selector: 'app-inspect-item', @@ -10,7 +10,10 @@ import { InspectFeatureSettings } from '@modules/inspect/inspect-feature-setting changeDetection: ChangeDetectionStrategy.OnPush }) export class InspectItemComponent implements OnInit { - public properties = []; + public properties = [ + 'weaponCriticalStrikeChance', + 'weaponAttacksPerSecond' + ]; public maps: string[]; @Input() diff --git a/src/app/shared/module/poe/item/frame/item-frame-stats/item-frame-stats.component.scss b/src/app/shared/module/poe/item/frame/item-frame-stats/item-frame-stats.component.scss index 888a3f6d..f6adc62c 100644 --- a/src/app/shared/module/poe/item/frame/item-frame-stats/item-frame-stats.component.scss +++ b/src/app/shared/module/poe/item/frame/item-frame-stats/item-frame-stats.component.scss @@ -57,5 +57,41 @@ } } } + + .life { + .text, + .value, + .value.changed { + color: $red; + + .text { + color: $red !important; + } + } + } + + .mana { + .text, + .value, + .value.changed { + color: $river; + + .text { + color: $river !important; + } + } + } + + .es { + .text, + .value, + .value.changed { + color: $emerald; + + .text { + color: $emerald !important; + } + } + } } } diff --git a/src/app/shared/module/poe/item/frame/item-frame-stats/item-frame-stats.component.ts b/src/app/shared/module/poe/item/frame/item-frame-stats/item-frame-stats.component.ts index 493648b6..84482a7f 100644 --- a/src/app/shared/module/poe/item/frame/item-frame-stats/item-frame-stats.component.ts +++ b/src/app/shared/module/poe/item/frame/item-frame-stats/item-frame-stats.component.ts @@ -28,7 +28,15 @@ export class ItemFrameStatsComponent { if (!id || id.length === 0) { return ''; } - + switch (id) { + case 'pseudo_total_life': + return 'life'; + case 'pseudo_total_mana': + return 'mana'; + case 'pseudo_total_energy_shield': + case 'pseudo_increased_energy_shield': + return 'es'; + } if (id.includes('fire_')) { return 'fire'; } @@ -41,7 +49,6 @@ export class ItemFrameStatsComponent { if (id.includes('chaos_')) { return 'chaos'; } - return ''; } } diff --git a/src/assets/i18n/english.json b/src/assets/i18n/english.json index b631b889..82253eec 100644 --- a/src/assets/i18n/english.json +++ b/src/assets/i18n/english.json @@ -5,7 +5,7 @@ "title": "Bookmarks" }, "changelog-1-0-5": { - "message": "- added support page with discord and github issues\n- added trade filter setting (Incoming & Outgoing, Incoming)\n- added trade layout setting (Top To Bottom, Bottom To Top)\n- added trade window to be transparent if no active trades and the window is pinned\n- update trade action finished to be always shown even if no trade have been initalized\n- fixed a focus issue occuring when using the trade whisper button\n- fixed a sorting issue at the market result list", + "message": "- added support page with discord and GitHub issues\n- added colors for life, mana and energy shield pseudo stats\n- added trade filter setting (Incoming & Outgoing, Incoming)\n- added trade layout setting (Top To Bottom, Bottom To Top)\n- added trade window to be transparent if no active trades and the window is pinned\n- update trade action finished to be always shown even if no trade have been initialized\n- fixed an focus issue occurring when using the trade whisper button\n- fixed an sorting issue at the market result list\n- fixed an issue at the inspect frame not showing dps", "title": "What's new in 1.0.5?" }, "commands": { @@ -109,6 +109,10 @@ "message": "Open the settings window by pressing following hotkey:", "title": "Settings" }, + "support": { + "message": "Do you have a question? Or do you want to request a new feature?\n\nCheck the support tab at the settings menu for further information.\n\nAlso if you love the app, consider supporting me by subscribing.", + "title": "Support" + }, "thanks": { "message": "That's it for now. Hope you enjoy my app. \n\n- Best regards, Kyusung4698", "title": "Thank you!" diff --git a/src/assets/i18n/french.json b/src/assets/i18n/french.json index 777a81ce..6287c4fa 100644 --- a/src/assets/i18n/french.json +++ b/src/assets/i18n/french.json @@ -105,6 +105,10 @@ "message": "Ouvrez la fenêtre des paramètres en appuyant sur la touche de raccourci suivante:", "title": "Réglages" }, + "support": { + "message": "As-tu une question? Ou souhaitez-vous demander une nouvelle fonctionnalité?\n\nVérifiez l'onglet d'assistance dans le menu des paramètres pour plus d'informations.\n\nAussi, si vous aimez l'application, pensez à me soutenir en vous abonnant.", + "title": "Soutien" + }, "thanks": { "message": "C'est tout pour le moment. J'espère que vous apprécierez mon application.\n\n- Cordialement, Kyusung4698", "title": "Je vous remercie!" diff --git a/src/assets/i18n/german.json b/src/assets/i18n/german.json index 04b5e1cd..de065558 100644 --- a/src/assets/i18n/german.json +++ b/src/assets/i18n/german.json @@ -105,6 +105,10 @@ "message": "Öffnen Sie das Einstellungsfenster, indem Sie den folgenden Hotkey drücken:", "title": "Einstellungen" }, + "support": { + "message": "Hast du eine Frage? Oder möchten Sie eine neue Funktion anfordern?\n\nWeitere Informationen finden Sie auf der Registerkarte Support im Einstellungsmenü.\n\nWenn Sie die App lieben, können Sie mich durch ein Abonnement unterstützen.", + "title": "Unterstützung" + }, "thanks": { "message": "Das war es fürs Erste. Hoffe dir gefällt meine App.\n\n- Mit freundlichen Grüßen, Kyusung4698", "title": "Vielen Dank!" diff --git a/src/assets/i18n/korean.json b/src/assets/i18n/korean.json index 48577f7a..4cbc787e 100644 --- a/src/assets/i18n/korean.json +++ b/src/assets/i18n/korean.json @@ -105,6 +105,10 @@ "message": "다음 핫키를 눌러 설정 창을 엽니 다.", "title": "설정" }, + "support": { + "message": "질문 있습니까? 아니면 새로운 기능을 요청 하시겠습니까?\n\n자세한 내용은 설정 메뉴에서 지원 탭을 확인하십시오.\n\n또한 당신이 응용 프로그램을 사랑한다면, 가입하여 나를 지원하는 것을 고려하십시오.", + "title": "지원하다" + }, "thanks": { "message": "그게 다야. 내 앱을 즐기시기 바랍니다.\n\n-Kyusung4698 감사합니다", "title": "고맙습니다!" diff --git a/src/assets/i18n/polish.json b/src/assets/i18n/polish.json index cc93d422..af6612a2 100644 --- a/src/assets/i18n/polish.json +++ b/src/assets/i18n/polish.json @@ -105,6 +105,10 @@ "message": "Otwórz okno ustawień, naciskając następujący skrót:", "title": "Ustawienia" }, + "support": { + "message": "Masz pytanie? A może chcesz poprosić o nową funkcję?\n\nSprawdź kartę pomocy w menu ustawień, aby uzyskać dodatkowe informacje.\n\nRównież jeśli podoba Ci się aplikacja, rozważ wsparcie, subskrybując ją.", + "title": "Wsparcie" + }, "thanks": { "message": "Na razie tyle. Mam nadzieję, że podoba Ci się moja aplikacja.\n\n- Z pozdrowieniami, Kyusung4698", "title": "Dziękuję Ci!" diff --git a/src/assets/i18n/portuguese.json b/src/assets/i18n/portuguese.json index 2cddd11f..d35fb0f2 100644 --- a/src/assets/i18n/portuguese.json +++ b/src/assets/i18n/portuguese.json @@ -105,6 +105,10 @@ "message": "Abra a janela de configurações pressionando a seguinte tecla de atalho:", "title": "Definições" }, + "support": { + "message": "Você tem uma pergunta? Ou você deseja solicitar um novo recurso?\n\nVerifique a guia de suporte no menu de configurações para obter mais informações.\n\nAlém disso, se você ama o aplicativo, considere apoiar-me assinando.", + "title": "Apoio, suporte" + }, "thanks": { "message": "Por enquanto é isso. Espero que você goste do meu aplicativo.\n\n- Atenciosamente, Kyusung4698", "title": "Obrigado!" diff --git a/src/assets/i18n/russian.json b/src/assets/i18n/russian.json index 7608031f..82e46071 100644 --- a/src/assets/i18n/russian.json +++ b/src/assets/i18n/russian.json @@ -105,6 +105,10 @@ "message": "Откройте окно настроек, нажав следующую горячую клавишу:", "title": "настройки" }, + "support": { + "message": "У вас есть вопрос? Или вы хотите запросить новую функцию?\n\nПроверьте вкладку поддержки в меню настроек для получения дополнительной информации.\n\nТакже, если вы любите приложение, рассмотрите поддержку меня, подписавшись.", + "title": "служба поддержки" + }, "thanks": { "message": "Это пока что. Надеюсь, вам понравится мое приложение.\n\n- С наилучшими пожеланиями, Kyusung4698", "title": "Спасибо!" diff --git a/src/assets/i18n/simplified-chinese.json b/src/assets/i18n/simplified-chinese.json index 2f0e2677..6d6a203e 100644 --- a/src/assets/i18n/simplified-chinese.json +++ b/src/assets/i18n/simplified-chinese.json @@ -105,6 +105,10 @@ "message": "通过按以下热键打开设置窗口:", "title": "设置" }, + "support": { + "message": "你有问题吗?还是要请求一项新功能?\n\n查看设置菜单上的支持标签以获取更多信息。\n\n另外,如果您喜欢该应用程序,请考虑通过订阅支持我。", + "title": "支持" + }, "thanks": { "message": "现在就这样。希望您喜欢我的应用。\n\n-敬礼,Kyusung4698", "title": "谢谢!" diff --git a/src/assets/i18n/spanish.json b/src/assets/i18n/spanish.json index acf6388d..8c137a5e 100644 --- a/src/assets/i18n/spanish.json +++ b/src/assets/i18n/spanish.json @@ -105,6 +105,10 @@ "message": "Abra la ventana de configuración presionando la siguiente tecla de acceso rápido:", "title": "Ajustes" }, + "support": { + "message": "¿Tienes una pregunta? ¿O quieres solicitar una nueva función?\n\nConsulte la pestaña de soporte en el menú de configuración para obtener más información.\n\nAdemás, si te encanta la aplicación, considera apoyarme suscribiéndote.", + "title": "Apoyo" + }, "thanks": { "message": "Eso es todo por ahora. Espero que disfrutes mi aplicación.\n\n- Saludos cordiales, Kyusung4698", "title": "¡Gracias!" diff --git a/src/assets/i18n/thai.json b/src/assets/i18n/thai.json index eec83ef4..efddbec7 100644 --- a/src/assets/i18n/thai.json +++ b/src/assets/i18n/thai.json @@ -105,6 +105,10 @@ "message": "เปิดหน้าต่างการตั้งค่าโดยกดปุ่มลัดต่อไปนี้:", "title": "การตั้งค่า" }, + "support": { + "message": "คุณมีคำถาม? หรือคุณต้องการที่จะขอคุณสมบัติใหม่?\n\nตรวจสอบแท็บการสนับสนุนที่เมนูการตั้งค่าสำหรับข้อมูลเพิ่มเติม\n\nนอกจากนี้ถ้าคุณรักแอปให้พิจารณาสนับสนุนฉันด้วยการสมัครรับข้อมูล", + "title": "สนับสนุน" + }, "thanks": { "message": "แค่นี้แหละ หวังว่าคุณจะสนุกกับแอพของฉัน\n\n- ขอแสดงความนับถือ Kyusung4698", "title": "ขอขอบคุณ!" diff --git a/src/assets/i18n/traditional-chinese.json b/src/assets/i18n/traditional-chinese.json index efa2340d..c36b65a2 100644 --- a/src/assets/i18n/traditional-chinese.json +++ b/src/assets/i18n/traditional-chinese.json @@ -105,6 +105,10 @@ "message": "通過按以下熱鍵打開設置窗口:", "title": "設置" }, + "support": { + "message": "你有問題嗎?還是要請求一項新功能?\n\n查看設置菜單上的支持標籤以獲取更多信息。\n\n另外,如果您喜歡該應用程序,請考慮通過訂閱支持我。", + "title": "支持" + }, "thanks": { "message": "現在就這樣。希望您喜歡我的應用。\n\n-敬禮,Kyusung4698", "title": "謝謝!" diff --git a/src/styles/_variables.scss b/src/styles/_variables.scss index fd2b331b..143df530 100644 --- a/src/styles/_variables.scss +++ b/src/styles/_variables.scss @@ -19,6 +19,8 @@ $light-white: #fff8e1; $red: #e63244; $pink: #e745ad; $aqua: #1ba29b; +$river: #3498db; +$emerald: #2ecc71; $black-transparent: rgba(0, 0, 0, 0.6); /* colors */ @@ -32,4 +34,4 @@ $black: #000; $gutter: 6px; $gutter-half: $gutter / 2; -$label-color: rgba(200, 200, 200, 0.54); \ No newline at end of file +$label-color: rgba(200, 200, 200, 0.54); From 7f49cbf97fe7a77d7075c00069bb686b51581bf1 Mon Sep 17 00:00:00 2001 From: Nicklas Ronge Date: Tue, 23 Jun 2020 09:37:04 +0200 Subject: [PATCH 08/22] - fixed an issue with the trade window not restoring to it's fully size --- manifest.json | 1 - src/app/modules/trade/service/trade-window.service.ts | 5 ++++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index 15139b61..646170e5 100644 --- a/manifest.json +++ b/manifest.json @@ -146,7 +146,6 @@ "disable_rightclick": true, "transparent": true, "resizable": true, - "override_on_update": true, "size": { "width": 310, "height": 400 diff --git a/src/app/modules/trade/service/trade-window.service.ts b/src/app/modules/trade/service/trade-window.service.ts index d9c08272..562c7a65 100644 --- a/src/app/modules/trade/service/trade-window.service.ts +++ b/src/app/modules/trade/service/trade-window.service.ts @@ -6,6 +6,7 @@ import { ProcessStorageService } from '@app/storage'; import { TradeExchangeMessage } from '@shared/module/poe/trade/chat'; import { Observable } from 'rxjs'; import { TradeFeatureSettings } from '../trade-feature-settings'; +import { flatMap } from 'rxjs/operators'; const WINDOW_DATA_KEY = 'TRADE_WINDOW_DATA'; @@ -39,7 +40,9 @@ export class TradeWindowService { const data = this.data$.get(); data.settings = settings; this.data$.next(data); - return this.window.restore(); + return this.window.restore().pipe( + flatMap(() => this.window.changeSize(310, 400)) + ); } public close(): Observable { From 0b7fe4c4f510d2cfc12995026b5332264cf017b7 Mon Sep 17 00:00:00 2001 From: Nicklas Ronge Date: Wed, 24 Jun 2020 17:50:40 +0200 Subject: [PATCH 09/22] - added market search history --- CHANGELOG.md | 11 +- README.md | 2 - overlay.babel | 57 +++++++++- src/app/core/annotation/annotation.service.ts | 2 +- .../market-exchange-bar.component.html | 17 ++- .../market-exchange-bar.component.scss | 19 ++++ .../market-exchange-bar.component.ts | 23 +++- .../market-exchange.component.html | 4 +- .../market-exchange.component.ts | 4 +- .../market-item-search-bar.component.html | 34 ++++-- .../market-item-search-bar.component.scss | 22 +++- .../market-item-search-bar.component.ts | 87 ++++++++++++--- .../market-item-search.component.html | 7 +- .../market-item-search.component.ts | 4 +- src/app/shared/module/poe/poe.module.ts | 9 +- .../poe/trade/chat/trade-chat-whisper.pipe.ts | 2 +- .../shared/module/poe/trade/exchange/index.ts | 2 + .../poe/trade/exchange/trade-exchange.pipe.ts | 12 ++ .../poe/trade/fetch/trade-fetch-item.pipe.ts | 6 +- src/app/shared/module/poe/trade/index.ts | 1 + .../poe/trade/search/trade-search.pipe.ts | 103 ++++++++++++++++++ .../module/poe/trade/search/trade-search.ts | 67 +++++++++++- 22 files changed, 440 insertions(+), 55 deletions(-) create mode 100644 src/app/shared/module/poe/trade/exchange/trade-exchange.pipe.ts create mode 100644 src/app/shared/module/poe/trade/search/trade-search.pipe.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 0aae91fa..b1f3a91c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,15 @@ # Changelog -## 1.0.5 (2020-06-22) +## 1.0.6 (2020-06-25) + +- added market search history +- added trade offer received timer +- added trade player name +- added trade go to hideout action +- added harvest seeds evaluate support +- fixed an issue at the market which resulted in crashing the app + +## 1.0.5 (2020-06-23) - added support page with discord and GitHub issues - added colors for life, mana and energy shield pseudo stats diff --git a/README.md b/README.md index 57be5ea0..667b08cb 100644 --- a/README.md +++ b/README.md @@ -24,10 +24,8 @@ The complete guide with pictures can be found [here](INSTALLING.md). | Market | Search History | 🚧 | | Market | Save Queries | 📚 | | Market | Sort Results | 📚 | -| Stash | Highlight Item | 📚 | | Stash | Filter Category | 📚 | | Stash | Navigation | ⚡ | Waiting 🐺 -| Trade | Parsing Offers | ⚡ | Waiting 🐺 | Commands | @latest_whisper | ⚡ | Waiting 🐺 🚧 In Progress 📚 Backlog ⚡ Blocked 🐺 Overwolf diff --git a/overlay.babel b/overlay.babel index 1d725aca..57dadbbb 100644 --- a/overlay.babel +++ b/overlay.babel @@ -1,4 +1,4 @@ - + kQG_@qyl3pGhK(7wYqsIql&|`xO=taTt z^zPtV`eE=Woge&0vq24G3N>TOhn6t8p|?z>P+PX1m{s39RD~N9TEi_5z2&Bda`^M1 zzWkfe9KL#ZE&oS&s~ClKj_(?A@p~hc(@!Id(z58sbfc(RI3ArWlt#Y_Lt?EY2V;*U z@mM{eY5ae{&Uii089yi95kct)q`Pz@@>F^Q=?;kj^w21D3j9CxCtMM0CYym>mwm=; z^45vj^0%TsxoM74?PsP8Pe8ouTa@G7l~Z)3k^%Pg_MYS36hIU;9zgSNj{#M7tTt)jkFQtrC=L z>w>6e6zI{6121aUgR?Z}!Sb3I=u}sd-ck>j=BXD-yQ=??>eT;A|5L@J8&$bbCzTn3 zRXWJ4B&B~V{nAs)lytsQ1&vUSfb_~6&_@LUZC2#M!xatSYKp3`Pu>K+F0T&%F7FKY zmiL9r$(O@Y`3bmCb`SQ+Zo*$=$6-Le0cK^J;Y|4wn3wf|Q?jzKMDB+K**6H1KZSg< zSI~ReC+Mv#2tAka&|fkGyhzpv{!KO*mda+p&*7=?A-Fx<4Hh5=?14O@mgWK!gvLQ; zSO-;wA4&Ve`=!0$xzeHVd}&L#qqI6)OIjP|!HRGpSQ~y0R)%kbT6j4af%2WN5BSX7|<6AO9<&mkyBbKw3p5kvl^QU9jE-f1r&0hCFi*7lAhcliH7@I@|t}jcI%%@hOw6=<=C?ll-VFT zz$}sUV7f^NI!AJq_6VKnT>?c75Drj)Fp;{KZbU6f+o@*h!c@8Rnbc=~VCpdMNHybC zsR(CF-QjwtHgOA5Yq@=?)!d5IcCLPEC+8=RaL36r;+oP8ZVvg7>q*|{^yCBX196f& zN<8J35$Cw6#9OXCag}RGJm;zsm$(MRMNUqv;ShW#_ZMD|JBsVLZTLNQJHCS5D*8^x z;J=v0_)ew*-hff#AX5c@KsU!P)5GzjbRK?#K7v1|H{))44UW*gaE|VWhw09Ei0*`c zrhDMe=!y7AdJn#rcH`S=8SxjLK^&$Dd=pLLEogvH(=Ca7YAo@KI!yeaE)YrTF~L)Z zh{p6bq5<8Ps81USCH(~tQGemDr~~+OY7u^f60TB`? z^)2~?DoMVkJ|>S-`N`GP&*Vt)SSJckwxxo}np8SjiHasGQyF+o%7OQzL|Q2|246#+ z!)H)$@!=GM*QU%wTPlt>re2B1ci>~GIrvCwE7RircyPcxn|craj^FsXy@r zVlAPLim$ti52XBfTdD;ygW5strg-8t)mbDP93unND>6(eQUYa5Iq0^j8uZdsU;1il z4o#;X({_rdJ5vprA=C(F3$=v#gWApPrA{%MsPoKz>KIcPH=a3m*5iI^5Srj;1IH#9q-Zp_g7z~ zPMyiHJ4uDvp6))+d47bR7h|uqTp8Lq|@BOiFc-b7&YwHxiTb=Sa;&jI)-643CORD1TCVbmX#&6wx z;D;4EWDI3HH0^K}Yv6$l+cA>CPLF-liOzm*SQ*WFbR1G%^eah`m=kN~E8TyB1{QE`iqEb+D030{glBAc@p8PH{^?A~zXq<=TNITmcZzIk-Fb5x3;d z;IiCooS!&Y#d7&@HqMXxb4Bqjt`#oFPr@tt<@guB4!022;iJM;oJ%xtoR|+h6kCFz zuN~;_>kYR0mH^kc2Q>0u0O$R8K)%2?uq2QbehSovIfETx``}IxTSTqJ4WmZjPEqA>yQqw~R+QuAjmm-LV0HX7*aq(j4#E?IZHb>v8=M-* zhK~k5c#8rny>@{%UeN&U{pY{ro+NIkGyPTFuKp;uouAYU{1=^E{;9-EqONnsSIn8^ z`^RbTE8`UO)p7zPB(b5BELL!Kh_pkz?d^bg+cXu9Y;JfCYYC~1Tz;k-`oRdnk8Vo`3np)_k#uI7BJVG4Gx&|!Af%k7;p9kRm|Fe zGwTz-jyB*q>H;33?jQ*@28pOB*oOY#?dT@ngQnths3pFMetS332JZqY?_Ed9?mhIc z`wpc!VbtFVp-*-ynqnuSiuOvBY7Ic^tp=!w)f62!E2GvVUZcEdFyfGBgpKXSQ=`3c z#)u(Y%T&E0;h_4BHTp+=sh*kSy2eR;x3ORUXzbMsqJ?@})I*<4_-RMcTkQ#2sf7{Y zvYDARXr5IqGCsW^W6MKyMoC89l~3r4{1#1@?;=+^hE_>CPlAng|Mo8i9X9E5Mx47jPt03+@Y@fX_lM(SrA- zQbR{5DMZo1aBbQjo=vmijdYgq4mxjm9o;EBi(V04MRW(J=$h%D>DlQynEUCinOEt{ zne_AvOfd49DH8d^)Qosc!wAndj}&7kMB1^NBFov=k;|+V`NEc$vT~iI8r)uKIQKwW z!s*g!4$8N<0`fPmj*PfP1V^4O=jVGWHTciU6uy?ao!>=VV*jW!_>$Uaev~$j-$Y!r z-)m!dtaaoI>%;jr`Ye8!ewbgXKjf$C|Kt1XZ}}?vSH6Uf_)K~ZA+MfM$f9QzO6msD zi)9nW>luW7`oF?EeYTK`aPFELj|t)Co3PTjFPt!r2rrD`LI4#LI-nQ)b~K-Vj*9a| ziNE@2a~=21?9WxUT643lvfL&s7q`|*W|vsI*k#rvlDo4)~w=nWdFq#*e5ue4S=`IU~r8& zOE{(s96_qU<(OfxGBX*LB<|{knf)-Gehn|t5#r_`P@CwA)LObJHJBbsRi-CV0eTtr zj!L5LQ(py$x1mM!*3~dw76p0-rJU;V-5jl$i|h1DQ!Z zV}60lgrItZc>+E&$3QGQ3$$e$gH3D{_{3hp0d6!d$>qS^xLe+MZkTtJE9m{lscvS% zqA$f?b^qZvxY_x^F3VSOzi@u{9rwez%Kgt-%OyC&xeml@=aU`a66~*RL;E~i$lk^R z;>Cll2kdu?sxP!z3eXclK-z4_a_lxcIhhmKWTD+%4`Fd#CebIzqm7PNAL`dX}`-WJEHTg7AQMDe@YOk}ir zVlJ(sSY696w$UhYEa{4ysC^g4Xdi@bTB=Y}`yv$9{s_f1U8t(13w^b)Fj_k&%+|IG zOSHMdL2ZffRa-3N(`N~7_3`8`o-K^imkIOqB|@A&LYSp@5ylW_-0tKqub^My)3l}h zU9C00o_GPT)~<3hw1M1E!hdV7onb3$v)IyFE4Hd8vQ@MTOlfT-!)O&4RShyf370RI zc8;#A&7>tYGI7D54fP7jEC!Q@Gku^{;j{jtZ@!kF_z+v#$-Is z=!g@H7I>c#z?Y3g@1rr%^P?7COZ2a|2DS3uqk>*m^OjrBobOID`@5UWKJII?k!zaR zsc9W?##*hNot9$XwD#M{R!3X03fKkhZ`KHVueIAAZ(Xs=SSReP)_FT(ezJM1u=Cd( z=X@~NI{VD?&II$jQ^yRryxGOQk7l@Y(HXZic}fLQj2AZAd+&{1-e%*k*WIXwV~lB} z5BwzFqI-CVPMq=eaX``5fiv1+uwL5Vjp;c(6dZOdR=B!6KyqT(4As zhm_Iqva%W;QEtE;%0oCyxeli&=iyxCFkGNKhD(%haGnx^MHu1`kJn*txb`Z4C1et}t~A7=WK++07-bkc7zll9ZgVe-0= zzLqI!Y+{BQOPJNhEas^(g5gjHrW7j6bVnjH2K}U`qa=DcIz_Z4o9P*79^C`Q(N$4A zT@p>AixJI9N7RFyt4hyC+35u+L~TbOsjKKJ6>BC_oy`Z-1@k@i!Tdq_tY1_G>lsze zN~A_v7pMu=Wonmoo;qpmp`H^h%TFs06>UF+vGzh((e6o9Sk*|xK-x|t>pL>mSyxG{ z2j8r*Alj}Bs@R3WFgq4(uycSbb`*fl8(ht~gEu;h$?SV7?&r3|58NiWvR4-`_Nw9s zUOAir3%D8n;Vr`FyyJMMcN-t{zTho{sky=Pfze(8(A>)iN_)is<&_6XZXa;QoeieB z`@l%|KB(-z0@3bQ@Ywke%yXWDf1E2ovQL7O_9-yMJ`XC`F95L@0MD$_@R-#BuCwCd zIBOp4XU&G4tTC{))fv{a2E%MtN2r(s35lsUTyKtrea!?y8`uXknzvxI`3`!BrTk=m z_X{#eC#L!qd)fmzgs&{pa~q!5O;QVX6@nv*-XI~=Gi zfvuH9SV^&AF(o%uSgA_oSISbQl*&{Yr7jh#bfzd}IF%~Tqr&n*%9OuTq7p;m}x9GVjIfq+1~PXc7*($9V9%~~FOf z%V`72^I#I&P20mR(2lb^v}^1aErBgeTxM73QS2H06_cv(XB2%2`BaZ%+8C{vsYV56 zm64x`Gm0_^MlEKg(S|u~bY(6XqnV3F9Ft^>XFeNa84-Na)b++A)n7kUA=u6NgI z>m@itz4^{eZ@P2U8|zS*=#|KraD@a18aQ1*4`&1Dt9It`6GIEev2;hlXS%O(M_%iIp11O;yUQ7xqkXE zu9rTB>!Ady$fe)lQ~IS!6j=)xJ%kGZmYJ68=+0$CTqR99@;dn zi*|sksD-%fT2?-&RpEiwmCvH};Q!IO@x-H@ucZa~SdHOBYCisk+LAw@j^h&uwJU+l z@n@_1`K{_1{)~E`|EzxG%V;X!MawN*(n<@zw9100=MwVhyiifM_%3>s(4TY#cG7bS zO?6JFM&|n+^!xlo{UEblV^>Ad}X6M-_w}E|7&dIml#j^^~NXu ztfBJn4TVoJe)72y@i0S4{9F>J(0M+KxsmT|j^*#0HTj^$^Iffv+-d6w=UQ92KK4*< zsokGDV7K5N+HE*wSK}%>MYu6eHg1grxg_T``-wOg@$SEDHMc4o=Q_+)_dfI0oyhQB z9wxJwLbvmF(<{7H^m}g*T^9EuyrqKlcbu874_;Es!2hUZu#CcBK2;9Zr6$3~)P7i; zdJij6IjD?O2MSV$sMqidl>%eww=f%>1_#h8(TEC^LkFpxOn|DxxNsEn5*}pMKp)!+ zR%5fmcvc7N*pncMT?0&ZJjlw81P!_VU<_9aoa7jQxFlSg--74yL-BunIb20By?EiG zcTX7aeHChWy70;UBdjG+(fuhrcK!WKXZnZAbN!v<5&k-IJ%15d^8FyJj{T&H-$UBy zt0Il}#YiK4UZlA%InvwrFw)caA~M+bH&UBa_yayhN)cJGZY8YINT{O?7%`zH+pINjmKJh1CpJXn)*e33i-ODm(YWT zpw~2hXvbc~m2J4X**p5Vj zP^3Aar18Kf9RztL6%>%F!u-+{(kHMAR+65!%1C>e=F(TDr&N;NOL%T?r7>)*9M6`MSF;`D{p?WrA$v{!%zl*-;kt2L zVI`U?srH%l}eZ@{Br#ub?jH+pAmoiRxK?k9v=P ztD1Z^Ex*uNt0QdGCJN8Ay@Ezoe#P}1Vh_EUc#N!0V~j)M0OPlK+bH0J=wDxRw9A)( zUingx?W=1B{RhobeqdGgSF%R>`&y&?Gprr{b5??1u@e2I?1%oTc5GmaT_-@)BLT;L z5~$`_fv!$$aFXK-u5)q(*E&^$H%ZSiQO^gvyN83v-B-a+?&ly&81=Cp9aY22AJx~Z z8MV%v7xk3zmW$&zQ8V!OsB73Fyye*F@3<5pMAnZk49Z6L2Bo5xf?UztK}_^{@Hgr^ zco9__?u}Xww?@5y@lg@jJ&K}oN9CZTU=8XlpR0Kuj;{sC?9 zv*;M1BOMg-&^d*#lwUYWMG2EBkMBtt#P>0UkHDM!CU}T%1{d-IT+Andczzd{!H)oa z`L3WRUjh{21(2KniQjRr@Ch;o_u@|A!rV&yf$fjiuw`*GHh}Z8Pdz`o-Se0>UJ7Hm zrUrzB>(=1Sd1o*HP$9&JFspy_7@S9+u+oE<3wD@3ATV)|duGyNv`FMJw|3eN(mp?I($)C|-Pl?7DD!GF>o;~QxS z_-I-?oREgRacKvfn|l zp8mx{=}rNn<}VeR=;REMUGz|@{U~jdy*#bH-6_p)H%Pl_RZp92HA+Kf^|S?M<+NC{ zLfZdOv$O?hL0SiNCM`2jRq4i?G}(Bc_Re^n_KB#gZW@Qu4j3!bjupw%HZig(5w3BMZ!oM{_>(w%bpJ+cq+q6}o`P#rxPvXAYLMt6At5pwW(rSm&iIVHR zS}k-^Z4o-6b`C94<4LRujaAQw2C2_O9n@Um9%}z^C-rZ5sM;aDpPHCHN~I!$)s~To z>gvd3^?#AEDwM{krKHYkf2p^6Txy{{k!q>BR8YkdRCCF{lrr*ZrLH_*=_t2Ry2?$I z(Q-9qqugD2D>qguD_xWoN)1I;3M!3NT3Mqi@+Xy2@@ScqSy~n4gVsW6s`pl|>jRZS z#!_Xsu}KM{hsr#3U5TLol*Z;W<$!rx`DJcU%91C_079YOVj=k_AyOByugP=m^YRt@ zpd9Vok-Is`GErO0v>TSIyNoi<&7`b%+bhZLMkUH~lrCN^^`N&)jm6K^{i$tPO^7+9}vU(_usHAF8c3mKv(7Ugj$1-F<2Do0+_pj`ucpx3D=w_`EPl85l7Hx(T≀CO*M;28sL@@SfL!%om4wgn6*Oa1M?U0Ci3%O6fu`s;Zbk^%37uaiTyk z5}VO0#8&hgaU#7^97#_SXVb&PDRg~t1zk$qLtDZP`h#$Xz9hV**9!0G!2)1P3uPF@ zPhg(&iOe28nq9^>XNU81*-`v1mT&>tMZC-IJ?_6+L;-pzN1U2{pladU+SE)mYS!up(ZN-P#u+A zRBa^#RbKfCvnWJys?39_@wNHW-_+3%SY_rQeXS2)X+X4Rk7Dgt?V&U z9lL{6!7e6wRwn7W6^<;hK17;X*CVcZDstQ09T{dGj1(sM3OW=Siw;EcpmUM;#*N4v z<6WeRVMSi(S*7WEBPpnNkdA3RrKVa-iP!2$m(|kJIJJ^gR?RALsuQ8r`;nl!F;Yt1 zLA+}BN4lxcBK_6R5#szUZB#2uXVf@pkGeyeseYE4tC{5-YA5-lvRXc=T$5)gg3?K8 zrBqVZD|wWcN)81nnU#WSw9-b+tZY(Q<(A43-mxYVhXFaa_Eavb?U0*k3Gzs7hP+!_ zEPvAG%2oBz@;JS}{8n!xXELhDgi|JOF%0RM@mtD=zDeCl96`^eWOQFjL&r&6krb39 zMVYdc*MxFyv#8w8EF$+a8^{aI-tt;=p?ujqBfl_j$-MPQE@dUjZLBMD59^dX(%K~+d>`=j#HE=;r{!_+d)6}5*W ztCO52+Gc0Cw#nH^@nh_k?Qs-@SL z(7Gy8=e$}}3~ofl;~~^tOe$=IQ=bd$qUwO>ocU>sRL`UMc^0`YuQq8I$Ix(WIK{`jbIF06`D){zF=%pyZZy~F$M@T z4)C!Ytj^M~Hv1m5ViQ4gb{*)?#)GNsRHD}y1TL^0!7CCJ*8}9_`hmJ!TTp>32TE`m zKmqOzA&XtYmAM4mgxgDMeS7c{?ioJIJ;EQk5BLZ75HtLJoQ;1(_6w46SN=5~!N0}B z`RBMV$rbreI6watvpfxGz5tN8x*(aW4R&z(z$miM(1A0DlQ0o#9m%yv8LBZEauf0GkDd-h+AB|;T90DxVgkzE-n6bKMUEt`$Bc^ zIoT6Q5w?!Jiyhmt&4+*pI3gIc zntusz@ad%g_dCqSpMs~jIj|4c0T$<)L4m6Yf3n%&bC!WO*i>+g{RvjFA<&2P1Xm#c zm;aBaor#>w!)Aw>*ox3$YQyhLahS|xgXb6lZeyZgZ*rWQ$qT;`YWFre29BfyunL_G zGITNchH3;8sG4L)sWkjafH7O)V?vo-1FFJNASkic!+a=$M`e8jd$Q= zJdxyj_!+K-|HFka#zim>Vle~KJe@E<4ZO!w@NAO1dS7uF?-|bI-6xy^4X3;1!98~- zIOrY(z1*{aa@T+h&MeTu=?^M9-9U`f0sfvf zHUnU}NrTF!Otzc;;x}ZB*-uC@z0gx!6`jPUaR|RRwv(#id3@Y>gU=fX-#7AtJ4Pn( z$OwXK2FA|~8NW6Z{EOs2#t)ooyvDDLM10U#g}WIuu+JERkLbg2KYcLvv>te?)&^JA zDqu&gg5MLLfV*mW5@qp0H4ENK=A0{4h^MK)y#?w+Z??MDTcnQhHmKdat7=v6m0HRB zq5|)?>h~gQj0d$wULLKN*GwDc&CcUOVD_*Z%X;G?yF~!%ws-_>k5S zuhHW0Tx|oMq9u}?gy(B_@mlQ$-l?6!r?s{Cg*F|Bv<|q4UKzL0GvfI=gE#0bKBi~G z2lRsYs$K~v>$S1p=!=^e)A4p=2mWbX#Z}N_JRd#8PtawY)jUYp)F<$Eb3YE5CviS& z9qw(d$Mda~_@cD}|F#z6BKBO|(oVqB?L&BveH-7lUt`(+igP+YaDV4H-t3&g&z+rE zbLL{?%)yQ`0sGwE7`Sb*=vK$+P7|y>xS31grS4fzSjNZi3AqmFl-9EWgAj|auPBA}4h5M=PW0Nou0UXr`$pt~E) zaxa5!M9WsyeF}2AFF-~&1q9q@fN^gD*?9(@JDU-G)zu%S~J7IR`?c1MH^VY-CvZ19<#2cEIZ z!C7_**xPOdtJ)O_i->#zt;X=MRU0<9+CbfG1|OMS;Wl#+d5R5%o6MCTbr-UGW5$yn5&_vJ!)dc?_8hkaL;6vmS(3{lIvl$KWEB&i?K%eN%)I;uQeVRK; z&+o>Or}--KWM5Bs>L>Ko&Le$<^GomRV7;f4)rcog`I(MrjB+Hsi}O)0?|jv>JAVkb zDNX-jf7kEW$$FA~OTTQ#>rd_8`dypW57^1ta(k9G%5JYUurp~HZADGA?y7yQ$7&|) zqk7HsX(P=hL>(HZ?LemqJ1SKRp#1u4qn&=z7^rVH;`KEoP8l2ZJH{^EGM?yJ&_}%q zDr^iw!;B^9mT?$a#yM01okR7}aWoDcKr_*KbOI%zi$o7*A!ueXW6Tz2akGh;+w5s( zHsehX9W;NTWb-llVQxd3ISm1;Cn{#uMD47SXr`qb`>izNnDx}SXniprTG)7FRY%zB zjY`GkngIt97m1}*AGn%o0B=&&V3_IvE7B9-aC#j)Nbi8}=rhnI+M&G6 zA6Sr4U^NEAZp>G>ht# z*-`K}nZKCi`Bj?R2kLW!!APzo*vI`3KjM~So#;R_^4KfJfA-4oNnREHoY#~;?+xQG zd29F|-X&hZcle_C2wxws;v3)zd}Tb4&xHH%zlfvMQ?EaNjpQX>8-6NzUuCZpiGqAK zF9)B=6L`t}#{G4_a_`-{++FuMH_g4yRd+9O@0|VIMQ0PY$eG8@b*69wo!MMhX8~8; zSwU9nD>%-X%PIC;E^JTZzS=XnFZOiqw;j)=+6%adJ&${2FXJwfYS03EBsbRX!1c3x zbM5VNToXGx*U)~$wzBWDgY9+fQhP2t$F9##upOqceUK?*_hGWy6!Y7}U@LXfzq=%i%O54|Wa5;}J!kj*177StEC~o_7UAu@1ag=6482}CHqE+Xp^!B4ORA|Qp!@4OPPUexi`Xc z7Zj3vAVqG1zRA^*D>EpdAfvAG%IHlv(TkMp#(w35k*F*%l9Wlt8KtvvOzB`uA-RJx z+{mUZHE3m<@l3v89F^}Iv*gc4clnFaNPc1bBVROX%EydB@@`|hyxMp!&oCnLAVZgH zk(}K~mVfAH%(kb1QzUbLxM=vY~jPi1{ zQC}`fez!_SL%EqzU9Mq-r3%I^sk$*Qk?vK$D&=zW%N}E6BFTR zvyxiM?5y@R+pIjo*qF>AY4&N`trw*G1zEWh5~YN)rf z1`z__X1$X2p7>{#H_BM^jOx}6qlcA~=;H^W%hr8lT2W>(yNNm2UThw=lT6o^&Du_G zYok-edgF|-3cLHQPVO6PsVmys-BR{pcYwXwU2o5FZ`dPT+aBx|a=N>{o!ahJCzE@} zc|$x1&pWx?eNHWRr_;+l>`ZqLIBQ70kL6Joi4p?;KAecix0wMZ0XwPJaub8H!_Bsr1WRJri z>`$1LYe@fjA_cwjH${#jOoorWgNhc$~czYlW{7WlyNEhC*y8b%b3WDv0K@kvGdrd*sg5m z*pe(Dp=FF^zh=x$UgI)WMw-nP8^tz>t-(%=9l`F3oz7m1JL#$o0+LGYnT=> z6PaMlIObi30nG6XotX(4DlsiGlxFf~h+?8M81&!hFZ9FcM0!{BZhCI?M0#9wExKuR zh{_RtluC)}OPz|UO2tJfuwK+NXa<+TXTiR3Td)Zn7Ayht2Q$Gh0h9PT{QwDpw_t4G zC8$gK0*VHf0@vRbsQwDzyWhhv{g?15{|r3LUlSMc$KZRuPu^7DL9dE$fR`o~^0tfL z-7ex8*B0X3YeGA+lbg#8@j-I3~N=>Cg6YJ~1_&0gP$`=DEF*_!kzZ zm)S?DA$E1DoP8Ij5nb0V>jUUu4Fp8%h)Jg=cdRPf5XO*pl5*DZY zRcb0w4JeZGTK=S*ly4~`2W7WZSLrJSl+4mw`B&tCd^s{yJ`-su z&x!=(-VsB}8~Gr~>93@B>2IZb>F=a->CdF&>G!1#>1U)_q(^gX`faIA`Z1|l`a0>K z^x>p$vzb&jy}VR3op_q2qevwDBl0%kP()4%d2&*yuyQrjO1Tx9pnME1Rg}fv3a0`pxx z6E3IaO&_4mPv5I)>36i|5ud(1QeM9o>8k&XOx4}UGCe@X{21wtUQEJzed!;gtJJ_4 zBuz8sOPh@g(sM(TAZjd^MC;_S$dq@WVai|hR`Huf)fVO~HO_pZCYi-G*_^6Xu&!%8 zElyu=)zB|l^YowADLtc26MlDPW1byvB-wk77xq&lVn+NTWOyxDX?e1;y0Q|N~{ zmdOojFnz%kW&zmE>;jLO*Wf$j0g0&zJ!T9f{eG}0yN8UP$6!}7s~pFs!IP{7WmbcQ zI0p{kG&qXOL~Z2?P$#(d)Guxhm6hK|_25&eseA_d0zZ^~!#||+3k8`r!hB|}@PWA} z)L>m<7MoK{WGjhx*z)3gwxB4n0WmM<39UF?=+4=~Fis`)VnbNLMT9$CNchPG#7ula zF(*GzEXz+33-H^-lKgrxnqMhq6;k+9!c+dHaD%@teB+-9 z9{+^A}zd3r6sk>1Epq7U+;>EnDC z`UYQyzQSYbIe&xt#wSp}`GJ(h*QUaJDT)$&)L;G^e8jJZ8~9SNI)4F#xPQPV?mXEq z%#L$%JG}>N32!8u4TI%sI#00DCx zIEF~qE}Dj;P&7tFr+(L%>zyQC$x{uJ?2K=B|1svdB}wOJc_X*m$_P6hj33TW#4+{dPNLq;nWQ&yD(EF0pyzTDHO-!_J+T{T33iM&(Eh2`w_mGy z><21k|4;pDy;WaZiu%}!(jHj_wL?}u5;?WeR%We-MO1Z`r(P!Anj_8cYHstP`U%}v zccArZf3!kvPP#CwqPA*9R6{L+@~N58N5wWaC}ieKX3AxiIYus}sgX&^Xo$)aT~PMv zf8;p*nLJ;=AWzlT$?Nn4d5OMQ-li{=HlE7$uP~ zC(kOJaz%0EXG#_&qWq&|P`fG3)sf0nb(?Ziy-tt>knk!CtCzIyYBqhb+DgBs#_3Pg zY5GTXv7Vx?C4}oGdR1+KK1`dcuhnMgm$do%7ec$vPx`~!>#OxW`U73kk>0>4V(c@T z7~hPJMlm$n7>?!}7ttXjhk4T&YQ8c~n$L~D=3k?x6(IB1RwzXJJZsy@D8bHQzOeh4 zxtuj-N9Ve^(n&WTITx$o^+;cPgmp?f{+K-(ZNF8P0Qu!qaXdyzRzPU);geU-u}L z(^IMDWGtQKk(u z4g);59Ms@8l2!L9u$oH*FS$Fw&wmBIc^jM|b>oae12{I{ zC{V3^G1Pir6lM5iSj_(m4)=eB+x)*FaT%qm2l7#C0u87KfnJmx7(t1_^;DkVHmZK` zCeEIbNpJxjA3RJC z51yl!2EWqdf)RRdurSj)ScYj3tk2XT#}$JGNX|-fUZzH{98)Y} zTnijz4g~fx=K~j+dx0a26}ZXp!6YVQ@EgMhCB_KQ?5{vM_G+LFyDG4X%$zT=X`bDm--^cm=ci9KN6KtF>j;-YD%Kj2-5=~Jywvp&EZ-igW7~w7>2>Y3% z{8*+RUyjMZ)68}5Jw1inN4Mc7(1p0#w7_Mj@31Vrl}(|Bv2Uo_>_yVUzKgoTOrXXv zttr41qt+3{W-L)}Zl~Umy3iGv2#>*fa1jiF$#5&E4|{>~FdOi|U7QXE<3k_{uLs+_ zA)t=e6MS&Xf;p}TYPzrRTjwy|>5RrzoSHa9?y$+EUpRw3*E?jj@oHJcyw9fV4mDF; zgwDAO&>A-fn&MtJMz}qUu5PT+%RR5xb7$-2-Mo4hSJr+wOG&qR4Q-ioPwne;Rx3HW z!Z-(%RC|YiE+wIzyhsXuWq?It^)0&$H)0Ub)(*9>sp&VATP%mp@Xor;?dS;m+WVH*Iut$Vj z+V{efY+w2&drJBV`$771J38{(t`TwVp^<=dB2v*ok(N$BDbBepZFDlrH;GO&**PkQ z9bU1WZb~8dno`5fuTFI1)t&AQ^`4tagI;T`u6IV;;r-S$uasT^x7Gi}bM15`x+g2`wCxQ|wW^5$`{(|ievTi?JUqNV3;1N5^I_>Y+N z)^a?s&&dEiryv~cR)PE7X0V7i01o#iK-F6c+u$AW8r}=@fh%wtI7imTXJKJ@lk7L% zf&alrq~>`Ko~Dk%EcA6ahfabKT7n&!0@PKe6P1-spvJO?sATpLRgU|QiswF4&$%=z zns=!Id|t95&O>{Ae!7O>QDcP|dasa$ekxR=DX}J9NNi5G5l7K8#r5<>@fS@DkLg~% z3WQc&iplEl#tiaLVv_ucjOtHe>IS0NUV$v^%0OOrQy`YT7+}a45M+M@GO#}bg;+IE zkbM)#&VD5EI3Tdk0@=vFQ|uBFJp=EVoPkG-;=jPW^50}0_>-Ar|9j?_ACq$ylQEE+ zElRFag;5g&?=Q2P2ota1eBFsL& zPLKDe)7|`!=_3BubawxF+Vvfy|M*tZPkm$QBfkFh9A788zpo`-%-5J^eZ}b8Vvt@X z{-xT9Z>R#|B`RImNj(teQG0|A)H0zAHCZrVAK@{qE^LBXg#l0^WBV_jhL8Ca@Q8l} zj`2^xHvS>_|4PJ@pgX?<)aF-#7=9MexN+btHwBF4`hYMy1WaRF0Gnw7mM}3OGxH56 z(35dix&+=pJ@@ic>%F6}w^t8V@=}T8z)JAmZ3oV~G+6Kcz{}h#c%r)vPjIK=E^Z0j z&JEx~?m5CT-{Jj7XeG~`lHNV%n|sySLt>b_knHIUbh5i8oo~($`;>Fc9^`biD>=OV z%06x_vPW3O>>}1h%QJ^sm(8HH(R^n1F?X2N$ew>rvzPf7wKP*uRr4yUWNt^L%<(9{ z*_hM_@}pMx8L`c4wvj2^nrsI4dI zeto2#rq$3-YL2#4d!;qjHfsTGp!QX*sNGO`?YR0@y{Ya}PphPZTy3P@QY)xQY98`^ zP~Asjp88W6qoyiN)mutc^)gYCY*MPIGn64}e`Sl>LLoXnC88En0$L5Fx>j51rVUiK zXakgkTAXrGo2Km5mMR;x70O&~Dv1%wM6H%GTFa;O(0!G~WW-0mgL(0GUYvrOIP<6erTFZ!62OH_d@My^S318Kbp}j74r6bimz3FrZ3!k%Y;v_4KUz1*+h*cJ3v>St}_E1pQUJuB=JEps$@5j<%b_llEZv z!rlTM`wcAP^Y-5k+%6Y}Pie6`~n%9Nv+klJ|vp3F?La=;z#?(R_B9f~^?_ZFwPyBBx9 zSfO}vYoS2#;tnnD2OPJXO(q$8pZE92hskF5vU|&A?Dmu+UFzRBNXpWT^{Q!^35|q1bz0yxS{jgOSs=eLEzr`K6qseS3tTp;2232a z8sY2KV7$fJ_J5dbflHWm5|6YV;&IkH=uu;MI_xzLux{dx)-_z#dW&;g=}BsSs%Q{Yo^)IwwDsJVZX{|CeY*nWTR$=OzS*dR(&~K&*&&7ygeIhaQEcs*} zA=k}$-a0(4{kkM@O-)+x1?)u3V3{x+`*H` zSJ0;CArV}aoWcFcN;oqLuO=<G^~gWKUf5~;hNl_>a9cwe z)r_k~yfMH?0adLiBF4Yy3)+WXp)u%h)C65b>CkTUO#hD7>viZSKyiHx1@t*|M%_kp z)P7W7%|>ZdTXaK~MayMM^u5$NoqVDH6Q}iMsLO2?Kk1F4g`NS~OQT^{)k745*_El& zi8tyQ->)u!ifk)ysea<+RXrY1Dft%}@!!Y?{&jiUzarQ9dt`rqrL5&ok|F>9E0xR0 ztzJsm)%!;jf;EF=O~oaaO6+5=_zbp}Ph`{h&#XJ2&1&;mtP)?uvhk@*_~Y2W{y_FW zzaty#H)Rd|CM*xEMe_P>z=Ng*)HfTl%ij0wgjbX8@Jh1HUP`vad+Gk@9dXNgGhN2M zcMq`w?h2;C2P4VJ%|19c!82o}`@(79UUL%MGtMVxmvh=V;B0qxIuo2DPCw@lr-O6C zY3>|ysydsUGR{ILjWgSc#zs1~V>ZtlFYJ3D{cU7W4< z56(Dym@~{C;dHm>JDu&7PAPl06N^4}&PAECC|b@P6z$@+fC^0U=rKT|n*kWYX`g;#0m-++k zlm2Ww<}b6$@>6y%e%9W@KiDt%d%K)4V}nJy*cNbIx-VMCqGDRCh};&dDj&zX%XnwJ z?Ck88Yn*@O7blY{?bcL_-4W`wJ5QBoht)K8SzQIM6Y9n3x?Vm##H$4?iy!q9Z?2B_ zpXwHV2o3k!q0RmjwA;UkF8Ro~?{_o;pcpK{Pa7lnb7Kh?#(iE8hebWyNld|;#5Vj! z+{M}DXWUeJc!o5{32Bi;nUfS%#Yh)bkStdTyb9M3;JEsM9C4KcW#TFZ>cy1`w2!M6m>5?) zFg319U`<@6z^b^sfz5G7U_)HQ8XI@t>Jayrl{0RWh2zFqx57QFW8o&&FX2kokKt@q zv+!%P2vlNHh6kA+Lb=ULq5E`uXg*yNYDnh+U1VP9&j0bM+lQKvTpuGC*sNCWUIW4 zN6HPjkZg>l$c+CH&y2m|iZM^@GX?Awo|FFvHS5WW0YjU4gU5@geiOSws;j?n$ zB)IzYVGDUYE5m}->(_H!?``awcPO^j8x-sA)r-~eQpGZW@0ex> z?I&!ieS|f!r!y99!nQ}VvEI?oZocR(H+A$6HySzW+EAnY5LxfOj{FRD+)D1>5$$Y& zy6lF?AZKzU4E5Oqu|APzv38M!Sfj`VyLx1gT_G~w&K?;7Xk!N=4eczEGIr`nMLS)j zupN$+wN-LHKuOz6E^2>Et`4YdyUDHX1bA((NIg48q^g}YlE*F@Nn_WJ*wL|(m(kxM zccX72*P2J@DEVDaCR@wO@J8UDe%f6TVn|(R? zvVA7`wtX`>L+n=a_puMjn_{n$U&eHD2IoU^eJ7GU#krTf)48AQIPe6WIZb!`G;kXFqS(~-U~*4@V+E(^X?_z@D3-(`MZ;A`RkKM`J0mu z_Djc1ribwCMPEkwGfHb51(UbaFGy}?D|9~3Xo6to21KMYoG#=YC3@dios2mI8 zma%+zNUSREA1i~W#%kfEv5NR=tTzri6LBNwAl~34;WrSJTgDwk#=1MmE!QRqtPt(N zI?zIqapQ5bxP7>N+*Ld>?mb=;7bd^OXL(TO~{_Owq$MGKr$h&7a0~em2`*$ zeM#J2k~8i+al)G13TLN#!+q)O@I2Zpe4926C)0#*F7siinK>gg)vO)*+YE-3`8?Rt zx)J=vx*Pm#-3}HAJP-aDcojSxU{Ejcg2jUos2@BJP7U6NJ^$;$%fa)(hfrnkf|G*b zP_tlZs6RA-TEq{bI)R=c+Zqr$W(^9>wuXe7TLVEOH#GFhY#KUZHVCaSi-abaMMDFi zKGNRI2cIH;sEJuER2iO6Fgu2B({9km^$#_py+Y~eu+VGLC$yRT1Uiy_q2gqC$Rd+M zXYuUND!d@n29FD6!aYMrjpCsnjaV?wI2*i!W(TLBhQa12OE4vR9QaTF891cZgVS68 zKp))`7(KNEOf?Q{QZ)muRDr-(Ss?Jc%oP|c%Lcxe)dIO?PC zfZ`bg5grbl=Xb5ce7&`R*R?uv->k(qn|XL^Gl9pO%Kwwz^QX{VehE6!e?{8*+et0I zH%aMNATK;0FZb@^R^Cc%dSmc8))p0$WC()bd-0%iE$Gm>d7O$7H(EHh$;>~e-c&nTi-d?AGciu_s-FM!wMCTxT=L}^} zoMP;%^VL1*{OTTd2Dtm3cwpU~aaO@xZ<>?KnFTA|U!1>U8=MWX-<;90U!DH3^-km1 zT>Ks*@=;%K2jVb^frsJ4@}>&KkRev&|mmT(K8APwXR3vVG5S?DvjuXLGe(+Ks^) z(~PZmm3;%+G%RM9Vb8#U@uWSOZM3(t(clW%33~X-HuZ|z`9VkggIC!e?Ul5b0`p|0 zm&4xVWwLjAx$I+JVf(Dt2pA}R?fX#ieC4gPeeZ8Om;c=E3pJ2MeumfyzijNPUp)5E zuOEy0&0}%AV=O0cA1lM_#j^5hv3$I8ECnwX%fXAsN^xN~0~XcWeDoDE{6^H^+jJaN*=ByRzd zoGdbhTU?fNi@{!MEjiIGAUC+#?>lGV7SGslVxg+SMz7`?5>>`UN0}(xS>JFYsS#qdlk#a#4Sj z*O-U~8U27~I2m07*7$p42?_!8r6T?Vb;eiGS{y|uaT?xXiIJzwcuP$;(?<<9L_-U;&{>==OP_(GqMDa zC5!M*as=Oj^`cL1;~dn*EvQL`(tKnKtxNX64E74$M*g7xkX!T}IZqw(nx>#HXnL5) zW~Ko%1x;tZC%MfVqyQv4H#BFG2Igqe#q0w9v+ZEj+Ko&AoHUn_f8qJ;)>Ts0dPBNc z9_ePq(TP?%I@>BpcUx8H39B=`YxM#2qW7(i^qy6pUbCvvD^?}C!>UMEST*S=c-+S- zOS@Z@X+5hPtz%WCx!`q~tOnG9S@a9D3H{xyOMfwI(Qal%THCBn^P2_16E`r|vPd5DXWowzs|kIRtGu-Yz+8xUzUg8zw%WFh>|v^NZr)3^^xm6O0_T8x{4 z>x82R;B&ekUZ~sQ1-b{Gpj+Yjx-Fir%iv#hDL@*$3b0ta#xm_03-lvnv3_NY)c1}4 zfcpBYQBuD(s8+@!KTiM8ZwZg9>uY{N zeap|MKl)kqb3dj2?5EI4ezJl|k23i+m4+WwLB2@E@iB_|t<)#Kk~-&y)l&bptm$8r zVSlsS=`EJSy#X>exPU!pmE=yAP4-|+RAdi??;a4(+|A;myGH!({sP!2cDW10Ie7fi zohj0=>7o+rDh9CnViqeQ7O{$A8E|kWu?~PA#9Y=zjAI?e0#;S@h39$#ySO|{BeJjv zkGjwJKklFWf9?+cv%7%TcW3hg?gTEJ#XQ-W$6q>-k>#x6j%8`S zr`L!d_v-TVUJ-u7%fVlHlqY)3NB&DchkxI1?4R{V_!s@RxAilVPfAv#N&50Ni{dH9;o zlK1&i`HU}-kNB^^MEq4|5?5twaY@b$K)vaKu(kIWH*UaI~i8BWfs*;7F2Cy3DrSXQoUp?)e+jRvMTT$ z^Qb1W5VUDj7jQBfCtu06ayMLMj(h^wb!AyuQe}|MlqUwMB+(DhOT|QYKp!~QPsPc$ zDkogA0lcmYyvqccLoJo*)JB;s_rY(pSHk{1{09F(Ci#D|0sI!lWklwcT4s`IRX+Gk zS!H=uK(>Udj8K{70^ngnCV@Py3d;v@^(QKwG&Gi;lA@p{G9$RFRn%ORhw!DQ`ip3< zzlyf{8SKVA68-c+81FWSMS7(86BH;Hbz{MFec|g0A|0wKvYT2dx1I!d^1Uw!A$MelbYOC2v-8Dz5=jJ?>!kVq9wM}KSK>ubvRSDK-Wm(xYwTkJ0 z)lvtoKH9S8>acY}d*&A{%&dr74NwB;1Yz$3bb>#krq(c2-x>nmf>0^BOu}zC_ne3>vqb#woKQ z@MA|AL(JVqL-U)F&n$tnm=mz12LYeK^}PUjMVpX!bR2mBdsH#{D>2QJB#n8Rq&6=R zK`+4hgX9U_K`ztr!MtG}jH_#4Ox+6axR34zjKhD?x=^RgfzQ!fps-tITn8oQf0UtX^jCD2HbqBi zdbE>*{)QgVOXyPAe;KKJ(Qf*CT0mE)DRnOT68xTSsSNZ_Rf?`uwdf?(i#Ap>Xc4s> zstgC|b9s^;mzU@Qd4u+mw`mpm56vpiP%gGnm}}DAVkw;~*3x!jC9N#x)1a71zwmMN z7@tDt^0Bl7Ura0U$+QGtMJw|`v@GvS%ka812QNa?^LQHdqvW&y54q%@A%FO*$Toio zndgrsBm9x1nLmQm0A%$ikc@CHg+Gae{K+JhKa^;%19|9`CY!x@(!q=3)ZS)&HdfT=uR}a)6lr%gpFIyZFJOG zhITl;&^o6nn(dTAqn)y-rBeWX=ftBd4hCG*nVsKsR_8|@a@uJxRz*LH)zLR&Mf9;) zanQXPdQI$$S`@pd#>5V(p|PdvN6^#_i{(?3V;|($*akU1)>%%81>|b*&OaXeNj!`N z#DB5B`1@El{xMdb2c55eM(4KQ#98O}b{6{Eoo@bFr=xGU)%+HN{!?M={s^6>48sfCJ_V+et4kI9=psXQ7K1j$u@TZ@HZ_ z#OUB0G)6nOj31pZ#t=stZJZ$f&MAPiIK^#md8 zy6sf5J~*{4-|1y#c86G1++|izcb~P;y=?vFI@TGNSr^?>fv0YPfOImOL}O$;3IW(OXFV;l091WNiF0-gOGfr1?#Bmb`6xKmcLMAEPk~>3*oF1e1TXmcg3tUSLC-H5OwEe~d-0;ddAwxs zD|o9{6f`(aJPVu`TY$ekI8a-b49t>A)=hcIN>GcfPHLF7PIa@MsfJc=&@#8u6|Gr1 z8~FI7w4Ugw8AdP6^60tQ9Q_IU>)*}UXuP=-burJO+MwypZ+hUfoYjcY%EmL=-`GnR z7-Q%zqd2{3yeAKhU&t4uJV`WeVb_?8gSaBjhBM%*kpJ5OA2&uqO>8Cp(fAcqTX%6C zBMR!?9Hb%+9B zK1(y|xAdm^0HcefgA_5pQyI*F%5FZBIn2{C7kE||F*nP~<~rHKTqLKM%jH&cqC9EN zlvm77^10bfx@HY&TBT%4E4|EUy%ZU(tD=}SSLC&NizZeP@tq}kN9!?o=k4X~t?9gv z)dJL0nfOBMng2g@+kl zIW5hVP93wW)5$FBbTeh_C-XsUxOpJf-CPuFXwHk}HOIv~Iy82Yc8E=<)ncV+&KQXF z;V!siuOvI|&SbJ(hBUM#&T7BG&!ZRdf#?N1IeHE^i{8ftqL;7}IftJ|7U2t#{`f?s z3_cr4h0jDj7*8W7jeC*x#z)A2e;H|Fut+|`h&m`^^ajcsorOw78=zWIM|X}M*CV6D z^|okE$d7-ZE=9+y=h3R_WfUtfdP1`328rz6(uCZk^mY-M#!iq0?DwLa{Y)oAc2NxqH2AZa=Rg)DpY8@7Nf3C;Ok$ufAN$FD%Idn= zy((^NFQ+@lE8$-9a=Wj*qHYd9-Yw&&bi4Tj?WJ^!{fI8G^P4~0 z{mh>Bd9$ev^>Mq6RmNUomA9{1Wop#ib#plxu@rIFS#mgy z_bOc1yBJ>Moekgf_Jxc1`@+5bjp6A)4 z<-~w+Q!z3;UUUi12OJQ!!xu#L@DoubtVM-zyet_mDRYJ!OEcU`^3VkNGBj1b4egbu zLzm>?P*5!jRaZkpGgb4@F_k-%sQh3t{V3R3?+R`PZ-lG5HiW9A4rWDn0(F4XFc|#= z?4u%qE6BANI%?%KhFkTGy4Fa;v{o9=%xj<>eQgXf)8OySf|$`J_$2Lx2h&No4E+s% zA%EcW)6*2gl!$Yq%{rh#QlkxIL+Z>qGC^71Zq?>5Wt5 z5&BA|pft1!s!BiT9(23@g?80@X)b+_K2&dE79KY1sQhMB)->mXPk$Xb%6u+Xm?y*z zbGSHZHWjzb9OAY4iN7^Z@%QEk{;ye`KL!{3*XAxjQ$NW>{ws5j7c*OV!t_`MYctDl zRbUmZcWxtVq}$ml><+i?Ia91z&StBgv&TZt4ePJiZEJDtq17VxpH(<^*-Er;Sy$|% z)^hu}HO1azwXpYF)$AQs$lhxuM^{<m|K$Xncb7mn&p!(m^gWt`R}*g=811h%$eV&nf<>FGwXi)!L0JFm6`ureY5bl zY9{_x$}}On;bl@v^GOmmuO>aE=acT!b4mN?*`%Fxd(vw9zobQUbkaOJJ!v?doYaoa zPx_87Ng~ibAk&l9kQqrsNdKhDq;FD?v`Tu7TPK~w-zV+HEt6K^UP*Itm!wH}LefAy zBVJEN#(q18)_*&Ku6^5#__tZ$^*9g>O>T_VCKp5RlTDN_@?Lk39MroboAsy2NL?=4 zUk{Hq*2khHbR?Qy7qflU$$qZp+c(q+`w)0FEK^xxgH_vD6}2iBR5xP}WqxO;?Bz_6 z`3n{cF5soi34FdeiN7%W@@iI3KG&+ppIW7Ou0TdUF2MXt zf!8pfIpL2A{^DN^cJcFts`x*Lvii3|K|fRYi`O-L$=ed%I9MogO9Y(|=Q>{OaW zmYn7b%a}IGN~e9#s-}I(s;B*r)lPezHGsB3+8eA~+9#}1+Dj})+C!{F+NG>`+CK2w z?^vC*Sy}zGpWNnYzq%dM{_S>1d)Mum_M|%~?H}&Qv}fJPX)n9;(mr=LrTyq`PMeDD zN}C!|xQnxyX-l&nY0I&?X-mQT=3%ik@$70E%yy+ocBiI!<@QN)-L019kefBlM)zCl ziSC)yecW}a+qyrduH?2%UCPatI-9E!a=BL$%DX!gTDo%+2DzOQrn%oGEOt@CcK3Yz zQFng)Q@3gSD>qBLbYG_O-0i6d>y;{w6-br9o~6vfHl@tLTBpp!Ql`wx{z#FUbxV&|4SW=G6+`^_~R6evd#g z-?e`5Cs@P%+}0}ppt;&_YX0uOr$_vs=~X`~z2)yEcm4Y0AO8lv>37H1{5Qre@QT0X zr!wC8J5dBUa~b$?aQXON*Wv%Eu6(f?!@pD8!NuSYK1sgimc(Mc$SDenmf|4n&(+|| z#a({~=yWd%%l`to36P-XRgl+M7uk_bmzeF9Yrq?-nhSb+C$pOB)KVp!KI)&?8ufGR zEZkc$b=A(JhuE!kDtn|p6J4zPL>Fk#W9xH~5&EadV4WudxkHoug`4?ma38$LI}Lq6BW4L|q91wVJg89$H2 z=I4o6Bu>Uo;&S{baU;H(_$NM^cn@z+#N9{DZt2eLA80U4FJkNlYUjC4)Z zq)TFU+AOg$t&#}q{=|+nQ{s;_MdD~0N?btA#7&eY{ze0dN2rx}o~lo`sFC=JvQL~Q zB&IO)B^EPlB-S^(C$=<4CiXLbO&n>SNnB`piTljp=Syal&$rD+pI?|ieZFo^{(Qw; z_4$DL`{$kJ^Uo_x{&|U6;mcIB<(JXs;xA*&!(RrNU%m`7!(V%vg}=5p8+`3$cKX`X zocgu3x%q27^WxV!CQ7PnmQMQKoB-{?r1oYksis-^TQhU^w_4_tZ`I90$z{y($=S@4 z$%3YiJf^K9hv~Y=68btag=UNPphKhW=)q`HYS=YtGrIv@YS*VxyCtm=`+@F?4WJ@6 zkal%OK`z92n&8f&{oP;aO?NXb&i2u%>=J#(uF=BYZ92!hN?&@1=y(2Ry2PJE|Mh>Q z)p%3-3olL`o{H8HugG$7mfRO>NoEOd{jxJzBP)@IG83tzqIju#gukjIxQ5<_H|y2d z(@XJ4v=l#u3Py8d3f>RvB8pq!X1FZg0)AT$@GGM%RGE5%pT#jU84`4UGOE%J##~y@ zcu2o9%9!~;VVK@HZKgAP@X4-aC7~JCpWs`y6~zN5vv&Y|CBdupb08(k5PYJC1TX6C z!L?cir|FuZhI(EolRg)Eq;PnrDi2YhA+xT;kD9=nl67D3EHW z=$~qZ*pjNRc$w-4kv6`ts0A1hulT}voBtYrjUS8O&(Fm#<|pHa@>}s;`Gxpu{C#{O z{v|#&4sTQuV|{ao=#cWyO6Sqw?1WBZ)8f&>ZZKH@}}I)5>w1#M^lVv z(^K?erBV!KvABM0W8BZIQ`{JqEp9%05nj%=hxf8E;RCEz_$*5w{+qoDont#gH`u7q zZB{7skR=75u?4{ota0!YdmjjRivp%sB#_O!YUT4rTRFW7Rvs_O@*q7=8*xc5$Vg)K{Ck|Je|$PN7(oHF9vqq>^`{HEdx)E zW<~`si_ylrg9dx6(F_lg=)A0ui}nt**?aU(Z?xX))d$XBe!bO;s72llwZvNvZ3ng9 z%c6F8kK_?=kv!@(l$X4ixZ!OP!s{U7eaWl)XL%P$teNDO&{{$78Df6D*f|J$cf zRXOXu@aK8HU(YjmHmJ@#VY#4+Q<0Blt$0H=oabemxXJ$H&!F;i*md|%p!F@|76ccc z%HpWgOpFJ2pSn&fL7aBtMr^2<6`Le}h;0{nV@HAUcw5}FU%`4YDwf-Z9A^h%g_R&{ z+NnTkl2v|Ta&m06xoi^cBuhqnN687ZjKM=HWt&`alx^wR|*E1=!33q}6Xr6ad=-N5b#jE&AvXXnt3`6derqeQD4FIJCda%oz)h(@()i6u8^0}?>JKEZ{4pdAUrdJc zUF3IulcW{Nq_ap(kBdAsg{(lk${OHr*olT!C)!K(q(@XeDpX}!TgTI3I+5(uSIITK zpLlvZ$$_?#I_Mx7f&L`>&<7GjQBvJVM<*B==-);z>KJKYwUvoZ!Gzwx@ia&Rv>^%7 zDTLC$i9*xED_kZp9}-$#OIJGsdB|I8CT3t{f_en}rY_ z8A>+hgsvO=LKlovq1DEt&`cv1YG%ZTOBiLtDU5dEH|VGEJ+vtd?$qI>=ymvK^c8X< zWw;E2LI={}ui6e@&^Yddej8qPmQ>x*cAtE{CV7f5VgExe;)_r@9*MtS*LYsB_^0@ER#kg`dhR;qCIT@ECb9TnE~e za(no-SQq|7j0&$2y~ATft#C_`FI-UQkl@cCRr_RU6<-qS#s`OT@hTzZrwKjvUj+a0 zPX^EV(}Fww9>I;UA34tt2S@l<0=@iwfu{b{KyiO$Af4Yk@XYHO_`|CnnD3Ph^!K<` z#Y?nOco(hv?2xsUt+&Ro8CDzC$11{_S^-why62X$4!htf?q;-Bx-oO2d&*qmE;C2D zjm`0HHnWHOn6`8m&F?-c7)Dr>5sR z6#$vNf?&c?(Y?odfWO!)O=P=ZXX}<*n{oY>`rw!9 z*L1_Yotuw$bldRW?jSzUUB&yldw2);6>s7qQQIvqD!HwozaB60yAwq=cdf_*EQ8#@ zI>_Um6(!sxI3JJ&-7+$_+e~J3rvXk#>`EDR3aPhFclF2_r=B^x)hGC7k*ig9x1cWU zw$)XDi&oQJr+c}_^%(bt-sQ&hIq*TW!5=Y>rAGx>6;u<_JL`aFYhU&&>djuD>C7-j zv%1C{Hqn^Jju@+91l+-jM1})-u__0`8RcMUJ+x8fsNlW3Be8w>4c&we|qc zsO45f?YFo(0;#h9S*5_Ow1G|?XrW66y6KLAae8=Qkscj5r^ka!>A-;2eZir$TcA8@ z4Kuvjfr%)8U=8|gT}1y_iD-e97JMce7`3e4MoMe3fvrQvbMqd!b9%-#Gc*3%EQBwa z#X!H92R}D6;V-aLg{`zWqm>;Ow2I)$Rs&qu>VX?sQ*ldcH*RZP!JRD+x3^M~CRSlm z(y9hZoJQoE*$1@3L&z3$92sxU22Rpc(%Afk6gF3o9OgzM>26{}b@L@XLf+ED&>jbF z(+TpFo+j7nHFBChg-Yi~vW$l4Fq(mOqfKZd+LachGiV;Vihcr4{~dCct_5EI2w)a9 zBZgUk1k5-RgoJHLkKs>rF@8zA;ya*Bh8a3kKFi<(v;_W*R>I3bsXUqHhkdsI?gk@6 zC;G`~M9&+I>0ZEGc-+J21C`NX;5|BmK0y9Pt^v(oY| z%LzOrEKe{BJi!-YCVMKzvg4uy+ao%&wW2*+B-*frqAi;!TCmBYBl}SdWBtSu;2Ira zoy8;IBPFtKg0Ysu@Y)H@APd2(1KW`mMS@pA5P$|AlEX5IZ!D)s`oA`Zc*7FJzbsB% zU>Z0=KL3p+@$Kw0|CK%E8`&G+3|)uEPx)n-ZC+)U`A7B#{|Yd?YdpdGix>9p@fzMm z-rsx3XM4~2@1D=!d1(altB7iT1JS@ACMNph#2kOU*y|q_C;hA9tPg5DUyIXz8TprA zTVC}?%9r4>==(cl0zW5<^SiP-Pm*2uXE}*Wxs@C0EKjT6@O&znS5lcp2UT4RQzOJi zby)nR-U+U9$o#sE?5ih3PWJEeh<*S$*|3)K(}P`we%MbQzp3f+Z_Y^?u5 z+4T!lSHDG_^lLO6FjhZBEA+o;slJbX*U!-bc7oE`vq4Gvn)ZC~5 z%*fgZ?g+HQ7=g|kOVMLvH+Y3zL=-P^a9qe}N%9y?iDgtF*eFRJBgkt&9^QnWfzS3|xHsC3 z+o5?l9~z6(qSiQ~YvE@)C%&Pju}l98jKsf;VR}0#)R!9#^%SG59&8lX-Hoiejgd}Q zHImhL#z$4yxTFdi2UT8Usmf>!Q}ISqWg3+fHF7HhlB5#WqBSNtHM zzmWeEjlnIi9H5e1E7Hl$B9q)GK8fujNvst&#VYYwtP$75BJl!Pa*xGo@los(5ph7o z#06l>T>zc-Em2I~1J>MaQ6AdT@)}(0tSBJQiK223T<@UZVxxE_)`?%mGBE}?cQwQe z5hrGfM|^?U4XnIne47}}kBd?Kk?74aIH#7BeR)eckPnrk_zXE38~~SrtLj#MM&9EO zM=j8F7YesCjSb@A$^yZ(>AZ86Zu#z0XE;D9llv}*drz4 ziq0Y4>B1tW>p|LIYmo+x7P--SQ3zcVHGorA3gwh_Q4^UD4VUH75}6yFljYD0SpfxA z6_i_5MHN&9R9O{49aJUMR+UEMKz%wvwMH|+&trx92`y7UqCILXU=pZQXQT6K6S}Cj zLBDhyT>v~%XVEit5k=J#ltO<&`LtnF)oG0eI-k*7mo}Q|>d@9Os_V)|EnUjUsY@EE zbPo6{FKpaXS&dt&gmF}5Gya6f2jDOLh{|jnR~d{`@E3kwr8O?AT*hOS!+5JI8eHWu z;&gE%w=QfH*5!;EaP5k^3A7E2Qo6BGR97$x!TJ0;3p}5}D4|WG41Av2nxk4e8GWxK zsDXZjn&|&fb$t-k)CW)zJrkAFKcm9BDQcvvqsBTP>Z;SBJ~{&$ro(8q&VyF#oM^lL z4jtA-(0N@4-O#1c8(kB<)fJJ@Wf4K8P)3v+WkK2CUyQP&WcZ1TIy>5^Zx<67ubV;Q~e?uDU4Pd}uha}b;z=*%3s-e@WBA_Wc z4EOXg^&L8@vZ9m9LI)M>?5JCi=(VaLxe+>14S~4v?#4cR2&N zoReisV35|4BV}%2i()xg-Vrn95iv|I1V_vP&?mHo>Qg1LL6(Dlq9F7SnZ*nl7C%cO zrphQEEx!W8^)+81AM&H}Hivyn7;&%gZ}J^~E+6o)`ocfTkK9s;;BgFrb8yUo3F}D) z=c)JrcqmhgTfm&XEpv&}aC};36vyHGUTKI!(&q=^efCSmPst=WHpNN#g`brXejcg~ z59AYmTfTw!y2fw7@hxai0qb_Be9TuvJ6JyF-QjaomM?e__-q;A{R#ZMBM9_UL2(ay zmp|ZmuZZ$3;u&8Gyx+y*GXF(9gu2B&z7rlF6-oSoi19bV;|cJYGD-`oaw))jBCY5G z-$gH(0N+UfzMBkU2VfWYQJjH_-Cxk-oRYQR^HvwX%J0N}nH&1s^x}Wg<@4b8p9`ON zlKjNy$V>beI9?6k+hO>OhvWzTAAGMbWl(S#2fbA;kwFy{l~gH69W5nBsPbYOV2f%l z_N&(7Z}qcys)mb?kTr_+5)rR=itK>G`h=*VFNx~<1!RtzvaK#D2kNeJB>1UM(0k=% zeM>ITFXR**QY&>fwNN)#oAfZXOaD)u(5KV`{Zzfz5rx3BKPSqs3!@rv7uL|t;7%Qm zn&~m9r`~`D>CI>n+^uWjZoQ~?p?i7@vd~oP_}Hw5%H3^d+Ijs9okM~96<=pUmxdIAxcG;po(-QYD1U9+GIW2OgEsv>1yhn_Y9mIf`r;S3R~M)R zu}!_@JJn@=MD68Q)f|3ajpNT$3rG^K1ha+&o)45JH9>vSQ}6T#>)DW>FaXfN-=XvS zd%?BjsJ6Yo^(*hJzT{od2fQ{)@-AMwmmu%rZ`kYErZL+9u7%5WUN&DBXNz@BHd8lX({yb%QrBk#bXC?JGJIO- za;y!!rj9Pe8tQz2EdSTmg^ZtiIv1-9*JuE!tV67-rYxIIU%+3pVZ&1Ke*KPQD50`6=6eE3U91R>y1(g-V~MF8==yBb5u$1 zM^(sMph|%Pu7)>P)%5zSZt%LFydTtjuanx~)mQtydg>^s6IFhszmhJCZX4op>Hy`@kv%OBC@sdR*p2j%BjYCxd86feTI~qjr8iikzHLf>Zwmg zYxUU}uY6;*Ling6_<@SY5tSOp>0-E$u8OPa?{NqH6CSKbgNE!kyhWb^J(-OkYS^&U zg-9xtj}%AMNdwf9bVdEh7&L=SM{CGxw2y2-7s&?ni2Og6&H_AcoLj?^XD02I+mxA^ znHjgt%(!K4x6HU@W=@%znVFfHQcfCMaNqR5Po5LWk}P{{`P0!MZ4lDGQpEOe68Zhx zL>d1M(a^t3wDBJh!~6%u82?eR+TFqu!&Ivv7~129M7L# ze(~p$Z~STGLw|-p`|F(cCzF@_apf_8a`sz_+;b_hyhp^^M}9&24zGZ>&}cdWeSn=TKtdfv~z46A&n<#P6bUf_Epr}#c# z?fXIY!dAGC@0D!G>bsink;Kbcrtlq-LB8$ssWU-dbcV`>PCaA})nr#EschoJlEs{- zA`QD%31_Q#C6|lC>>#mF_FxWgD(cI>MLwBMup$;W#V@;2e6>TxUE51sw^hU;TU;El z8N~`K#D7FiA8L{G*^TTJG{(lZE$tg{`Ho2dR(~|B%{9~4Y%ycZT#&h^8DbinfhMo% zZ!()cCW>heKU~ec*M-ef*1ZRHaNcFRc_X&>GUZT70;|VdI3@5Cn}@i8BnX$OK*#M=uJ__yaj5P*GsMOx~paQ zs4eh{szqKFD2|$s|JiCU%$woCwc@8X7C*I7&`58sH_%(@4fE!CZ7FT*_3CAUedWG&@3^1bBlyqlc3-&5-B7f_58T=K*o|}_x?|nT zZh!ZY+s!@fc5*Mdjokfi1E>~M)!pvabho+X+^rn%aO>iQ*O4|uIe)VI#9cw(8{Dt7 za^0h@&)elj@y@%!-f=gXcg@Y?U2rRTSKSWe2Y6521>ReCl^4r9<0bMQdR08-HS}Vt zv0hd+5AVDkc-o!t>ZlvuK=srcqTXZq_Rb5zQ|~Yyd>4r3b^(t3E*^YWRZO__cs%J$ zMD8!i)32glt4_R~b|C9m(n0D6(gua}L94wg3X%rDexYLMFHkfcQzz1~bP*k!w;x}3 z=4d$HX7li2Tc-cUm#!_Vq#k(K&BVWLk-kC6H9XWl>Cf8LenwYH6Ko2bWTq-<8$nZid5?ED@W{Ua`?!X65)uTr$7KEfXQWniSHo_Ks^yu$KOtwQ_q|!VZ+B?JQZ< zE|v}K9$C#El5N<#5|TfQRw%b!uEVgIn~{$N?!pH$}dYf;7Tm&Mpmu94r0+Wv%KR8rZ%Uq&{> zR;Gc!o2>2cC0qIz$@>0v;Mh&s&i_vK_ZvBuedibY|3YsN+d1cVoJ*Ab_Dkm%d&Xo$ zW0Do$uF8QAMDuQ84h)p10)6CV zB7r{&jKLmwlKdE$3oVeJ0&C>Yz;fveT7hO}u1p)WNMpE zbRD`!{;F&ibW2tXIwu?A*Ve(R-Jw9tq<>o*G{MIVS(SbU$PoNUNsVcv%sjMETD2oT$ z$?SpZ?2FTqXy%QWM_MqCw2&wL?d1;tKXRGBzZ~r!Ap82q$=3dUvXpN>)uObosYv9jA$-Jhde63j*PS=^fOCmRj3@0NXE{FFt87u` z+I)-|zcbaka*4etm)gB@hn+4D*unC!Z6uG`igKq-CpX$C)V~rF>|rs2RbDGQQdG08 ziIP@AD3egICz;)BZo*TqMw&6r)?tr~s-_ll^CC8lNowQ3X9vs&<2U!s7rn=P)C-Va zv^A&kJKdlokW!rH3!J1U>pFTg*xXBhRh{((RbS6l)%8F)q6#VpYwLLWm*>aB_Ji8u zT~~{}-T3Yy>t!dU@SaUKBT- z_cJ1ncOk;KDWAHpC>?eix*Sm<>|8{-uoILWkEj#2pL8c0=(Q1*iP2FzY+*#1 zu#kvqVH-F;#PRWnnty12M6<91XsdTew5Plw=QRpD8qq3jPecv+Y7=%iqHfqFj?Zwt zQxOe_`O%2Bb;Gt(w>zRW<$c1=M+^>o5-~aKS;X8h6|puf;GV>P<5pNUH!Q4z8$GM_&TP3`&+bn#xJ0yI)yEOcgyMx^z9)yRxpTix``JKT_PK>7Xc&t_Y-Px;!mw4~r z3%yCdw|XmnAM}p=zTiDY%j2Q>$%{6pW<)>@iST3pnNppO$e?~l26&wzHaZ8)|0*ZdaE}O{(25_pB>18t}_lIG~T>&kY&Zff5lUyouI*rJA=Fw7M@i+u;To223= zlGa4XGiurKNE8ohagi_n)t$Z-=k1@3n7=?=LjDY0%hKBtk`1f588b zKiJ>jp9?*0VgEvZQ~wr!TmMo2c%oL!_P_COC2GYUf2_bEe>SLKAjDreu+d*LFvj01 zFu~s`(81p$(9u64P}4sqP{Y5BXcB7zmHh_-fBP>JUE)TdssDALz5jh+2oWb{_`Se9 ze~h4A{)oUff0Cfn{^-PSOCNLzI_u97bkv_aXp=vG&@6wcpz)-A{H23>_zMIz_m>E2 z;V(nviqb(f{EdPt`)dZ(C9*{mf9;^w9CxI?yT4e_Ao}?i8bpMPKE#b|?~g*13@50z z|9hYqu_N>Q9|RKm9|xrWXyCo?QsAU-V_>guM_{&ZUSPCuLZGv+Cw4;(0tJ1g0&(%{ zMc7LW$@BhO_e{mzj7s@ochm56LNzGn@5h{oLgx~oyC1vEEgvZo5Vk$2Zqt#f^Ry7yJ zR7sIur4-gPHr#uPF5;-Y=dHFUyrK4#*9yvJcY5LGkax+fC-UT4uP=7m`OFM2v6M<_n}hmQ}qLV>pS;^dgbm` zSKRgLlDk~(b;qdf?r^o9uXw#%O>J|NsomHl9&=xN7u_S?6?d=q#GUWmc1ObxcJc1J zwcrg4dk@@9-d#5V6!7l2+Px0HdKKRCx_cjv^Q-$5JH{vOclS3uXTW>yCh{)1IlPl@ z0dK8a4lBpMy&-O0uZPTkECYV5X9HC=2O-C3%syFt}+cc}XAc~!+dtxCIZRADHy8(U{~Q|fqb zMV-p6O|*|5?Bh3B$8pE&#O`7p3?*>4Li=?Z_q5LH-qmH@*Se~!h~pX43~)1;>26`O z$gOX-y1mRccbYlu?l1@36XvM<+MIHKnDcHt*l+?tQl7JoYj5{NjWcUwrhkh^VTB$i{xCMOAxITm2)NsEKHqriyWj z{p{6waag?l|&zVN<=#*=y%G z=j|Hjm7VTbyjE{l%%`JV$r^5MB2bXQXoo z9rX@pgR{gr<4kt$QS!@a=tS|gbkh4uIPkonZfUgB74iKlQ)LSH)x7Yg zIRXP@X{bV=gDe|pE33i()elsYO#;Pb%Ro`tDo_mGFpI1cNX_2NK{8L^r$`^TgAC%h z_~oA?p85NUo&M@#lRv8%?vEw@^@rMK{@WJ+LtD(h&gS(`w6Xl7Y!rVdd(YR(o&d9! z`10DGzG$|E?}N$byN=DwO5-_;u#oS-F4hgr4yTZr;3P6#oWD$YFe|6?SVwWr=`eXv z-;t~IKDk6MkdyTQ;$5^P-bE?d4;fG^okTX&@fcBIqNsi;O6Y4MJNvAb&}&6OJzkV$ z57v^p2FK~4=pw6rV6*C@R_Hm_sDbv1s$nmx;zZGnXICm=C#&aXoVsKNBeUwS)|*~x z8j{vgW&lw~CZeYuioSLvdfXl=wP~-EZjOGp9(%YoK)YQN&2?>6TUS*Xpl_F2vr2u&`uo0j$veiX^^kYYTkM_n=6J_he}k#4 z$J;_pi5XMa+vTP64tw#T@9qijqkGCb?Vj`wKx^Dx-aL1=H=Wh*5b$RZE8*VopFP|V z_|Sb`7f`XQd&leRKK8o7qYie1RBtyPmMz&-e>Wp(N!7#6L%tFiRZ=x~E33R%z~qNl zO6nG6&yW%-zFP#Vn8F+vS3cUrcdIHJQC&rIJ7FN(MFrexDmqp&QQiG24al9&4O2zk z9J-`iMOSf$LW^~4_mpnv5(B{vC!flUag&*WZZR|0txEK;=H?K1b=MtB6tQV0zPHun z@{XFu-dppJXUu#rqh0A0wa2|C_O{ozyLR1a*b*?YYsoLVMYA0TSUq1GIj;m*jLV5+GWUpw$ z2s;~v01+om)Ps%6BIC?MK1GR6gO`~Tk>7ZGcm$^6jQOcm`B-W^A25XC@bpE z;yJ5oZGMPkHo7EY39IK!te$houC^FasA>_7s*c=kd&`S^sH>Zr_fJy;h z6DKD2G4XxfokYG~?EBFNL>o(+3C<&Do^#p>adtV|ot4fWXRLGG8R%ScsyR=b@*rh= zD30^gc_XhoPvkvpg|0Z;G;yH(?WDCZ5)}+_eA9NT}4Jf zR4reKsN)+a>Z31fgv_9|uY_pgOD4MbqLcq&yZBz%?!FVYlW()_=9_LC`})|HzJF|W zUv*p8SJf8u6||*&d2C8wLYvJO-zN3_GFg4$>_+p*gXI!b#N^kxRyshkx9@oCDc1) z0w&tQ&myk zR5j!&RY@KqznZnV15gT;E{(=YMbi`iaFF~O?~)fA(NZ8pfOC`Nc?#6LvY{nyJY+IXeJ za4)0i<&_Xq@d=&Hj%#bYOk%H>QXHlHtQSYz^x}zY?3#Ytb4Vk}@C7S-#}ncy+{Ifj z+VDQ znR;wisv~Br+F|yq`Q{{;eILwzh;}So{cAiTMI~d+pF-C$C3Oi?0;;7mn%Y<`HPJ~- zV;uv_rWmG!{)v^s4?T#;R{iyTJp|dnXry!_h#fT*iQP2*rX#akLd{Y=lxR}Dp*F~S z+vxYYn*PgF#}=Xh^5CL69}%T0m>jyMNv+$NRJsQieq&5hJ=G-Et4u<@&cr3UR4gdI z-e_X$^|TM6-BQwdCIe|I+Gf$KO>S(j3bPkQRlR{bC3c72Z+h!(*kheB1N24HM_(s> zV@B!Ekl)T_{W)Fdup#K)mus{udZOK-7ueJKv^}98VfPgf_jMxi4eOszx{T1ek+8Zw z);|M8Y%@f}H6uh4GYVU=z9O;dC(@aJL~7F$yRx<-hv_Bqn3kdhRzMX@M^WAM7A-li z9p_Cnlf)Ek%{H1fVxI{SC(I>r9SfkB#)aZbYqCq%)ROUR8)%fwXeVOdwovA`%aAs1 zkcFWl*udqn>#*LLjdjp6S=UaH&Foy+*-n++C>v$#xZXbF1Y_+HbZC zkRGj&CpqUD`TKUc{9&Z5Z;a{7(kUWzsLv8_SKX)(=Q2cS|eI((`Hg3v_=jp2-(PqkMo4;|b_~K_r2) zgX(3RRicVBRdmFjpe^np0nA8! zZB8r@bIG3AMYKfj_77=on?^Q*8rZ~GB}PT=8^jy>jcwF7k;c9k@$75tP@jr0^H97n zr?FT%FOHktVhgm`>_Qj5RP;9ML=`h#ls02Ta?_s?)>!<~b;K84nth=PGZOQQ+d4Zl zYz}c=XA#GBR)NK_*r1b$2|9)t4iP&<)YID5(h;^8`oY3F+~(Gy?9%edrqxevT>a3- z)c34am#tPe?H6^xzE>ygL$%J{RBP>FHOU@PBkWq$1q+o1cD|}^7plB=s>)zztCZ}V z5E~pxK^lWNrSaJ9%r&dQmi6kp*@Sh=R`tznP`^wF)-KD?VJ=cP(7<0aQ`7;oQ0+D| z)g0PQgIby+V9inX@jZu)-#M&kE-Rxisi*ojmPVJbf_#L9(RsB*KU0gahMcCKV+Hv_ zP1cV&exj!9`&jZkP|MK@ZPGW%pT&CTidscFnf6ol9W?+;%5K_K?R0WoPp1NR^6DyR zm-6WHx|pu0ljxc{8T4D#)IU@meN|P#=CLLb{wnIVaHrS~U|ZQt&rzN9IP5IvsD9X8 z_RwRn!5YLJjl||^Ja(Fs)E+%Uox&#TuAYrG;{x@SNP$N0RF2t>MdL-4#9V?CzN3no z*Q%U(uWEs`jiILIFWuk#Q2mTw&oZHEAu;;)LD$VE^_p0Hv2B=2#@ni4gLDHT=?&x! z{%hmtsW!EqWm937nn~kBr#JJK5A()P*>Z60HT4tQK!33v7zLfQPmE<`Ow#eiTAcz7 zaYk{35p_|Q6xVeNaaXrQQ#=-$Eq?10;)A{iz6tqNCzBwwjAE+ELShSq z$8xH9CzqSAa-A_)EJkyVnt0ANlgW8v(%}PK+!3~r6KtzHiEK+JuWjsPw*#F@wwY6r zw3%(|)Ik&7g=nTNEz$dIb7z>XM^w{B&Kg@Asd;PXDCud+A5tDlKFl_BVhJM8iuz6t zQNyVXPgskzCnz!u#F#1SIqOAFXCEkXob~QCF~qq|inhghE(Q}xwZHQM`U&EEg`}+Q zSW(uAE^|44naoKnJNJd zUGF_{8cFIQXc4xZ^Xw-v0KDpf9cm-{13S-9Y&;`G9_&AJSiubBpz{in4#)3|Pd+oB z#CbUSUFMqDi5=@qvjpyb5;m}H1@<&s z^%o>qnM4p%@`Zh&9@}^7n0=tO+uLd>Yu1V2*+6@Uc*<+ApID-r+hM9PyT8=4^@&0G zH)&2)*QO$k&CW0Z(jZk6d0kVS`l?wEIb9ItQB(&jI5#H!2-TjHh>EHO{8vNTRiUgR zX(nsDw8U|ib{AoPMc_Ivq94gO*T@EG};@C{c;!c%fn*E>xiF22lK=0WPWTddi7E>r+MAG9P}Mbi@s&7= z)zdar)*Mp#%pR2;iF+z@T_rb9k;H#iiQ(~*V}YK*#L=mV-8@j%f3+}^v_c0P4mbBzU(g;}*YElxI@e#?XOvE8;+bsdTl1h}Wj{jfV9TL@ zZH5Ivchk>IGd-mXOpI|X~&#iq9%0ZlgJvGN*Z zN13U1uo;Usc8Z;7X4^?-AvU@jY=}94&Es`@-8{FC(G3Xfe;w?DGumueO_#zVxe24S zCnI-?Xo&W!lRYdt*t6mvX5H5I4Hn5?MLk9_)_B+wN0Uvg#Tz7!Y;Cn@haRCT7LQ%A zdhTtLz&oXpqnOo4G2_p|LV7a31q*Czxd=_~a@${Svwh&B#>#_s5*oM#@KUSb9Ja_y zc9*^}Pw3zsi;hJ67&v%Tz9+tZ%6&FxWJ z)$X-b>@J(nZnJ6aW}6&}X4hF`R#?}pv|mZTm=Mw(_VXXwV?SV}`-1#y(#K}IePB-6 zTi6>MF%O_SSek!_!t4^P*XNrU;Ab*1#-zi4AV1QQ!mJc3iUv>x{0R!1hQxVqCF0;$ z@LP8kq55BD?g8+DW5ixPN^H~<#VS2n%tDSgTh9{HnbAk;h2lTbK6Xq{p5to*pNXkP6*jMAyAVgz6>2RbTN* zbrttiPkbagi2bTFI*;~9vRjGiNQ!2tT4J~=B!;T|qPt2hdVi7UW(>4geY4X^SL5%o23kpeJ$)`y zFQI!jL|vrp7&dkX?OwITo>n{T1+|_zWQ)B6fBaBwwvVvAdrkg{n$J8l)xJ@q><85r zKDwO^S7mKfT@y?0Vm6tsVuN)B`0jF0d7E7qwK;Wh`0;EupU!7X;yqLWs;x8Ib~-WM zL@DhgoysmER`O1r+8!dkri1ZqOK3l^%i?>;Xl()}0{Viz%Qvj5LQNLZB<8Ehg^f!l zJQLCxY4cH^j&|j+eJO3;m?qfHb~jheIJ^{=nS*AZIcl!ssqo3{HUYcaq{1p7pWO;3 zuQW}-p?lh##RBYsePUkQ_XZ>~J`swp z*1`Kj-~|%f))CQd3y~PlkZ62=N%$6HVvC-{E+yT8@5Ua=&j^F(OAI)XFl2&3a32mB z>>vXSu&Rn;Gh$_vUrJjTDuu^O4eIL4AMl_qyObI;7@8wv*d=(xte1)GW|`VT^U%UCmxP_*+*|V__><=d^kZoCBe^o%$;|5Uytn&^8LZiF5?Yv0&m_J-|2 zeGAJsP0Nb*psi+)+oBe)AkrN6l+8(5GHeYKkp|Nyh_YB<@DK1(a-Fy4B^VoOKbp@r z((~sdBk!$Ag484#X%_LsWP|dEJNRW?CA|TiH5u>-N{<&%O4i&l;Z@^f&n2+&l2EuE z2M&*hCmmpZ!GUiBo9LpB`3s+}r0}okL+GQN$$>;W2l-qgFIEX<@h~cG%7f1p zuy3zI`vypOYKv~9158aZ$wEr_6mOqUZ zUyx#j;dS}NB;|`uCPVQ{3&U>CGl}_nlkvqSlhNR|l0k`}q)7b}!Hva4W|Dw)Mil!2 zl=v#*AUBD}=uK?jisbeM2=WH+uU8^I>y@;uQG#io93Qn{MtMy9)nekqi}(x#VuNZE zCK7U288$ZUs^juEMB2lCx% zUxW7bxu**BUy|#UB`v`DW#}&(=jX>dB{AMN2}C+}R>^IZ&4aycS^LqJv9D|``vl(M zfo;rJQrq6Kt?WJ9j(iKggKnhF`8L{+atE4Jq-`CjkX8u z0K3}uwrlNRc5~@vXK_4=_9MvmwH;{PksjLFX0{<$Y|fRd*-Dg@;HVha&&hF4Y426KiP>l`bFtE?O@8BagJ z9{7=Ytv{K^`h~f!i6N)Im=pS|*{_ue(I3oO?V9QO4f_&&#a8&W=|$T?No>;`!55WGCM;^nzXlw@buTI4&3y<&jaFUE;WVm`D| z+!34M`A>*9;w=3CZ6V}KtkhqN6iA4JWkBYTiDi1EBZZJIqkETs%NEF*dm$wmg-m6Z zY%5nHMcFAk$^%GQE+UP-Ej!D{lz*noLrxvlX@f;r2bqeUj50Z0WHzT2{`S%GNk*p)AkcX+; z%6)8g2FMlAJR*S4#d2)|78m24TEq#jf>yGu9OLAbgVA6Pb~4K0PD;KTIV&_w(bg zoI_qPY2-0{$JQZdT7ryeJo8Ima~8SM5mAGAry_pT*_n?rnThQ9J47Tx>*6!5MJ(n% zB1nrM=H{Qs$35gnU$JHQj-2V8{$?NRJIInrwc(D*n=y!&7lKGT|+^P7of;}5abjR+Dk^Mok(;Knr~_iQr$J?gIa*+ z*<2*LbIeEdYN2Why0z}+0rH%as+~El%9}NKq-|7L%?vCfC##fZtV)aRL|p79;+i%p zU^=q5Ohcu0D}|?>`i0%Zee5MZ>&EJVZb?~7WaR&_A5BN~Q1?@}^#FAfiS%70)K{>? zy?~VZlHQ^Y69M3eK89raAl|K4|3nk`51INz_O1C>zf)awIG(XTRTC|+y!T<#8&y|e zKbuNAp{@*-(^+*{onDvGC9uvf%Dy!fke*i~UqffsjmURGqTW+yMDG_LonIoo7GI5R z*z;e}mOGBBe`$pb+^-X}3rupbxBySBtVyJ+ngqH7X$SOo|C;1_B$B96VE9y%RZlbp z^<45Z(L62$hv#D_y3|zBYtcf6n7aBfI=#Kj0XNa>-7!7%H?Y-3Qk4Wd($sb-E3I|V zW}<^^)$LhDjo>YhMV~j{p3|%B4ZW8g)K1%1Xh2@*m&A4;tUS`j032NsxV%)RlqiH( zVhK}2R5Q)t!a9l$rU%^IFgU8QtkS266=o$|&_=xZ&xrfxCfb}g;uCQs9JD?Gn?fc; zJCqU6fb6!eEN`33DtHDov14RgbaVaeHaXbtL>G69ujH;=h6ZY_4U@arQEQWpf#r7` zXO~UE4!e=EyY#l~9 zyTuac6m&zZ=4;=E+1{NUsw%_BcKr75c-U$R&CW2d=%0$Sd5x`S-vK(H|&*(`Yi zw7cRglBb-FST(E$1vi3z8z|erP6wN?wcP{qZKD1tv2w2$3~+A z5klJ$F{Oo5z-fRzT79Rm^S6`UDdOZ|r-c;6P|5A2=G^GiNp@cNDAPF4WIXO9v2#Eg zW{~Lol2B%p?{bX%z`TLCD3+A1dGL3vC6UjH|EZ?H5d?jBYVS6AR$n!|S zj-b2Tgd}YZR>)J(WzG@@C9|9yjAj+?8*7zCvYJ?e^~!LhTqBU&wUWOWE%#ZyT_B1{ zh|R_bNr?tGw(Nq;y$*bB5gR6Q!T&}>KJT~BS?_!h*UVG+@fXCGxC77rkWqS?Jpiw= zhBzeZGD7p2{fy`XXs0)$Q(VJnUj!zO7Y~pb-Piw!1G*C$p})l#H-! zyLX!+Y6Y|e&-%$GC0LpixwlVsGJe(AgyA>&!YfDIk1Xbjm&05pX3#M&j@j?|%yyy} zY$kfa7Vo=WP2A(n-V@SGI>fu6*WrV?+B-siuU_fx)62XKdbzh+FY*?UPT_bM<$dta zY^pbUjr1NtK;d$4Capfam9s)*Wwo!c7K7%!-{YPTAy_N!59A0@k?9Yhn~i5Jx-tl>5( zpWdJn>TN0$RGPReRnR52Chf-YaJ^4W(VNvm;y`Sr{4n{e`ha>w{U^}=x4w)vHB#sJ z63yy6RSe001LNqH&@dBC4~GX{4llb3+&zZP1kp0|V{rBtysyvJ1xIV@thT8xW7{Cj z>Zseo$M$1(9A(EcOD@&Ru$9;bz8?btMq39aFFx&cBjcc8X**L36 zz^;^uScPXam6)+hvYKry%H#cA8JmfwtTbD*y6j_CiGFCpCz(@>;0LTo->@pSVlAHI z+lb+_lhxx9Q(B%SipecgMLsaK;S?INs%*h(vb|L3BI9Bo76bW5dOI2$i9yJErh>n- zkg+V5jqO_GF5AK0U1;-9%f-lC*1)0c0f*1noAM^y3z7^X9E8fK;-`$1(_^6a{CP;hqDWA=`7X=w?r=IH9Eymq8=#mw-dm=EEe`; zsi91=6jog2z|SI11;b3QQ)Yqd%jQgj8=VLTxnQA$`s-FbsLT^H2t}lT3W)Blo@RA+P`(6h#vXrisFTQzbzUB{u7#Z% z%w#1+5vLF~8oA*&Gf|e3r@(lzS(TfYv?JGwud&Oa}{6YYc@67 z-BeIAX3K=mS{om&Zz5+7Gw2kXz!}agI*77P>}AOs$!SEsmJN1lkS}UuI)!X>CzG`@ zvGs@;^${uJJ4Vq{WED5$8*^8_Fc%qR=j20k8Xj~nF?O~RNh(AhHM8VaGed4Nawz_D2tg=M4u`wv%%YDFNKE)#%buBtL&ZBCAwKJ8;PWHm3=yds>&kn2C2@xqV*4>koJ8J#37Pz9 z-IshzaacD;Z(3b!*X7CQN5fwfJWnk`bT;flQiydr0oa~gtk8Zjg)eiV_UtI_+6C~! z|Y+Uo+#6g;n0O%++jIeYyMw_);0Pv)l1TH4nFVO&=YhkEu{v6cBykDR^H!s^ zUx;LJJsPM5#29l9yS2ka?RWsUaTkn!gT(MRlEMfii$U0N#AW3c z3{EGLj~U_5h&c7$WR~BtXA3jwWdx%?VACSqODkjB)KGFfXp{0KrbT8S7oIs2vif+k zII{nWa6h%7CPbiV2VdOxtMw7%>>q`yw0jvOee%YLGY93jd> zW#nj4P)-xY<#f`yB8OZm3PIW6>~dpykxzz*?AXK=h1<&`_hOZ?4gKXF&f7usz{6N* zoFY9#dJ9X9n^CwFm3WRB|~D-0L8}cx zxhN?ciVCups3;5a6pHdIGl@z(i5h5POQD6W!mL*w>%a2SPo0l4k0&O%^Y2(+d$t@i zWL5dnmcd?*nV1#MNi^j9pbfm0Ezknq27a`j>KT>NZJy)Y%6;Wjr|?y8j*``;In!`lqY6mDSJv3gmT&=$a)VTm)(I@X&soZ#v4ZdGpsYeBIka9g=Q%6 zAs@nlJU7kI6I4TnT^}AAJvB1?!>j~%qkr9roPVuJgM20R!Ql_zB zh$>j|BT4&amzleyw~>yXBi%!~7cE+344aj9y_s&eLaWR$yVHy##?4^L25|mRyVSI{ zGfaP|DU!L?Na|XU*0bX{9%pKxeXD0DAdOu{Is=L9Qd7y!F-18pWakloVF6OvMbLDU z45@4y>f$5i3#MIMGxnS!ebb(7qm!Jz=OXRX8=B(L;0^`x;7!QQ~Wu6-i-uvw{?(!~o{*dzf z-1&Xv%TFkKWDNcMGEa@qhI0JDM6ux}CYqpNYw+s-ZPJtGw%Qc1$`HQ>-I7F}?YH%z zYG{#Kkv4(a+kkD0?FhTA+b*PSNITgm$jSerJg#kuwy6bWO>I2e2n|26>_~&Di%uVj zX&Vz+JN~Fd!RX5I5b6imw05LTX~)}4P)I3A7uI6~ZXe36zZ?KNStZ zL^Ndc(7jEux6lndvn#M=*lxekn-F_#G;!9(BIZ{Tan+_2*NDXT5P9ugba+ppdqm%R zMkK!b$ZnsY(YT9-<37jtY(;c{*=SpYGz)1aC?{=FphL_>WU%Du4fCNF%tXF8R1&>l zdF(Fgi%*>U6@B4%TaAb!%}ARg^KFK`MrY)|T}XQq+iwK<;Y1pnM)bdFoHq{}jCtr7 z=X35{`dCbUHuf9y#Y>Lgp_zHi@nf_z50NQfqU^ezDv)N2i`aLZCx70K5|`0ko}=#@ zb{zSUq{ERv4@18>lynH^k3h#cls<-X{}cEPApDk>5IsbPQ!PppisNn~S~4WbSjaQ) zhjXncVupyIeN-{+PZ~u`7lvzD%KX$xVzULrR8scd6%%MPTEr4#xXv&UO$?>~Ve~nO zd+ZMl=Kgw-{>%OM;vW0(Te@)H-T58uxj!s^Y&)ne@1qUvTG3xi?xPuLGw!d6_=(K^ zr>)Jqsz+ZnNh|Vuup1;|<6C6=KWz^B&CT_bLYc|OralpAbgt>=ek9MJ-#LfyG2Lzu|ZgT`N+p2jmG>E z8H+M5b4y&&7)?fP?z*atM;yzj%rEiKXhauzDKE~i%Egyb7+qc=n}&HOy(q@$FUW{5 z%GXkauO+|DD@yRCWaG&cBA=C~QW*VTPMeP7ob;0xN>96#*h{7-CT0Sx(=wqeOicXY z%;+&QFn?u4hnN{wKRfwsqy^BnWMe)nBz_UKG8}#GPv)O6B$40$q$SbFaT^PG@&q8m*| zngv~HdUT=L_`R8#t8=3_&5Lfe&>v#wWS(Uao=0(>VR52(7Uh{2;dvG18Rp{o7X9RDhklNI@E1|B z{Br~reQ2nBkbv*-L9Xr3XvM}ABn@W_eF3jOGmgH2s*&UBi~Wx=Io|RuGjb=}_h?%0 zVGH)i&Sm7H*RYGRMOclk!Ww(nZh$s}w;Ms_jg~!P$cKR18=++!ucKr+w3?P{7}2Zw zzkwd`z`&Ahf!)DXjxj?V2g}be$}e&CbAPaWvc1jS++j|5!reT=cOq@W-M0IaerBe6&kPr8ThgvAzp%OeMaur8d?{_vP&Z-JGZXUU z5@Y)q7fQ%+8f+%x^VMV$o&S`jCm%z!#ohxuSH7gg*h@x5_ZJKWu%V2{+lVIW(>5|+ zpYkSrLG__lU`4|}=OyRdjFczi8d>Ng1;<%=L&&zsFmKj}CwKwoJY1;rQ*=|x3GRYTfWq#P|bUwUTp*{Dy; z$ca48$ZC#qpBJst`+@6-dih1Tjce-QQm_#gSqd4)Q=(^O8Gca z?0>{W?q>qOXDZKZA~X}4W{G6TvzSY|!p0QKcz)|iH!xDSF+vaW40n;9qn}gc&-1%( zaDV6cJrB6YE8N=??%@{Kc)_*rk$=tC@tC?-+(YD?`-Vv<((+O^V6KpaSt=CZloQ#*S3^3rM?NAO%u|3+-n2U2K<&<^w*HzTo;a`7Mw{#%BykQ zjJ7r4d|JS%)PmD#0>@F0=hcj7Q3o!lIaHtL5t%ljzt;5Cf@jfzYqjI~cH!C`;39f( zZ|&eNy3uzh+IFE$Cp!Q{7|hqvkNfMvZ|}vI*q-0oiLa&!&!G+F_4%rsLA5xi5x=K8 zUvDj*LrvP1<_oGWhS?JQ{!%>C(!8U5P;s7hE}nI6v6zuQoiVbAuYV?A{$jqgd7#W3 z=F-Jr_cUvyOW@H=eR4`NewUDQlT;l)q(-^Oa*fC#bjP3-zC{J`QDl6Uy4>J@ubR zzuE}%77DjNsrzX>)=Vze$QE180M=TP6>uE!)I@epVf34R?jK$ z@E{I19Kd^%npJdqEV{CCZdO*)?86F25t%+`wfxEC{FA<+>;s&`E7Fh9J2;BSx(}q0 zoXi(Ek_ggYrZgNy0aos%&}0=6Q5gwwL55%uAUSA|l+louk&yxJAtStKE=EXR+T?>u zQ(v6A%B1BurvYuNkhX!#Xh3-f+P1|)t21eL`s)eG47BAKdHMO;%JD@OU<8#HlR1Ab z?dNmeLi!-e7C2o9L@5Be6b7erLxsWTydYFT)=q^$t=#a|CBfuu@WExl;cW28C7}Ys zrOi)9wId3Hd~jIefB9fh1fISyxS0>k#A@shS*|1D6 zL2V9EMHJ#pto*?2(zI#;e(g0{A2tNv>9>FSN z64*Qn3;1cE^mvY^l1}8Vrh?N`Xg8ge#}tr!CU-xB)yZt?=J5*_Fk>vBd@1R2!uBko zZX^9HBQmUM&^ti%oUrkJlaHl9jo6E@~fCPmWs{b?`~F=o59M>q#MD?)!^`2ux=SRyN1=* zQt)y$Sh*COTn7#=0q3^hO|lp)+|FFH4BEn~YB^YkFFo}gn1eb}-j4HIij}rCbV1^!zT|1qX&Wb6T$2W{F?vZm9f?VwI?HE znL^D7`0QD<9?VsyGcSyU|DHgP$lJJ^<>W*7#S6gojimGb+`%aN7{Hwj=ZbwPAHX^N zNqaJf^n*9=MqPh?O^-i!y_Y*bMBNeE9)nI&e~Kr0o+osk<8!pVg*E1Jp28F6hLapW zfJV|CC4NjsL}HiY{irgHEp2i4$Ma)`*ZHnM|;qz&K>8zQTy zi+rRR9AbTV)+QV`09hI%tB5>~lv~sRp<05m4MDF)piwjABXvQqW}s6o5Ud5fX$?@0 z2q2{KL_;{(8t|v+KE&VH8rFs%tpLW>0y)cy?D$1y17q<46?wqte58fIQKaI3khh?y zM5}^ODX_S(s0l7J`w%5RpC~8tld_vP`1?0JaU*)I4AlpN8wjki*~g**e04L@y5Msg z?w~n$)13OY@XGDD(>CzSUBJ>dDB_EbdO)1Ma;Wb@<)D z3mfq0JICQrDA*IqaVR|38+ftLJgKMf#&0Qq1SUNIr=C!EhvPe7(_QfD64IYrw7W`r znkRaT^f3JO74pY;>Ssugke=j8ABK+c77p?@kI-f>Jo*9f>>zJ_18?~tZ+n~^jhoSO))%>d^nF~X*>QW?$2n!xBA&CEKQ z70U=PZUiH65EwTG9Cf8>1S5sU-_cmf+`=u zn3sHsFF=#md|`LM3gm)(;WNR+c^ppzAD4oaQ~B~&lApyFzxWS#c^n)$4(1#I#g0M; zSoa@f&A$%}+6}Hm$_n<9Zh`jMtsLz}8o;~-&TQhW?SG^Q$Khc2fuCook35_G{ixdv zhO7f`wsI$HkVtIiPS#Ks0+y`jcrkar0kmESmV{8glwY(6{8<5>EChoV^Gg@PHP5Hr zB5-65^^2*SgIr)fGs8Td&N8HPvv@jdcyjZYIaZJ^W8J?LDa$hOWhJzTb?r)MG3(kD z%sk7eTftjeOx+sZ%u?3EA>hs$*7wVKYiptPys4$E2GQ7y1#tV@cw?)1+Z%bKYdPLX z-5PkRjnHPwLl^;D85!%qtVq6W9V1~MqlXCmjKo6BzS$V11;h?8>^f-RA} zWK@xfwRTo0Hy9YXHqQ@=qyS;^l26I`SgwG4!K~kdX&bp(kI%VD`HKq{r3RZK*YFwO zMB{N*TGGTIYck5yfHw)@CDU=7h@R5I3r4Q>)BdTCOD{oODHdr|T1O}Si*x?sD$z(| zfQCNOSa75o$wq8aMH+=)BaFBFo$vk^ZNKs6zmWdq z_$}o>p!dA}4~&qn)V(18jr?=)B9wDq(8mY*dP&`TuJMe~^Ntbsl=4>`Kc(&eC>d#_ zMk6_IHZ^={M&5XQ@G={GW-yw9v}gztlTS`Q38Nz^*qMNllY|iw2OcyD?c;D9pAi!q z+>HGve;wSp$obd7oQur9H~BKo@nzgV?s$>@u7W-1|MaKqWzIj#jD49e|-50T|J==TbBmpSh`U;SnJxe6j&=WD;rwQf*%36A3y*So+9^Csoj z;S(=%-c2NmS4c0xvD~8`|3BLQ{!@N|a~{yod9d>y*St!byCBPT5akj1E7Uy!ajwzl zW02_veLjJ1k$*_PcPW1WFM1DTdc^AYF6|$JyLUO~34PxK-5&A`AA!ll%O?Mh@^93? z1(m;1|B)6SsQ*g(mTP>c{4;Gna1`0s2U>jR+%H@;6jYDYQT(9ACpg}pob{2i?;L;o z(?0b7O1jtO1c4X|z{pKRTgLZ)y!ManOr5q;L~i}Ej-z2WC!4cb61;%ey3l{X$L|;y z{m!@0zR_H5k1RiF?pnVvU)Ze>?`B`whuYYXZha9a&y#A@R zJ>5tSR&y{?*nC@gr$l+rl#?}^38s-j;bAXxGPR>33w#Cqt%?mP9v$pK zjeKR<^5bUG{Dv&lpa(9Qnl+2j>Ugt>=WI?9zrh@9{DWfwHR)f)Dp#YP9CN-}{3DhP zObN43awR96D~}$J*2sa~VV$div6d0n1 Date: Thu, 9 Jul 2020 08:34:18 +0200 Subject: [PATCH 21/22] - 1.0.8 --- manifest.json | 2 +- overlay.babel | 2 +- package.json | 2 +- src/app/app-error-handler.ts | 2 +- src/app/app.component.ts | 2 +- src/app/core/annotation/annotation.service.ts | 2 +- src/app/core/odk/ow-audio.ts | 5 ---- src/app/core/odk/ow-games-events-listener.ts | 2 +- src/app/core/odk/ow-replay.ts | 3 -- .../layout/service/launcher-window.service.ts | 2 +- .../background-window.component.ts | 2 +- src/app/modules/commands/commands.module.ts | 2 +- src/app/modules/replay/replay.module.ts | 10 +++---- .../trade-message/trade-message.component.ts | 2 +- .../component/header/header.component.scss | 4 +-- .../item-frame/item-frame.component.scss | 2 -- .../chat/trade-chat-parser.service.spec.ts | 1 - .../poe/trade/fetch/trade-fetch-item.pipe.ts | 3 ++ .../poe/trade/fetch/trade-fetch.service.ts | 28 +++++++++---------- src/assets/i18n/english.json | 6 ++-- src/main.ts | 2 +- 21 files changed, 39 insertions(+), 47 deletions(-) diff --git a/manifest.json b/manifest.json index 63165a28..4bde8066 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "meta": { "name": "PoE Overlay", "author": "Kyusung4698", - "version": "1.0.7", + "version": "1.0.8", "minimum-overwolf-version": "0.147.0", "description": "Search the market and send trade offers. Get current market values for your item. View insights for maps and items.", "dock_button_title": "PoE Overlay", diff --git a/overlay.babel b/overlay.babel index e5f37aae..7be3ca94 100644 --- a/overlay.babel +++ b/overlay.babel @@ -130,7 +130,7 @@ - changelog-1-0-7 + changelog-1-0-8 message diff --git a/package.json b/package.json index 4258c970..90bc55ac 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "poe-overlay-overwolf", - "version": "1.0.7", + "version": "1.0.8", "scripts": { "watch": "ng build --watch", "watch:prod": "ng build --watch --prod", diff --git a/src/app/app-error-handler.ts b/src/app/app-error-handler.ts index 1a67499c..f0b87f0a 100644 --- a/src/app/app-error-handler.ts +++ b/src/app/app-error-handler.ts @@ -7,7 +7,7 @@ export class AppErrorHandler implements ErrorHandler { StackTrace.fromError(error).then(stackframes => { const message = error.message ?? error; const stack = stackframes.splice(0, 20).map(x => x.toString()).join('\n'); - console.error('An unexpected application error occured.', JSON.stringify({ message, stack })); + console.error(`An unexpected application error occured. ${JSON.stringify({ message, stack })}`); }); throw error; } diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 0ea33acf..dfce405c 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -47,7 +47,7 @@ export class AppComponent implements OnInit, OnDestroy { flatMap(() => OWWindows.getCurrentWindow()), retryWhen(errors => errors.pipe( flatMap(error => { - console.warn(`An unexpected error occured while loading PoE Overlay. ${error.message ?? JSON.stringify(error)}`); + console.warn(`An unexpected error occured while loading PoE Overlay. ${error?.message ?? JSON.stringify(error)}`); return OWWindows.displayMessageBox({ message_title: 'PoE Overlay could not be loaded.', message_body: 'An unexpected error occured while loading PoE Overlay.\n' + diff --git a/src/app/core/annotation/annotation.service.ts b/src/app/core/annotation/annotation.service.ts index 4ea0414f..4bd3ae30 100644 --- a/src/app/core/annotation/annotation.service.ts +++ b/src/app/core/annotation/annotation.service.ts @@ -95,7 +95,7 @@ const ANNOTATIONS: Annotation[] = [ hotkey: Hotkey.SettingsToggle }, { id: 'thanks' }, - { id: 'changelog-1-0-7' }, + { id: 'changelog-1-0-8' }, ]; @Injectable({ diff --git a/src/app/core/odk/ow-audio.ts b/src/app/core/odk/ow-audio.ts index 0d234867..509764e0 100644 --- a/src/app/core/odk/ow-audio.ts +++ b/src/app/core/odk/ow-audio.ts @@ -5,7 +5,6 @@ export class OWAudio { public static create(url: string): Observable { const promise = new Promise((resolve, reject) => { overwolf.media.audio.create(url, result => { - console.log(result); if (result.success) { resolve(result.id); } else { @@ -19,7 +18,6 @@ export class OWAudio { public static play(id: string): Observable { const promise = new Promise((resolve, reject) => { overwolf.media.audio.play(id, result => { - console.log(result); if (result.success) { resolve(); } else { @@ -33,7 +31,6 @@ export class OWAudio { public static stop(id: string): Observable { const promise = new Promise((resolve, reject) => { overwolf.media.audio.stopById(id, result => { - console.log(result); if (result.success) { resolve(); } else { @@ -47,7 +44,6 @@ export class OWAudio { public static resume(id: string): Observable { const promise = new Promise((resolve, reject) => { overwolf.media.audio.resumeById(id, result => { - console.log(result); if (result.success) { resolve(); } else { @@ -61,7 +57,6 @@ export class OWAudio { public static setVolume(volume: number): Observable { const promise = new Promise((resolve, reject) => { overwolf.media.audio.setVolume(volume, result => { - console.log(result); if (result.success) { resolve(); } else { diff --git a/src/app/core/odk/ow-games-events-listener.ts b/src/app/core/odk/ow-games-events-listener.ts index e463038d..961cd729 100644 --- a/src/app/core/odk/ow-games-events-listener.ts +++ b/src/app/core/odk/ow-games-events-listener.ts @@ -45,7 +45,7 @@ export class OWGamesEventsListener { )), map(features => !!features?.length), catchError(error => { - console.error(`Could not set required features.`, this.requiredFeatures, error); + console.error(`Could not set required features: ${JSON.stringify(this.requiredFeatures)}, error: ${error?.message ?? JSON.stringify(error)}`); return of(false); }) ); diff --git a/src/app/core/odk/ow-replay.ts b/src/app/core/odk/ow-replay.ts index c794fb9a..3e60c9eb 100644 --- a/src/app/core/odk/ow-replay.ts +++ b/src/app/core/odk/ow-replay.ts @@ -30,7 +30,6 @@ export class OWReplay { public static getHighlightsFeatures(gameId: number): Observable { const promise = new Promise((resolve, reject) => { overwolf.media.replays.getHighlightsFeatures(gameId, result => { - console.log(result); if (result.success) { resolve(); } else { @@ -44,14 +43,12 @@ export class OWReplay { public static capture(pastDuration: number, futureDuration: number): Observable { const promise = new Promise((resolve, reject) => { overwolf.media.replays.capture(pastDuration, futureDuration, result => { - console.log('finished', result); if (result.success) { resolve(result.url); } else { reject(result.error); } }, result => { - console.log('called', result, pastDuration, futureDuration); if (!result.success) { reject(result); } diff --git a/src/app/layout/service/launcher-window.service.ts b/src/app/layout/service/launcher-window.service.ts index 43571e27..55569f33 100644 --- a/src/app/layout/service/launcher-window.service.ts +++ b/src/app/layout/service/launcher-window.service.ts @@ -26,7 +26,7 @@ export class LauncherWindowService { if (monitor) { const [x, y] = monitor.Location.split(',').map(loc => +loc.trim()); const [width, height] = monitor.Resolution.split(',').map(res => +res.trim()); - console.log('monitor', x, y, width, height); + console.log(`monitor x: ${x}, y: ${y}, w: ${width}, h: ${height}`, x, y, width, height); const left = x + (width / 2) - (WIN_WIDTH / 2); const top = y + (height / 2) - (WIN_HEIGHT / 2); diff --git a/src/app/layout/window/background-window/background-window.component.ts b/src/app/layout/window/background-window/background-window.component.ts index 76d5f59f..2f4f0835 100644 --- a/src/app/layout/window/background-window/background-window.component.ts +++ b/src/app/layout/window/background-window/background-window.component.ts @@ -247,6 +247,6 @@ export class BackgroundWindowComponent implements OnInit, OnDestroy { } public onLogError(error: string): void { - console.error('An unexpected error occured while listening to the Client.txt file.', error); + console.error(`An unexpected error occured while listening to the Client.txt file. ${error}`, error); } } diff --git a/src/app/modules/commands/commands.module.ts b/src/app/modules/commands/commands.module.ts index 622a6a90..47032409 100644 --- a/src/app/modules/commands/commands.module.ts +++ b/src/app/modules/commands/commands.module.ts @@ -82,7 +82,7 @@ export class CommandsModule implements FeatureModule { const { text } = settings.commands[index - 1]; if (text?.length) { this.command.execute(text, settings).subscribe(() => { }, error => { - console.warn(`Could not execute command.`, error, text); + console.warn(`Could not execute command: ${text}, ${error?.message ?? JSON.stringify(error)}`, error, text); this.notification.show('commands.execute-error'); }); } diff --git a/src/app/modules/replay/replay.module.ts b/src/app/modules/replay/replay.module.ts index 523d06f4..022710c1 100644 --- a/src/app/modules/replay/replay.module.ts +++ b/src/app/modules/replay/replay.module.ts @@ -68,7 +68,7 @@ export class ReplayModule implements FeatureModule { settings.replayCaptureManuallyPastDuration, settings.replayCaptureManuallyFutureDuration ).subscribe(() => { }, error => { - console.warn('Could not capture a manually triggered event.', error); + console.warn(`Could not capture a manually triggered event. ${error?.message ?? JSON.stringify(error)}`, error); this.notification.show('replay.capture-error'); }); } @@ -84,7 +84,7 @@ export class ReplayModule implements FeatureModule { settings.replayCaptureDeathPastDuration, settings.replayCaptureDeathFutureDuration ).subscribe(() => { }, error => { - console.warn('Could not capture the death event.', event, error); + console.warn(`Could not capture the death event. ${error?.message ?? JSON.stringify(error)}`, event, error); this.notification.show('replay.capture-error'); }); } @@ -95,7 +95,7 @@ export class ReplayModule implements FeatureModule { settings.replayCaptureKillPastDuration, settings.replayCaptureKillFutureDuration ).subscribe(() => { }, error => { - console.warn('Could not capture the kill event.', event, error); + console.warn(`Could not capture the kill event. ${error?.message ?? JSON.stringify(error)}`, event, error); this.notification.show('replay.capture-error'); }); } @@ -128,7 +128,7 @@ export class ReplayModule implements FeatureModule { this.notification.show('replay.started'); } }, error => { - console.warn('Could not start the replay capturing.', error); + console.warn(`Could not start the replay capturing. ${error?.message ?? JSON.stringify(error)}`, error); this.notification.show('replay.start-error'); }); } @@ -139,7 +139,7 @@ export class ReplayModule implements FeatureModule { this.notification.show('replay.stopped'); } }, error => { - console.warn('Could not stop the replay capturing.', error); + console.warn(`Could not stop the replay capturing. ${error?.message ?? JSON.stringify(error)}`, error); this.notification.show('replay.stop-error'); }); } diff --git a/src/app/modules/trade/component/trade-message/trade-message.component.ts b/src/app/modules/trade/component/trade-message/trade-message.component.ts index b427e8b1..a4a8289d 100644 --- a/src/app/modules/trade/component/trade-message/trade-message.component.ts +++ b/src/app/modules/trade/component/trade-message/trade-message.component.ts @@ -196,7 +196,7 @@ export class TradeMessageComponent implements OnInit { return throwError('character name was not set.'); }) ).subscribe(name => this.chat.kick(name), error => { - console.warn(`Could not kick character.`, error); + console.warn(`Could not kick character. ${error?.message ?? JSON.stringify(error)}`, error); this.notification.show('trade.kick-error'); }); } else { diff --git a/src/app/shared/module/odk/component/header/header.component.scss b/src/app/shared/module/odk/component/header/header.component.scss index 8d693fe2..8d8f07d1 100644 --- a/src/app/shared/module/odk/component/header/header.component.scss +++ b/src/app/shared/module/odk/component/header/header.component.scss @@ -133,14 +133,14 @@ $border-color: #1a1a1a; padding: $header-size 0 0 0; &.has-footer { - padding: $header-size 0 $footer-size 0; + padding: $header-size 0 $footer-size - 1px 0; } &.reverse { padding: 0 0 $header-size 0; &.has-footer { - padding: $footer-size 0 $header-size 0; + padding: $footer-size 0 $header-size - 1px 0; } } } diff --git a/src/app/shared/module/poe/item/frame/item-frame/item-frame.component.scss b/src/app/shared/module/poe/item/frame/item-frame/item-frame.component.scss index 4e6c7992..d270febb 100644 --- a/src/app/shared/module/poe/item/frame/item-frame/item-frame.component.scss +++ b/src/app/shared/module/poe/item/frame/item-frame/item-frame.component.scss @@ -6,13 +6,11 @@ text-align: center; font-style: 14.3px; font-family: FontinSmallCaps; - display: inline-block; .detail { position: relative; padding: 2px; min-width: 396px; - // min-height: 115px; white-space: pre; } } diff --git a/src/app/shared/module/poe/trade/chat/trade-chat-parser.service.spec.ts b/src/app/shared/module/poe/trade/chat/trade-chat-parser.service.spec.ts index b3597680..9978b779 100644 --- a/src/app/shared/module/poe/trade/chat/trade-chat-parser.service.spec.ts +++ b/src/app/shared/module/poe/trade/chat/trade-chat-parser.service.spec.ts @@ -32,7 +32,6 @@ fdescribe('TradeChatParserService', () => { logs.forEach(log => { it(`should not get result for log: '${log.slice(0, 30)}'`, () => { const result = sut.parse(log); - console.log(JSON.stringify(result, undefined, 2)); expect(result.type !== TradeParserType.Ignored).toBeTruthy(); }); }); diff --git a/src/app/shared/module/poe/trade/fetch/trade-fetch-item.pipe.ts b/src/app/shared/module/poe/trade/fetch/trade-fetch-item.pipe.ts index 10727e3e..709b72f7 100644 --- a/src/app/shared/module/poe/trade/fetch/trade-fetch-item.pipe.ts +++ b/src/app/shared/module/poe/trade/fetch/trade-fetch-item.pipe.ts @@ -14,6 +14,9 @@ export class TradeFetchItemPipe implements PipeTransform { private readonly processor: ItemProcessorService) { } public transform(fetchItem: TradeFetchEntryItem): Item { + if (!fetchItem) { + return null; + } const item = this.parser.parse(fetchItem.text, null, fetchItem.hashes.reduce((filter, key) => { filter[key] = true; diff --git a/src/app/shared/module/poe/trade/fetch/trade-fetch.service.ts b/src/app/shared/module/poe/trade/fetch/trade-fetch.service.ts index 505e96d5..19e547b2 100644 --- a/src/app/shared/module/poe/trade/fetch/trade-fetch.service.ts +++ b/src/app/shared/module/poe/trade/fetch/trade-fetch.service.ts @@ -74,68 +74,68 @@ export class TradeFetchService { private map(results: TradeFetchHttpResult[], url: string, total: number, checkExchange: boolean): TradeFetchResponse { const entries = results.filter(result => { if (!result?.listing) { - console.log(`Listing was null or undefined.`, result); + console.log(`Listing was null or undefined. ${JSON.stringify(result)}`, result); return false; } if (!moment(result.listing.indexed).isValid()) { - console.log(`Indexed was not a valid date.`, result); + console.log(`Indexed was not a valid date. ${JSON.stringify(result)}`, result); return false; } if (!result.listing.account?.name?.length) { - console.log(`Account name was empty or undefined.`, result); + console.log(`Account name was empty or undefined. ${JSON.stringify(result)}`, result); return false; } const { price } = result.listing; if (!price) { - console.log(`Price was null or undefined.`, result); + console.log(`Price was null or undefined. ${JSON.stringify(result)}`, result); return false; } if (checkExchange) { const { exchange } = price; if (!exchange) { - console.log(`Price exchange was null or undefined.`, result); + console.log(`Price exchange was null or undefined. ${JSON.stringify(result)}`, result); return false; } if (!exchange.currency?.length) { - console.log(`Price exchange currency was empty or undefined.`, result); + console.log(`Price exchange currency was empty or undefined. ${JSON.stringify(result)}`, result); return false; } if (exchange.amount === null || exchange.amount === undefined || exchange.amount === 0) { - console.log(`Price exchange amount was null or undefined or zero.`, result); + console.log(`Price exchange amount was null or undefined or zero. ${JSON.stringify(result)}`, result); return false; } const { item } = price; if (!item) { - console.log(`Price item was null or undefined.`, result); + console.log(`Price item was null or undefined. ${JSON.stringify(result)}`, result); return false; } if (!item.currency?.length) { - console.log(`Price item currency was empty or undefined.`, result); + console.log(`Price item currency was empty or undefined. ${JSON.stringify(result)}`, result); return false; } if (item.amount === null || item.amount === undefined || item.amount <= 0) { - console.log(`Price item amount was null or undefined or zero.`, result); + console.log(`Price item amount was null or undefined or zero. ${JSON.stringify(result)}`, result); return false; } if (item.stock === null || item.stock === undefined || item.stock <= 0) { - console.log(`Price item stock was null or undefined or zero.`, result); + console.log(`Price item stock was null or undefined or zero. ${JSON.stringify(result)}`, result); return false; } } else { if (price.amount === null || price.amount === undefined || price.amount <= 0) { - console.log(`Price amount was null or undefined or zero.`, result); + console.log(`Price amount was null or undefined or zero. ${JSON.stringify(result)}`, result); return false; } if (!price.currency?.length) { - console.log(`Price currency was empty or undefined.`, result); + console.log(`Price currency was empty or undefined. ${JSON.stringify(result)}`, result); return false; } } if (!result.item?.icon?.length) { - console.log(`Item icon was empty or undefined.`, result); + console.log(`Item icon was empty or undefined. ${JSON.stringify(result)}`, result); return false; } return true; diff --git a/src/assets/i18n/english.json b/src/assets/i18n/english.json index 60bf8a55..132d8e02 100644 --- a/src/assets/i18n/english.json +++ b/src/assets/i18n/english.json @@ -4,9 +4,9 @@ "message": "Opens a webpage on hotkey press in the in-game browser.\n\nTry the hotkey below to open poe.ninja.", "title": "Bookmarks" }, - "changelog-1-0-7": { - "message": "- added the version number at the evaluate, inspect and settings window\n- update trade action still interested to be always shown for incoming requests\n- update the market history to only show unique requests\n- fixed an focus issue occurring when using the trade whisper button\n- fixed an issue accessing the clipboard\n- fixed an issue querying the map tier", - "title": "What's new in 1.0.7?" + "changelog-1-0-8": { + "message": "- added support for the new cluster jewels stats\n- added a new hotkey (default on F10) to manually capture replays\n- added a toggle to disable the leaving of a party via kick using the trade finished action\n- added a audio button at the trade settings to customize the notification sound\n- added a lower opacity for market results once they have been requested\n- added the seller name for items and bulk exchanges at the market\n- fixed an issue at the market type filter resulting in a unknown category error", + "title": "What's new in 1.0.8?" }, "commands": { "message": "All game commands can be bound to hotkeys.\n\nThere are also placeholders like @char available which will be replaced before executing the command.\n\nTry the hotkey below to teleport into your hideout.", diff --git a/src/main.ts b/src/main.ts index 1c889e2c..13cc8977 100644 --- a/src/main.ts +++ b/src/main.ts @@ -9,4 +9,4 @@ if (environment.production) { } platformBrowserDynamic().bootstrapModule(AppModule) - .catch(err => console.error('An unexpected error occured while bootstrapping the AppModule.', err.message ?? JSON.stringify(err))); + .catch(err => console.error(`An unexpected error occured while bootstrapping the AppModule. ${err?.message ?? JSON.stringify(err)}`)); From 09240060aa87403042bf5a6c5968f1d65805d099 Mon Sep 17 00:00:00 2001 From: Nicklas Ronge Date: Thu, 9 Jul 2020 08:35:47 +0200 Subject: [PATCH 22/22] - fixed linting --- src/app/core/odk/ow-games-events-listener.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/core/odk/ow-games-events-listener.ts b/src/app/core/odk/ow-games-events-listener.ts index 961cd729..3b553d0b 100644 --- a/src/app/core/odk/ow-games-events-listener.ts +++ b/src/app/core/odk/ow-games-events-listener.ts @@ -45,7 +45,8 @@ export class OWGamesEventsListener { )), map(features => !!features?.length), catchError(error => { - console.error(`Could not set required features: ${JSON.stringify(this.requiredFeatures)}, error: ${error?.message ?? JSON.stringify(error)}`); + console.error(`Could not set required features: ${JSON.stringify(this.requiredFeatures)}, ` + + `error: ${error?.message ?? JSON.stringify(error)}`); return of(false); }) );