Repository: marcincichocki/breach-protocol-autosolver (ts)

Issue:
Reorganize code
- `@/core` => core functionality, sequence, solving, ocr. Platform agnostic. Move registry here
- `@/common` => common functionality, utils, helper fns, shared code
- `@/common/node` => nodejs shared code
- `@/common/electron` => shared electron code
- `@/electron/main` => main process
- `@/electron/renderer` => react
- `@/electron/worker` => worker

Pull request description:
Reorganize
fixes #119

Patch:
diff --git a/.prettierignore b/.prettierignore
index fc3fc18..0561a80 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -1,1 +1,1 @@
-src/bp-registry/registry.json
+src/core/bp-registry/*.json
diff --git a/configs/webpack.config.main.ts b/configs/webpack.config.main.ts
index 8ef21c9..fbf0b6b 100644
--- a/configs/webpack.config.main.ts
+++ b/configs/webpack.config.main.ts
@@ -5,7 +5,7 @@ import { commonPlugins, commonRules } from './common';
 
 export const config: webpack.Configuration = {
   mode: 'development',
-  entry: join(__dirname, '../src/client-electron/main/index.ts'),
+  entry: join(__dirname, '../src/electron/main/index.ts'),
   target: 'electron-main',
   resolve: {
     extensions: ['.js', '.jsx', '.ts', '.tsx', '.json'],
diff --git a/configs/webpack.config.renderer.ts b/configs/webpack.config.renderer.ts
index 699ae02..e2d4c22 100644
--- a/configs/webpack.config.renderer.ts
+++ b/configs/webpack.config.renderer.ts
@@ -6,7 +6,7 @@ import { commonPlugins, commonRules } from './common';
 
 export const config: webpack.Configuration = {
   mode: 'development',
-  entry: join(__dirname, '../src/client-electron/renderer/index.tsx'),
+  entry: join(__dirname, '../src/electron/renderer/index.tsx'),
   target: 'electron-renderer',
   output: {
     path: join(__dirname, '../dist'),
@@ -22,7 +22,7 @@ export const config: webpack.Configuration = {
   plugins: [
     ...commonPlugins,
     new HtmlWebpackPlugin({
-      template: join(__dirname, '../public/renderer.html'),
+      template: join(__dirname, '../src/electron/renderer/index.html'),
       filename: 'renderer.html',
       title: process.env.npm_package_build_productName,
     }),
diff --git a/configs/webpack.config.worker.ts b/configs/webpack.config.worker.ts
index 0e0b92b..71ef5dd 100644
--- a/configs/webpack.config.worker.ts
+++ b/configs/webpack.config.worker.ts
@@ -6,7 +6,7 @@ import { commonPlugins, commonRules } from './common';
 
 export const config: webpack.Configuration = {
   mode: 'development',
-  entry: join(__dirname, '../src/client-electron/worker/index.ts'),
+  entry: join(__dirname, '../src/electron/worker/index.ts'),
   target: 'electron-renderer',
   output: {
     path: join(__dirname, '../dist'),
@@ -27,7 +27,7 @@ export const config: webpack.Configuration = {
   plugins: [
     ...commonPlugins,
     new HtmlWebpackPlugin({
-      template: join(__dirname, '../public/worker.html'),
+      template: join(__dirname, '../src/electron/worker/index.html'),
       filename: 'worker.html',
     }),
   ],
diff --git a/package.json b/package.json
index 9977bda..fb95c4f 100644
--- a/package.json
+++ b/package.json
@@ -19,8 +19,7 @@
       "package.json"
     ],
     "extraFiles": [
-      "vendor/**/*",
-      "BreachProtocol.traineddata"
+      "resources/**/*"
     ],
     "directories": {
       "output": "./out/"
diff --git a/BreachProtocol.traineddata b/resources/BreachProtocol.traineddata
similarity index 100%
rename from BreachProtocol.traineddata
rename to resources/BreachProtocol.traineddata
diff --git a/vendor/nircmd/nircmd.exe b/resources/win32/nircmd/nircmd.exe
similarity index 100%
rename from vendor/nircmd/nircmd.exe
rename to resources/win32/nircmd/nircmd.exe
diff --git a/src/platform-node/index.ts b/src/common/node/index.ts
similarity index 100%
rename from src/platform-node/index.ts
rename to src/common/node/index.ts
diff --git a/src/platform-node/robot.ts b/src/common/node/robot.ts
similarity index 98%
rename from src/platform-node/robot.ts
rename to src/common/node/robot.ts
index 234e546..97a0769 100644
--- a/src/platform-node/robot.ts
+++ b/src/common/node/robot.ts
@@ -90,7 +90,7 @@ export class WindowsRobot extends BreachProtocolRobot {
   private x = 0;
   private y = 0;
 
-  private readonly bin = './vendor/nircmd/nircmd.exe';
+  private readonly bin = './resources/win32/nircmd/nircmd.exe';
 
   click() {
     return this.nircmd('sendmouse left click');
diff --git a/src/core/ocr/base.ts b/src/core/ocr/base.ts
index 45b2965..25204e1 100644
--- a/src/core/ocr/base.ts
+++ b/src/core/ocr/base.ts
@@ -250,9 +250,9 @@ export abstract class BreachProtocolOCRFragment<
     return this.thresholds.get(value);
   }
 
-  private static async initWorker() {
+  private static async initWorker(options: Partial<Tesseract.WorkerOptions>) {
     const lang = 'BreachProtocol';
-    const w = createWorker();
+    const w = createWorker(options);
 
     await w.load();
     await w.loadLanguage(lang);
@@ -264,13 +264,15 @@ export abstract class BreachProtocolOCRFragment<
     return w;
   }
 
-  static async initScheduler() {
+  static async initScheduler(
+    options: Partial<Tesseract.WorkerOptions> = { cachePath: './resources' }
+  ) {
     if (BreachProtocolOCRFragment.scheduler) {
       throw new Error('Scheduler is alredy initialized.');
     }
 
-    const w1 = await BreachProtocolOCRFragment.initWorker();
-    const w2 = await BreachProtocolOCRFragment.initWorker();
+    const w1 = await BreachProtocolOCRFragment.initWorker(options);
+    const w2 = await BreachProtocolOCRFragment.initWorker(options);
 
     const scheduler = createScheduler();
 
diff --git a/src/core/ocr/daemons.ts b/src/core/ocr/daemons.ts
index 1a60313..ca1e44c 100644
--- a/src/core/ocr/daemons.ts
+++ b/src/core/ocr/daemons.ts
@@ -2,8 +2,8 @@ import { Point } from '@/common';
 import { DaemonsRawData } from '../common';
 import {
   BreachProtocolFragmentResult,
-  BreachProtocolOCRFragment,
   BreachProtocolFragmentStatus,
+  BreachProtocolOCRFragment,
 } from './base';
 
 export type BreachProtocolDaemonsFragmentResult = BreachProtocolFragmentResult<
diff --git a/src/core/ocr/grid.ts b/src/core/ocr/grid.ts
index 7133efe..f055762 100644
--- a/src/core/ocr/grid.ts
+++ b/src/core/ocr/grid.ts
@@ -2,8 +2,8 @@ import { Point } from '@/common';
 import { GridRawData } from '../common';
 import {
   BreachProtocolFragmentResult,
-  BreachProtocolOCRFragment,
   BreachProtocolFragmentStatus,
+  BreachProtocolOCRFragment,
 } from './base';
 
 export type BreachProtocolGridFragmentResult = BreachProtocolFragmentResult<
diff --git a/src/client-electron/actions.ts b/src/electron/common/actions.ts
similarity index 100%
rename from src/client-electron/actions.ts
rename to src/electron/common/actions.ts
diff --git a/src/client-electron/common.ts b/src/electron/common/common.ts
similarity index 98%
rename from src/client-electron/common.ts
rename to src/electron/common/common.ts
index b735443..1dd623a 100644
--- a/src/client-electron/common.ts
+++ b/src/electron/common/common.ts
@@ -1,10 +1,10 @@
+import { RobotSettings } from '@/common/node';
 import {
   BreachProtocolFragmentResults,
   BreachProtocolResultJSON,
   FragmentId,
   SequenceJSON,
 } from '@/core';
-import { RobotSettings } from '@/platform-node';
 import { Accelerator, ipcRenderer as ipc, IpcRendererEvent } from 'electron';
 import { ScreenshotDisplayOutput } from 'screenshot-desktop';
 import { v4 as uuidv4 } from 'uuid';
diff --git a/src/electron/common/index.ts b/src/electron/common/index.ts
new file mode 100644
index 0000000..d0ef209
--- /dev/null
+++ b/src/electron/common/index.ts
@@ -0,0 +1,3 @@
+export * from './actions';
+export * from './common';
+export * from './options';
diff --git a/src/client-electron/options.ts b/src/electron/common/options.ts
similarity index 100%
rename from src/client-electron/options.ts
rename to src/electron/common/options.ts
diff --git a/src/client-electron/main/index.ts b/src/electron/main/index.ts
similarity index 100%
rename from src/client-electron/main/index.ts
rename to src/electron/main/index.ts
diff --git a/src/client-electron/main/main.ts b/src/electron/main/main.ts
similarity index 100%
rename from src/client-electron/main/main.ts
rename to src/electron/main/main.ts
diff --git a/src/client-electron/main/store/reducer.ts b/src/electron/main/store/reducer.ts
similarity index 97%
rename from src/client-electron/main/store/reducer.ts
rename to src/electron/main/store/reducer.ts
index a722f66..9cdad1e 100644
--- a/src/client-electron/main/store/reducer.ts
+++ b/src/electron/main/store/reducer.ts
@@ -1,15 +1,15 @@
 import { isDaemonsFragment } from '@/core';
-import { ScreenshotDisplayOutput } from 'screenshot-desktop';
-import { ActionTypes } from '../../actions';
 import {
   Action,
+  ActionTypes,
   AppSettings,
   AppStats,
   BreachProtocolStatus,
   HistoryEntry,
   State,
   WorkerStatus,
-} from '../../common';
+} from '@/electron/common';
+import { ScreenshotDisplayOutput } from 'screenshot-desktop';
 
 type Handler<T = any, S = State> = (state: S, action: Action<T>) => State;
 
diff --git a/src/client-electron/main/store/store.ts b/src/electron/main/store/store.ts
similarity index 97%
rename from src/client-electron/main/store/store.ts
rename to src/electron/main/store/store.ts
index f1aa4d6..2127198 100644
--- a/src/client-electron/main/store/store.ts
+++ b/src/electron/main/store/store.ts
@@ -1,19 +1,19 @@
-import { ActionTypes } from '@/client-electron/actions';
 import { isDev, isProd } from '@/common';
-import { app, ipcMain as ipc, IpcMainEvent, WebContents } from 'electron';
-import ElectronStore from 'electron-store';
-import { ensureDirSync, remove, removeSync } from 'fs-extra';
-import { join } from 'path';
 import {
   Action,
+  ActionTypes,
   AppSettings,
   AppStats,
+  defaultOptions,
   HistoryEntry,
   Request,
   Response,
   State,
-} from '../../common';
-import { defaultOptions } from '../../options';
+} from '@/electron/common';
+import { app, ipcMain as ipc, IpcMainEvent, WebContents } from 'electron';
+import ElectronStore from 'electron-store';
+import { ensureDirSync, remove, removeSync } from 'fs-extra';
+import { join } from 'path';
 import { appReducer } from './reducer';
 
 type Middleware = (action: Action) => void;
diff --git a/src/client-electron/main/windows.ts b/src/electron/main/windows.ts
similarity index 100%
rename from src/client-electron/main/windows.ts
rename to src/electron/main/windows.ts
diff --git a/src/client-electron/renderer/app.tsx b/src/electron/renderer/app.tsx
similarity index 95%
rename from src/client-electron/renderer/app.tsx
rename to src/electron/renderer/app.tsx
index 27bf2aa..925cb43 100644
--- a/src/client-electron/renderer/app.tsx
+++ b/src/electron/renderer/app.tsx
@@ -1,6 +1,6 @@
+import { ActionTypes } from '@/electron/common';
 import { Route, Switch } from 'react-router-dom';
 import styled from 'styled-components';
-import { ActionTypes } from '../actions';
 import { useHistoryRedirect, useIpcState } from './common';
 import { Navigation, StatusBar, TitleBar } from './components';
 import { Calibrate, Dashboard, History, Settings } from './pages';
diff --git a/src/client-electron/renderer/assets/fonts/Rajdhani/OFL.txt b/src/electron/renderer/assets/fonts/Rajdhani/OFL.txt
similarity index 100%
rename from src/client-electron/renderer/assets/fonts/Rajdhani/OFL.txt
rename to src/electron/renderer/assets/fonts/Rajdhani/OFL.txt
diff --git a/src/client-electron/renderer/assets/fonts/Rajdhani/Rajdhani-Bold.ttf b/src/electron/renderer/assets/fonts/Rajdhani/Rajdhani-Bold.ttf
similarity index 100%
rename from src/client-electron/renderer/assets/fonts/Rajdhani/Rajdhani-Bold.ttf
rename to src/electron/renderer/assets/fonts/Rajdhani/Rajdhani-Bold.ttf
diff --git a/src/client-electron/renderer/assets/fonts/Rajdhani/Rajdhani-Light.ttf b/src/electron/renderer/assets/fonts/Rajdhani/Rajdhani-Light.ttf
similarity index 100%
rename from src/client-electron/renderer/assets/fonts/Rajdhani/Rajdhani-Light.ttf
rename to src/electron/renderer/assets/fonts/Rajdhani/Rajdhani-Light.ttf
diff --git a/src/client-electron/renderer/assets/fonts/Rajdhani/Rajdhani-Medium.ttf b/src/electron/renderer/assets/fonts/Rajdhani/Rajdhani-Medium.ttf
similarity index 100%
rename from src/client-electron/renderer/assets/fonts/Rajdhani/Rajdhani-Medium.ttf
rename to src/electron/renderer/assets/fonts/Rajdhani/Rajdhani-Medium.ttf
diff --git a/src/client-electron/renderer/assets/fonts/Rajdhani/Rajdhani-Regular.ttf b/src/electron/renderer/assets/fonts/Rajdhani/Rajdhani-Regular.ttf
similarity index 100%
rename from src/client-electron/renderer/assets/fonts/Rajdhani/Rajdhani-Regular.ttf
rename to src/electron/renderer/assets/fonts/Rajdhani/Rajdhani-Regular.ttf
diff --git a/src/client-electron/renderer/assets/fonts/Rajdhani/Rajdhani-SemiBold.ttf b/src/electron/renderer/assets/fonts/Rajdhani/Rajdhani-SemiBold.ttf
similarity index 100%
rename from src/client-electron/renderer/assets/fonts/Rajdhani/Rajdhani-SemiBold.ttf
rename to src/electron/renderer/assets/fonts/Rajdhani/Rajdhani-SemiBold.ttf
diff --git a/src/client-electron/renderer/assets/icon.png b/src/electron/renderer/assets/icon.png
similarity index 100%
rename from src/client-electron/renderer/assets/icon.png
rename to src/electron/renderer/assets/icon.png
diff --git a/src/client-electron/renderer/common.ts b/src/electron/renderer/common.ts
similarity index 97%
rename from src/client-electron/renderer/common.ts
rename to src/electron/renderer/common.ts
index 3779efc..902197b 100644
--- a/src/client-electron/renderer/common.ts
+++ b/src/electron/renderer/common.ts
@@ -1,9 +1,9 @@
+import { Action, State } from '@/electron/common';
 import { format, formatDistanceToNow } from 'date-fns';
 import { ipcRenderer as ipc, IpcRendererEvent } from 'electron';
 import { useContext, useEffect, useState } from 'react';
 import { useHistory, useParams } from 'react-router-dom';
 import { ScreenshotDisplayOutput } from 'screenshot-desktop';
-import { Action, State } from '../common';
 import { StateContext } from './state';
 
 /** Return history entry based on entryId url param. */
diff --git a/src/client-electron/renderer/components/Arrows.tsx b/src/electron/renderer/components/Arrows.tsx
similarity index 100%
rename from src/client-electron/renderer/components/Arrows.tsx
rename to src/electron/renderer/components/Arrows.tsx
diff --git a/src/client-electron/renderer/components/BufferSizeViewer.tsx b/src/electron/renderer/components/BufferSizeViewer.tsx
similarity index 100%
rename from src/client-electron/renderer/components/BufferSizeViewer.tsx
rename to src/electron/renderer/components/BufferSizeViewer.tsx
diff --git a/src/client-electron/renderer/components/Buttons.tsx b/src/electron/renderer/components/Buttons.tsx
similarity index 100%
rename from src/client-electron/renderer/components/Buttons.tsx
rename to src/electron/renderer/components/Buttons.tsx
diff --git a/src/client-electron/renderer/components/DaemonsViewer.tsx b/src/electron/renderer/components/DaemonsViewer.tsx
similarity index 100%
rename from src/client-electron/renderer/components/DaemonsViewer.tsx
rename to src/electron/renderer/components/DaemonsViewer.tsx
diff --git a/src/client-electron/renderer/components/File.tsx b/src/electron/renderer/components/File.tsx
similarity index 100%
rename from src/client-electron/renderer/components/File.tsx
rename to src/electron/renderer/components/File.tsx
diff --git a/src/client-electron/renderer/components/Flex.tsx b/src/electron/renderer/components/Flex.tsx
similarity index 100%
rename from src/client-electron/renderer/components/Flex.tsx
rename to src/electron/renderer/components/Flex.tsx
diff --git a/src/client-electron/renderer/components/Form.tsx b/src/electron/renderer/components/Form.tsx
similarity index 100%
rename from src/client-electron/renderer/components/Form.tsx
rename to src/electron/renderer/components/Form.tsx
diff --git a/src/client-electron/renderer/components/FragmentPreview.tsx b/src/electron/renderer/components/FragmentPreview.tsx
similarity index 100%
rename from src/client-electron/renderer/components/FragmentPreview.tsx
rename to src/electron/renderer/components/FragmentPreview.tsx
diff --git a/src/client-electron/renderer/components/GridViewer.tsx b/src/electron/renderer/components/GridViewer.tsx
similarity index 100%
rename from src/client-electron/renderer/components/GridViewer.tsx
rename to src/electron/renderer/components/GridViewer.tsx
diff --git a/src/client-electron/renderer/components/HistoryViewer.tsx b/src/electron/renderer/components/HistoryViewer.tsx
similarity index 93%
rename from src/client-electron/renderer/components/HistoryViewer.tsx
rename to src/electron/renderer/components/HistoryViewer.tsx
index 114ab02..d35ab00 100644
--- a/src/client-electron/renderer/components/HistoryViewer.tsx
+++ b/src/electron/renderer/components/HistoryViewer.tsx
@@ -1,9 +1,9 @@
-import { HistoryEntry } from '@/client-electron/common';
 import {
   isBufferSizeFragment,
   isDaemonsFragment,
   isGridFragment,
-} from '@/core/common';
+} from '@/core';
+import { HistoryEntry } from '@/electron/common';
 import { FC, useState } from 'react';
 import { BufferSizeViewer } from './BufferSizeViewer';
 import { DaemonsViewer } from './DaemonsViewer';
diff --git a/src/client-electron/renderer/components/KeyBind.tsx b/src/electron/renderer/components/KeyBind.tsx
similarity index 100%
rename from src/client-electron/renderer/components/KeyBind.tsx
rename to src/electron/renderer/components/KeyBind.tsx
diff --git a/src/client-electron/renderer/components/Navigation.tsx b/src/electron/renderer/components/Navigation.tsx
similarity index 100%
rename from src/client-electron/renderer/components/Navigation.tsx
rename to src/electron/renderer/components/Navigation.tsx
diff --git a/src/client-electron/renderer/components/RangeSlider.tsx b/src/electron/renderer/components/RangeSlider.tsx
similarity index 100%
rename from src/client-electron/renderer/components/RangeSlider.tsx
rename to src/electron/renderer/components/RangeSlider.tsx
diff --git a/src/client-electron/renderer/components/RawDataPreview.tsx b/src/electron/renderer/components/RawDataPreview.tsx
similarity index 100%
rename from src/client-electron/renderer/components/RawDataPreview.tsx
rename to src/electron/renderer/components/RawDataPreview.tsx
diff --git a/src/client-electron/renderer/components/Select.tsx b/src/electron/renderer/components/Select.tsx
similarity index 100%
rename from src/client-electron/renderer/components/Select.tsx
rename to src/electron/renderer/components/Select.tsx
diff --git a/src/client-electron/renderer/components/Spinner.tsx b/src/electron/renderer/components/Spinner.tsx
similarity index 100%
rename from src/client-electron/renderer/components/Spinner.tsx
rename to src/electron/renderer/components/Spinner.tsx
diff --git a/src/client-electron/renderer/components/StatusBar.tsx b/src/electron/renderer/components/StatusBar.tsx
similarity index 97%
rename from src/client-electron/renderer/components/StatusBar.tsx
rename to src/electron/renderer/components/StatusBar.tsx
index dcd46f4..688b85a 100644
--- a/src/client-electron/renderer/components/StatusBar.tsx
+++ b/src/electron/renderer/components/StatusBar.tsx
@@ -1,4 +1,4 @@
-import { WorkerStatus } from '@/client-electron/common';
+import { WorkerStatus } from '@/electron/common';
 import { FC, useContext, useState } from 'react';
 import { useHistory } from 'react-router-dom';
 import styled from 'styled-components';
diff --git a/src/client-electron/renderer/components/Switch.tsx b/src/electron/renderer/components/Switch.tsx
similarity index 100%
rename from src/client-electron/renderer/components/Switch.tsx
rename to src/electron/renderer/components/Switch.tsx
diff --git a/src/client-electron/renderer/components/TitleBar.tsx b/src/electron/renderer/components/TitleBar.tsx
similarity index 100%
rename from src/client-electron/renderer/components/TitleBar.tsx
rename to src/electron/renderer/components/TitleBar.tsx
diff --git a/src/client-electron/renderer/components/index.ts b/src/electron/renderer/components/index.ts
similarity index 100%
rename from src/client-electron/renderer/components/index.ts
rename to src/electron/renderer/components/index.ts
diff --git a/public/renderer.html b/src/electron/renderer/index.html
similarity index 100%
rename from public/renderer.html
rename to src/electron/renderer/index.html
diff --git a/src/client-electron/renderer/index.tsx b/src/electron/renderer/index.tsx
similarity index 100%
rename from src/client-electron/renderer/index.tsx
rename to src/electron/renderer/index.tsx
index 2ec8def..d78795a 100644
--- a/src/client-electron/renderer/index.tsx
+++ b/src/electron/renderer/index.tsx
@@ -1,7 +1,7 @@
 import { render } from 'react-dom';
+import { HashRouter as Router } from 'react-router-dom';
 import { App } from './app';
 import { GlobalStyles } from './styles/global';
-import { HashRouter as Router } from 'react-router-dom';
 
 render(
   <>
diff --git a/src/client-electron/renderer/pages/Calibrate.tsx b/src/electron/renderer/pages/Calibrate.tsx
similarity index 98%
rename from src/client-electron/renderer/pages/Calibrate.tsx
rename to src/electron/renderer/pages/Calibrate.tsx
index 00a5217..d993960 100644
--- a/src/client-electron/renderer/pages/Calibrate.tsx
+++ b/src/electron/renderer/pages/Calibrate.tsx
@@ -1,4 +1,4 @@
-import { rendererAsyncRequestDispatcher as asyncRequest } from '@/client-electron/common';
+import { rendererAsyncRequestDispatcher as asyncRequest } from '@/electron/common';
 import { FC, useEffect } from 'react';
 import { MdKeyboardBackspace } from 'react-icons/md';
 import { Link, Route, useRouteMatch } from 'react-router-dom';
diff --git a/src/client-electron/renderer/pages/CalibrateFragment.tsx b/src/electron/renderer/pages/CalibrateFragment.tsx
similarity index 94%
rename from src/client-electron/renderer/pages/CalibrateFragment.tsx
rename to src/electron/renderer/pages/CalibrateFragment.tsx
index 94c746c..75ca68b 100644
--- a/src/client-electron/renderer/pages/CalibrateFragment.tsx
+++ b/src/electron/renderer/pages/CalibrateFragment.tsx
@@ -1,9 +1,12 @@
-import { UpdateSettingsAction } from '@/client-electron/actions';
-import { HistoryEntry, TestThresholdData } from '@/client-electron/common';
 import { BreachProtocolFragmentResults, FragmentId } from '@/core';
+import {
+  HistoryEntry,
+  rendererAsyncRequestDispatcher as asyncRequest,
+  TestThresholdData,
+  UpdateSettingsAction,
+} from '@/electron/common';
 import { FC, useEffect, useState } from 'react';
 import { useParams } from 'react-router-dom';
-import { rendererAsyncRequestDispatcher as asyncRequest } from '../../common';
 import { dispatch, fromCamelCase } from '../common';
 import {
   Col,
diff --git a/src/client-electron/renderer/pages/Dashboard.tsx b/src/electron/renderer/pages/Dashboard.tsx
similarity index 98%
rename from src/client-electron/renderer/pages/Dashboard.tsx
rename to src/electron/renderer/pages/Dashboard.tsx
index e3d3782..7261029 100644
--- a/src/client-electron/renderer/pages/Dashboard.tsx
+++ b/src/electron/renderer/pages/Dashboard.tsx
@@ -1,4 +1,4 @@
-import { AppStats } from '@/client-electron/common';
+import { AppStats } from '@/electron/common';
 import { formatDuration, secondsToHours, secondsToMinutes } from 'date-fns';
 import { memo, useContext } from 'react';
 import styled from 'styled-components';
diff --git a/src/client-electron/renderer/pages/History.tsx b/src/electron/renderer/pages/History.tsx
similarity index 97%
rename from src/client-electron/renderer/pages/History.tsx
rename to src/electron/renderer/pages/History.tsx
index 61ff7f5..c3e9bb2 100644
--- a/src/client-electron/renderer/pages/History.tsx
+++ b/src/electron/renderer/pages/History.tsx
@@ -1,4 +1,4 @@
-import { BreachProtocolStatus } from '@/client-electron/common';
+import { BreachProtocolStatus } from '@/electron/common';
 import { FC, useContext } from 'react';
 import { MdClose, MdDone } from 'react-icons/md';
 import {
diff --git a/src/client-electron/renderer/pages/HistoryDetails.tsx b/src/electron/renderer/pages/HistoryDetails.tsx
similarity index 93%
rename from src/client-electron/renderer/pages/HistoryDetails.tsx
rename to src/electron/renderer/pages/HistoryDetails.tsx
index f97257a..13a4e85 100644
--- a/src/client-electron/renderer/pages/HistoryDetails.tsx
+++ b/src/electron/renderer/pages/HistoryDetails.tsx
@@ -1,8 +1,11 @@
-import { RemoveHistoryEntryAction } from '@/client-electron/actions';
-import { BreachProtocolStatus, HistoryEntry } from '@/client-electron/common';
+import {
+  BreachProtocolStatus,
+  HistoryEntry,
+  RemoveHistoryEntryAction,
+} from '@/electron/common';
 import { differenceInMilliseconds as diff, formatDuration } from 'date-fns';
 import { ipcRenderer as ipc, shell } from 'electron';
-import { FC, PropsWithChildren } from 'react';
+import { FC } from 'react';
 import { Link } from 'react-router-dom';
 import styled from 'styled-components';
 import { dispatch, useHistoryEntryFromParam } from '../common';
diff --git a/src/client-electron/renderer/pages/Settings.tsx b/src/electron/renderer/pages/Settings.tsx
similarity index 97%
rename from src/client-electron/renderer/pages/Settings.tsx
rename to src/electron/renderer/pages/Settings.tsx
index 613d490..7e44932 100644
--- a/src/client-electron/renderer/pages/Settings.tsx
+++ b/src/electron/renderer/pages/Settings.tsx
@@ -1,6 +1,9 @@
-import { UpdateSettingsAction } from '@/client-electron/actions';
-import { AppSettings, WorkerStatus } from '@/client-electron/common';
-import { optionsDescription } from '@/client-electron/options';
+import {
+  AppSettings,
+  optionsDescription,
+  UpdateSettingsAction,
+  WorkerStatus,
+} from '@/electron/common';
 import { Accelerator, ipcRenderer as ipc } from 'electron';
 import {
   FC,
diff --git a/src/client-electron/renderer/pages/index.ts b/src/electron/renderer/pages/index.ts
similarity index 100%
rename from src/client-electron/renderer/pages/index.ts
rename to src/electron/renderer/pages/index.ts
diff --git a/src/client-electron/renderer/state.ts b/src/electron/renderer/state.ts
similarity index 69%
rename from src/client-electron/renderer/state.ts
rename to src/electron/renderer/state.ts
index d82aac5..e0a77e6 100644
--- a/src/client-electron/renderer/state.ts
+++ b/src/electron/renderer/state.ts
@@ -1,4 +1,4 @@
+import { State } from '@/electron/common';
 import { createContext } from 'react';
-import { State } from '../common';
 
 export const StateContext = createContext<State>(null);
diff --git a/src/client-electron/renderer/styles/fonts.css b/src/electron/renderer/styles/fonts.css
similarity index 100%
rename from src/client-electron/renderer/styles/fonts.css
rename to src/electron/renderer/styles/fonts.css
diff --git a/src/client-electron/renderer/styles/global.tsx b/src/electron/renderer/styles/global.tsx
similarity index 100%
rename from src/client-electron/renderer/styles/global.tsx
rename to src/electron/renderer/styles/global.tsx
diff --git a/src/client-electron/worker/autosolver.ts b/src/electron/worker/autosolver.ts
similarity index 97%
rename from src/client-electron/worker/autosolver.ts
rename to src/electron/worker/autosolver.ts
index 06a9635..a421e0c 100644
--- a/src/client-electron/worker/autosolver.ts
+++ b/src/electron/worker/autosolver.ts
@@ -1,4 +1,5 @@
 import { BitMask } from '@/common';
+import { BreachProtocolRobot, SharpImageContainer } from '@/common/node';
 import {
   BreachProtocol,
   breachProtocolOCR,
@@ -6,16 +7,15 @@ import {
   BreachProtocolResult,
   FragmentId,
 } from '@/core';
-import { BreachProtocolRobot, SharpImageContainer } from '@/platform-node';
-import { remove } from 'fs-extra';
-import sharp from 'sharp';
-import { v4 as uuidv4 } from 'uuid';
 import {
   AppSettings,
   BreachProtocolSolveProgress,
   BreachProtocolStatus,
   HistoryEntry,
-} from '../common';
+} from '@/electron/common';
+import { remove } from 'fs-extra';
+import sharp from 'sharp';
+import { v4 as uuidv4 } from 'uuid';
 
 export class BreachProtocolAutosolver {
   private readonly uuid = uuidv4();
diff --git a/public/worker.html b/src/electron/worker/index.html
similarity index 100%
rename from public/worker.html
rename to src/electron/worker/index.html
diff --git a/src/client-electron/worker/index.ts b/src/electron/worker/index.ts
similarity index 100%
rename from src/client-electron/worker/index.ts
rename to src/electron/worker/index.ts
diff --git a/src/client-electron/worker/worker.ts b/src/electron/worker/worker.ts
similarity index 97%
rename from src/client-electron/worker/worker.ts
rename to src/electron/worker/worker.ts
index 92903fc..33bc6ab 100644
--- a/src/client-electron/worker/worker.ts
+++ b/src/electron/worker/worker.ts
@@ -1,28 +1,26 @@
+import { PlatformRobot, SharpImageContainer } from '@/common/node';
 import {
   BreachProtocolBufferSizeFragment,
   BreachProtocolDaemonsFragment,
   BreachProtocolGridFragment,
   BreachProtocolOCRFragment,
 } from '@/core';
-import { PlatformRobot, SharpImageContainer } from '@/platform-node';
-import { ipcRenderer as ipc, IpcRendererEvent } from 'electron';
-import { listDisplays, ScreenshotDisplayOutput } from 'screenshot-desktop';
-import sharp from 'sharp';
-import {
-  AddHistoryEntryAction,
-  SetDisplaysAction,
-  SetStatusAction,
-  UpdateSettingsAction,
-} from '../actions';
 import {
   Action,
+  AddHistoryEntryAction,
   AppSettings,
   Request,
+  SetDisplaysAction,
+  SetStatusAction,
   State,
   TestThresholdData,
+  UpdateSettingsAction,
   workerAsyncRequestListener,
   WorkerStatus,
-} from '../common';
+} from '@/electron/common';
+import { ipcRenderer as ipc, IpcRendererEvent } from 'electron';
+import { listDisplays, ScreenshotDisplayOutput } from 'screenshot-desktop';
+import sharp from 'sharp';
 import { BreachProtocolAutosolver } from './autosolver';
 
 export class BreachProtocolWorker {


Test patch:
diff --git a/src/platform-node/sharp-image-container.ts b/src/common/node/sharp-image-container.ts
similarity index 100%
rename from src/platform-node/sharp-image-container.ts
rename to src/common/node/sharp-image-container.ts
diff --git a/src/common/util.test.ts b/src/common/util.test.ts
index d93e6bf..f8a9162 100644
--- a/src/common/util.test.ts
+++ b/src/common/util.test.ts
@@ -1,11 +1,11 @@
 import {
+  BitMask,
   chunk,
   getClosest,
   memoize,
   unique,
   uniqueBy,
   uniqueWith,
-  BitMask,
 } from './util';
 
 describe('utils', () => {
diff --git a/src/bp-registry/1024x768/1.png b/src/core/bp-registry/1024x768/1.png
similarity index 100%
rename from src/bp-registry/1024x768/1.png
rename to src/core/bp-registry/1024x768/1.png
diff --git a/src/bp-registry/1920x1080/1.png b/src/core/bp-registry/1920x1080/1.png
similarity index 100%
rename from src/bp-registry/1920x1080/1.png
rename to src/core/bp-registry/1920x1080/1.png
diff --git a/src/bp-registry/1920x1080/2.png b/src/core/bp-registry/1920x1080/2.png
similarity index 100%
rename from src/bp-registry/1920x1080/2.png
rename to src/core/bp-registry/1920x1080/2.png
diff --git a/src/bp-registry/1920x1080/3.png b/src/core/bp-registry/1920x1080/3.png
similarity index 100%
rename from src/bp-registry/1920x1080/3.png
rename to src/core/bp-registry/1920x1080/3.png
diff --git a/src/bp-registry/1920x1080/4.png b/src/core/bp-registry/1920x1080/4.png
similarity index 100%
rename from src/bp-registry/1920x1080/4.png
rename to src/core/bp-registry/1920x1080/4.png
diff --git a/src/bp-registry/1920x1080/5.png b/src/core/bp-registry/1920x1080/5.png
similarity index 100%
rename from src/bp-registry/1920x1080/5.png
rename to src/core/bp-registry/1920x1080/5.png
diff --git a/src/bp-registry/1920x1080/ar.png b/src/core/bp-registry/1920x1080/ar.png
similarity index 100%
rename from src/bp-registry/1920x1080/ar.png
rename to src/core/bp-registry/1920x1080/ar.png
diff --git a/src/bp-registry/1920x1080/ja.png b/src/core/bp-registry/1920x1080/ja.png
similarity index 100%
rename from src/bp-registry/1920x1080/ja.png
rename to src/core/bp-registry/1920x1080/ja.png
diff --git a/src/bp-registry/1920x1080/ko.png b/src/core/bp-registry/1920x1080/ko.png
similarity index 100%
rename from src/bp-registry/1920x1080/ko.png
rename to src/core/bp-registry/1920x1080/ko.png
diff --git a/src/bp-registry/1920x1080/th.png b/src/core/bp-registry/1920x1080/th.png
similarity index 100%
rename from src/bp-registry/1920x1080/th.png
rename to src/core/bp-registry/1920x1080/th.png
diff --git a/src/bp-registry/1920x1080/zh-CN.png b/src/core/bp-registry/1920x1080/zh-CN.png
similarity index 100%
rename from src/bp-registry/1920x1080/zh-CN.png
rename to src/core/bp-registry/1920x1080/zh-CN.png
diff --git a/src/bp-registry/2560x1440/1.png b/src/core/bp-registry/2560x1440/1.png
similarity index 100%
rename from src/bp-registry/2560x1440/1.png
rename to src/core/bp-registry/2560x1440/1.png
diff --git a/src/bp-registry/2560x1440/2.png b/src/core/bp-registry/2560x1440/2.png
similarity index 100%
rename from src/bp-registry/2560x1440/2.png
rename to src/core/bp-registry/2560x1440/2.png
diff --git a/src/bp-registry/2560x1440/3.png b/src/core/bp-registry/2560x1440/3.png
similarity index 100%
rename from src/bp-registry/2560x1440/3.png
rename to src/core/bp-registry/2560x1440/3.png
diff --git a/src/bp-registry/2560x1440/4.png b/src/core/bp-registry/2560x1440/4.png
similarity index 100%
rename from src/bp-registry/2560x1440/4.png
rename to src/core/bp-registry/2560x1440/4.png
diff --git a/src/bp-registry/2560x1440/5.png b/src/core/bp-registry/2560x1440/5.png
similarity index 100%
rename from src/bp-registry/2560x1440/5.png
rename to src/core/bp-registry/2560x1440/5.png
diff --git a/src/bp-registry/2560x1440/ar.png b/src/core/bp-registry/2560x1440/ar.png
similarity index 100%
rename from src/bp-registry/2560x1440/ar.png
rename to src/core/bp-registry/2560x1440/ar.png
diff --git a/src/bp-registry/2560x1440/g050.png b/src/core/bp-registry/2560x1440/g050.png
similarity index 100%
rename from src/bp-registry/2560x1440/g050.png
rename to src/core/bp-registry/2560x1440/g050.png
diff --git a/src/bp-registry/2560x1440/g150.png b/src/core/bp-registry/2560x1440/g150.png
similarity index 100%
rename from src/bp-registry/2560x1440/g150.png
rename to src/core/bp-registry/2560x1440/g150.png
diff --git a/src/bp-registry/2560x1440/ja.png b/src/core/bp-registry/2560x1440/ja.png
similarity index 100%
rename from src/bp-registry/2560x1440/ja.png
rename to src/core/bp-registry/2560x1440/ja.png
diff --git a/src/bp-registry/2560x1440/ko.png b/src/core/bp-registry/2560x1440/ko.png
similarity index 100%
rename from src/bp-registry/2560x1440/ko.png
rename to src/core/bp-registry/2560x1440/ko.png
diff --git a/src/bp-registry/2560x1440/th.png b/src/core/bp-registry/2560x1440/th.png
similarity index 100%
rename from src/bp-registry/2560x1440/th.png
rename to src/core/bp-registry/2560x1440/th.png
diff --git a/src/bp-registry/2560x1440/zh-CN.png b/src/core/bp-registry/2560x1440/zh-CN.png
similarity index 100%
rename from src/bp-registry/2560x1440/zh-CN.png
rename to src/core/bp-registry/2560x1440/zh-CN.png
diff --git a/src/bp-registry/3440x1440/1.png b/src/core/bp-registry/3440x1440/1.png
similarity index 100%
rename from src/bp-registry/3440x1440/1.png
rename to src/core/bp-registry/3440x1440/1.png
diff --git a/src/bp-registry/3840x2160/1.png b/src/core/bp-registry/3840x2160/1.png
similarity index 100%
rename from src/bp-registry/3840x2160/1.png
rename to src/core/bp-registry/3840x2160/1.png
diff --git a/src/bp-registry/3840x2160/2.png b/src/core/bp-registry/3840x2160/2.png
similarity index 100%
rename from src/bp-registry/3840x2160/2.png
rename to src/core/bp-registry/3840x2160/2.png
diff --git a/src/bp-registry/3840x2160/3.png b/src/core/bp-registry/3840x2160/3.png
similarity index 100%
rename from src/bp-registry/3840x2160/3.png
rename to src/core/bp-registry/3840x2160/3.png
diff --git a/src/bp-registry/3840x2160/4.png b/src/core/bp-registry/3840x2160/4.png
similarity index 100%
rename from src/bp-registry/3840x2160/4.png
rename to src/core/bp-registry/3840x2160/4.png
diff --git a/src/bp-registry/3840x2160/5.png b/src/core/bp-registry/3840x2160/5.png
similarity index 100%
rename from src/bp-registry/3840x2160/5.png
rename to src/core/bp-registry/3840x2160/5.png
diff --git a/src/bp-registry/registry.json b/src/core/bp-registry/registry.json
similarity index 100%
rename from src/bp-registry/registry.json
rename to src/core/bp-registry/registry.json
diff --git a/src/core/bp-registry/test-data.json b/src/core/bp-registry/test-data.json
new file mode 100644
index 0000000..713a112
--- /dev/null
+++ b/src/core/bp-registry/test-data.json
@@ -0,0 +1,63 @@
+[
+  {
+    "grid": [
+      "E9", "55", "1C", "55", "E9",
+      "1C", "55", "1C", "1C", "1C",
+      "55", "55", "E9", "1C", "1C",
+      "E9", "1C", "1C", "55", "1C",
+      "55", "1C", "E9", "55", "1C"
+    ],
+    "daemons": [
+      ["1C", "1C"],
+      ["E9", "1C"],
+      ["1C", "55", "E9"]
+    ],
+    "bufferSize": 7
+  },
+  {
+    "grid": [
+      "1C", "BD", "55", "55", "BD",
+      "55", "1C", "E9", "1C", "BD",
+      "1C", "BD", "BD", "55", "BD",
+      "BD", "55", "1C", "E9", "E9",
+      "55", "1C", "BD", "55", "55"
+    ],
+    "daemons": [
+      ["55", "1C"],
+      ["1C", "BD", "BD"],
+      ["BD", "1C", "55"]
+    ],
+    "bufferSize": 4
+  },
+  {
+    "grid": [
+      "1C", "BD", "1C", "1C", "BD",
+      "1C", "BD", "55", "1C", "1C",
+      "BD", "E9", "55", "1C", "55", 
+      "1C" ,"1C", "1C", "BD", "E9", 
+      "1C", "1C", "1C", "55", "E9"
+    ],
+    "daemons": [
+      ["E9", "1C"],
+      ["1C", "BD", "55"]
+    ],
+    "bufferSize": 7
+  },
+  {
+    "grid": [
+      "7A", "55", "E9", "FF", "1C", "1C", "1C",
+      "FF", "55", "55", "1C", "7A", "FF", "55", 
+      "1C", "FF", "FF", "55", "E9", "BD", "55",
+      "1C", "1C", "BD", "7A", "E9", "E9", "BD",
+      "FF", "55", "1C", "1C", "55", "7A", "E9",
+      "7A", "1C", "1C", "7A", "1C", "BD", "E9",
+      "1C", "55", "BD", "1C", "1C", "1C", "1C"
+    ],
+    "daemons": [
+      ["1C", "FF", "1C", "1C"],
+      ["BD", "E9", "1C", "E9"],
+      ["FF", "FF", "55", "1C"]
+    ],
+    "bufferSize": 8
+  }
+]
diff --git a/src/core/index.test.ts b/src/core/index.test.ts
index 4c14469..63c30ea 100644
--- a/src/core/index.test.ts
+++ b/src/core/index.test.ts
@@ -1,4 +1,5 @@
-import registry from '../bp-registry/registry.json';
+import registry from './bp-registry/registry.json';
+import data from './bp-registry/test-data.json';
 import {
   BreachProtocolRawData,
   BufferSize,
@@ -11,9 +12,9 @@ import {
 } from './common';
 import { BreachProtocol, BreachProtocolResult } from './game';
 import { Daemon, parseDaemons, Sequence } from './sequence';
-import data from './test-data.json';
 
 const registryBreachProtocols = [
+  ...registry['1024x768'],
   ...registry['1920x1080'],
   ...registry['2560x1440'],
   ...registry['3440x1440'],
@@ -25,7 +26,7 @@ const testData = (data as BreachProtocolRawData[]).concat(
 );
 
 describe('utilities', () => {
-  test('should combine 2 strings', () => {
+  it('should combine 2 strings', () => {
     const a = 'ab';
     const b = '12';
     const result = cross(a, b);
@@ -34,7 +35,7 @@ describe('utilities', () => {
     expect(result.length).toBe(a.length * b.length);
   });
 
-  test('should return array of units in correct order', () => {
+  it('should return array of units in correct order', () => {
     const result = getUnits('abc', '123');
 
     expect(result).toEqual([
@@ -54,7 +55,7 @@ describe('utilities', () => {
     ]);
   });
 
-  test('should generate square map with correct values', () => {
+  it('should generate square map with correct values', () => {
     const squares = cross('ab', '12');
     const result = generateSquareMap(squares, (squre, index) => {
       if (squre === 'b2') {
@@ -73,7 +74,7 @@ describe('utilities', () => {
 });
 
 describe('Breach protocol solve', () => {
-  test('should resolve 3 base cases', () => {
+  it('should resolve 3 base cases', () => {
     // prettier-ignore
     const grid: GridRawData = [
       '55', '55', '1C', 
diff --git a/src/core/ocr/ocr.test.ts b/src/core/ocr/ocr.test.ts
index b23074e..a33517b 100644
--- a/src/core/ocr/ocr.test.ts
+++ b/src/core/ocr/ocr.test.ts
@@ -1,7 +1,7 @@
-import { SharpImageContainer } from '@/platform-node';
+import { SharpImageContainer } from '@/common/node';
 import path from 'path';
 import sharp from 'sharp';
-import registry from '../../bp-registry/registry.json';
+import registry from '../bp-registry/registry.json';
 import { BufferSize, DaemonsRawData, GridRawData } from '../common';
 import {
   BreachProtocolFragmentStatus,
@@ -28,7 +28,6 @@ type Resolution =
   | '2560x1440'
   | '3440x1440'
   | '3840x2160';
-type Registry = Record<Resolution, RegistryEntry[]>;
 
 describe('image container', () => {
   const aspectRatio = ImageContainer.ASPECT_RATIO;
@@ -223,7 +222,7 @@ describe('ocr', () => {
 });
 
 function getRegistryFor(resolution: Resolution) {
-  return (registry as Registry)[resolution].map(
+  return registry[resolution].map(
     (e) => [e.fileName, e] as [string, RegistryEntry]
   );
 }
@@ -250,7 +249,7 @@ async function recognizeRegistryEntry(
   resolution: Resolution,
   thresholds?: Partial<Record<FragmentId, number>>
 ) {
-  const file = path.join('./src/bp-registry', resolution, entry.fileName);
+  const file = path.join('./src/core/bp-registry', resolution, entry.fileName);
   const image = sharp(file);
   const container = await SharpImageContainer.create(image);
   const trimStrategy = new BreachProtocolBufferSizeTrimFragment(container);
diff --git a/src/core/test-data.json b/src/core/test-data.json
deleted file mode 100644
index dc1fc7f..0000000
--- a/src/core/test-data.json
+++ /dev/null
@@ -1,165 +0,0 @@
-[
-  {
-    "grid": [
-      "E9",
-      "55",
-      "1C",
-      "55",
-      "E9",
-      "1C",
-      "55",
-      "1C",
-      "1C",
-      "1C",
-      "55",
-      "55",
-      "E9",
-      "1C",
-      "1C",
-      "E9",
-      "1C",
-      "1C",
-      "55",
-      "1C",
-      "55",
-      "1C",
-      "E9",
-      "55",
-      "1C"
-    ],
-    "daemons": [
-      ["1C", "1C"],
-      ["E9", "1C"],
-      ["1C", "55", "E9"]
-    ],
-    "bufferSize": 7
-  },
-  {
-    "grid": [
-      "1C",
-      "BD",
-      "55",
-      "55",
-      "BD",
-      "55",
-      "1C",
-      "E9",
-      "1C",
-      "BD",
-      "1C",
-      "BD",
-      "BD",
-      "55",
-      "BD",
-      "BD",
-      "55",
-      "1C",
-      "E9",
-      "E9",
-      "55",
-      "1C",
-      "BD",
-      "55",
-      "55"
-    ],
-    "daemons": [
-      ["55", "1C"],
-      ["1C", "BD", "BD"],
-      ["BD", "1C", "55"]
-    ],
-    "bufferSize": 4
-  },
-  {
-    "grid": [
-      "1C",
-      "BD",
-      "1C",
-      "1C",
-      "BD",
-      "1C",
-      "BD",
-      "55",
-      "1C",
-      "1C",
-      "BD",
-      "E9",
-      "55",
-      "1C",
-      "55",
-      "1C",
-      "1C",
-      "1C",
-      "BD",
-      "E9",
-      "1C",
-      "1C",
-      "1C",
-      "55",
-      "E9"
-    ],
-    "daemons": [
-      ["E9", "1C"],
-      ["1C", "BD", "55"]
-    ],
-    "bufferSize": 7
-  },
-  {
-    "grid": [
-      "7A",
-      "55",
-      "E9",
-      "FF",
-      "1C",
-      "1C",
-      "1C",
-      "FF",
-      "55",
-      "55",
-      "1C",
-      "7A",
-      "FF",
-      "55",
-      "1C",
-      "FF",
-      "FF",
-      "55",
-      "E9",
-      "BD",
-      "55",
-      "1C",
-      "1C",
-      "BD",
-      "7A",
-      "E9",
-      "E9",
-      "BD",
-      "FF",
-      "55",
-      "1C",
-      "1C",
-      "55",
-      "7A",
-      "E9",
-      "7A",
-      "1C",
-      "1C",
-      "7A",
-      "1C",
-      "BD",
-      "E9",
-      "1C",
-      "55",
-      "BD",
-      "1C",
-      "1C",
-      "1C",
-      "1C"
-    ],
-    "daemons": [
-      ["1C", "FF", "1C", "1C"],
-      ["BD", "E9", "1C", "E9"],
-      ["FF", "FF", "55", "1C"]
-    ],
-    "bufferSize": 8
-  }
-]