hardpy 0.10.0__tar.gz → 0.11.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. {hardpy-0.10.0 → hardpy-0.11.0}/PKG-INFO +1 -1
  2. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/__init__.py +2 -0
  3. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/cli/cli.py +0 -12
  4. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/cli/template.py +0 -4
  5. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/common/config.py +11 -21
  6. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/common/stand_cloud/registration.py +28 -1
  7. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/common/stand_cloud/token_storage.py +5 -1
  8. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/asset-manifest.json +3 -3
  9. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/index.html +1 -1
  10. hardpy-0.11.0/hardpy/hardpy_panel/frontend/dist/static/js/main.114c5914.js +3 -0
  11. hardpy-0.11.0/hardpy/hardpy_panel/frontend/dist/static/js/main.114c5914.js.map +1 -0
  12. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/db/base_store.py +7 -2
  13. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/db/const.py +3 -0
  14. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/db/schema/v1.py +22 -0
  15. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/plugin.py +4 -12
  16. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/pytest_call.py +30 -41
  17. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/pytest_wrapper.py +7 -17
  18. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/reporter/base.py +9 -4
  19. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/reporter/hook_reporter.py +7 -0
  20. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/utils/__init__.py +2 -0
  21. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/utils/connection_data.py +0 -4
  22. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/utils/dialog_box.py +59 -6
  23. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/utils/exception.py +1 -0
  24. {hardpy-0.10.0 → hardpy-0.11.0}/pyproject.toml +1 -1
  25. hardpy-0.10.0/hardpy/hardpy_panel/frontend/dist/static/js/main.8a7d8f7d.js +0 -3
  26. hardpy-0.10.0/hardpy/hardpy_panel/frontend/dist/static/js/main.8a7d8f7d.js.map +0 -1
  27. {hardpy-0.10.0 → hardpy-0.11.0}/.gitignore +0 -0
  28. {hardpy-0.10.0 → hardpy-0.11.0}/LICENSE +0 -0
  29. {hardpy-0.10.0 → hardpy-0.11.0}/README.md +0 -0
  30. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/cli/__init__.py +0 -0
  31. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/common/__init__.py +0 -0
  32. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/common/stand_cloud/__init__.py +0 -0
  33. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/common/stand_cloud/connector.py +0 -0
  34. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/common/stand_cloud/exception.py +0 -0
  35. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/common/stand_cloud/oauth_callback.py +0 -0
  36. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/__init__.py +0 -0
  37. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/api.py +0 -0
  38. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/favicon.ico +0 -0
  39. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/logo192.png +0 -0
  40. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/logo512.png +0 -0
  41. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/manifest.json +0 -0
  42. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/css/main.e8a862f1.css +0 -0
  43. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/css/main.e8a862f1.css.map +0 -0
  44. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/js/808.ce070002.chunk.js +0 -0
  45. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/js/808.ce070002.chunk.js.map +0 -0
  46. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/js/blueprint-icons-16px-paths.d605910e.chunk.js +0 -0
  47. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/js/blueprint-icons-16px-paths.d605910e.chunk.js.map +0 -0
  48. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/js/blueprint-icons-20px-paths.7ee05cc8.chunk.js +0 -0
  49. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/js/blueprint-icons-20px-paths.7ee05cc8.chunk.js.map +0 -0
  50. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/js/blueprint-icons-all-paths-loader.0aa89747.chunk.js +0 -0
  51. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/js/blueprint-icons-all-paths-loader.0aa89747.chunk.js.map +0 -0
  52. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/js/blueprint-icons-all-paths.f63155c9.chunk.js +0 -0
  53. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/js/blueprint-icons-all-paths.f63155c9.chunk.js.map +0 -0
  54. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/js/blueprint-icons-split-paths-by-size-loader.52a072d3.chunk.js +0 -0
  55. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/js/blueprint-icons-split-paths-by-size-loader.52a072d3.chunk.js.map +0 -0
  56. /hardpy-0.10.0/hardpy/hardpy_panel/frontend/dist/static/js/main.8a7d8f7d.js.LICENSE.txt → /hardpy-0.11.0/hardpy/hardpy_panel/frontend/dist/static/js/main.114c5914.js.LICENSE.txt +0 -0
  57. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/media/blueprint-icons-16.520846c6beb41df528c8.eot +0 -0
  58. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/media/blueprint-icons-16.5c52b39c697f2323ce8b.svg +0 -0
  59. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/media/blueprint-icons-16.84db1772f4bfb529f64f.woff +0 -0
  60. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/media/blueprint-icons-16.b67ee1736e20e37a3225.woff2 +0 -0
  61. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/media/blueprint-icons-16.e02ecf515378db143652.ttf +0 -0
  62. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/media/blueprint-icons-20.429cacb8accf72488451.ttf +0 -0
  63. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/media/blueprint-icons-20.6ae3791ee2d86fc228a6.svg +0 -0
  64. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/media/blueprint-icons-20.8cecf62de42997e4d82f.woff2 +0 -0
  65. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/media/blueprint-icons-20.afbadb627d43b7857223.eot +0 -0
  66. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/media/blueprint-icons-20.e857f5a5132b8bfa71a1.woff +0 -0
  67. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/hardpy_panel/frontend/dist/static/media/logo_smol.5b16f92447a4a9e80331.png +0 -0
  68. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/__init__.py +0 -0
  69. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/db/__init__.py +0 -0
  70. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/db/base_connector.py +0 -0
  71. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/db/base_server.py +0 -0
  72. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/db/runstore.py +0 -0
  73. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/db/schema/__init__.py +0 -0
  74. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/db/statestore.py +0 -0
  75. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/reporter/__init__.py +0 -0
  76. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/reporter/runner_reporter.py +0 -0
  77. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/result/__init__.py +0 -0
  78. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/result/couchdb_config.py +0 -0
  79. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/result/report_loader/__init__.py +0 -0
  80. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/result/report_loader/couchdb_loader.py +0 -0
  81. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/result/report_loader/stand_cloud_loader.py +0 -0
  82. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/result/report_reader/__init__.py +0 -0
  83. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/result/report_reader/couchdb_reader.py +0 -0
  84. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/utils/const.py +0 -0
  85. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/utils/machineid.py +0 -0
  86. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/utils/node_info.py +0 -0
  87. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/utils/progress_calculator.py +0 -0
  88. {hardpy-0.10.0 → hardpy-0.11.0}/hardpy/pytest_hardpy/utils/singleton.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hardpy
