@tsparticles/engine 3.6.0-beta.1 → 3.7.0

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 (269) hide show
  1. package/README.md +6 -1
  2. package/browser/Core/Canvas.js +32 -21
  3. package/browser/Core/Container.js +1 -1
  4. package/browser/Core/Engine.js +17 -1
  5. package/browser/Core/Particle.js +1 -1
  6. package/browser/Options/Classes/AnimatableColor.js +2 -2
  7. package/browser/Options/Classes/AnimationOptions.js +3 -2
  8. package/browser/Options/Classes/Background/Background.js +2 -1
  9. package/browser/Options/Classes/BackgroundMask/BackgroundMask.js +2 -2
  10. package/browser/Options/Classes/BackgroundMask/BackgroundMaskCover.js +2 -1
  11. package/browser/Options/Classes/ColorAnimation.js +2 -1
  12. package/browser/Options/Classes/FullScreen/FullScreen.js +2 -1
  13. package/browser/Options/Classes/HslAnimation.js +2 -1
  14. package/browser/Options/Classes/Interactivity/Events/ClickEvent.js +2 -1
  15. package/browser/Options/Classes/Interactivity/Events/DivEvent.js +2 -1
  16. package/browser/Options/Classes/Interactivity/Events/Events.js +2 -1
  17. package/browser/Options/Classes/Interactivity/Events/HoverEvent.js +2 -1
  18. package/browser/Options/Classes/Interactivity/Events/Parallax.js +2 -1
  19. package/browser/Options/Classes/Interactivity/Events/ResizeEvent.js +2 -1
  20. package/browser/Options/Classes/Interactivity/Interactivity.js +2 -1
  21. package/browser/Options/Classes/Interactivity/Modes/Modes.js +2 -1
  22. package/browser/Options/Classes/ManualParticle.js +2 -1
  23. package/browser/Options/Classes/Options.js +2 -2
  24. package/browser/Options/Classes/OptionsColor.js +5 -3
  25. package/browser/Options/Classes/Particles/Bounce/ParticlesBounce.js +2 -1
  26. package/browser/Options/Classes/Particles/Collisions/Collisions.js +2 -1
  27. package/browser/Options/Classes/Particles/Collisions/CollisionsAbsorb.js +2 -1
  28. package/browser/Options/Classes/Particles/Collisions/CollisionsOverlap.js +2 -1
  29. package/browser/Options/Classes/Particles/Effect/Effect.js +2 -1
  30. package/browser/Options/Classes/Particles/Move/Move.js +2 -2
  31. package/browser/Options/Classes/Particles/Move/MoveAngle.js +2 -1
  32. package/browser/Options/Classes/Particles/Move/MoveAttract.js +2 -1
  33. package/browser/Options/Classes/Particles/Move/MoveCenter.js +2 -1
  34. package/browser/Options/Classes/Particles/Move/MoveGravity.js +2 -1
  35. package/browser/Options/Classes/Particles/Move/MoveTrail.js +2 -1
  36. package/browser/Options/Classes/Particles/Move/MoveTrailFill.js +2 -1
  37. package/browser/Options/Classes/Particles/Move/OutModes.js +2 -1
  38. package/browser/Options/Classes/Particles/Move/Path/MovePath.js +2 -1
  39. package/browser/Options/Classes/Particles/Move/Spin.js +2 -1
  40. package/browser/Options/Classes/Particles/Number/ParticlesDensity.js +2 -1
  41. package/browser/Options/Classes/Particles/Number/ParticlesNumber.js +2 -1
  42. package/browser/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -1
  43. package/browser/Options/Classes/Particles/Opacity/Opacity.js +2 -1
  44. package/browser/Options/Classes/Particles/Opacity/OpacityAnimation.js +2 -1
  45. package/browser/Options/Classes/Particles/ParticlesOptions.js +2 -1
  46. package/browser/Options/Classes/Particles/Shadow.js +2 -1
  47. package/browser/Options/Classes/Particles/Shape/Shape.js +2 -1
  48. package/browser/Options/Classes/Particles/Size/Size.js +2 -1
  49. package/browser/Options/Classes/Particles/Size/SizeAnimation.js +2 -1
  50. package/browser/Options/Classes/Particles/Stroke.js +2 -1
  51. package/browser/Options/Classes/Particles/ZIndex/ZIndex.js +2 -1
  52. package/browser/Options/Classes/Responsive.js +5 -4
  53. package/browser/Options/Classes/Theme/Theme.js +2 -1
  54. package/browser/Options/Classes/Theme/ThemeDefault.js +2 -1
  55. package/browser/Options/Classes/ValueWithRandom.js +4 -3
  56. package/browser/Types/EasingFunction.js +1 -0
  57. package/browser/Utils/ColorUtils.js +25 -45
  58. package/browser/Utils/NumberUtils.js +1 -10
  59. package/browser/Utils/TypeUtils.js +3 -0
  60. package/browser/Utils/Utils.js +6 -0
  61. package/browser/exports.js +0 -2
  62. package/browser/init.js +0 -6
  63. package/cjs/Core/Canvas.js +32 -21
  64. package/cjs/Core/Container.js +1 -1
  65. package/cjs/Core/Engine.js +17 -1
  66. package/cjs/Core/Particle.js +1 -1
  67. package/cjs/Options/Classes/AnimatableColor.js +1 -1
  68. package/cjs/Options/Classes/AnimationOptions.js +3 -2
  69. package/cjs/Options/Classes/Background/Background.js +2 -1
  70. package/cjs/Options/Classes/BackgroundMask/BackgroundMask.js +2 -2
  71. package/cjs/Options/Classes/BackgroundMask/BackgroundMaskCover.js +2 -1
  72. package/cjs/Options/Classes/ColorAnimation.js +2 -1
  73. package/cjs/Options/Classes/FullScreen/FullScreen.js +2 -1
  74. package/cjs/Options/Classes/HslAnimation.js +2 -1
  75. package/cjs/Options/Classes/Interactivity/Events/ClickEvent.js +2 -1
  76. package/cjs/Options/Classes/Interactivity/Events/DivEvent.js +2 -1
  77. package/cjs/Options/Classes/Interactivity/Events/Events.js +2 -1
  78. package/cjs/Options/Classes/Interactivity/Events/HoverEvent.js +2 -1
  79. package/cjs/Options/Classes/Interactivity/Events/Parallax.js +2 -1
  80. package/cjs/Options/Classes/Interactivity/Events/ResizeEvent.js +2 -1
  81. package/cjs/Options/Classes/Interactivity/Interactivity.js +2 -1
  82. package/cjs/Options/Classes/Interactivity/Modes/Modes.js +2 -1
  83. package/cjs/Options/Classes/ManualParticle.js +2 -1
  84. package/cjs/Options/Classes/Options.js +2 -2
  85. package/cjs/Options/Classes/OptionsColor.js +4 -2
  86. package/cjs/Options/Classes/Particles/Bounce/ParticlesBounce.js +2 -1
  87. package/cjs/Options/Classes/Particles/Collisions/Collisions.js +2 -1
  88. package/cjs/Options/Classes/Particles/Collisions/CollisionsAbsorb.js +2 -1
  89. package/cjs/Options/Classes/Particles/Collisions/CollisionsOverlap.js +2 -1
  90. package/cjs/Options/Classes/Particles/Effect/Effect.js +2 -1
  91. package/cjs/Options/Classes/Particles/Move/Move.js +1 -1
  92. package/cjs/Options/Classes/Particles/Move/MoveAngle.js +2 -1
  93. package/cjs/Options/Classes/Particles/Move/MoveAttract.js +2 -1
  94. package/cjs/Options/Classes/Particles/Move/MoveCenter.js +2 -1
  95. package/cjs/Options/Classes/Particles/Move/MoveGravity.js +2 -1
  96. package/cjs/Options/Classes/Particles/Move/MoveTrail.js +2 -1
  97. package/cjs/Options/Classes/Particles/Move/MoveTrailFill.js +2 -1
  98. package/cjs/Options/Classes/Particles/Move/OutModes.js +2 -1
  99. package/cjs/Options/Classes/Particles/Move/Path/MovePath.js +2 -1
  100. package/cjs/Options/Classes/Particles/Move/Spin.js +2 -1
  101. package/cjs/Options/Classes/Particles/Number/ParticlesDensity.js +2 -1
  102. package/cjs/Options/Classes/Particles/Number/ParticlesNumber.js +2 -1
  103. package/cjs/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -1
  104. package/cjs/Options/Classes/Particles/Opacity/Opacity.js +2 -1
  105. package/cjs/Options/Classes/Particles/Opacity/OpacityAnimation.js +2 -1
  106. package/cjs/Options/Classes/Particles/ParticlesOptions.js +2 -1
  107. package/cjs/Options/Classes/Particles/Shadow.js +2 -1
  108. package/cjs/Options/Classes/Particles/Shape/Shape.js +2 -1
  109. package/cjs/Options/Classes/Particles/Size/Size.js +2 -1
  110. package/cjs/Options/Classes/Particles/Size/SizeAnimation.js +2 -1
  111. package/cjs/Options/Classes/Particles/Stroke.js +2 -1
  112. package/cjs/Options/Classes/Particles/ZIndex/ZIndex.js +2 -1
  113. package/cjs/Options/Classes/Responsive.js +5 -4
  114. package/cjs/Options/Classes/Theme/Theme.js +2 -1
  115. package/cjs/Options/Classes/Theme/ThemeDefault.js +2 -1
  116. package/cjs/Options/Classes/ValueWithRandom.js +4 -3
  117. package/cjs/Types/EasingFunction.js +2 -0
  118. package/cjs/Utils/ColorUtils.js +25 -46
  119. package/cjs/Utils/NumberUtils.js +1 -12
  120. package/cjs/Utils/TypeUtils.js +4 -0
  121. package/cjs/Utils/Utils.js +7 -0
  122. package/cjs/exports.js +0 -2
  123. package/cjs/init.js +0 -6
  124. package/esm/Core/Canvas.js +32 -21
  125. package/esm/Core/Container.js +1 -1
  126. package/esm/Core/Engine.js +17 -1
  127. package/esm/Core/Particle.js +1 -1
  128. package/esm/Options/Classes/AnimatableColor.js +2 -2
  129. package/esm/Options/Classes/AnimationOptions.js +3 -2
  130. package/esm/Options/Classes/Background/Background.js +2 -1
  131. package/esm/Options/Classes/BackgroundMask/BackgroundMask.js +2 -2
  132. package/esm/Options/Classes/BackgroundMask/BackgroundMaskCover.js +2 -1
  133. package/esm/Options/Classes/ColorAnimation.js +2 -1
  134. package/esm/Options/Classes/FullScreen/FullScreen.js +2 -1
  135. package/esm/Options/Classes/HslAnimation.js +2 -1
  136. package/esm/Options/Classes/Interactivity/Events/ClickEvent.js +2 -1
  137. package/esm/Options/Classes/Interactivity/Events/DivEvent.js +2 -1
  138. package/esm/Options/Classes/Interactivity/Events/Events.js +2 -1
  139. package/esm/Options/Classes/Interactivity/Events/HoverEvent.js +2 -1
  140. package/esm/Options/Classes/Interactivity/Events/Parallax.js +2 -1
  141. package/esm/Options/Classes/Interactivity/Events/ResizeEvent.js +2 -1
  142. package/esm/Options/Classes/Interactivity/Interactivity.js +2 -1
  143. package/esm/Options/Classes/Interactivity/Modes/Modes.js +2 -1
  144. package/esm/Options/Classes/ManualParticle.js +2 -1
  145. package/esm/Options/Classes/Options.js +2 -2
  146. package/esm/Options/Classes/OptionsColor.js +5 -3
  147. package/esm/Options/Classes/Particles/Bounce/ParticlesBounce.js +2 -1
  148. package/esm/Options/Classes/Particles/Collisions/Collisions.js +2 -1
  149. package/esm/Options/Classes/Particles/Collisions/CollisionsAbsorb.js +2 -1
  150. package/esm/Options/Classes/Particles/Collisions/CollisionsOverlap.js +2 -1
  151. package/esm/Options/Classes/Particles/Effect/Effect.js +2 -1
  152. package/esm/Options/Classes/Particles/Move/Move.js +2 -2
  153. package/esm/Options/Classes/Particles/Move/MoveAngle.js +2 -1
  154. package/esm/Options/Classes/Particles/Move/MoveAttract.js +2 -1
  155. package/esm/Options/Classes/Particles/Move/MoveCenter.js +2 -1
  156. package/esm/Options/Classes/Particles/Move/MoveGravity.js +2 -1
  157. package/esm/Options/Classes/Particles/Move/MoveTrail.js +2 -1
  158. package/esm/Options/Classes/Particles/Move/MoveTrailFill.js +2 -1
  159. package/esm/Options/Classes/Particles/Move/OutModes.js +2 -1
  160. package/esm/Options/Classes/Particles/Move/Path/MovePath.js +2 -1
  161. package/esm/Options/Classes/Particles/Move/Spin.js +2 -1
  162. package/esm/Options/Classes/Particles/Number/ParticlesDensity.js +2 -1
  163. package/esm/Options/Classes/Particles/Number/ParticlesNumber.js +2 -1
  164. package/esm/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -1
  165. package/esm/Options/Classes/Particles/Opacity/Opacity.js +2 -1
  166. package/esm/Options/Classes/Particles/Opacity/OpacityAnimation.js +2 -1
  167. package/esm/Options/Classes/Particles/ParticlesOptions.js +2 -1
  168. package/esm/Options/Classes/Particles/Shadow.js +2 -1
  169. package/esm/Options/Classes/Particles/Shape/Shape.js +2 -1
  170. package/esm/Options/Classes/Particles/Size/Size.js +2 -1
  171. package/esm/Options/Classes/Particles/Size/SizeAnimation.js +2 -1
  172. package/esm/Options/Classes/Particles/Stroke.js +2 -1
  173. package/esm/Options/Classes/Particles/ZIndex/ZIndex.js +2 -1
  174. package/esm/Options/Classes/Responsive.js +5 -4
  175. package/esm/Options/Classes/Theme/Theme.js +2 -1
  176. package/esm/Options/Classes/Theme/ThemeDefault.js +2 -1
  177. package/esm/Options/Classes/ValueWithRandom.js +4 -3
  178. package/esm/Types/EasingFunction.js +1 -0
  179. package/esm/Utils/ColorUtils.js +25 -45
  180. package/esm/Utils/NumberUtils.js +1 -10
  181. package/esm/Utils/TypeUtils.js +3 -0
  182. package/esm/Utils/Utils.js +6 -0
  183. package/esm/exports.js +0 -2
  184. package/esm/init.js +0 -6
  185. package/package.json +1 -1
  186. package/report.html +1 -1
  187. package/tsparticles.engine.js +62 -82
  188. package/tsparticles.engine.min.js +1 -1
  189. package/tsparticles.engine.min.js.LICENSE.txt +1 -1
  190. package/types/Core/Canvas.d.ts +4 -1
  191. package/types/Core/Engine.d.ts +9 -1
  192. package/types/Core/Interfaces/Colors.d.ts +28 -0
  193. package/types/Types/EasingFunction.d.ts +1 -0
  194. package/types/Utils/ColorUtils.d.ts +8 -9
  195. package/types/Utils/NumberUtils.d.ts +0 -5
  196. package/types/Utils/TypeUtils.d.ts +1 -0
  197. package/types/Utils/Utils.d.ts +2 -0
  198. package/types/exports.d.ts +0 -2
  199. package/umd/Core/Canvas.js +32 -21
  200. package/umd/Core/Container.js +1 -1
  201. package/umd/Core/Engine.js +17 -1
  202. package/umd/Core/Particle.js +1 -1
  203. package/umd/Options/Classes/AnimatableColor.js +1 -1
  204. package/umd/Options/Classes/AnimationOptions.js +4 -3
  205. package/umd/Options/Classes/Background/Background.js +3 -2
  206. package/umd/Options/Classes/BackgroundMask/BackgroundMask.js +3 -3
  207. package/umd/Options/Classes/BackgroundMask/BackgroundMaskCover.js +3 -2
  208. package/umd/Options/Classes/ColorAnimation.js +3 -2
  209. package/umd/Options/Classes/FullScreen/FullScreen.js +3 -2
  210. package/umd/Options/Classes/HslAnimation.js +3 -2
  211. package/umd/Options/Classes/Interactivity/Events/ClickEvent.js +3 -2
  212. package/umd/Options/Classes/Interactivity/Events/DivEvent.js +3 -2
  213. package/umd/Options/Classes/Interactivity/Events/Events.js +3 -2
  214. package/umd/Options/Classes/Interactivity/Events/HoverEvent.js +3 -2
  215. package/umd/Options/Classes/Interactivity/Events/Parallax.js +3 -2
  216. package/umd/Options/Classes/Interactivity/Events/ResizeEvent.js +3 -2
  217. package/umd/Options/Classes/Interactivity/Interactivity.js +3 -2
  218. package/umd/Options/Classes/Interactivity/Modes/Modes.js +3 -2
  219. package/umd/Options/Classes/ManualParticle.js +3 -2
  220. package/umd/Options/Classes/Options.js +3 -3
  221. package/umd/Options/Classes/OptionsColor.js +4 -2
  222. package/umd/Options/Classes/Particles/Bounce/ParticlesBounce.js +3 -2
  223. package/umd/Options/Classes/Particles/Collisions/Collisions.js +3 -2
  224. package/umd/Options/Classes/Particles/Collisions/CollisionsAbsorb.js +3 -2
  225. package/umd/Options/Classes/Particles/Collisions/CollisionsOverlap.js +3 -2
  226. package/umd/Options/Classes/Particles/Effect/Effect.js +3 -2
  227. package/umd/Options/Classes/Particles/Move/Move.js +1 -1
  228. package/umd/Options/Classes/Particles/Move/MoveAngle.js +3 -2
  229. package/umd/Options/Classes/Particles/Move/MoveAttract.js +3 -2
  230. package/umd/Options/Classes/Particles/Move/MoveCenter.js +3 -2
  231. package/umd/Options/Classes/Particles/Move/MoveGravity.js +3 -2
  232. package/umd/Options/Classes/Particles/Move/MoveTrail.js +3 -2
  233. package/umd/Options/Classes/Particles/Move/MoveTrailFill.js +3 -2
  234. package/umd/Options/Classes/Particles/Move/OutModes.js +3 -2
  235. package/umd/Options/Classes/Particles/Move/Path/MovePath.js +3 -2
  236. package/umd/Options/Classes/Particles/Move/Spin.js +3 -2
  237. package/umd/Options/Classes/Particles/Number/ParticlesDensity.js +3 -2
  238. package/umd/Options/Classes/Particles/Number/ParticlesNumber.js +3 -2
  239. package/umd/Options/Classes/Particles/Number/ParticlesNumberLimit.js +3 -2
  240. package/umd/Options/Classes/Particles/Opacity/Opacity.js +3 -2
  241. package/umd/Options/Classes/Particles/Opacity/OpacityAnimation.js +3 -2
  242. package/umd/Options/Classes/Particles/ParticlesOptions.js +3 -2
  243. package/umd/Options/Classes/Particles/Shadow.js +3 -2
  244. package/umd/Options/Classes/Particles/Shape/Shape.js +3 -2
  245. package/umd/Options/Classes/Particles/Size/Size.js +3 -2
  246. package/umd/Options/Classes/Particles/Size/SizeAnimation.js +3 -2
  247. package/umd/Options/Classes/Particles/Stroke.js +3 -2
  248. package/umd/Options/Classes/Particles/ZIndex/ZIndex.js +3 -2
  249. package/umd/Options/Classes/Responsive.js +6 -5
  250. package/umd/Options/Classes/Theme/Theme.js +3 -2
  251. package/umd/Options/Classes/Theme/ThemeDefault.js +3 -2
  252. package/umd/Options/Classes/ValueWithRandom.js +5 -4
  253. package/umd/Types/EasingFunction.js +12 -0
  254. package/umd/Utils/ColorUtils.js +25 -46
  255. package/umd/Utils/NumberUtils.js +1 -12
  256. package/umd/Utils/TypeUtils.js +4 -0
  257. package/umd/Utils/Utils.js +7 -0
  258. package/umd/exports.js +1 -3
  259. package/umd/init.js +1 -7
  260. package/browser/Utils/HslColorManager.js +0 -45
  261. package/browser/Utils/RgbColorManager.js +0 -44
  262. package/cjs/Utils/HslColorManager.js +0 -49
  263. package/cjs/Utils/RgbColorManager.js +0 -48
  264. package/esm/Utils/HslColorManager.js +0 -45
  265. package/esm/Utils/RgbColorManager.js +0 -44
  266. package/types/Utils/HslColorManager.d.ts +0 -10
  267. package/types/Utils/RgbColorManager.d.ts +0 -10
  268. package/umd/Utils/HslColorManager.js +0 -59
  269. package/umd/Utils/RgbColorManager.js +0 -58
@@ -1,3 +1,4 @@
1
+ import { isNull } from "../../../../Utils/TypeUtils.js";
1
2
  import { setRangeValue } from "../../../../Utils/NumberUtils.js";
2
3
  export class MoveGravity {
3
4
  constructor() {
@@ -7,7 +8,7 @@ export class MoveGravity {
7
8
  this.maxSpeed = 50;
8
9
  }
9
10
  load(data) {
10
- if (!data) {
11
+ if (isNull(data)) {
11
12
  return;
12
13
  }
13
14
  if (data.acceleration !== undefined) {
@@ -1,4 +1,5 @@
1
1
  import { MoveTrailFill } from "./MoveTrailFill.js";
2
+ import { isNull } from "../../../../Utils/TypeUtils.js";
2
3
  export class MoveTrail {
3
4
  constructor() {
4
5
  this.enable = false;
@@ -6,7 +7,7 @@ export class MoveTrail {
6
7
  this.fill = new MoveTrailFill();
7
8
  }
8
9
  load(data) {
9
- if (!data) {
10
+ if (isNull(data)) {
10
11
  return;
11
12
  }
12
13
  if (data.enable !== undefined) {
@@ -1,7 +1,8 @@
1
1
  import { OptionsColor } from "../../OptionsColor.js";
2
+ import { isNull } from "../../../../Utils/TypeUtils.js";
2
3
  export class MoveTrailFill {
3
4
  load(data) {
4
- if (!data) {
5
+ if (isNull(data)) {
5
6
  return;
6
7
  }
7
8
  if (data.color !== undefined) {
@@ -1,10 +1,11 @@
1
1
  import { OutMode } from "../../../../Enums/Modes/OutMode.js";
2
+ import { isNull } from "../../../../Utils/TypeUtils.js";
2
3
  export class OutModes {
3
4
  constructor() {
4
5
  this.default = OutMode.out;
5
6
  }
6
7
  load(data) {
7
- if (!data) {
8
+ if (isNull(data)) {
8
9
  return;
9
10
  }
10
11
  if (data.default !== undefined) {
@@ -1,5 +1,6 @@
1
1
  import { ValueWithRandom } from "../../../ValueWithRandom.js";
2
2
  import { deepExtend } from "../../../../../Utils/Utils.js";
3
+ import { isNull } from "../../../../../Utils/TypeUtils.js";
3
4
  export class MovePath {
4
5
  constructor() {
5
6
  this.clamp = true;
@@ -8,7 +9,7 @@ export class MovePath {
8
9
  this.options = {};
9
10
  }
10
11
  load(data) {
11
- if (!data) {
12
+ if (isNull(data)) {
12
13
  return;
13
14
  }
14
15
  if (data.clamp !== undefined) {
@@ -1,4 +1,5 @@
1
1
  import { deepExtend } from "../../../../Utils/Utils.js";
2
+ import { isNull } from "../../../../Utils/TypeUtils.js";
2
3
  import { setRangeValue } from "../../../../Utils/NumberUtils.js";
3
4
  export class Spin {
4
5
  constructor() {
@@ -6,7 +7,7 @@ export class Spin {
6
7
  this.enable = false;
7
8
  }
8
9
  load(data) {
9
- if (!data) {
10
+ if (isNull(data)) {
10
11
  return;
11
12
  }
12
13
  if (data.acceleration !== undefined) {
@@ -1,3 +1,4 @@
1
+ import { isNull } from "../../../../Utils/TypeUtils.js";
1
2
  export class ParticlesDensity {
2
3
  constructor() {
3
4
  this.enable = false;
@@ -5,7 +6,7 @@ export class ParticlesDensity {
5
6
  this.height = 1080;
6
7
  }
7
8
  load(data) {
8
- if (!data) {
9
+ if (isNull(data)) {
9
10
  return;
10
11
  }
11
12
  if (data.enable !== undefined) {
@@ -1,5 +1,6 @@
1
1
  import { ParticlesDensity } from "./ParticlesDensity.js";
2
2
  import { ParticlesNumberLimit } from "./ParticlesNumberLimit.js";
3
+ import { isNull } from "../../../../Utils/TypeUtils.js";
3
4
  export class ParticlesNumber {
4
5
  constructor() {
5
6
  this.density = new ParticlesDensity();
@@ -7,7 +8,7 @@ export class ParticlesNumber {
7
8
  this.value = 0;
8
9
  }
9
10
  load(data) {
10
- if (!data) {
11
+ if (isNull(data)) {
11
12
  return;
12
13
  }
13
14
  this.density.load(data.density);
@@ -1,11 +1,12 @@
1
1
  import { LimitMode } from "../../../../Enums/Modes/LimitMode.js";
2
+ import { isNull } from "../../../../Utils/TypeUtils.js";
2
3
  export class ParticlesNumberLimit {
3
4
  constructor() {
4
5
  this.mode = LimitMode.delete;
5
6
  this.value = 0;
6
7
  }
7
8
  load(data) {
8
- if (!data) {
9
+ if (isNull(data)) {
9
10
  return;
10
11
  }
11
12
  if (data.mode !== undefined) {
@@ -1,5 +1,6 @@
1
1
  import { OpacityAnimation } from "./OpacityAnimation.js";
2
2
  import { RangedAnimationValueWithRandom } from "../../ValueWithRandom.js";
3
+ import { isNull } from "../../../../Utils/TypeUtils.js";
3
4
  export class Opacity extends RangedAnimationValueWithRandom {
4
5
  constructor() {
5
6
  super();
@@ -7,7 +8,7 @@ export class Opacity extends RangedAnimationValueWithRandom {
7
8
  this.value = 1;
8
9
  }
9
10
  load(data) {
10
- if (!data) {
11
+ if (isNull(data)) {
11
12
  return;
12
13
  }
13
14
  super.load(data);
@@ -1,5 +1,6 @@
1
1
  import { DestroyType } from "../../../../Enums/Types/DestroyType.js";
2
2
  import { RangedAnimationOptions } from "../../AnimationOptions.js";
3
+ import { isNull } from "../../../../Utils/TypeUtils.js";
3
4
  export class OpacityAnimation extends RangedAnimationOptions {
4
5
  constructor() {
5
6
  super();
@@ -8,7 +9,7 @@ export class OpacityAnimation extends RangedAnimationOptions {
8
9
  }
9
10
  load(data) {
10
11
  super.load(data);
11
- if (!data) {
12
+ if (isNull(data)) {
12
13
  return;
13
14
  }
14
15
  if (data.destroy !== undefined) {
@@ -11,6 +11,7 @@ import { Shape } from "./Shape/Shape.js";
11
11
  import { Size } from "./Size/Size.js";
12
12
  import { Stroke } from "./Stroke.js";
13
13
  import { ZIndex } from "./ZIndex/ZIndex.js";
14
+ import { isNull } from "../../../Utils/TypeUtils.js";
14
15
  export class ParticlesOptions {
15
16
  constructor(engine, container) {
16
17
  this._engine = engine;
@@ -32,7 +33,7 @@ export class ParticlesOptions {
32
33
  this.zIndex = new ZIndex();
33
34
  }
34
35
  load(data) {
35
- if (!data) {
36
+ if (isNull(data)) {
36
37
  return;
37
38
  }
38
39
  if (data.groups !== undefined) {
@@ -1,4 +1,5 @@
1
1
  import { OptionsColor } from "../OptionsColor.js";
2
+ import { isNull } from "../../../Utils/TypeUtils.js";
2
3
  export class Shadow {
3
4
  constructor() {
4
5
  this.blur = 0;
@@ -11,7 +12,7 @@ export class Shadow {
11
12
  this.color.value = "#000";
12
13
  }
13
14
  load(data) {
14
- if (!data) {
15
+ if (isNull(data)) {
15
16
  return;
16
17
  }
17
18
  if (data.blur !== undefined) {
@@ -1,4 +1,5 @@
1
1
  import { deepExtend } from "../../../../Utils/Utils.js";
2
+ import { isNull } from "../../../../Utils/TypeUtils.js";
2
3
  export class Shape {
3
4
  constructor() {
4
5
  this.close = true;
@@ -7,7 +8,7 @@ export class Shape {
7
8
  this.type = "circle";
8
9
  }
9
10
  load(data) {
10
- if (!data) {
11
+ if (isNull(data)) {
11
12
  return;
12
13
  }
13
14
  const options = data.options;
@@ -1,5 +1,6 @@
1
1
  import { RangedAnimationValueWithRandom } from "../../ValueWithRandom.js";
2
2
  import { SizeAnimation } from "./SizeAnimation.js";
3
+ import { isNull } from "../../../../Utils/TypeUtils.js";
3
4
  export class Size extends RangedAnimationValueWithRandom {
4
5
  constructor() {
5
6
  super();
@@ -8,7 +9,7 @@ export class Size extends RangedAnimationValueWithRandom {
8
9
  }
9
10
  load(data) {
10
11
  super.load(data);
11
- if (!data) {
12
+ if (isNull(data)) {
12
13
  return;
13
14
  }
14
15
  const animation = data.animation;
@@ -1,5 +1,6 @@
1
1
  import { DestroyType } from "../../../../Enums/Types/DestroyType.js";
2
2
  import { RangedAnimationOptions } from "../../AnimationOptions.js";
3
+ import { isNull } from "../../../../Utils/TypeUtils.js";
3
4
  export class SizeAnimation extends RangedAnimationOptions {
4
5
  constructor() {
5
6
  super();
@@ -8,7 +9,7 @@ export class SizeAnimation extends RangedAnimationOptions {
8
9
  }
9
10
  load(data) {
10
11
  super.load(data);
11
- if (!data) {
12
+ if (isNull(data)) {
12
13
  return;
13
14
  }
14
15
  if (data.destroy !== undefined) {
@@ -1,11 +1,12 @@
1
1
  import { AnimatableColor } from "../AnimatableColor.js";
2
+ import { isNull } from "../../../Utils/TypeUtils.js";
2
3
  import { setRangeValue } from "../../../Utils/NumberUtils.js";
3
4
  export class Stroke {
4
5
  constructor() {
5
6
  this.width = 0;
6
7
  }
7
8
  load(data) {
8
- if (!data) {
9
+ if (isNull(data)) {
9
10
  return;
10
11
  }
11
12
  if (data.color !== undefined) {
@@ -1,4 +1,5 @@
1
1
  import { ValueWithRandom } from "../../ValueWithRandom.js";
2
+ import { isNull } from "../../../../Utils/TypeUtils.js";
2
3
  export class ZIndex extends ValueWithRandom {
3
4
  constructor() {
4
5
  super();
@@ -8,7 +9,7 @@ export class ZIndex extends ValueWithRandom {
8
9
  }
9
10
  load(data) {
10
11
  super.load(data);
11
- if (!data) {
12
+ if (isNull(data)) {
12
13
  return;
13
14
  }
14
15
  if (data.opacityRate !== undefined) {
@@ -1,5 +1,6 @@
1
1
  import { ResponsiveMode } from "../../Enums/Modes/ResponsiveMode.js";
2
2
  import { deepExtend } from "../../Utils/Utils.js";
3
+ import { isNull } from "../../Utils/TypeUtils.js";
3
4
  export class Responsive {
4
5
  constructor() {
5
6
  this.maxWidth = Infinity;
@@ -7,13 +8,13 @@ export class Responsive {
7
8
  this.mode = ResponsiveMode.canvas;
8
9
  }
9
10
  load(data) {
10
- if (!data) {
11
+ if (isNull(data)) {
11
12
  return;
12
13
  }
13
- if (data.maxWidth !== undefined) {
14
+ if (!isNull(data.maxWidth)) {
14
15
  this.maxWidth = data.maxWidth;
15
16
  }
16
- if (data.mode !== undefined) {
17
+ if (!isNull(data.mode)) {
17
18
  if (data.mode === ResponsiveMode.screen) {
18
19
  this.mode = ResponsiveMode.screen;
19
20
  }
@@ -21,7 +22,7 @@ export class Responsive {
21
22
  this.mode = ResponsiveMode.canvas;
22
23
  }
23
24
  }
24
- if (data.options !== undefined) {
25
+ if (!isNull(data.options)) {
25
26
  this.options = deepExtend({}, data.options);
26
27
  }
27
28
  }
@@ -1,12 +1,13 @@
1
1
  import { ThemeDefault } from "./ThemeDefault.js";
2
2
  import { deepExtend } from "../../../Utils/Utils.js";
3
+ import { isNull } from "../../../Utils/TypeUtils.js";
3
4
  export class Theme {
4
5
  constructor() {
5
6
  this.name = "";
6
7
  this.default = new ThemeDefault();
7
8
  }
8
9
  load(data) {
9
- if (!data) {
10
+ if (isNull(data)) {
10
11
  return;
11
12
  }
12
13
  if (data.name !== undefined) {
@@ -1,4 +1,5 @@
1
1
  import { ThemeMode } from "../../../Enums/Modes/ThemeMode.js";
2
+ import { isNull } from "../../../Utils/TypeUtils.js";
2
3
  export class ThemeDefault {
3
4
  constructor() {
4
5
  this.auto = false;
@@ -6,7 +7,7 @@ export class ThemeDefault {
6
7
  this.value = false;
7
8
  }
8
9
  load(data) {
9
- if (!data) {
10
+ if (isNull(data)) {
10
11
  return;
11
12
  }
12
13
  if (data.auto !== undefined) {
@@ -1,14 +1,15 @@
1
1
  import { AnimationOptions, RangedAnimationOptions } from "./AnimationOptions.js";
2
+ import { isNull } from "../../Utils/TypeUtils.js";
2
3
  import { setRangeValue } from "../../Utils/NumberUtils.js";
3
4
  export class ValueWithRandom {
4
5
  constructor() {
5
6
  this.value = 0;
6
7
  }
7
8
  load(data) {
8
- if (!data) {
9
+ if (isNull(data)) {
9
10
  return;
10
11
  }
11
- if (data.value !== undefined) {
12
+ if (!isNull(data.value)) {
12
13
  this.value = setRangeValue(data.value);
13
14
  }
14
15
  }
@@ -20,7 +21,7 @@ export class AnimationValueWithRandom extends ValueWithRandom {
20
21
  }
21
22
  load(data) {
22
23
  super.load(data);
23
- if (!data) {
24
+ if (isNull(data)) {
24
25
  return;
25
26
  }
26
27
  const animation = data.animation;
@@ -0,0 +1 @@
1
+ export {};
@@ -3,83 +3,63 @@ import { isArray, isString } from "./TypeUtils.js";
3
3
  import { millisecondsToSeconds, percentDenominator } from "../Core/Utils/Constants.js";
4
4
  import { AnimationStatus } from "../Enums/AnimationStatus.js";
5
5
  import { itemFromArray } from "./Utils.js";
6
- var RgbIndexes;
7
- (function (RgbIndexes) {
8
- RgbIndexes[RgbIndexes["r"] = 1] = "r";
9
- RgbIndexes[RgbIndexes["g"] = 2] = "g";
10
- RgbIndexes[RgbIndexes["b"] = 3] = "b";
11
- RgbIndexes[RgbIndexes["a"] = 4] = "a";
12
- })(RgbIndexes || (RgbIndexes = {}));
13
- const randomColorValue = "random", midColorValue = "mid", colorManagers = new Map();
14
- export function addColorManager(manager) {
15
- colorManagers.set(manager.key, manager);
16
- }
17
- function stringToRgba(input) {
18
- for (const manager of colorManagers.values()) {
6
+ const randomColorValue = "random", midColorValue = "mid";
7
+ function stringToRgba(engine, input) {
8
+ if (!input) {
9
+ return;
10
+ }
11
+ for (const manager of engine.colorManagers.values()) {
19
12
  if (input.startsWith(manager.stringPrefix)) {
20
13
  return manager.parseString(input);
21
14
  }
22
15
  }
23
- const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])([a-f\d])?$/i, hexFixed = input.replace(shorthandRegex, (_, r, g, b, a) => {
24
- return r + r + g + g + b + b + (a !== undefined ? a + a : "");
25
- }), regex = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i, result = regex.exec(hexFixed), radix = 16, defaultAlpha = 1, alphaFactor = 0xff;
26
- return result
27
- ? {
28
- a: result[RgbIndexes.a] !== undefined
29
- ? parseInt(result[RgbIndexes.a], radix) / alphaFactor
30
- : defaultAlpha,
31
- b: parseInt(result[RgbIndexes.b], radix),
32
- g: parseInt(result[RgbIndexes.g], radix),
33
- r: parseInt(result[RgbIndexes.r], radix),
34
- }
35
- : undefined;
36
16
  }
37
- export function rangeColorToRgb(input, index, useIndex = true) {
17
+ export function rangeColorToRgb(engine, input, index, useIndex = true) {
38
18
  if (!input) {
39
19
  return;
40
20
  }
41
21
  const color = isString(input) ? { value: input } : input;
42
22
  if (isString(color.value)) {
43
- return colorToRgb(color.value, index, useIndex);
23
+ return colorToRgb(engine, color.value, index, useIndex);
44
24
  }
45
25
  if (isArray(color.value)) {
46
- return rangeColorToRgb({
26
+ return rangeColorToRgb(engine, {
47
27
  value: itemFromArray(color.value, index, useIndex),
48
28
  });
49
29
  }
50
- for (const manager of colorManagers.values()) {
30
+ for (const manager of engine.colorManagers.values()) {
51
31
  const res = manager.handleRangeColor(color);
52
32
  if (res) {
53
33
  return res;
54
34
  }
55
35
  }
56
36
  }
57
- export function colorToRgb(input, index, useIndex = true) {
37
+ export function colorToRgb(engine, input, index, useIndex = true) {
58
38
  if (!input) {
59
39
  return;
60
40
  }
61
41
  const color = isString(input) ? { value: input } : input;
62
42
  if (isString(color.value)) {
63
- return color.value === randomColorValue ? getRandomRgbColor() : stringToRgb(color.value);
43
+ return color.value === randomColorValue ? getRandomRgbColor() : stringToRgb(engine, color.value);
64
44
  }
65
45
  if (isArray(color.value)) {
66
- return colorToRgb({
46
+ return colorToRgb(engine, {
67
47
  value: itemFromArray(color.value, index, useIndex),
68
48
  });
69
49
  }
70
- for (const manager of colorManagers.values()) {
50
+ for (const manager of engine.colorManagers.values()) {
71
51
  const res = manager.handleColor(color);
72
52
  if (res) {
73
53
  return res;
74
54
  }
75
55
  }
76
56
  }
77
- export function colorToHsl(color, index, useIndex = true) {
78
- const rgb = colorToRgb(color, index, useIndex);
57
+ export function colorToHsl(engine, color, index, useIndex = true) {
58
+ const rgb = colorToRgb(engine, color, index, useIndex);
79
59
  return rgb ? rgbToHsl(rgb) : undefined;
80
60
  }
81
- export function rangeColorToHsl(color, index, useIndex = true) {
82
- const rgb = rangeColorToRgb(color, index, useIndex);
61
+ export function rangeColorToHsl(engine, color, index, useIndex = true) {
62
+ const rgb = rangeColorToRgb(engine, color, index, useIndex);
83
63
  return rgb ? rgbToHsl(rgb) : undefined;
84
64
  }
85
65
  export function rgbToHsl(color) {
@@ -106,11 +86,11 @@ export function rgbToHsl(color) {
106
86
  }
107
87
  return res;
108
88
  }
109
- export function stringToAlpha(input) {
110
- return stringToRgba(input)?.a;
89
+ export function stringToAlpha(engine, input) {
90
+ return stringToRgba(engine, input)?.a;
111
91
  }
112
- export function stringToRgb(input) {
113
- return stringToRgba(input);
92
+ export function stringToRgb(engine, input) {
93
+ return stringToRgba(engine, input);
114
94
  }
115
95
  export function hslToRgb(hsl) {
116
96
  const hMax = 360, sMax = 100, lMax = 100, sMin = 0, lMin = 0, h = ((hsl.h % hMax) + hMax) % hMax, s = Math.max(sMin, Math.min(sMax, hsl.s)), l = Math.max(lMin, Math.min(lMax, hsl.l)), hNormalized = h / hMax, sNormalized = s / sMax, lNormalized = l / lMax, rgbFactor = 255, triple = 3;
@@ -201,11 +181,11 @@ export function getLinkColor(p1, p2, linkColor) {
201
181
  return linkColor;
202
182
  }
203
183
  }
204
- export function getLinkRandomColor(optColor, blink, consent) {
184
+ export function getLinkRandomColor(engine, optColor, blink, consent) {
205
185
  const color = isString(optColor) ? optColor : optColor.value;
206
186
  if (color === randomColorValue) {
207
187
  if (consent) {
208
- return rangeColorToRgb({
188
+ return rangeColorToRgb(engine, {
209
189
  value: color,
210
190
  });
211
191
  }
@@ -218,7 +198,7 @@ export function getLinkRandomColor(optColor, blink, consent) {
218
198
  return midColorValue;
219
199
  }
220
200
  else {
221
- return rangeColorToRgb({
201
+ return rangeColorToRgb(engine, {
222
202
  value: color,
223
203
  });
224
204
  }
@@ -6,16 +6,7 @@ let _random = Math.random;
6
6
  const _animationLoop = {
7
7
  nextFrame: (cb) => requestAnimationFrame(cb),
8
8
  cancel: (idx) => cancelAnimationFrame(idx),
9
- }, easingFunctions = new Map(), double = 2, doublePI = Math.PI * double;
10
- export function addEasing(name, easing) {
11
- if (easingFunctions.get(name)) {
12
- return;
13
- }
14
- easingFunctions.set(name, easing);
15
- }
16
- export function getEasing(name) {
17
- return easingFunctions.get(name) ?? ((value) => value);
18
- }
9
+ }, double = 2, doublePI = Math.PI * double;
19
10
  export function setRandom(rnd = Math.random) {
20
11
  _random = rnd;
21
12
  }
@@ -16,3 +16,6 @@ export function isObject(arg) {
16
16
  export function isArray(arg) {
17
17
  return Array.isArray(arg);
18
18
  }
19
+ export function isNull(arg) {
20
+ return arg === null || arg === undefined;
21
+ }
@@ -414,3 +414,9 @@ export function updateAnimation(particle, data, changeDirection, destroyType, de
414
414
  data.value = clamp(data.value, minValue, maxValue);
415
415
  }
416
416
  }
417
+ export function assertValidVersion(engine, pluginVersion) {
418
+ if (engine.version === pluginVersion) {
419
+ return;
420
+ }
421
+ throw new Error(`The tsParticles version is different from the loaded plugins version. Engine version: ${engine.version}. Plugins version: ${pluginVersion}`);
422
+ }
package/esm/exports.js CHANGED
@@ -78,9 +78,7 @@ export * from "./Options/Classes/Theme/ThemeDefault.js";
78
78
  export * from "./Options/Classes/ValueWithRandom.js";
79
79
  export * from "./Utils/CanvasUtils.js";
80
80
  export * from "./Utils/ColorUtils.js";
81
- export * from "./Utils/HslColorManager.js";
82
81
  export * from "./Utils/NumberUtils.js";
83
82
  export * from "./Utils/OptionsUtils.js";
84
- export * from "./Utils/RgbColorManager.js";
85
83
  export * from "./Utils/Utils.js";
86
84
  export * from "./Utils/TypeUtils.js";
package/esm/init.js CHANGED
@@ -1,11 +1,5 @@
1
1
  import { Engine } from "./Core/Engine.js";
2
- import { HslColorManager } from "./Utils/HslColorManager.js";
3
- import { RgbColorManager } from "./Utils/RgbColorManager.js";
4
- import { addColorManager } from "./Utils/ColorUtils.js";
5
2
  export function init() {
6
- const rgbColorManager = new RgbColorManager(), hslColorManager = new HslColorManager();
7
- addColorManager(rgbColorManager);
8
- addColorManager(hslColorManager);
9
3
  const engine = new Engine();
10
4
  engine.init();
11
5
  return engine;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tsparticles/engine",
3
- "version": "3.6.0-beta.1",
3
+ "version": "3.7.0",
4
4
  "description": "Easily create highly customizable particle, confetti and fireworks animations and use them as animated backgrounds for your website. Ready to use components available also for React, Vue.js (2.x and 3.x), Angular, Svelte, jQuery, Preact, Riot.js, Inferno.",
5
5
  "homepage": "https://particles.js.org",
6
6
  "scripts": {
package/report.html CHANGED
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8"/>
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1"/>
6
- <title>@tsparticles/engine [13 Oct 2024 at 17:21]</title>
6
+ <title>@tsparticles/engine [24 Nov 2024 at 19:17]</title>
7
7
  <link rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAABrVBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+O1foceMD///+J0/qK1Pr7/v8Xdr/9///W8P4UdL7L7P0Scr2r4Pyj3vwad8D5/f/2/f+55f3E6f34+/2H0/ojfMKpzOd0rNgQcb3F3O/j9f7c8v6g3Pz0/P/w+v/q+P7n9v6T1/uQ1vuE0vqLut/y+v+Z2fvt+f+15Pzv9fuc2/vR7v2V2Pvd6/bg9P7I6/285/2y4/yp3/zp8vk8i8kqgMT7/P31+fyv4vxGkcz6/P6/6P3j7vfS5PNnpNUxhcbO7f7F6v3O4vHK3/DA2u631Ouy0eqXweKJud5wqthfoNMMbLvY8f73+v2dxeR8sNtTmdDx9/zX6PSjyeaCtd1YnNGX2PuQveCGt95Nls42h8dLlM3F4vBtAAAAM3RSTlMAAyOx0/sKBvik8opWGBMOAe3l1snDm2E9LSb06eHcu5JpHbarfHZCN9CBb08zzkdNS0kYaptYAAAFV0lEQVRYw92X51/aYBDHHS2O2qqttVbrqNq9m+TJIAYIShBkWwqIiCgoWvfeq7Z2/s29hyQNyUcR7LveGwVyXy6XH8/9rqxglLfUPLxVduUor3h0rfp2TYvpivk37929TkG037hffoX0+peVtZQc1589rigVUdXS/ABSAyEmGIO/1XfvldSK8vs3OqB6u3m0nxmIrvgB0dj7rr7Y9IbuF68hnfFaiHA/sxqm0wciIG43P60qKv9WXWc1RXGh/mFESFABTSBi0sNAKzqet17eCtOb3kZIDwxEEU0oAIJGYxNBDhBND29e0rtXXbcpuPmED9IhEAAQ/AXEaF8EPmnrrKsv0LvWR3fg5sWDNAFZOgAgaKvZDogHNU9MFwnnYROkc56RD5CjAbQX9Ow4g7upCsvYu55aSI/Nj0H1akgKQEUM94dwK65hYRmFU9MIcH/fqJYOZYcnuJSU/waKDgTOEVaVKhwrTRP5XzgSpAITYzom7UvkhFX5VutmxeNnWDjjswTKTyfgluNDGbUpWissXhF3s7mlSml+czWkg3D0l1nNjGNjz3myOQOa1KM/jOS6ebdbAVTCi4gljHSFrviza7tOgRWcS0MOUX9zdNgag5w7rRqA44Lzw0hr1WqES36dFliSJFlh2rXIae3FFcDDgKdxrUIDePr8jGcSClV1u7A9xeN0ModY/pHMxmR1EzRh8TJiwqsHmKW0l4FCEZI+jHio+JdPPE9qwQtTRxku2D8sIeRL2LnxWSllANCQGOIiqVHAz2ye2JR0DcH+HoxDkaADLjgxjKQ+AwCX/g0+DNgdG0ukYCONAe+dbc2IAc6fwt1ARoDSezNHxV2Cmzwv3O6lDMV55edBGwGK9n1+x2F8EDfAGCxug8MhpsMEcTEAWf3rx2vZhe/LAmtIn/6apE6PN0ULKgywD9mmdxbmFl3OvD5AS5fW5zLbv/YHmcsBTjf/afDz3MaZTVCfAP9z6/Bw6ycv8EUBWJIn9zYcoAWWlW9+OzO3vkTy8H+RANLmdrpOuYWdZYEXpo+TlCJrW5EARb7fF+bWdqf3hhyZI1nWJQHgznErZhbjoEsWqi8dQNoE294aldzFurwSABL2XXMf9+H1VQGke9exw5P/AnA5Pv5ngMul7LOvO922iwACu8WkCwLCafvM4CeWPxfA8lNHcWZSoi8EwMAIciKX2Z4SWCMAa3snCZ/G4EA8D6CMLNFsGQhkkz/gQNEBbPCbWsxGUpYVu3z8IyNAknwJkfPMEhLyrdi5RTyUVACkw4GSFRNWJNEW+fgPGwHD8/JxnRuLabN4CGNRkAE23na2+VmEAUmrYymSGjMAYqH84YUIyzgzs3XC7gNgH36Vcc4zKY9o9fgPBXUAiHHwVboBHGLiX6Zcjp1f2wu4tvzZKo0ecPnDtQYDQvJXaBeNzce45Fp28ZQLrEZVuFqgBwOalArKXnW1UzlnSusQKJqKYNuz4tOnI6sZG4zanpemv+7ySU2jbA9h6uhcgpfy6G2PahirDZ6zvq6zDduMVFTKvzw8wgyEdelwY9in3XkEPs3osJuwRQ4qTkfzifndg9Gfc4pdsu82+tTnHZTBa2EAMrqr2t43pguc8tNm7JQVQ2S0ukj2d22dhXYP0/veWtwKrCkNoNimAN5+Xr/oLrxswKbVJjteWrX7eR63o4j9q0GxnaBdWgGA5VStpanIjQmEhV0/nVt5VOFUvix6awJhPcAaTEShgrG+iGyvb5a0Ndb1YGHFPEwoqAinoaykaID1o1pdPNu7XsnCKQ3R+hwWIIhGvORcJUBYXe3Xa3vq/mF/N9V13ugufMkfXn+KHsRD0B8AAAAASUVORK5CYII=" type="image/x-icon" />
8
8
 
9
9
  <script>