3
- Version: 0.10.0
3
+ Version: 0.11.0
4
4
  Summary: HardPy library for device testing
5
5
  Project-URL: Homepage, https://github.com/everypinio/hardpy/
6
6
  Project-URL: Documentation, https://everypinio.github.io/hardpy/
@@ -30,6 +30,7 @@ from hardpy.pytest_hardpy.utils import (
30
30
  DuplicateSerialNumberError,
31
31
  DuplicateTestStandLocationError,
32
32
  DuplicateTestStandNameError,
33
+ HTMLComponent,
33
34
  ImageComponent,
34
35
  MultistepWidget,
35
36
  NumericInputWidget,
@@ -48,6 +49,7 @@ __all__ = [
48
49
  "DuplicateSerialNumberError",
49
50
  "DuplicateTestStandLocationError",
50
51
  "DuplicateTestStandNameError",
52
+ "HTMLComponent",
51
53
  "ImageComponent",
52
54
  "MultistepWidget",
53
55
  "NumericInputWidget",
@@ -59,14 +59,6 @@ def init( # noqa: PLR0913
59
59
  default=default_config.frontend.port,
60
60
  help="Specify a frontend port.",
61
61
  ),
62
- socket_host: str = typer.Option(
63
- default=default_config.socket.host,
64
- help="Specify a socket host.",
65
- ),
66
- socket_port: int = typer.Option(
67
- default=default_config.socket.port,
68
- help="Specify a socket port.",
69
- ),
70
62
  sc_address: str = typer.Option(
71
63
  default="",
72
64
  help="Specify a StandCloud address.",
@@ -87,8 +79,6 @@ def init( # noqa: PLR0913
87
79
  database_port (int): Database port
88
80
  frontend_host (str): Panel operator host
89
81
  frontend_port (int): Panel operator port
90
- socket_host (str): Socket host
91
- socket_port (int): Socket port
92
82
  sc_address (str): StandCloud address
93
83
  sc_connection_only (bool): Flag to check StandCloud service availability
94
84
  """
@@ -101,8 +91,6 @@ def init( # noqa: PLR0913
101
91
  database_port=database_port,
102
92
  frontend_host=frontend_host,
103
93
  frontend_port=frontend_port,
104
- socket_host=socket_host,
105
- socket_port=socket_port,
106
94
  sc_address=sc_address,
107
95
  sc_connection_only=sc_connection_only,
108
96
  )
@@ -138,8 +138,6 @@ log_cli_format = %%(asctime)s [%%(levelname)s] %%(message)s
138
138
  log_cli_date_format = %H:%M:%S
139
139
  addopts = --hardpy-pt
140
140
  --hardpy-db-url http://{}:{}@{}:{}/
141
- --hardpy-sh {}
142
- --hardpy-sp {}
143
141
  """
144
142
 
145
143
  test_1_py = """import pytest
@@ -207,8 +205,6 @@ class TemplateGenerator:
207
205
  self._config.database.password,
208
206
  self._config.database.host,
209
207
  self._config.database.port,
210
- self._config.socket.host,
211
- self._config.socket.port,
212
208
  )
213
209
 
214
210
  @property
@@ -42,14 +42,6 @@ class FrontendConfig(BaseModel):
42
42
  port: int = 8000
43
43
 
44
44
 
45
- class SocketConfig(BaseModel):
46
- """Socket configuration."""
47
-
48
- model_config = ConfigDict(extra="forbid")
49
-
50
- host: str = "localhost"
51
- port: int = 6525
52
-
53
45
  class StandCloudConfig(BaseModel):
54
46
  """StandCloud configuration."""
55
47
 
@@ -58,7 +50,7 @@ class StandCloudConfig(BaseModel):
58
50
  address: str = ""
59
51
  connection_only: bool = False
60
52
 
61
- class HardpyConfig(BaseModel):
53
+ class HardpyConfig(BaseModel, extra="allow"):
62
54
  """HardPy configuration."""
63
55
 
64
56
  model_config = ConfigDict(extra="forbid")
@@ -67,7 +59,6 @@ class HardpyConfig(BaseModel):
67
59
  tests_dir: str = "tests"
68
60
  database: DatabaseConfig = DatabaseConfig()
69
61
  frontend: FrontendConfig = FrontendConfig()
70
- socket: SocketConfig = SocketConfig()
71
62
  stand_cloud: StandCloudConfig = StandCloudConfig()
72
63
 
73
64
 
@@ -87,8 +78,6 @@ class ConfigManager:
87
78
  database_port: int,
88
79
  frontend_host: str,
89
80
  frontend_port: int,
90
- socket_host: str,
91
- socket_port: int,
92
81
  sc_address: str = "",
93
82
  sc_connection_only: bool = False,
94
83
  ) -> None:
@@ -102,8 +91,6 @@ class ConfigManager:
102
91
  database_port (int): Database port.
103
92
  frontend_host (str): Operator panel host.
104
93
  frontend_port (int): Operator panel port.
105
- socket_host (str): Socket host.
106
- socket_port (int): Socket port.
107
94
  sc_address (str): StandCloud address.
108
95
  sc_connection_only (bool): StandCloud check availability.
109
96
  """
@@ -114,8 +101,6 @@ class ConfigManager:
114
101
  cls.obj.database.port = database_port
115
102
  cls.obj.frontend.host = frontend_host
116
103
  cls.obj.frontend.port = frontend_port
117
- cls.obj.socket.host = socket_host
118
- cls.obj.socket.port = socket_port
119
104
  cls.obj.stand_cloud.address = sc_address
120
105
  cls.obj.stand_cloud.connection_only = sc_connection_only
121
106
 
@@ -149,13 +134,18 @@ class ConfigManager:
149
134
  return None
150
135
  try:
151
136
  with Path.open(toml_path / "hardpy.toml", "rb") as f:
152
- cls.obj = HardpyConfig(**tomli.load(f))
153
- return cls.obj # noqa: TRY300
154
- except tomli.TOMLDecodeError:
155
- logger.exception("Error parsing TOML")
137
+ toml_data = tomli.load(f)
138
+ except tomli.TOMLDecodeError as exc:
139
+ msg = f"Error parsing TOML: {exc}"
140
+ logger.exception(msg)
141
+ return None
142
+
143
+ try:
144
+ cls.obj = HardpyConfig(**toml_data)
156
145
  except ValidationError:
157
146
  logger.exception("Error parsing TOML")
158
- return None
147
+ return None
148
+ return cls.obj
159
149
 
160
150
  @classmethod
161
151
  def get_config(cls) -> HardpyConfig:
@@ -12,6 +12,8 @@ import secrets
12
12
  import socket
13
13
  import subprocess
14
14
  import sys
15
+ from contextlib import suppress
16
+ from platform import system
15
17
  from time import sleep
16
18
  from typing import TYPE_CHECKING
17
19
  from urllib.parse import urlencode
@@ -109,6 +111,12 @@ def logout() -> bool:
109
111
  delete_password(service_name, cred.username)
110
112
  except KeyringError:
111
113
  return False
114
+ # TODO(xorialexandrov): fix keyring clearing
115
+ # Windows does not clear refresh token by itself
116
+ if system() == "Windows":
117
+ storage_keyring, _ = get_token_store()
118
+ with suppress(KeyringError):
119
+ storage_keyring.delete_password(service_name, "refresh_token")
112
120
  return True
113
121
 
114
122
 
@@ -147,6 +155,18 @@ def _create_callback_process(port: str) -> subprocess.Popen:
147
155
  "--log-level=error",
148
156
  ]
149
157
 
158
+ if system() == "Windows":
159
+ env = os.environ.copy()
160
+ env["PYTHONUNBUFFERED"] = "1"
161
+
162
+ return subprocess.Popen( # noqa: S603
163
+ args,
164
+ stdout=subprocess.PIPE,
165
+ bufsize=1,
166
+ universal_newlines=True,
167
+ env=env,
168
+ creationflags=subprocess.CREATE_NEW_PROCESS_GROUP, # type: ignore
169
+ )
150
170
  return subprocess.Popen( # noqa: S603
151
171
  args,
152
172
  stdout=subprocess.PIPE,
@@ -187,7 +207,14 @@ def _check_incorrect_response(response: dict, state: str) -> None:
187
207
  print(f"{error}: {error_description}")
188
208
  sys.exit(1)
189
209
 
190
- def _par_data(code_verifier: str, client_id: str, port: str, state: str, api_url: str) -> dict:
210
+
211
+ def _par_data(
212
+ code_verifier: str,
213
+ client_id: str,
214
+ port: str,
215
+ state: str,
216
+ api_url: str,
217
+ ) -> dict:
191
218
  """Create pushed authorization request data.
192
219
 
193
220
  Returns:
@@ -2,6 +2,7 @@
2
2
  # GNU General Public License v3.0 (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
3
3
  from __future__ import annotations
4
4
 
5
+ from platform import system
5
6
  from typing import TYPE_CHECKING
6
7
 
7
8
  from keyring.core import load_keyring
@@ -16,7 +17,10 @@ def get_token_store() -> tuple[KeyringBackend, KeyringBackend]:
16
17
  Returns:
17
18
  tuple[KeyringBackend, KeyringBackend]: token store
18
19
  """
19
- storage_keyring = load_keyring("keyring.backends.SecretService.Keyring")
20
+ if system() == "Linux":
21
+ storage_keyring = load_keyring("keyring.backends.SecretService.Keyring")
22
+ elif system() == "Windows":
23
+ storage_keyring = load_keyring("keyring.backends.Windows.WinVaultKeyring")
20
24
  # TODO(xorialexandrov): add memory keyring or other store
21
25
  mem_keyring = storage_keyring
22
26
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "files": {
3
3
  "main.css": "/static/css/main.e8a862f1.css",
4
- "main.js": "/static/js/main.8a7d8f7d.js",
4
+ "main.js": "/static/js/main.114c5914.js",
5
5
  "blueprint-icons-all-paths-loader.js": "/static/js/blueprint-icons-all-paths-loader.0aa89747.chunk.js",
6
6
  "blueprint-icons-split-paths-by-size-loader.js": "/static/js/blueprint-icons-split-paths-by-size-loader.52a072d3.chunk.js",
7
7
  "static/js/808.ce070002.chunk.js": "/static/js/808.ce070002.chunk.js",
@@ -21,7 +21,7 @@
21
21
  "static/media/logo_smol.png": "/static/media/logo_smol.5b16f92447a4a9e80331.png",
22
22
  "index.html": "/index.html",
23
23
  "main.e8a862f1.css.map": "/static/css/main.e8a862f1.css.map",
24
- "main.8a7d8f7d.js.map": "/static/js/main.8a7d8f7d.js.map",
24
+ "main.114c5914.js.map": "/static/js/main.114c5914.js.map",
25
25
  "blueprint-icons-all-paths-loader.0aa89747.chunk.js.map": "/static/js/blueprint-icons-all-paths-loader.0aa89747.chunk.js.map",
26
26
  "blueprint-icons-split-paths-by-size-loader.52a072d3.chunk.js.map": "/static/js/blueprint-icons-split-paths-by-size-loader.52a072d3.chunk.js.map",
27
27
  "808.ce070002.chunk.js.map": "/static/js/808.ce070002.chunk.js.map",
@@ -31,6 +31,6 @@
31
31
  },
32
32
  "entrypoints": [
33
33
  "static/css/main.e8a862f1.css",
34
- "static/js/main.8a7d8f7d.js"
34
+ "static/js/main.114c5914.js"
35
35
  ]
36
36
  }
@@ -1 +1 @@
1
- <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="/logo192.png"/><link rel="manifest" href="/manifest.json"/><title>HardPy Operator Panel</title><script defer="defer" src="/static/js/main.8a7d8f7d.js"></script><link href="/static/css/main.e8a862f1.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="/logo192.png"/><link rel="manifest" href="/manifest.json"/><title>HardPy Operator Panel</title><script defer="defer" src="/static/js/main.114c5914.js"></script><link href="/static/css/main.e8a862f1.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>