diff --git a/.babelrc b/.babelrc
deleted file mode 100644
index 014b1c1..0000000
--- a/.babelrc
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "presets": [
- "es2015-rollup",
- "stage-0"
- ]
-}
\ No newline at end of file
diff --git a/.babelrc.json b/.babelrc.json
new file mode 100755
index 0000000..d7350ef
--- /dev/null
+++ b/.babelrc.json
@@ -0,0 +1,21 @@
+{
+ "presets": [
+ [
+ "@babel/preset-env",
+ {
+ "modules": false,
+ "targets": ">0.25%",
+ "loose": true,
+ "bugfixes": true
+ }
+ ]
+ ],
+ "plugins": [
+ [
+ "@babel/plugin-proposal-class-properties",
+ {
+ "loose": true
+ }
+ ]
+ ]
+}
diff --git a/.editorconfig b/.editorconfig
new file mode 100755
index 0000000..6588b4a
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,15 @@
+# https://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+max_line_length = 120
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+insert_final_newline = false
+trim_trailing_whitespace = false
diff --git a/.eslintignore b/.eslintignore
new file mode 100755
index 0000000..92e6209
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,3 @@
+dist
+build
+example
\ No newline at end of file
diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml
new file mode 100644
index 0000000..ab14ad2
--- /dev/null
+++ b/.github/workflows/node.js.yml
@@ -0,0 +1,30 @@
+# This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: Node.js CI
+
+on:
+ push:
+ branches: [ master ]
+ pull_request:
+ branches: [ master ]
+
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+
+ strategy:
+ matrix:
+ node-version: [16.x, 18.x]
+ # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v2
+ with:
+ node-version: ${{ matrix.node-version }}
+ cache: 'npm'
+ - run: npm ci
+ - run: npm run lint
diff --git a/.gitignore b/.gitignore
index fce9b1a..7a6a64e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,43 @@
+# IDEs and editors
+.idea
+.project
+.classpath
+.c9/
+*.launch
+.settings/
+*.sublime-workspace
+
+# IDE - VSCode
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# next.js build output
+.next
+
+# Lerna
+lerna-debug.log
+
+# System Files
+.DS_Store
+Thumbs.db
+
# node modules
node_modules
# documentation
build/docs/
-package-lock.json
+.DS_Store
+source/build/
+static/
+yarn.lock
diff --git a/.npmignore b/.npmignore
old mode 100644
new mode 100755
index d29026d..696840f
--- a/.npmignore
+++ b/.npmignore
@@ -2,14 +2,43 @@ DS_Store
git/
node_modules/
example/
-.*.swp
+examples/
+.github/
+images/
+static/
+script/
+source/
+source/build/
+
+# testing
+/coverage
+/.github
+
+# misc
.DS_Store
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+.code.yml
+
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+.babelrc.json
+.*.swp
.git
.hg
.npmrc
.lock-wscript
.svn
.wafpickle-*
+.travis.yml
+.eslintignore
+.editorconfig
config.gypi
CVS
-npm-debug.log
\ No newline at end of file
+npm-debug.log
+bower.json
+
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..2e53aa5
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,5 @@
+language: node_js
+node_js:
+ - node
+script:
+ - npm run travis
diff --git a/LICENSE b/LICENSE
new file mode 100755
index 0000000..8058113
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) Proton authors.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
old mode 100644
new mode 100755
index ad67e49..715f31d
--- a/README.md
+++ b/README.md
@@ -1,58 +1,104 @@
-# Proton
-
-> See the detailed documentation please visit [here](https://projects.jpeer.at/proton/)
-
-Proton is a lightweight and powerful javascript particle engine. With it you can easily create countless cool effects.
-#### Check out examples at: [http://a-jie.github.io/Proton/](http://a-jie.github.io/Proton/). Check out the tutorial at: [https://qiita.com/matsu7089/items/dcb7d326e4ec1340eba6](https://qiita.com/matsu7089/items/dcb7d326e4ec1340eba6)
+

+
+---
+
+
+
+Proton is a lightweight and powerful Javascript particle animation library. Use it to easily create a variety of cool particle effects.
+
+Check out examples at [http://drawcall.github.io/Proton/](http://drawcall.github.io/Proton/). The **3D version** of the proton engine is here [here](https://github.com/drawcall/three.proton/). An available **react version** is [here](https://github.com/lindelof/particles-bg).
## Features
-- Seven kinds of renderers
- - canvas - CanvasRenderer
- - dom - DomRenderer
- - webgl - WebGLRenderer
- - pixel - PixelRenderer
- - easeljs - EaselRenderer
- - pixi.js - PixiRenderer
- - custom - CustomRenderer
-- Create cool effects like the demo of [71squared's ParticleDesigner](https://www.71squared.com/particledesigner) in 10 lines of code.
-- Integratable into any game engine.
-- Veriety of behaviors which can simulate many different physical effects.
-- Three kinds of emitters and can be easily expanded.
-- The __3D version__ of the proton engine is here [https://a-jie.github.io/three.proton/](https://a-jie.github.io/three.proton/)
+- **Easy to use** It takes only a dozen lines of code to create a particle animation effect.
+- **Multiple effects** Use Proton to create flames, fireworks, bullets, explosions, and more.
+- **Any scene** You can use it in frameworks such as `react`, `vue`, `angular`, and `pixi.js`, `Phaser`, etc.
+- **Efficient rendering** Its rendering efficiency is very high, you can render tens of thousands of particles in the page.
+- **Simulated physics** Proton can simulate various physical properties including gravity and Brownian motion.
+- **Several renderers** Proton provides a variety of renderers, of course you can also customize your own renderer
+ - `CanvasRenderer` - Proton's canvas renderer
+ - `DomRenderer` - Proton's dom renderer, supporting hardware acceleration.
+ - `WebGLRenderer` - Proton's webgl renderer.
+ - `PixelRenderer` - Proton's pixel renderer, It can implement pixel animation.
+ - `EaselRenderer` - Easeljs proton renderer.
+ - `EaselRenderer` - Pixi.js proton renderer.
+ - `CustomRenderer` - Use a custom renderer that can be applied to any scene.
+
+## Documentation
+
+See detailed documentation please visit [https://projects.jpeer.at/proton/](https://projects.jpeer.at/proton/).
+Thank you very much [@matsu7089](https://github.com/matsu7089) for writing a [good tutorial](https://qiita.com/matsu7089/items/dcb7d326e4ec1340eba6).
## Installation
-#### Install using npm
-[](https://npmjs.org/package/proton-js)
+#### Install using npm
+
+> Note: NPM package-name has been changed from `proton-js` to `proton-engine`
+
+```shell
+npm install proton-engine --save
+```
-```
-npm install proton-js --save
-...
-import Proton from 'proton-js';
+```javascript
+import Proton from "proton-engine";
```
#### OR include in html
+
```html
-
+
```
## Usage
+
+Proton is very simple to use, a dozen lines of code can create a particle animation.
+
```javascript
-var proton = new Proton();
-var emitter = new Proton.Emitter();
+import Proton, {
+ Emitter,
+ Rate,
+ Span,
+ Radius,
+ Life,
+ Velocity,
+ Color,
+ Alpha,
+ CanvasRenderer,
+} from "proton-engine";
+
+const proton = new Proton();
+const emitter = new Emitter();
//set Rate
-emitter.rate = new Proton.Rate(Proton.getSpan(10, 20), 0.1);
+emitter.rate = new Rate(new Span(10, 20), 0.1);
//add Initialize
-emitter.addInitialize(new Proton.Radius(1, 12));
-emitter.addInitialize(new Proton.Life(2, 4));
-emitter.addInitialize(new Proton.Velocity(3, Proton.getSpan(0, 360), 'polar'));
+emitter.addInitialize(new Radius(1, 12));
+emitter.addInitialize(new Life(2, 4));
+emitter.addInitialize(new Velocity(3, new Span(0, 360), "polar"));
//add Behaviour
-emitter.addBehaviour(new Proton.Color('ff0000', 'random'));
-emitter.addBehaviour(new Proton.Alpha(1, 0));
+emitter.addBehaviour(new Color("ff0000", "random"));
+emitter.addBehaviour(new Alpha(1, 0));
//set emitter position
emitter.p.x = canvas.width / 2;
@@ -63,30 +109,39 @@ emitter.emit(5);
proton.addEmitter(emitter);
// add canvas renderer
-var renderer = new Proton.CanvasRenderer(canvas);
+const renderer = new CanvasRenderer(canvas);
proton.addRenderer(renderer);
-
-//use Euler integration calculation is more accurate (default false)
-Proton.USE_CLOCK = false or true;
```
-## Description
-`Proton.Span (or Proton.getSpan)` is a very important concept of the Proton engine, it's everywhere. If you understand its usage, you can create almost any desired effect!
-
-Proton has now been upgraded to the __v3__ version. Performance has been greatly improved and api also has some improvements. For more details, please check [here](https://github.com/a-jie/Proton/releases).
+## Remarks
+- `Proton.Span` (or `Proton.getSpan`) is a very important concept of the Proton engine, it's everywhere. If you understand its usage, you can create almost any desired effect!
+
+- If you want to create wind, rain, or snow, etc, you can use the `emitter.preEmit` method to pre-render the scene.
+
+- Use `Proton.Body` and `Proton.Color` at the same time. I suggest you'd better use the `WebGLRenderer` not `CanvasRenderer`.
+
+- Added `Proton.Cyclone` behavior, you can make vortex effects with Cyclone. Demo please check [here](https://codesandbox.io/s/proton-cyclone-rzweu).
+
+- `proton.fps` In modern browsers, if the FPS exceeds 60 and you want to maintain a stable 60 FPS, you need to set `proton.fps = 60`. You can set this property when the game engine has fixed fps or some browsers have a higher refresh rate.
+
+- Use Euler integration calculation is more accurate (default false) `Proton.USE_CLOCK = false or true;`.
+
+Proton has now been upgraded to the **v4** version. Performance has been greatly improved and api also has some improvements. For more details, please check [here](https://github.com/drawcall/Proton/releases).
## Building
-Node is a dependency, use terminal to install it with:
+
+`node` is a dependency, use terminal to install it with:
```javascript
-git clone git://github.com/a-jie/Proton.git
+git clone git://github.com/drawcall/Proton.git
+
...
npm install
npm run build
-```
+```
-and run example
+And run example
```javascript
npm start
@@ -94,8 +149,9 @@ npm start
```
## Changelog
-Detailed changes for each release are documented in the [release notes](https://github.com/a-jie/Proton/releases).
+Detailed changes for each release are documented in the [release notes](https://github.com/drawcall/Proton/releases).
## License
+
Proton is released under the MIT License. http://www.opensource.org/licenses/mit-license
diff --git a/bower.json b/bower.json
deleted file mode 100644
index 9b30c1d..0000000
--- a/bower.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "name": "Proton",
- "version": "3.1.1",
- "homepage": "http://a-jie.github.io/Proton",
- "authors": [
- "a-jie "
- ],
- "description": "Proton is an easily customizable html5 particle engine including five different types of renderers.",
- "main": "build/proton.min.js",
- "license": "MIT",
- "ignore": [
- "**/.*",
- "node_modules",
- "bower_components",
- "test",
- "tests"
- ]
-}
diff --git a/build/proton.d.ts b/build/proton.d.ts
new file mode 100644
index 0000000..88b117c
--- /dev/null
+++ b/build/proton.d.ts
@@ -0,0 +1,2394 @@
+declare class Stats {
+ constructor(proton: any);
+ proton: any;
+ container: HTMLDivElement | null;
+ type: number;
+ emitterIndex: number;
+ rendererIndex: number;
+ update(style: any, body: any): void;
+ add(style: any, body: any): void;
+ getEmitter(): any;
+ getRenderer(): any;
+ concatArr(arr: any): string;
+ getCreatedNumber(renderer: any): any;
+ getEmitterPos(e: any): string;
+ destroy(): void;
+}
+
+declare class Pool {
+ /**
+ * @memberof! Proton#
+ * @constructor
+ * @alias Proton.Pool
+ *
+ * @todo add description
+ * @todo add description of properties
+ *
+ * @property {Number} total
+ * @property {Object} cache
+ */
+ constructor(num: any);
+ total: number;
+ cache: {};
+ /**
+ * @todo add description
+ *
+ * @method get
+ * @memberof Proton#Proton.Pool
+ *
+ * @param {Object|Function} target
+ * @param {Object} [params] just add if `target` is a function
+ *
+ * @return {Object}
+ */
+ get(target: Object | Function, params?: Object, uid: any): Object;
+ /**
+ * @todo add description
+ *
+ * @method set
+ * @memberof Proton#Proton.Pool
+ *
+ * @param {Object} target
+ *
+ * @return {Object}
+ */
+ expire(target: Object): Object;
+ /**
+ * Creates a new class instance
+ *
+ * @todo add more documentation
+ *
+ * @method create
+ * @memberof Proton#Proton.Pool
+ *
+ * @param {Object|Function} target any Object or Function
+ * @param {Object} [params] just add if `target` is a function
+ *
+ * @return {Object}
+ */
+ createOrClone(target: Object | Function, params?: Object): Object;
+ /**
+ * @todo add description - what is in the cache?
+ *
+ * @method getCount
+ * @memberof Proton#Proton.Pool
+ *
+ * @return {Number}
+ */
+ getCount(): number;
+ /**
+ * Destroyes all items from Pool.cache
+ *
+ * @method destroy
+ * @memberof Proton#Proton.Pool
+ */
+ destroy(): void;
+ /**
+ * Returns Pool.cache
+ *
+ * @method getCache
+ * @memberof Proton#Proton.Pool
+ * @private
+ *
+ * @param {Number} uid the unique id
+ *
+ * @return {Object}
+ */
+ private getCache;
+}
+
+declare class Integration {
+ constructor(type: any);
+ type: any;
+ calculate(particles: any, time: any, damping: any): void;
+ eulerIntegrate(particle: any, time: any, damping: any): void;
+}
+
+declare class Proton$1 {
+ static USE_CLOCK: boolean;
+ static MEASURE: number;
+ static EULER: string;
+ static RK2: string;
+ static PARTICLE_CREATED: string;
+ static PARTICLE_UPDATE: string;
+ static PARTICLE_SLEEP: string;
+ static PARTICLE_DEAD: string;
+ static EMITTER_ADDED: string;
+ static EMITTER_REMOVED: string;
+ static PROTON_UPDATE: string;
+ static PROTON_UPDATE_AFTER: string;
+ static DEFAULT_INTERVAL: number;
+ static amendChangeTabsBug: boolean;
+ /**
+ * The constructor to add emitters
+ *
+ * @constructor Proton
+ *
+ * @todo add more documentation of the single properties and parameters
+ *
+ * @param {Number | undefined} [integrationType=Proton.EULER]
+ *
+ * @property {String} [integrationType=Proton.EULER]
+ * @property {Array} emitters All added emitter
+ * @property {Array} renderers All added renderer
+ * @property {Number} time The active time
+ * @property {Number} oldtime The old time
+ */
+ constructor(integrationType?: number | undefined);
+ emitters: any[];
+ renderers: any[];
+ time: number;
+ now: number;
+ then: number;
+ elapsed: number;
+ stats: Stats;
+ pool: Pool;
+ integrationType: Mixed;
+ integrator: Integration;
+ _fps: string;
+ _interval: number;
+ /**
+ * Sets the frames per second (FPS) for the Proton system.
+ * @param {number|string} fps - The desired FPS. Use "auto" for default behavior, or a number for a specific FPS.
+ */
+ set fps(fps: number | string);
+ /**
+ * Gets the current frames per second (FPS) setting.
+ * @returns {number|string} The current FPS setting. Returns "auto" if set to default, or a number representing the specific FPS.
+ */
+ get fps(): number | string;
+ /**
+ * add a type of Renderer
+ *
+ * @method addRenderer
+ * @memberof Proton
+ * @instance
+ *
+ * @param {Renderer} render
+ */
+ addRenderer(render: Renderer): void;
+ /**
+ * @name add a type of Renderer
+ *
+ * @method addRenderer
+ * @param {Renderer} render
+ */
+ removeRenderer(render: Renderer): void;
+ /**
+ * add the Emitter
+ *
+ * @method addEmitter
+ * @memberof Proton
+ * @instance
+ *
+ * @param {Emitter} emitter
+ */
+ addEmitter(emitter: Emitter): void;
+ /**
+ * Removes an Emitter
+ *
+ * @method removeEmitter
+ * @memberof Proton
+ * @instance
+ *
+ * @param {Proton.Emitter} emitter
+ */
+ removeEmitter(emitter: Proton$1.Emitter): void;
+ /**
+ * Updates all added emitters
+ *
+ * @method update
+ * @memberof Proton
+ * @instance
+ */
+ update(): void;
+ emittersUpdate(elapsed: any): void;
+ /**
+ * @todo add description
+ *
+ * @method amendChangeTabsBug
+ * @memberof Proton
+ * @instance
+ */
+ amendChangeTabsBug(): void;
+ /**
+ * Counts all particles from all emitters
+ *
+ * @method getCount
+ * @memberof Proton
+ * @instance
+ */
+ getCount(): number;
+ getAllParticles(): any[];
+ destroyAllEmitters(): void;
+ /**
+ * Destroys everything related to this Proton instance. This includes all emitters, and all properties
+ *
+ * @method destroy
+ * @memberof Proton
+ * @instance
+ */
+ destroy(remove?: boolean): void;
+}
+
+declare class Vector2D$1 {
+ /**
+ * Creates a new Vector2D instance.
+ * @param {number} [x=0] - The x coordinate.
+ * @param {number} [y=0] - The y coordinate.
+ */
+ constructor(x?: number, y?: number);
+ /** @type {number} */
+ x: number;
+ /** @type {number} */
+ y: number;
+ /**
+ * Sets the x and y components of this vector.
+ * @param {number} x - The x coordinate.
+ * @param {number} y - The y coordinate.
+ * @returns {Vector2D} This vector.
+ */
+ set(x: number, y: number): Vector2D$1;
+ /**
+ * Sets the x component of this vector.
+ * @param {number} x - The x coordinate.
+ * @returns {Vector2D} This vector.
+ */
+ setX(x: number): Vector2D$1;
+ /**
+ * Sets the y component of this vector.
+ * @param {number} y - The y coordinate.
+ * @returns {Vector2D} This vector.
+ */
+ setY(y: number): Vector2D$1;
+ /**
+ * Calculates the gradient (angle) of this vector.
+ * @returns {number} The gradient in radians.
+ */
+ getGradient(): number;
+ /**
+ * Copies the values of another vector to this one.
+ * @param {Vector2D} v - The vector to copy from.
+ * @returns {Vector2D} This vector.
+ */
+ copy(v: Vector2D$1): Vector2D$1;
+ /**
+ * Adds another vector to this one.
+ * @param {Vector2D} v - The vector to add.
+ * @param {Vector2D} [w] - An optional second vector to add.
+ * @returns {Vector2D} This vector.
+ */
+ add(v: Vector2D$1, w?: Vector2D$1): Vector2D$1;
+ /**
+ * Adds scalar values to this vector's components.
+ * @param {number} a - Value to add to x.
+ * @param {number} b - Value to add to y.
+ * @returns {Vector2D} This vector.
+ */
+ addXY(a: number, b: number): Vector2D$1;
+ /**
+ * Adds two vectors and sets the result to this vector.
+ * @param {Vector2D} a - The first vector to add.
+ * @param {Vector2D} b - The second vector to add.
+ * @returns {Vector2D} This vector.
+ */
+ addVectors(a: Vector2D$1, b: Vector2D$1): Vector2D$1;
+ /**
+ * Subtracts another vector from this one.
+ * @param {Vector2D} v - The vector to subtract.
+ * @param {Vector2D} [w] - An optional second vector to subtract.
+ * @returns {Vector2D} This vector.
+ */
+ sub(v: Vector2D$1, w?: Vector2D$1): Vector2D$1;
+ /**
+ * Subtracts one vector from another and sets the result to this vector.
+ * @param {Vector2D} a - The vector to subtract from.
+ * @param {Vector2D} b - The vector to subtract.
+ * @returns {Vector2D} This vector.
+ */
+ subVectors(a: Vector2D$1, b: Vector2D$1): Vector2D$1;
+ /**
+ * Divides this vector by a scalar.
+ * @param {number} s - The scalar to divide by.
+ * @returns {Vector2D} This vector.
+ */
+ divideScalar(s: number): Vector2D$1;
+ /**
+ * Multiplies this vector by a scalar.
+ * @param {number} s - The scalar to multiply by.
+ * @returns {Vector2D} This vector.
+ */
+ multiplyScalar(s: number): Vector2D$1;
+ /**
+ * Negates this vector (inverts its direction).
+ * @returns {Vector2D} This vector.
+ */
+ negate(): Vector2D$1;
+ /**
+ * Calculates the dot product of this vector with another.
+ * @param {Vector2D} v - The other vector.
+ * @returns {number} The dot product.
+ */
+ dot(v: Vector2D$1): number;
+ /**
+ * Calculates the squared length of this vector.
+ * @returns {number} The squared length.
+ */
+ lengthSq(): number;
+ /**
+ * Calculates the length of this vector.
+ * @returns {number} The length.
+ */
+ length(): number;
+ /**
+ * Normalizes this vector (makes it unit length).
+ * @returns {Vector2D} This vector.
+ */
+ normalize(): Vector2D$1;
+ /**
+ * Calculates the distance to another vector.
+ * @param {Vector2D} v - The other vector.
+ * @returns {number} The distance.
+ */
+ distanceTo(v: Vector2D$1): number;
+ /**
+ * Rotates this vector by an angle.
+ * @param {number} tha - The angle to rotate by (in radians).
+ * @returns {Vector2D} This vector.
+ */
+ rotate(tha: number): Vector2D$1;
+ /**
+ * Calculates the squared distance to another vector.
+ * @param {Vector2D} v - The other vector.
+ * @returns {number} The squared distance.
+ */
+ distanceToSquared(v: Vector2D$1): number;
+ /**
+ * Linearly interpolates this vector toward another vector.
+ * @param {Vector2D} v - The target vector.
+ * @param {number} alpha - The interpolation factor (0-1).
+ * @returns {Vector2D} This vector.
+ */
+ lerp(v: Vector2D$1, alpha: number): Vector2D$1;
+ /**
+ * Checks if this vector is equal to another vector.
+ * @param {Vector2D} v - The other vector.
+ * @returns {boolean} True if the vectors are equal, false otherwise.
+ */
+ equals(v: Vector2D$1): boolean;
+ /**
+ * Sets this vector to zero.
+ * @returns {Vector2D} This vector.
+ */
+ clear(): Vector2D$1;
+ /**
+ * Creates a new vector with the same x and y values as this one.
+ * @returns {Vector2D} A new Vector2D instance.
+ */
+ clone(): Vector2D$1;
+}
+
+declare class Rgb {
+ constructor(r?: number, g?: number, b?: number);
+ r: number;
+ g: number;
+ b: number;
+ reset(): void;
+}
+
+/**
+ * Represents a particle in a particle system.
+ * @class Particle
+ */
+declare class Particle$1 {
+ /**
+ * Creates a new Particle instance.
+ * @param {Object} [conf] Configuration object for the particle
+ */
+ constructor(conf?: Object);
+ /** @type {string} The unique identifier of the particle */
+ id: string;
+ /** @type {{p:Vector2D,v:Vector2D,a:Vector2D}} Old state of the particle */
+ old: {
+ p: Vector2D$1;
+ v: Vector2D$1;
+ a: Vector2D$1;
+ };
+ /** @type {object} Custom data associated with the particle */
+ data: object;
+ /** @type {Behaviour[]} Array of behaviours applied to the particle */
+ behaviours: Behaviour[];
+ /** @type {Vector2D} Current position of the particle */
+ p: Vector2D$1;
+ /** @type {Vector2D} Current velocity of the particle */
+ v: Vector2D$1;
+ /** @type {Vector2D} Current acceleration of the particle */
+ a: Vector2D$1;
+ /** @type {Rgb} Color of the particle */
+ rgb: Rgb;
+ name: string;
+ /**
+ * Gets the direction of the particle's movement in degrees.
+ * @returns {number} The direction in degrees
+ */
+ getDirection(): number;
+ /**
+ * Resets the particle to its initial state.
+ * @returns {Particle} The particle instance
+ */
+ reset(): Particle$1;
+ life: number | undefined;
+ age: number | undefined;
+ dead: boolean | undefined;
+ sleep: boolean | undefined;
+ body: any;
+ sprite: any;
+ parent: any;
+ energy: number | undefined;
+ mass: number | undefined;
+ radius: number | undefined;
+ alpha: number | undefined;
+ scale: number | undefined;
+ rotation: number | undefined;
+ color: any;
+ easing: ((value: any) => any) | undefined;
+ /**
+ * Updates the particle's state.
+ * @param {number} time The time elapsed since the last update
+ * @param {number} index The index of the particle in its parent system
+ */
+ update(time: number, index: number): void;
+ /**
+ * Applies all behaviours attached to the particle.
+ * @param {number} time The time elapsed since the last update
+ * @param {number} index The index of the particle in its parent system
+ */
+ applyBehaviours(time: number, index: number): void;
+ /**
+ * Adds a behaviour to the particle.
+ * @param {Behaviour} behaviour The behaviour to add
+ */
+ addBehaviour(behaviour: Behaviour): void;
+ /**
+ * Adds multiple behaviours to the particle.
+ * @param {Behaviour[]} behaviours An array of behaviours to add
+ */
+ addBehaviours(behaviours: Behaviour[]): void;
+ /**
+ * Removes a specific behaviour from the particle.
+ * @param {Behaviour} behaviour The behaviour to remove
+ */
+ removeBehaviour(behaviour: Behaviour): void;
+ /**
+ * Removes all behaviours from the particle.
+ */
+ removeAllBehaviours(): void;
+ /**
+ * Destroys the particle, removing all behaviours and setting it as dead.
+ */
+ destroy(): void;
+}
+
+declare namespace _default$3 {
+ /**
+ * Returns the default if the value is null or undefined
+ *
+ * @memberof Proton#Proton.Util
+ * @method initValue
+ *
+ * @param {Mixed} value a specific value, could be everything but null or undefined
+ * @param {Mixed} defaults the default if the value is null or undefined
+ */
+ function initValue(value: Mixed, defaults: Mixed): Mixed;
+ /**
+ * Checks if the value is a valid array
+ *
+ * @memberof Proton#Proton.Util
+ * @method isArray
+ *
+ * @param {Array} value Any array
+ *
+ * @returns {Boolean}
+ */
+ function isArray(value: any[]): boolean;
+ /**
+ * Destroyes the given array
+ *
+ * @memberof Proton#Proton.Util
+ * @method emptyArray
+ *
+ * @param {Array} array Any array
+ */
+ function emptyArray(arr: any): void;
+ function toArray(arr: any): any;
+ function sliceArray(arr1: any, index: any, arr2: any): void;
+ function getRandFromArray(arr: any): any;
+ /**
+ * Destroyes the given object
+ *
+ * @memberof Proton#Proton.Util
+ * @method emptyObject
+ *
+ * @param {Object} obj Any object
+ */
+ function emptyObject(obj: Object, ignore?: null): void;
+ /**
+ * Makes an instance of a class and binds the given array
+ *
+ * @memberof Proton#Proton.Util
+ * @method classApply
+ *
+ * @param {Function} constructor A class to make an instance from
+ * @param {Array} [args] Any array to bind it to the constructor
+ *
+ * @return {Object} The instance of constructor, optionally bind with args
+ */
+ function classApply(constructor: Function, args?: any[]): Object;
+ /**
+ * This will get the image data. It could be necessary to create a Proton.Zone.
+ *
+ * @memberof Proton#Proton.Util
+ * @method getImageData
+ *
+ * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'
+ * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');
+ * @param {Proton.Rectangle} rect
+ */
+ function getImageData(context: HTMLCanvasElement, image: Object, rect: Proton.Rectangle): any;
+ function destroyAll(arr: any, param?: null): void;
+ function assign(target: any, source: any): any;
+}
+
+declare namespace _default$2 {
+ /**
+ * @typedef {Object} rgbObject
+ * @property {Number} r red value
+ * @property {Number} g green value
+ * @property {Number} b blue value
+ */
+ /**
+ * converts a hex value to a rgb object
+ *
+ * @memberof Proton#Proton.Util
+ * @method hexToRgb
+ *
+ * @param {String} h any hex value, e.g. #000000 or 000000 for black
+ *
+ * @return {rgbObject}
+ */
+ function hexToRgb(h: string): {
+ /**
+ * red value
+ */
+ r: number;
+ /**
+ * green value
+ */
+ g: number;
+ /**
+ * blue value
+ */
+ b: number;
+ };
+ /**
+ * converts a rgb value to a rgb string
+ *
+ * @memberof Proton#Proton.Util
+ * @method rgbToHex
+ *
+ * @param {Object | Proton.hexToRgb} rgb a rgb object like in {@link Proton#Proton.}
+ *
+ * @return {String} rgb()
+ */
+ function rgbToHex(rbg: any): string;
+ function getHex16FromParticle(p: any): number;
+}
+
+declare namespace MathUtil {
+ export { PI };
+ export let PIx2: number;
+ export let PI_2: number;
+ export let PI_180: number;
+ export let N180_PI: number;
+ export let Infinity: number;
+ export function isInfinity(num: any): boolean;
+ export function randomAToB(a: any, b: any, isInt?: boolean): any;
+ export function randomFloating(center: any, f: any, isInt: any): any;
+ export function randomColor(): string;
+ export function randomZone(display: any): void;
+ export function floor(num: any, k?: number): number;
+ export function degreeTransform(a: any): number;
+ export function toColor16(num: any): string;
+}
+declare const PI: 3.1415926;
+
+declare class Polar2D {
+ constructor(r: any, tha: any);
+ r: number;
+ tha: any;
+ set(r: any, tha: any): this;
+ setR(r: any): this;
+ setTha(tha: any): this;
+ copy(p: any): this;
+ toVector(): Vector2D$1;
+ getX(): number;
+ getY(): number;
+ normalize(): this;
+ equals(v: any): boolean;
+ clear(): this;
+ clone(): Polar2D;
+}
+
+declare namespace Mat3 {
+ function create(mat3: any): Float32Array;
+ function set(mat1: any, mat2: any): any;
+ function multiply(mat: any, mat2: any, mat3: any): any;
+ function inverse(mat: any, mat3: any): any;
+ function multiplyVec2(m: any, vec: any, mat3: any): any;
+}
+
+/**
+ * Represents a span of values or an array.
+ */
+declare class Span {
+ /**
+ * Returns a new Span object.
+ * @param {*|Span} a - The first value or a Span object.
+ * @param {*} [b] - The second value.
+ * @param {*} [c] - The third value.
+ * @returns {Span} A new Span instance.
+ */
+ static setSpanValue(a: any | Span, b?: any, c?: any): Span;
+ /**
+ * Returns the value from a Span, if the param is not a Span it will return the given parameter.
+ * @param {*|Span} pan - The value or Span to get the value from.
+ * @returns {*} The value of Span OR the parameter if it is not a Span.
+ */
+ static getSpanValue(pan: any | Span): any;
+ /**
+ * Creates a new Span instance.
+ * @param {number|number[]} a - The first value or an array of values.
+ * @param {number} [b] - The second value (if a is not an array).
+ * @param {boolean} [center=false] - Whether to use center-based calculation.
+ */
+ constructor(a: number | number[], b?: number, center?: boolean);
+ /**
+ * @type {boolean}
+ * @private
+ */
+ private isArray;
+ /**
+ * @type {number|number[]}
+ * @private
+ */
+ private a;
+ /**
+ * @type {number}
+ * @private
+ */
+ private b;
+ /**
+ * @type {boolean}
+ * @private
+ */
+ private center;
+ /**
+ * Gets a value from the span.
+ * @param {boolean} [isInt=false] - Whether to return an integer value.
+ * @returns {number} A random value from the span.
+ */
+ getValue(isInt?: boolean): number;
+}
+
+/**
+ * Represents an ArraySpan, a subclass of Span that works with arrays.
+ * @extends Span
+ */
+declare class ArraySpan extends Span {
+ /**
+ * Creates an ArraySpan instance from the given array.
+ * If the input is already an ArraySpan instance, it returns the input.
+ * @static
+ * @param {Array|ArraySpan|any} arr - The array or ArraySpan instance.
+ * @returns {ArraySpan|null} A new ArraySpan instance or null if the input is falsy.
+ */
+ static createArraySpan(arr: any[] | ArraySpan | any): ArraySpan | null;
+ /**
+ * Creates an instance of ArraySpan.
+ * @param {Array|*|any} arr - The array or value to be converted to an array.
+ */
+ constructor(arr: any[] | any | any);
+ _arr: any;
+ /**
+ * Gets a random value from the array.
+ * If the value is "random" or "Random", it returns a random color.
+ * @returns {*} A random value from the array or a random color.
+ */
+ getValue(): any;
+}
+
+declare class Rectangle {
+ constructor(x: any, y: any, w: any, h: any);
+ x: any;
+ y: any;
+ width: any;
+ height: any;
+ bottom: any;
+ right: any;
+ contains(x: any, y: any): boolean;
+}
+
+declare namespace _default$1 {
+ function easeLinear(value: any): any;
+ function easeInQuad(value: any): number;
+ function easeOutQuad(value: any): number;
+ function easeInOutQuad(value: any): number;
+ function easeInCubic(value: any): number;
+ function easeOutCubic(value: any): number;
+ function easeInOutCubic(value: any): number;
+ function easeInQuart(value: any): number;
+ function easeOutQuart(value: any): number;
+ function easeInOutQuart(value: any): number;
+ function easeInSine(value: any): number;
+ function easeOutSine(value: any): number;
+ function easeInOutSine(value: any): number;
+ function easeInExpo(value: any): number;
+ function easeOutExpo(value: any): number;
+ function easeInOutExpo(value: any): number;
+ function easeInCirc(value: any): number;
+ function easeOutCirc(value: any): number;
+ function easeInOutCirc(value: any): number;
+ function easeInBack(value: any): number;
+ function easeOutBack(value: any): number;
+ function easeInOutBack(value: any): number;
+ function getEasing(ease: any): any;
+}
+
+/**
+ * Rate class for controlling particle emission rate.
+ */
+declare class Rate {
+ /**
+ * Creates a new Rate instance.
+ * The number of particles per second emission (a [particle]/b [s]).
+ * @param {Array|number|Span} [numpan=1] - The number of particles for each emission.
+ * @param {Array|number|Span} [timepan=1] - The time interval between each emission.
+ * @example
+ * // Create a rate of 10-20 particles every 0.1-0.25 seconds
+ * new Rate(new Span(10, 20), new Span(0.1, 0.25));
+ */
+ constructor(numpan?: any[] | number | Span, timepan?: any[] | number | Span);
+ /**
+ * @type {Span}
+ * @private
+ */
+ private numPan;
+ /**
+ * @type {Span}
+ * @private
+ */
+ private timePan;
+ /**
+ * @type {number}
+ * @private
+ */
+ private startTime;
+ /**
+ * @type {number}
+ * @private
+ */
+ private nextTime;
+ /**
+ * Initializes the rate.
+ * @private
+ */
+ private init;
+ /**
+ * Gets the number of particles to emit based on the elapsed time.
+ * @param {number} time - The elapsed time since the last update.
+ * @returns {number} The number of particles to emit.
+ */
+ getValue(time: number): number;
+}
+
+declare class Initialize {
+ reset(): void;
+ init(emitter: any, particle: any): void;
+ initialize(target: any): void;
+}
+
+/**
+ * Life class for initializing particle lifetime.
+ * @extends Initialize
+ */
+declare class Life extends Initialize {
+ /**
+ * Creates a new Life instance.
+ * @param {number|Span} a - The lifetime value or the lower bound of the lifetime range.
+ * @param {number} [b] - The upper bound of the lifetime range (if a is a number).
+ * @param {boolean} [c] - Whether to use center-based calculation (if a and b are numbers).
+ */
+ constructor(a: number | Span, b?: number, c?: boolean);
+ /**
+ * @type {Span}
+ * @private
+ */
+ private lifePan;
+ /**
+ * @type {string}
+ */
+ name: string;
+ /**
+ * Initializes the lifetime of a target particle.
+ * @param {object} target - The target particle to initialize.
+ */
+ initialize(target: object): void;
+}
+
+declare class Zone {
+ vector: Vector2D$1;
+ random: number;
+ crossType: string;
+ alert: boolean;
+ getPosition(): void;
+ crossing(particle: any): void;
+ destroy(): void;
+}
+
+/**
+ * Represents a point zone in a 2D space.
+ * @extends Zone
+ */
+declare class PointZone extends Zone {
+ /**
+ * Creates a new PointZone.
+ * @param {number} x - The x-coordinate of the point.
+ * @param {number} y - The y-coordinate of the point.
+ */
+ constructor(x: number, y: number);
+ /**
+ * The x-coordinate of the point.
+ * @type {number}
+ */
+ x: number;
+ /**
+ * The y-coordinate of the point.
+ * @type {number}
+ */
+ y: number;
+ /**
+ * Gets the position of the point.
+ * @returns {Object} An object representing the position vector.
+ */
+ getPosition(): Object;
+ /**
+ * This method is not supported for PointZone.
+ * @param {Object} particle - The particle object (unused).
+ */
+ crossing(particle: Object): void;
+}
+
+/**
+ * Position class for initializing particle positions.
+ * @extends Initialize
+ */
+declare class Position extends Initialize {
+ /**
+ * Creates a new Position instance.
+ * @param {PointZone|any} [zone] - The zone to use for positioning. Defaults to a new PointZone if not provided.
+ */
+ constructor(zone?: PointZone | any);
+ /**
+ * @type {PointZone|any}
+ * @private
+ */
+ private zone;
+ /**
+ * @type {string}
+ */
+ name: string;
+ /**
+ * Resets this initializer's parameters.
+ * @param {PointZone|any} [zone] - The new zone to use for positioning. Defaults to a new PointZone if not provided.
+ */
+ reset(zone?: PointZone | any): void;
+ /**
+ * Initializes the particle's position.
+ * @param {object} target - The particle to initialize.
+ * @param {object} target.p - The particle's position object.
+ * @param {number} target.p.x - The particle's x coordinate.
+ * @param {number} target.p.y - The particle's y coordinate.
+ */
+ initialize(target: {
+ p: {
+ x: number;
+ y: number;
+ };
+ }): void;
+}
+
+/**
+ * Velocity class for initializing particle velocities.
+ * @extends Initialize
+ */
+declare class Velocity extends Initialize {
+ /**
+ * Creates a new Velocity instance.
+ * @param {number|Span} [rpan] - The radial component of the velocity or its range.
+ * @param {number|Span} [thapan] - The angular component of the velocity or its range.
+ * @param {string} [type='vector'] - The type of velocity ('vector' or 'polar').
+ */
+ constructor(rpan?: number | Span, thapan?: number | Span, type?: string);
+ /**
+ * @type {Span}
+ * @private
+ */
+ private rPan;
+ /**
+ * @type {Span}
+ * @private
+ */
+ private thaPan;
+ /**
+ * @type {string}
+ */
+ name: string;
+ type: Mixed;
+ /**
+ * Resets the velocity parameters.
+ * @param {number|Span} [rpan] - The radial component of the velocity or its range.
+ * @param {number|Span} [thapan] - The angular component of the velocity or its range.
+ * @param {string} [type='vector'] - The type of velocity ('vector' or 'polar').
+ */
+ reset(rpan?: number | Span, thapan?: number | Span, type?: string): void;
+ /**
+ * Normalizes the velocity value.
+ * @param {number} vr - The velocity value to normalize.
+ * @returns {number} The normalized velocity value.
+ * @private
+ */
+ private normalizeVelocity;
+ /**
+ * Initializes the particle's velocity.
+ * @param {object} target - The particle to initialize.
+ */
+ initialize(target: object): void;
+}
+
+/**
+ * Mass class for initializing particle mass.
+ * @extends Initialize
+ */
+declare class Mass extends Initialize {
+ /**
+ * Creates a new Mass instance.
+ * @param {number|Span} a - The mass value or the lower bound of the mass range.
+ * @param {number} [b] - The upper bound of the mass range (if a is a number).
+ * @param {boolean} [c] - Whether to use center-based calculation (if a and b are numbers).
+ */
+ constructor(a: number | Span, b?: number, c?: boolean);
+ /**
+ * @type {Span}
+ * @private
+ */
+ private massPan;
+ /**
+ * @type {string}
+ */
+ name: string;
+ /**
+ * Initializes the mass of a target particle.
+ * @param {object} target - The target particle to initialize.
+ */
+ initialize(target: object): void;
+}
+
+/**
+ * Radius class for initializing particle radius.
+ * @extends Initialize
+ */
+declare class Radius extends Initialize {
+ /**
+ * Creates a new Radius instance.
+ * @param {number|Span} a - The radius value or the lower bound of the radius range.
+ * @param {number} [b] - The upper bound of the radius range (if a is a number).
+ * @param {boolean} [c] - Whether to use center-based calculation (if a and b are numbers).
+ */
+ constructor(a: number | Span, b?: number, c?: boolean);
+ /**
+ * @type {Span}
+ */
+ radius: Span;
+ /**
+ * @type {string}
+ */
+ name: string;
+ /**
+ * Resets this initializer's parameters.
+ * @param {number|Span} a - The radius value or the lower bound of the radius range.
+ * @param {number} [b] - The upper bound of the radius range (if a is a number).
+ * @param {boolean} [c] - Whether to use center-based calculation (if a and b are numbers).
+ */
+ reset(a: number | Span, b?: number, c?: boolean): void;
+ /**
+ * Initializes the particle's radius.
+ * @param {Particle} particle - The particle to initialize.
+ */
+ initialize(particle: Particle): void;
+}
+
+/**
+ * Body class for initializing particle bodies.
+ * @extends Initialize
+ */
+declare class Body extends Initialize {
+ /**
+ * Creates a new Body instance.
+ * @param {string|object|Image|HTMLImageElement|ArraySpan} image - The image source or object to use for the particle body.
+ * @param {number} [w=20] - The width of the particle body.
+ * @param {number} [h] - The height of the particle body. Defaults to the width if not provided.
+ */
+ constructor(image: string | object | (new (width?: number, height?: number) => HTMLImageElement) | HTMLImageElement | ArraySpan, w?: number, h?: number);
+ /**
+ * @type {ArraySpan}
+ * @private
+ */
+ private image;
+ /**
+ * @type {string}
+ */
+ name: string;
+ w: Mixed;
+ h: Mixed;
+ /**
+ * Initializes the particle's body.
+ * @param {object} particle - The particle to initialize.
+ */
+ initialize(particle: object): void;
+ /**
+ * Sets the span value for the image.
+ * @param {string|object|Image|HTMLImageElement|ArraySpan} image - The image source or object to set as span value.
+ * @returns {ArraySpan} The ArraySpan instance.
+ * @private
+ */
+ private setSpanValue;
+}
+
+/**
+ * The Behaviour class is the base for the other Behaviour
+ * @class
+ */
+declare class Behaviour$1 {
+ static id: number;
+ /**
+ * Create a new Behaviour instance
+ * @param {number} [life=Infinity] - The behaviour's life
+ * @param {string} [easing='easeLinear'] - The behaviour's decaying trend, for example ease.easeOutQuart
+ */
+ constructor(life?: number, easing?: string);
+ /**
+ * The behaviour's life
+ * @type {number}
+ */
+ life: number;
+ /**
+ * The behaviour's easing function
+ * @type {function}
+ */
+ easing: Function;
+ /**
+ * The behaviour's current age
+ * @type {number}
+ */
+ age: number;
+ /**
+ * The behaviour's current energy
+ * @type {number}
+ */
+ energy: number;
+ /**
+ * Whether the behaviour is dead
+ * @type {boolean}
+ */
+ dead: boolean;
+ /**
+ * The behaviour's parent emitters
+ * @type {Array}
+ */
+ parents: any[];
+ /**
+ * The behaviour's unique id
+ * @type {string}
+ */
+ id: string;
+ /**
+ * The behaviour's name
+ * @type {string}
+ */
+ name: string;
+ /**
+ * Reset this behaviour's parameters
+ * @param {number} [life=Infinity] - This behaviour's new life
+ * @param {string} [easing='easeLinear'] - This behaviour's new easing
+ */
+ reset(life?: number, easing?: string): void;
+ /**
+ * Normalize a force by 1:100
+ * @param {Proton.Vector2D} force - The force to normalize
+ * @returns {Proton.Vector2D} The normalized force
+ */
+ normalizeForce(force: Proton.Vector2D): Proton.Vector2D;
+ /**
+ * Normalize a value by 1:100
+ * @param {number} value - The value to normalize
+ * @returns {number} The normalized value
+ */
+ normalizeValue(value: number): number;
+ /**
+ * Initialize the behaviour's parameters for a particle
+ * @param {Proton.Particle} particle - The particle to initialize
+ */
+ initialize(particle: Proton.Particle): void;
+ /**
+ * Compute the behaviour's life cycle
+ * @param {Proton.Particle} particle - The particle to calculate for
+ * @param {number} time - The integrate time 1/ms
+ * @param {number} index - The particle index
+ */
+ calculate(particle: Proton.Particle, time: number, index: number): void;
+ /**
+ * Apply this behaviour to a particle
+ * @param {Proton.Particle} particle - The particle to apply the behaviour to
+ * @param {number} time - The integrate time 1/ms
+ * @param {number} index - The particle index
+ */
+ applyBehaviour(particle: Proton.Particle, time: number, index: number): void;
+ /**
+ * Destroy this behaviour
+ */
+ destroy(): void;
+}
+
+declare class Force extends Behaviour$1 {
+ /**
+ * @memberof! Proton#
+ * @augments Proton.Behaviour
+ * @constructor
+ * @alias Proton.Force
+ *
+ * @param {Number} fx
+ * @param {Number} fy
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ *
+ * @property {String} name The Behaviour name
+ */
+ constructor(fx: number, fy: number, life?: number, easing?: string);
+ force: Proton.Vector2D;
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @method reset
+ * @memberof Proton#Proton.Force
+ * @instance
+ *
+ * @param {Number} fx
+ * @param {Number} fy
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ */
+ reset(fx: number, fy: number, life?: number, easing?: string): void;
+ /**
+ * Apply this behaviour for all particles every time
+ *
+ * @method applyBehaviour
+ * @memberof Proton#Proton.Force
+ * @instance
+ *
+ * @param {Proton.Particle} particle
+ * @param {Number} the integrate time 1/ms
+ * @param {Int} the particle index
+ */
+ applyBehaviour(particle: Proton.Particle, time: any, index: any): void;
+}
+
+/**
+ * Attraction behavior for particles.
+ * This behaviour makes particles follow a specific target position.
+ * @extends Behaviour
+ */
+declare class Attraction extends Behaviour$1 {
+ /**
+ * Creates an instance of Attraction.
+ * @param {Vector2D} targetPosition - The attraction point coordinates.
+ * @param {number} [force=100] - The strength of the attraction force.
+ * @param {number} [radius=1000] - The radius of influence for the attraction.
+ * @param {number} [life=Infinity] - The life span of this behaviour.
+ * @param {string} [easing='ease.easeLinear'] - The easing function for this behaviour.
+ */
+ constructor(targetPosition: Vector2D$1, force?: number, radius?: number, life?: number, easing?: string);
+ /**
+ * The target position for attraction.
+ * @type {Vector2D}
+ */
+ targetPosition: Vector2D$1;
+ /**
+ * The radius of influence for the attraction.
+ * @type {number}
+ */
+ radius: number;
+ /**
+ * The strength of the attraction force.
+ * @type {number}
+ */
+ force: number;
+ /**
+ * The squared radius (for optimization).
+ * @type {number}
+ */
+ radiusSq: number;
+ /**
+ * The attraction force vector.
+ * @type {Vector2D}
+ */
+ attractionForce: Vector2D$1;
+ /**
+ * The squared length of the attraction force.
+ * @type {number}
+ */
+ lengthSq: number;
+ /**
+ * Resets the behaviour's parameters.
+ * @param {Vector2D} targetPosition - The new attraction point coordinates.
+ * @param {number} [force=100] - The new strength of the attraction force.
+ * @param {number} [radius=1000] - The new radius of influence for the attraction.
+ * @param {number} [life=Infinity] - The new life span of this behaviour.
+ * @param {string} [easing='ease.easeLinear'] - The new easing function for this behaviour.
+ */
+ reset(targetPosition: Vector2D$1, force?: number, radius?: number, life?: number, easing?: string): void;
+}
+
+declare class RandomDrift extends Behaviour$1 {
+ /**
+ * @memberof! Proton#
+ * @augments Behaviour
+ * @constructor
+ * @alias RandomDrift
+ *
+ * @param {Number} driftX X value of the new Vector2D
+ * @param {Number} driftY Y value of the new Vector2D
+ * @param {Number} delay How much delay the drift should have
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=easeLinear] this behaviour's easing
+ *
+ * @property {Number} time The time of the drift
+ * @property {String} name The Behaviour name
+ */
+ constructor(driftX: number, driftY: number, delay: number, life?: number, easing?: string);
+ time: number;
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @method reset
+ * @memberof Proton#RandomDrift
+ * @instance
+ *
+ * @param {Number} driftX X value of the new Vector2D
+ * @param {Number} driftY Y value of the new Vector2D
+ * @param {Number} delay How much delay the drift should have
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=easeLinear] this behaviour's easing
+ */
+ reset(driftX: number, driftY: number, delay: number, life?: number, easing?: string): void;
+ panFoce: any;
+ delay: number | undefined;
+ initialize(particle: any): void;
+ /**
+ * Apply this behaviour for all particles every time
+ *
+ * @method applyBehaviour
+ * @memberof Proton#RandomDrift
+ * @instance
+ *
+ * @param {Particle} particle
+ * @param {Number} time the integrate time 1/ms
+ * @param {Int} index the particle index
+ */
+ applyBehaviour(particle: Particle, time: number, index: Int): void;
+}
+
+declare class Gravity extends Force {
+ /**
+ * @memberof! Proton#
+ * @augments Proton#Proton.Force
+ * @constructor
+ * @alias Proton.Gravity
+ *
+ * @param {Number} g Gravity
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ *
+ * @property {String} name The Behaviour name
+ */
+ constructor(g: number, life?: number, easing?: string);
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @method reset
+ * @memberof Proton#Proton.Gravity
+ * @instance
+ *
+ * @param {Number} g Gravity
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ */
+ reset(g: number, life?: number, easing?: string): void;
+}
+
+declare class Collision extends Behaviour$1 {
+ /**
+ * The callback after collision
+ *
+ * @callback Callback
+ *
+ * @param {Proton.Particle} particle
+ * @param {Proton.Paritcle} otherParticle
+ */
+ /**
+ * @memberof! Proton#
+ * @augments Proton.Behaviour
+ * @constructor
+ * @alias Proton.Collision
+ *
+ * @todo add description to mass
+ *
+ * @param {Proton.Emitter} [emitter=null] the attraction point coordinates
+ * @param {Boolean} [mass=true]
+ * @param {Callback} [callback=null] the callback after the collision
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ *
+ * @property {String} name The Behaviour name
+ */
+ constructor(emitter?: Proton.Emitter, mass?: boolean, callback?: (particle: Proton.Particle, otherParticle: Proton.Paritcle) => Collision, life?: number, easing?: string);
+ newPool: any[];
+ pool: any[];
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @memberof Proton#Proton.Collision
+ * @method reset
+ * @instance
+ *
+ * @todo add description to mass
+ *
+ * @param {Proton.Emitter} [emitter=null] the attraction point coordinates
+ * @param {Boolean} [mass=true]
+ * @param {Callback} [callback=null] the callback after the collision
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ */
+ reset(emitter?: Proton.Emitter, mass?: boolean, callback?: (particle: Proton.Particle, otherParticle: Proton.Paritcle) => Collision, life?: number, easing?: string): void;
+ emitter: any;
+ mass: any;
+ callback: any;
+ collisionPool: any[] | undefined;
+ delta: Vector2D$1 | undefined;
+ /**
+ * Apply this behaviour for all particles every time
+ *
+ * @memberof Proton#Proton.Collision
+ * @method applyBehaviour
+ * @instance
+ *
+ * @param {Proton.Particle} particle
+ * @param {Number} time the integrate time 1/ms
+ * @param {Int} index the particle index
+ */
+ applyBehaviour(particle: Proton.Particle, time: number, index: Int): void;
+}
+
+declare class CrossZone extends Behaviour$1 {
+ /**
+ * Defines what happens if the particles come to the end of the specified zone
+ *
+ * @memberof! Proton#
+ * @augments Proton.Behaviour
+ * @constructor
+ * @alias Proton.CrossZone
+ *
+ * @param {Proton.Zone} zone can be any Proton.Zone - e.g. Proton.RectZone()
+ * @param {String} [crossType=dead] what happens if the particles pass the zone - allowed strings: dead | bound | cross
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ *
+ * @property {String} name The Behaviour name
+ */
+ constructor(zone: Proton.Zone, crossType?: string, life?: number, easing?: string);
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @method reset
+ * @memberof Proton#Proton.CrossZone
+ * @instance
+ *
+ * @param {Proton.Zone} zone can be any Proton.Zone - e.g. Proton.RectZone()
+ * @param {String} [crossType=dead] what happens if the particles pass the zone - allowed strings: dead | bound | cross
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=easeLinear] this behaviour's easing
+ */
+ reset(zone: Proton.Zone, crossType?: string, life?: number, easing?: string): void;
+ zone: any;
+ /**
+ * Apply this behaviour for all particles every time
+ *
+ * @method applyBehaviour
+ * @memberof Proton#Proton.CrossZone
+ * @instance
+ *
+ * @param {Proton.Particle} particle
+ * @param {Number} the integrate time 1/ms
+ * @param {Int} the particle index
+ */
+ applyBehaviour(particle: Proton.Particle, time: any, index: any): void;
+}
+
+/**
+ * Alpha behaviour for controlling particle opacity over time.
+ * @extends Behaviour
+ */
+declare class Alpha extends Behaviour$1 {
+ /**
+ * Creates a new Alpha instance.
+ * @param {number|Span} [a=1] - The initial alpha value or range.
+ * @param {number|Span} [b] - The final alpha value or range. If not provided, it will be the same as 'a'.
+ * @param {number} [life=Infinity] - This behaviour's life.
+ * @param {string} [easing='easeLinear'] - This behaviour's easing function.
+ */
+ constructor(a?: number | Span, b?: number | Span, life?: number, easing?: string);
+ /**
+ * @type {boolean}
+ * @private
+ */
+ private same;
+ /**
+ * @type {Span}
+ * @private
+ */
+ private a;
+ /**
+ * @type {Span}
+ * @private
+ */
+ private b;
+ /**
+ * Resets this behaviour's parameters.
+ * @param {number|Span} [a=1] - The initial alpha value or range.
+ * @param {number|Span} [b] - The final alpha value or range. If not provided, it will be the same as 'a'.
+ * @param {number} [life] - This behaviour's life.
+ * @param {string} [easing] - This behaviour's easing function.
+ */
+ reset(a?: number | Span, b?: number | Span, life?: number, easing?: string): void;
+}
+
+/**
+ * Scale behaviour for controlling particle size over time.
+ * @extends Behaviour
+ */
+declare class Scale extends Behaviour$1 {
+ /**
+ * Creates a new Scale instance.
+ * @param {number|Span} [a=1] - The initial scale value or range.
+ * @param {number|Span} [b] - The final scale value or range. If not provided, it will be the same as 'a'.
+ * @param {number} [life=Infinity] - This behaviour's life.
+ * @param {string} [easing='easeLinear'] - This behaviour's easing function.
+ */
+ constructor(a?: number | Span, b?: number | Span, life?: number, easing?: string);
+ /**
+ * @type {boolean}
+ * @private
+ */
+ private same;
+ /**
+ * Resets this behaviour's parameters.
+ * @param {number|Span} a - The initial scale value or range.
+ * @param {number|Span} [b] - The final scale value or range. If not provided, it will be the same as 'a'.
+ * @param {number} [life] - This behaviour's life.
+ * @param {string} [easing] - This behaviour's easing function.
+ */
+ reset(a: number | Span, b?: number | Span, life?: number, easing?: string): void;
+ a: Span | undefined;
+ b: Span | undefined;
+}
+
+/**
+ * Rotate behaviour for controlling particle rotation.
+ * @extends Behaviour
+ */
+declare class Rotate extends Behaviour$1 {
+ /**
+ * Creates a new Rotate instance.
+ * @param {string|number|Span} [influence='Velocity'] - The rotation's influence or initial rotation.
+ * @param {string|number|Span} [b] - The final rotation value or range.
+ * @param {string} [style='to'] - The style of rotation ('to' or 'add').
+ * @param {number} [life=Infinity] - This behaviour's life.
+ * @param {string} [easing='easeLinear'] - This behaviour's easing function.
+ */
+ constructor(influence?: string | number | Span, b?: string | number | Span, style?: string, life?: number, easing?: string);
+ /**
+ * @type {boolean}
+ * @private
+ */
+ private same;
+ /**
+ * @type {Span}
+ * @private
+ */
+ private a;
+ /**
+ * @type {Span}
+ * @private
+ */
+ private b;
+ /**
+ * @type {string}
+ * @private
+ */
+ private style;
+ /**
+ * Resets this behaviour's parameters.
+ * @param {string|number|Span} [a='Velocity'] - The rotation's influence or initial rotation.
+ * @param {string|number|Span} [b] - The final rotation value or range.
+ * @param {string} [style='to'] - The style of rotation ('to' or 'add').
+ * @param {number} [life] - This behaviour's life.
+ * @param {string} [easing] - This behaviour's easing function.
+ */
+ reset(a?: string | number | Span, b?: string | number | Span, style?: string, life?: number, easing?: string): void;
+ /**
+ * Initializes the behaviour's parameters for a particle.
+ * @param {object} particle - The particle to initialize.
+ * @param {number} particle.rotation - The particle's rotation.
+ * @param {object} particle.data - The particle's data object.
+ */
+ initialize(particle: {
+ rotation: number;
+ data: object;
+ }): void;
+ /**
+ * Applies this behaviour to a particle.
+ * @param {object} particle - The particle to apply the behaviour to.
+ * @param {number} time - The integrate time (1/ms).
+ * @param {number} index - The particle index.
+ */
+ applyBehaviour(particle: object, time: number, index: number): void;
+}
+
+declare class Color extends Behaviour$1 {
+ /**
+ * @memberof! Proton#
+ * @augments Proton.Behaviour
+ * @constructor
+ * @alias Proton.Color
+ *
+ * @param {Proton.ArraySpan | String} [a] the string should be a hex e.g. #000000 for black
+ * @param {Proton.ArraySpan | String} [b] the string should be a hex e.g. #000000 for black
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=easeLinear] this behaviour's easing
+ *
+ * @property {String} name The Behaviour name
+ */
+ constructor(a?: Proton.ArraySpan | string, b?: Proton.ArraySpan | string, life?: number, easing?: string);
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @method reset
+ * @memberof Proton#Proton.Color
+ * @instance
+ *
+ * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black
+ * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=easeLinear] this behaviour's easing
+ */
+ reset(a: Proton.ArraySpan | string, b: Proton.ArraySpan | string, life?: number, easing?: string): void;
+ a: ArraySpan | null | undefined;
+ b: ArraySpan | null | undefined;
+ /**
+ * Apply this behaviour for all particles every time
+ *
+ * @method applyBehaviour
+ * @memberof Proton#Proton.Color
+ * @instance
+ *
+ * @param {Proton.Particle} particle
+ * @param {Number} the integrate time 1/ms
+ * @param {Int} the particle index
+ */
+ applyBehaviour(particle: Proton.Particle, time: any, index: any): void;
+}
+
+declare class Cyclone extends Behaviour$1 {
+ /**
+ * @memberof! Proton#
+ * @augments Proton.Behaviour
+ * @constructor
+ * @alias Proton.Cyclone
+ *
+ * @param {Number} angle
+ * @param {Number} force
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ *
+ * @property {String} name The Behaviour name
+ */
+ constructor(angle: number, force: number, life?: number, easing?: string);
+ setAngleAndForce(angle: any, force: any): void;
+ force: any;
+ angle: any;
+ span: Span | undefined;
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @method reset
+ * @memberof Proton#Proton.Cyclone
+ * @instance
+ *
+ * @param {Number} angle
+ * @param {Number} force
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ */
+ reset(angle: number, force: number, life?: number, easing?: string): void;
+ initialize(particle: any): void;
+ /**
+ * Apply this behaviour for all particles every time
+ *
+ * @method applyBehaviour
+ * @memberof Proton#Proton.Cyclone
+ * @instance
+ *
+ * @param {Proton.Particle} particle
+ * @param {Number} the integrate time 1/ms
+ * @param {Int} the particle index
+ */
+ applyBehaviour(particle: Proton.Particle, time: any, index: any): void;
+}
+
+/**
+ * The opposite of Attraction - turns the force
+ *
+ * @class
+ * @extends Proton.Attraction
+ * @memberof! Proton#
+ * @alias Proton.Repulsion
+ */
+declare class Repulsion {
+ /**
+ * Creates a new Repulsion behaviour instance
+ *
+ * @constructor
+ * @param {Proton.Vector2D} targetPosition - The repulsion point coordinates
+ * @param {number} [force=100] - The strength of the repulsion force
+ * @param {number} [radius=1000] - The radius of influence for the repulsion
+ * @param {number} [life=Infinity] - The behaviour's life
+ * @param {string} [easing='easeLinear'] - The behaviour's easing function
+ */
+ constructor(targetPosition: Proton.Vector2D, force?: number, radius?: number, life?: number, easing?: string);
+ /**
+ * The name of the behaviour
+ * @type {string}
+ */
+ name: string;
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @param {Proton.Vector2D} targetPosition - The new repulsion point coordinates
+ * @param {number} [force=100] - The new strength of the repulsion force
+ * @param {number} [radius=1000] - The new radius of influence for the repulsion
+ * @param {number} [life=Infinity] - The new behaviour's life
+ * @param {string} [easing='easeLinear'] - The new behaviour's easing function
+ */
+ reset(targetPosition: Proton.Vector2D, force?: number, radius?: number, life?: number, easing?: string): void;
+}
+
+declare class GravityWell extends Behaviour$1 {
+ /**
+ * @memberof! Proton#
+ * @augments Behaviour
+ * @constructor
+ * @alias GravityWell
+ *
+ * @param {Vector2D} [centerPoint=new Vector2D] The point in the center
+ * @param {Number} [force=100] The force
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=easeLinear] this behaviour's easing
+ *
+ * @property {String} name The Behaviour name
+ */
+ constructor(centerPoint?: Vector2D$1, force?: number, life?: number, easing?: string);
+ distanceVec: Vector2D$1;
+ centerPoint: Mixed;
+ force: Mixed;
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @method reset
+ * @memberof Proton#GravityWell
+ * @instance
+ *
+ * @param {Vector2D} [centerPoint=new Vector2D] The point in the center
+ * @param {Number} [force=100] The force
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=easeLinear] this behaviour's easing
+ */
+ reset(centerPoint?: Vector2D$1, force?: number, life?: number, easing?: string): void;
+ /**
+ * @inheritdoc
+ */
+ initialize(particle: any): void;
+ /**
+ * Apply this behaviour for all particles every time
+ *
+ * @method applyBehaviour
+ * @memberof Proton#GravityWell
+ * @instance
+ *
+ * @param {Particle} particle
+ * @param {Number} the integrate time 1/ms
+ * @param {Int} the particle index
+ */
+ applyBehaviour(particle: Particle, time: any, index: any): void;
+}
+
+declare class Emitter$1 extends Particle$1 {
+ particles: any[];
+ initializes: any[];
+ emitTime: number;
+ emitSpeed: number;
+ totalTime: number;
+ /**
+ * The friction coefficient for all particle emit by This;
+ * @property damping
+ * @type {Number}
+ * @default 0.006
+ */
+ damping: number;
+ /**
+ * If bindEmitter the particles can bind this emitter's property;
+ * @property bindEmitter
+ * @type {Boolean}
+ * @default true
+ */
+ bindEmitter: boolean;
+ /**
+ * The number of particles per second emit (a [particle]/b [s]);
+ * @property rate
+ * @type {Rate}
+ * @default Rate(1, .1)
+ */
+ rate: Rate;
+ /**
+ * start emit particle
+ * @method emit
+ * @param {Number | String} [totalTime] begin emit time;
+ * @param {String | boolean} [life] the life of this emitter
+ */
+ emit(totalTime?: number | string, life?: string | boolean): void;
+ stoped: any;
+ /**
+ * stop emiting
+ * @method stop
+ */
+ stop(): void;
+ preEmit(time: any): void;
+ /**
+ * remove current all particles
+ * @method removeAllParticles
+ */
+ removeAllParticles(): void;
+ /**
+ * add initialize to this emitter
+ * @method addSelfInitialize
+ */
+ addSelfInitialize(initialize: any): void;
+ /**
+ * add the Initialize to particles;
+ *
+ * you can use initializes array:for example emitter.addInitialize(initialize1,initialize2,initialize3);
+ * @method addInitialize
+ * @param {Initialize} initialize like this new Radius(1, 12)
+ */
+ addInitialize(...rest: any[]): void;
+ /**
+ * remove the Initialize
+ * @method removeInitialize
+ * @param {Initialize} initialize a initialize
+ */
+ removeInitialize(initializer: any): void;
+ /**
+ * remove all Initializes
+ * @method removeInitializers
+ */
+ removeAllInitializers(): void;
+ /**
+ * add the Behaviour to particles;
+ *
+ * you can use Behaviours array:emitter.addBehaviour(Behaviour1,Behaviour2,Behaviour3);
+ * @method addBehaviour
+ * @param {Behaviour} behaviour like this new Color('random')
+ */
+ addBehaviour(...rest: any[]): void;
+ /**
+ * remove the Behaviour
+ * @method removeBehaviour
+ * @param {Behaviour} behaviour a behaviour
+ */
+ removeBehaviour(behaviour: Behaviour): number;
+ update(time: any): void;
+ integrate(time: any): void;
+ dispatch(event: any, target: any): void;
+ emitting(time: any): void;
+ /**
+ * Creates a single particle.
+ *
+ * @param {Object|Array} [initialize] - Initialization parameters or array of initialization objects.
+ * @param {Object|Array} [behaviour] - Behavior object or array of behavior objects.
+ * @returns {Particle} The created particle.
+ *
+ */
+ createParticle(initialize?: Object | any[], behaviour?: Object | any[]): Particle$1;
+ /**
+ * Sets up a particle with initialization and behavior.
+ *
+ * @param {Particle} particle - The particle to set up.
+ * @param {Object|Array} [initialize] - Initialization parameters or array of initialization objects.
+ * @param {Object|Array} [behaviour] - Behavior object or array of behavior objects.
+ */
+ setupParticle(particle: Particle$1, initialize?: Object | any[], behaviour?: Object | any[]): void;
+ /**
+ * Removes all particles and stops the emitter.
+ */
+ remove(): void;
+}
+
+declare class BehaviourEmitter extends Emitter$1 {
+ /**
+ * The BehaviourEmitter class inherits from Proton.Emitter
+ *
+ * use the BehaviourEmitter you can add behaviours to self;
+ * @class Proton.BehaviourEmitter
+ * @constructor
+ * @param {Object} conf the parameters object;
+ */
+ constructor(conf: Object);
+ selfBehaviours: any[];
+ /**
+ * add the Behaviour to emitter;
+ *
+ * you can use Behaviours array:emitter.addSelfBehaviour(Behaviour1,Behaviour2,Behaviour3);
+ * @method addSelfBehaviour
+ * @param {Proton.Behaviour} behaviour like this new Proton.Color('random')
+ */
+ addSelfBehaviour(...rest: any[]): void;
+ /**
+ * remove the Behaviour for self
+ * @method removeSelfBehaviour
+ * @param {Proton.Behaviour} behaviour a behaviour
+ */
+ removeSelfBehaviour(behaviour: Proton.Behaviour): void;
+}
+
+declare class FollowEmitter extends Emitter$1 {
+ /**
+ * The FollowEmitter class inherits from Proton.Emitter
+ *
+ * use the FollowEmitter will emit particle when mousemoving
+ *
+ * @class Proton.FollowEmitter
+ * @constructor
+ * @param {Element} mouseTarget mouseevent's target;
+ * @param {Number} ease the easing of following speed;
+ * @default 0.7
+ * @param {Object} conf the parameters object;
+ */
+ constructor(mouseTarget: Element, ease: number, conf: Object);
+ mouseTarget: Mixed;
+ ease: Mixed;
+ _allowEmitting: boolean;
+ initEventHandler(): void;
+ mousemoveHandler: ((e: any) => void) | undefined;
+ mousedownHandler: ((e: any) => any) | undefined;
+ mouseupHandler: ((e: any) => any) | undefined;
+ /**
+ * start emit particle
+ * @method emit
+ */
+ emit(): void;
+ mousemove(e: any): void;
+}
+
+declare class BaseRenderer {
+ constructor(element: any, stroke: any);
+ pool: Pool;
+ element: any;
+ stroke: any;
+ circleConf: {
+ isCircle: boolean;
+ };
+ name: string;
+ setStroke(color?: string, thinkness?: number): void;
+ initEventHandler(): void;
+ _protonUpdateHandler: (() => void) | undefined;
+ _protonUpdateAfterHandler: (() => void) | undefined;
+ _emitterAddedHandler: ((emitter: any) => void) | undefined;
+ _emitterRemovedHandler: ((emitter: any) => void) | undefined;
+ _particleCreatedHandler: ((particle: any) => void) | undefined;
+ _particleUpdateHandler: ((particle: any) => void) | undefined;
+ _particleDeadHandler: ((particle: any) => void) | undefined;
+ init(proton: any): void;
+ parent: any;
+ resize(width: any, height: any): void;
+ destroy(): void;
+ remove(proton: any): void;
+ onProtonUpdate(): void;
+ onProtonUpdateAfter(): void;
+ onEmitterAdded(emitter: any): void;
+ onEmitterRemoved(emitter: any): void;
+ onParticleCreated(particle: any): void;
+ onParticleUpdate(particle: any): void;
+ onParticleDead(particle: any): void;
+}
+
+/**
+ * CanvasRenderer class for rendering particles on a canvas element.
+ * @extends BaseRenderer
+ */
+declare class CanvasRenderer extends BaseRenderer {
+ /**
+ * Creates a new CanvasRenderer instance.
+ * @param {HTMLCanvasElement} element - The canvas element to render on.
+ */
+ constructor(element: HTMLCanvasElement);
+ /**
+ * @type {object|null}
+ * @private
+ */
+ private stroke;
+ /**
+ * @type {CanvasRenderingContext2D}
+ * @private
+ */
+ private context;
+ /**
+ * @type {object}
+ * @private
+ */
+ private bufferCache;
+ /**
+ * Resizes the canvas element.
+ * @param {number} width - The new width of the canvas.
+ * @param {number} height - The new height of the canvas.
+ */
+ resize(width: number, height: number): void;
+ /**
+ * Handles particle creation.
+ * @param {object} particle - The created particle.
+ */
+ onParticleCreated(particle: object): void;
+ /**
+ * Handles particle updates.
+ * @param {object} particle - The updated particle.
+ */
+ onParticleUpdate(particle: object): void;
+ /**
+ * Handles particle destruction.
+ * @param {object} particle - The destroyed particle.
+ */
+ onParticleDead(particle: object): void;
+ /**
+ * Adds an image to the particle body.
+ * @param {HTMLImageElement} img - The image to add.
+ * @param {object} particle - The particle to add the image to.
+ * @private
+ */
+ private addImg2Body;
+ /**
+ * Draws an image particle.
+ * @param {object} particle - The particle to draw.
+ * @private
+ */
+ private drawImage;
+ /**
+ * Draws a circular particle.
+ * @param {object} particle - The particle to draw.
+ * @private
+ */
+ private drawCircle;
+ /**
+ * Creates a buffer for image particles.
+ * @param {HTMLImageElement} image - The image to create a buffer for.
+ * @returns {HTMLCanvasElement|undefined} The created buffer canvas.
+ * @private
+ */
+ private createBuffer;
+}
+
+/**
+ * Represents a DOM-based renderer for particle systems.
+ * @extends BaseRenderer
+ */
+declare class DomRenderer extends BaseRenderer {
+ /**
+ * Creates a new DomRenderer instance.
+ * @param {HTMLElement} element - The HTML element to render to.
+ */
+ constructor(element: HTMLElement);
+ transform3d: boolean;
+ addImg2Body(img: any, particle: any): void;
+ bodyReady(particle: any): any;
+ createBody(body: any, particle: any): HTMLDivElement;
+ createCircle(particle: any): HTMLDivElement;
+ createSprite(body: any, particle: any): HTMLDivElement;
+}
+
+declare class EaselRenderer extends BaseRenderer {
+ createSprite(particle: any): void;
+ createCircle(particle: any): void;
+}
+
+/**
+ * Represents a pixel-based renderer for particle systems.
+ * @extends BaseRenderer
+ */
+declare class PixelRenderer extends BaseRenderer {
+ /**
+ * Creates a new PixelRenderer instance.
+ * @param {HTMLCanvasElement} element - The canvas element to render to.
+ * @param {Rectangle} [rectangle] - The rectangle defining the rendering area.
+ */
+ constructor(element: HTMLCanvasElement, rectangle?: Rectangle);
+ context: any;
+ imageData: any;
+ rectangle: Rectangle | undefined;
+ createImageData(rectangle: any): void;
+ setPixel(imagedata: any, x: any, y: any, particle: any): void;
+}
+
+/**
+ * Represents a PIXI-based renderer for particle systems.
+ * @extends BaseRenderer
+ */
+declare class PixiRenderer extends BaseRenderer {
+ /**
+ * Creates a new PixiRenderer instance.
+ * @param {PIXI.Container} element - The PIXI container to render to.
+ * @param {string|number} [stroke] - The stroke color for particles.
+ */
+ constructor(element: PIXI.Container, stroke?: string | number);
+ stroke: string | number | undefined;
+ color: boolean;
+ setColor: boolean;
+ blendMode: any;
+ setPIXI(PIXI: any): void;
+ createFromImage: any;
+ /**
+ * @param particle
+ */
+ onParticleCreated(particle: any): void;
+ /**
+ * @param particle
+ */
+ onParticleUpdate(particle: any): void;
+ /**
+ * @param particle
+ */
+ onParticleDead(particle: any): void;
+ transform(particle: any, target: any): void;
+ createBody(body: any, particle: any): any;
+ createSprite(body: any): any;
+ createCircle(particle: any): any;
+ /**
+ * Destroys the renderer and cleans up resources.
+ * @param {Array} particles - The particles to clean up.
+ */
+ destroy(particles: Array): void;
+}
+
+declare class MStack {
+ mats: Float32Array[];
+ size: number;
+ set(m: any, i: any): void;
+ push(m: any): void;
+ pop(): void;
+ top(): Float32Array;
+}
+
+/**
+ * Represents a WebGL-based renderer for particle systems.
+ * @extends BaseRenderer
+ */
+declare class WebGLRenderer extends BaseRenderer {
+ /**
+ * Creates a new WebGLRenderer instance.
+ * @param {HTMLCanvasElement} element - The canvas element to render to.
+ */
+ constructor(element: HTMLCanvasElement);
+ gl: any;
+ addImg2Body(img: any, particle: any): void;
+ setMaxRadius(radius: any): void;
+ circleCanvasURL: any;
+ getVertexShader(): string;
+ getFragmentShader(): string;
+ initVar(): void;
+ mstack: MStack | null | undefined;
+ umat: Float32Array | null | undefined;
+ smat: Float32Array | null | undefined;
+ texturebuffers: {} | null | undefined;
+ blendEquation(A: any): void;
+ blendFunc(A: any, B: any): void;
+ getShader(gl: any, str: any, fs: any): any;
+ initShaders(): void;
+ sprogram: any;
+ initBuffers(): void;
+ unitIBuffer: any;
+ unitI33: any;
+ stripBuffer: any;
+ createCircle(raidus: any): any;
+ circleCanvasRadius: number | undefined;
+ drawImg2Canvas(particle: any): void;
+ updateMatrix(particle: any): void;
+}
+
+/**
+ * Represents a custom renderer that extends the BaseRenderer.
+ * @extends BaseRenderer
+ */
+declare class CustomRenderer extends BaseRenderer {
+ /**
+ * Creates a new CustomRenderer instance.
+ * @param {HTMLElement} element - The HTML element to render to.
+ */
+ constructor(element: HTMLElement);
+}
+
+/**
+ * Represents a line zone for particle systems.
+ * @extends Zone
+ */
+declare class LineZone extends Zone {
+ /**
+ * Creates a new LineZone.
+ * @param {number} x1 - The x-coordinate of the first point.
+ * @param {number} y1 - The y-coordinate of the first point.
+ * @param {number} [x2] - The x-coordinate of the second point.
+ * @param {number} [y2] - The y-coordinate of the second point.
+ * @param {string} [direction=">"] - The direction of the line.
+ */
+ constructor(x1: number, y1: number, x2?: number, y2?: number, direction?: string);
+ x1: number | undefined;
+ y1: number | undefined;
+ x2: number | undefined;
+ y2: number | undefined;
+ dx: number;
+ dy: number;
+ minx: number;
+ miny: number;
+ maxx: number;
+ maxy: number;
+ dot: number;
+ xxyy: number;
+ gradient: number;
+ length: number;
+ direction: Mixed;
+ /**
+ * Gets a random position on the line.
+ * @returns {Vector2D} A vector representing the random position.
+ */
+ getPosition(): Vector2D$1;
+ /**
+ * Determines which side of the line a point is on.
+ * @param {number} x - The x-coordinate of the point.
+ * @param {number} y - The y-coordinate of the point.
+ * @returns {boolean} True if the point is on the positive side of the line, false otherwise.
+ */
+ getDirection(x: number, y: number): boolean;
+ /**
+ * Calculates the distance of a point from the line.
+ * @param {number} x - The x-coordinate of the point.
+ * @param {number} y - The y-coordinate of the point.
+ * @returns {number} The distance from the point to the line.
+ */
+ getDistance(x: number, y: number): number;
+ /**
+ * Calculates the symmetric vector of a given vector with respect to the line.
+ * @param {Vector2D} v - The vector to reflect.
+ * @returns {Vector2D} The reflected vector.
+ */
+ getSymmetric(v: Vector2D$1): Vector2D$1;
+ /**
+ * Gets the gradient (angle) of the line.
+ * @returns {number} The gradient of the line in radians.
+ */
+ getGradient(): number;
+ /**
+ * Checks if a particle is outside the range of the line.
+ * @param {Particle} particle - The particle to check.
+ * @returns {boolean} True if the particle is within range, false otherwise.
+ */
+ rangeOut(particle: Particle): boolean;
+ /**
+ * Gets the length of the line.
+ * @returns {number} The length of the line.
+ */
+ getLength(): number;
+ /**
+ * Handles particle crossing behavior based on the crossType.
+ * @param {Particle} particle - The particle to check for crossing.
+ */
+ crossing(particle: Particle): void;
+}
+
+/**
+ * Represents a circular zone in a 2D space.
+ * @extends Zone
+ */
+declare class CircleZone extends Zone {
+ /**
+ * Creates a new CircleZone.
+ * @param {number} x - The x-coordinate of the circle's center.
+ * @param {number} y - The y-coordinate of the circle's center.
+ * @param {number} [radius] - The radius of the circle.
+ */
+ constructor(x: number, y: number, radius?: number);
+ x: number;
+ y: number;
+ radius: number | undefined;
+ angle: number;
+ center: {
+ x: number;
+ y: number;
+ };
+ /**
+ * Gets a random position within the circle.
+ * @returns {Object} An object with x and y coordinates.
+ */
+ getPosition(): Object;
+ randomRadius: number | undefined;
+ /**
+ * Sets the center of the circle.
+ * @param {number} x - The new x-coordinate of the center.
+ * @param {number} y - The new y-coordinate of the center.
+ */
+ setCenter(x: number, y: number): void;
+ /**
+ * Handles particle crossing behavior.
+ * @param {Object} particle - The particle to check for crossing.
+ */
+ crossing(particle: Object): void;
+ /**
+ * Calculates the symmetric position of a particle.
+ * @param {Object} particle - The particle to calculate symmetry for.
+ */
+ getSymmetric(particle: Object): void;
+ /**
+ * Calculates the gradient for a particle.
+ * @param {Object} particle - The particle to calculate the gradient for.
+ * @returns {number} The calculated gradient.
+ */
+ getGradient(particle: Object): number;
+}
+
+/**
+ * Represents a rectangular zone for particle systems.
+ * @extends Zone
+ */
+declare class RectZone extends Zone {
+ /**
+ * Creates a new RectZone.
+ * @param {number} x - The x-coordinate of the top-left corner of the rectangle.
+ * @param {number} y - The y-coordinate of the top-left corner of the rectangle.
+ * @param {number} [width] - The width of the rectangle.
+ * @param {number} [height] - The height of the rectangle.
+ */
+ constructor(x: number, y: number, width?: number, height?: number);
+ x: number;
+ y: number;
+ width: number;
+ height: number;
+ /**
+ * Gets a random position within the rectangular zone.
+ * @returns {Vector2D} A vector representing the random position.
+ */
+ getPosition(): Vector2D;
+ /**
+ * Handles particle crossing behavior based on the crossType.
+ * @param {Particle} particle - The particle to check for crossing.
+ */
+ crossing(particle: Particle): void;
+}
+
+/**
+ * Represents a zone based on image data.
+ * @extends Zone
+ */
+declare class ImageZone extends Zone {
+ /**
+ * Creates an ImageZone.
+ * @param {ImageData} imageData - The image data to use for the zone.
+ * @param {number} [x=0] - The x-coordinate offset.
+ * @param {number} [y=0] - The y-coordinate offset.
+ * @param {number} [d=2] - The sampling density.
+ */
+ constructor(imageData: ImageData, x?: number, y?: number, d?: number);
+ /**
+ * Resets the ImageZone with new parameters.
+ * @param {ImageData} imageData - The image data to use for the zone.
+ * @param {number} [x=0] - The x-coordinate offset.
+ * @param {number} [y=0] - The y-coordinate offset.
+ * @param {number} [d=2] - The sampling density.
+ */
+ reset(imageData: ImageData, x?: number, y?: number, d?: number): void;
+ imageData: ImageData | null | undefined;
+ x: any;
+ y: any;
+ d: any;
+ vectors: any[] | undefined;
+ /**
+ * Sets up vectors based on the image data.
+ * @returns {Object} The vector object.
+ */
+ setVectors(): Object;
+ /**
+ * Checks if a point is within the bounds of the image.
+ * @param {number} x - The x-coordinate to check.
+ * @param {number} y - The y-coordinate to check.
+ * @returns {boolean} True if the point is within bounds, false otherwise.
+ */
+ getBound(x: number, y: number): boolean;
+ /**
+ * Gets a random position within the image zone.
+ * @returns {Object} A vector representing the position.
+ */
+ getPosition(): Object;
+ /**
+ * Gets the color at a specific point in the image.
+ * @param {number} x - The x-coordinate.
+ * @param {number} y - The y-coordinate.
+ * @returns {Object} An object containing r, g, b, and a values.
+ */
+ getColor(x: number, y: number): Object;
+ /**
+ * Handles particle crossing behavior.
+ * @param {Object} particle - The particle to check for crossing.
+ */
+ crossing(particle: Object): void;
+}
+
+declare namespace _default {
+ function addEventListener(proton: any, func: any): void;
+ function getStyle(color?: string): string;
+ function drawZone(proton: any, canvas: any, zone: any, clear: any): void;
+ function drawEmitter(proton: any, canvas: any, emitter: any, clear: any): void;
+}
+
+export { Alpha, ArraySpan, Attraction, Behaviour$1 as Behaviour, BehaviourEmitter, Body, CanvasRenderer, CircleZone, Collision, Color, _default$2 as ColorUtil, CrossZone, CustomRenderer, Cyclone, _default as Debug, DomRenderer, EaselRenderer, Emitter$1 as Emitter, FollowEmitter, Force, Gravity, GravityWell, ImageZone, Initialize, Life, LineZone, Mass, Mat3, MathUtil, Particle$1 as Particle, PixelRenderer, PixiRenderer, PointZone, Polar2D, Pool, Position, Radius, RandomDrift, Rate, RectZone, Rectangle, Repulsion, Rotate, Scale, Span, _default$3 as Util, Vector2D$1 as Vector2D, Velocity, WebGLRenderer, Zone, Proton$1 as default, _default$1 as ease };
diff --git a/build/proton.js b/build/proton.js
index 2f28c39..6240b71 100644
--- a/build/proton.js
+++ b/build/proton.js
@@ -1,61 +1,10 @@
(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global.Proton = factory());
-}(this, (function () { 'use strict';
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Proton = {}));
+})(this, (function (exports) { 'use strict';
-var PI = 3.1415926;
-
-var MathUtils = {
-
- PI: PI,
- PIx2: PI * 2,
- PI_2: PI / 2,
- PI_180: PI / 180,
- N180_PI: 180 / PI,
-
- randomAToB: function randomAToB(a, b, INT) {
- if (!INT) return a + Math.random() * (b - a);else return Math.floor(Math.random() * (b - a)) + a;
- },
- randomFloating: function randomFloating(center, f, INT) {
- return this.randomAToB(center - f, center + f, INT);
- },
- randomZone: function randomZone(display) {},
- degreeTransform: function degreeTransform(a) {
- return a * PI / 180;
- },
- toColor16: function toColor16(num) {
- return "#" + num.toString(16);
- },
- randomColor: function randomColor() {
- return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).slice(-6);
- }
-};
-
-var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
- return typeof obj;
-} : function (obj) {
- return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
-};
-
-
-
-
-
-
-
-
-
-
-
-var classCallCheck = function (instance, Constructor) {
- if (!(instance instanceof Constructor)) {
- throw new TypeError("Cannot call a class as a function");
- }
-};
-
-var createClass = function () {
- function defineProperties(target, props) {
+ function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
@@ -64,296 +13,31 @@ var createClass = function () {
Object.defineProperty(target, descriptor.key, descriptor);
}
}
-
- return function (Constructor, protoProps, staticProps) {
- if (protoProps) defineProperties(Constructor.prototype, protoProps);
- if (staticProps) defineProperties(Constructor, staticProps);
+ function _createClass(Constructor, protoProps, staticProps) {
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
- };
-}();
-
-
-
-
-
-
-
-var get = function get(object, property, receiver) {
- if (object === null) object = Function.prototype;
- var desc = Object.getOwnPropertyDescriptor(object, property);
-
- if (desc === undefined) {
- var parent = Object.getPrototypeOf(object);
-
- if (parent === null) {
- return undefined;
- } else {
- return get(parent, property, receiver);
- }
- } else if ("value" in desc) {
- return desc.value;
- } else {
- var getter = desc.get;
-
- if (getter === undefined) {
- return undefined;
- }
-
- return getter.call(receiver);
}
-};
-
-var inherits = function (subClass, superClass) {
- if (typeof superClass !== "function" && superClass !== null) {
- throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ function _inheritsLoose(subClass, superClass) {
+ subClass.prototype = Object.create(superClass.prototype);
+ subClass.prototype.constructor = subClass;
+ _setPrototypeOf(subClass, superClass);
}
-
- subClass.prototype = Object.create(superClass && superClass.prototype, {
- constructor: {
- value: subClass,
- enumerable: false,
- writable: true,
- configurable: true
- }
- });
- if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
-};
-
-
-
-
-
-
-
-
-
-
-
-var possibleConstructorReturn = function (self, call) {
- if (!self) {
- throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ function _setPrototypeOf(o, p) {
+ _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
+ o.__proto__ = p;
+ return o;
+ };
+ return _setPrototypeOf(o, p);
}
-
- return call && (typeof call === "object" || typeof call === "function") ? call : self;
-};
-
-var Vector2D = function () {
- function Vector2D(x, y) {
- classCallCheck(this, Vector2D);
-
- this.x = x || 0;
- this.y = y || 0;
+ function _assertThisInitialized(self) {
+ if (self === void 0) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
+ return self;
+ }
- createClass(Vector2D, [{
- key: 'set',
- value: function set$$1(x, y) {
- this.x = x;
- this.y = y;
- return this;
- }
- }, {
- key: 'setX',
- value: function setX(x) {
- this.x = x;
- return this;
- }
- }, {
- key: 'setY',
- value: function setY(y) {
- this.y = y;
- return this;
- }
- }, {
- key: 'getGradient',
- value: function getGradient() {
- if (this.x != 0) return Math.atan2(this.y, this.x);else if (this.y > 0) return MathUtils.PI_2;else if (this.y < 0) return -MathUtils.PI_2;
- }
- }, {
- key: 'copy',
- value: function copy(v) {
- this.x = v.x;
- this.y = v.y;
-
- return this;
- }
- }, {
- key: 'add',
- value: function add(v, w) {
- if (w !== undefined) {
- return this.addVectors(v, w);
- }
-
- this.x += v.x;
- this.y += v.y;
-
- return this;
- }
- }, {
- key: 'addXY',
- value: function addXY(a, b) {
- this.x += a;
- this.y += b;
-
- return this;
- }
- }, {
- key: 'addVectors',
- value: function addVectors(a, b) {
- this.x = a.x + b.x;
- this.y = a.y + b.y;
-
- return this;
- }
- }, {
- key: 'sub',
- value: function sub(v, w) {
- if (w !== undefined) {
- return this.subVectors(v, w);
- }
-
- this.x -= v.x;
- this.y -= v.y;
-
- return this;
- }
- }, {
- key: 'subVectors',
- value: function subVectors(a, b) {
- this.x = a.x - b.x;
- this.y = a.y - b.y;
-
- return this;
- }
- }, {
- key: 'divideScalar',
- value: function divideScalar(s) {
- if (s !== 0) {
- this.x /= s;
- this.y /= s;
- } else {
- this.set(0, 0);
- }
-
- return this;
- }
- }, {
- key: 'multiplyScalar',
- value: function multiplyScalar(s) {
- this.x *= s;
- this.y *= s;
-
- return this;
- }
- }, {
- key: 'negate',
- value: function negate() {
- return this.multiplyScalar(-1);
- }
- }, {
- key: 'dot',
- value: function dot(v) {
- return this.x * v.x + this.y * v.y;
- }
- }, {
- key: 'lengthSq',
- value: function lengthSq() {
- return this.x * this.x + this.y * this.y;
- }
- }, {
- key: 'length',
- value: function length() {
- return Math.sqrt(this.x * this.x + this.y * this.y);
- }
- }, {
- key: 'normalize',
- value: function normalize() {
- return this.divideScalar(this.length());
- }
- }, {
- key: 'distanceTo',
- value: function distanceTo(v) {
- return Math.sqrt(this.distanceToSquared(v));
- }
- }, {
- key: 'rotate',
- value: function rotate(tha) {
- var x = this.x;
- var y = this.y;
-
- this.x = x * Math.cos(tha) + y * Math.sin(tha);
- this.y = -x * Math.sin(tha) + y * Math.cos(tha);
-
- return this;
- }
- }, {
- key: 'distanceToSquared',
- value: function distanceToSquared(v) {
- var dx = this.x - v.x;
- var dy = this.y - v.y;
-
- return dx * dx + dy * dy;
- }
- }, {
- key: 'lerp',
- value: function lerp(v, alpha) {
- this.x += (v.x - this.x) * alpha;
- this.y += (v.y - this.y) * alpha;
-
- return this;
- }
- }, {
- key: 'equals',
- value: function equals(v) {
- return v.x === this.x && v.y === this.y;
- }
- }, {
- key: 'clear',
- value: function clear() {
- this.x = 0.0;
- this.y = 0.0;
- return this;
- }
- }, {
- key: 'clone',
- value: function clone() {
- return new Vector2D(this.x, this.y);
- }
- }]);
- return Vector2D;
-}();
-
-var Span = function () {
- function Span(a, b, center) {
- classCallCheck(this, Span);
-
- this.isArray = false;
-
- if (Util.isArray(a)) {
- this.isArray = true;
- this.a = a;
- } else {
- this.a = Util.initValue(a, 1);
- this.b = Util.initValue(b, this.a);
- this.center = Util.initValue(center, false);
- }
- }
-
- createClass(Span, [{
- key: 'getValue',
- value: function getValue(INT) {
- if (this.isArray) {
- return this.a[Math.floor(this.a.length * Math.random())];
- } else {
- if (!this.center) return MathUtils.randomAToB(this.a, this.b, INT);else return MathUtils.randomFloating(this.a, this.b, INT);
- }
- }
- }]);
- return Span;
-}();
-
-var WebGLUtil = {
-
+ var WebGLUtil = {
/**
* @memberof Proton#Proton.WebGLUtil
* @method ipot
@@ -366,10 +50,8 @@ var WebGLUtil = {
* @return {Boolean}
*/
ipot: function ipot(length) {
- return (length & length - 1) == 0;
+ return (length & length - 1) === 0;
},
-
-
/**
* @memberof Proton#Proton.WebGLUtil
* @method nhpot
@@ -382,15 +64,12 @@ var WebGLUtil = {
* @return {Number}
*/
nhpot: function nhpot(length) {
- --length;
- for (var i = 1; i < 32; i <<= 1) {
- length = length | length >> i;
- }
-
- return length + 1;
+ --length;
+ for (var i = 1; i < 32; i <<= 1) {
+ length = length | length >> i;
+ }
+ return length + 1;
},
-
-
/**
* @memberof Proton#Proton.WebGLUtil
* @method makeTranslation
@@ -405,10 +84,8 @@ var WebGLUtil = {
* @return {Object}
*/
makeTranslation: function makeTranslation(tx, ty) {
- return [1, 0, 0, 0, 1, 0, tx, ty, 1];
+ return [1, 0, 0, 0, 1, 0, tx, ty, 1];
},
-
-
/**
* @memberof Proton#Proton.WebGLUtil
* @method makeRotation
@@ -421,13 +98,10 @@ var WebGLUtil = {
* @return {Object}
*/
makeRotation: function makeRotation(angleInRadians) {
- var c = Math.cos(angleInRadians);
- var s = Math.sin(angleInRadians);
-
- return [c, -s, 0, s, c, 0, 0, 0, 1];
+ var c = Math.cos(angleInRadians);
+ var s = Math.sin(angleInRadians);
+ return [c, -s, 0, s, c, 0, 0, 0, 1];
},
-
-
/**
* @memberof Proton#Proton.WebGLUtil
* @method makeScale
@@ -442,10 +116,8 @@ var WebGLUtil = {
* @return {Object}
*/
makeScale: function makeScale(sx, sy) {
- return [sx, 0, 0, 0, sy, 0, 0, 0, 1];
+ return [sx, 0, 0, 0, sy, 0, 0, 0, 1];
},
-
-
/**
* @memberof Proton#Proton.WebGLUtil
* @method matrixMultiply
@@ -460,31 +132,29 @@ var WebGLUtil = {
* @return {Object}
*/
matrixMultiply: function matrixMultiply(a, b) {
- var a00 = a[0 * 3 + 0];
- var a01 = a[0 * 3 + 1];
- var a02 = a[0 * 3 + 2];
- var a10 = a[1 * 3 + 0];
- var a11 = a[1 * 3 + 1];
- var a12 = a[1 * 3 + 2];
- var a20 = a[2 * 3 + 0];
- var a21 = a[2 * 3 + 1];
- var a22 = a[2 * 3 + 2];
- var b00 = b[0 * 3 + 0];
- var b01 = b[0 * 3 + 1];
- var b02 = b[0 * 3 + 2];
- var b10 = b[1 * 3 + 0];
- var b11 = b[1 * 3 + 1];
- var b12 = b[1 * 3 + 2];
- var b20 = b[2 * 3 + 0];
- var b21 = b[2 * 3 + 1];
- var b22 = b[2 * 3 + 2];
-
- return [a00 * b00 + a01 * b10 + a02 * b20, a00 * b01 + a01 * b11 + a02 * b21, a00 * b02 + a01 * b12 + a02 * b22, a10 * b00 + a11 * b10 + a12 * b20, a10 * b01 + a11 * b11 + a12 * b21, a10 * b02 + a11 * b12 + a12 * b22, a20 * b00 + a21 * b10 + a22 * b20, a20 * b01 + a21 * b11 + a22 * b21, a20 * b02 + a21 * b12 + a22 * b22];
- }
-};
-
-var DomUtil = {
+ var a00 = a[0 * 3 + 0];
+ var a01 = a[0 * 3 + 1];
+ var a02 = a[0 * 3 + 2];
+ var a10 = a[1 * 3 + 0];
+ var a11 = a[1 * 3 + 1];
+ var a12 = a[1 * 3 + 2];
+ var a20 = a[2 * 3 + 0];
+ var a21 = a[2 * 3 + 1];
+ var a22 = a[2 * 3 + 2];
+ var b00 = b[0 * 3 + 0];
+ var b01 = b[0 * 3 + 1];
+ var b02 = b[0 * 3 + 2];
+ var b10 = b[1 * 3 + 0];
+ var b11 = b[1 * 3 + 1];
+ var b12 = b[1 * 3 + 2];
+ var b20 = b[2 * 3 + 0];
+ var b21 = b[2 * 3 + 1];
+ var b22 = b[2 * 3 + 2];
+ return [a00 * b00 + a01 * b10 + a02 * b20, a00 * b01 + a01 * b11 + a02 * b21, a00 * b02 + a01 * b12 + a02 * b22, a10 * b00 + a11 * b10 + a12 * b20, a10 * b01 + a11 * b11 + a12 * b21, a10 * b02 + a11 * b12 + a12 * b22, a20 * b00 + a21 * b10 + a22 * b20, a20 * b01 + a21 * b11 + a22 * b21, a20 * b02 + a21 * b12 + a22 * b22];
+ }
+ };
+ var DomUtil = {
/**
* Creates and returns a new canvas. The opacity is by default set to 0
*
@@ -494,83 +164,73 @@ var DomUtil = {
* @param {String} $id the canvas' id
* @param {Number} $width the canvas' width
* @param {Number} $height the canvas' height
- * @param {String} [$position=absolute] the canvas' position, default is 'absolute'
+ * @param {String} [$position=absolute] the canvas' position, default is 'absolute'
*
* @return {Object}
*/
createCanvas: function createCanvas(id, width, height, position) {
- var dom = document.createElement("canvas");
- position = position || 'absolute';
-
- dom.id = id;
- dom.width = width;
- dom.height = height;
- dom.style.opacity = 0;
- dom.style.position = position;
-
- this.transform(dom, -500, -500, 0, 0);
-
- return dom;
+ if (position === void 0) {
+ position = "absolute";
+ }
+ var dom = document.createElement("canvas");
+ dom.id = id;
+ dom.width = width;
+ dom.height = height;
+ dom.style.opacity = 0;
+ dom.style.position = position;
+ this.transform(dom, -500, -500, 0, 0);
+ return dom;
},
createDiv: function createDiv(id, width, height) {
- var dom = document.createElement("div");
-
- dom.id = id;
- dom.style.position = 'absolute';
- this.resize(dom, width, height);
-
- return dom;
+ var dom = document.createElement("div");
+ dom.id = id;
+ dom.style.position = "absolute";
+ this.resize(dom, width, height);
+ return dom;
},
resize: function resize(dom, width, height) {
- dom.style.width = width + 'px';
- dom.style.height = height + 'px';
- dom.style.marginLeft = -width / 2 + 'px';
- dom.style.marginTop = -height / 2 + 'px';
+ dom.style.width = width + "px";
+ dom.style.height = height + "px";
+ dom.style.marginLeft = -width / 2 + "px";
+ dom.style.marginTop = -height / 2 + "px";
},
-
-
/**
* Adds a transform: translate(), scale(), rotate() to a given div dom for all browsers
*
* @memberof Proton#Proton.DomUtil
* @method transform
*
- * @param {HTMLDivElement} div
- * @param {Number} $x
- * @param {Number} $y
- * @param {Number} $scale
- * @param {Number} $rotate
+ * @param {HTMLDivElement} div
+ * @param {Number} $x
+ * @param {Number} $y
+ * @param {Number} $scale
+ * @param {Number} $rotate
*/
transform: function transform(div, x, y, scale, rotate) {
- var transform = "translate(" + x + "px, " + y + "px) scale(" + scale + ") rotate(" + rotate + "deg)";
-
- div.style.willChange = 'transform';
- this.css3(div, 'transform', transform);
+ div.style.willChange = "transform";
+ var transform = "translate(" + x + "px, " + y + "px) scale(" + scale + ") rotate(" + rotate + "deg)";
+ this.css3(div, "transform", transform);
},
transform3d: function transform3d(div, x, y, scale, rotate) {
- var transform = "translate3d(" + x + "px, " + y + "px, 0) scale(" + scale + ") rotate(" + rotate + "deg)";
-
- div.style.willChange = 'transform';
- this.css3(div, 'backfaceVisibility', 'hidden');
- this.css3(div, 'transform', transform);
+ div.style.willChange = "transform";
+ var transform = "translate3d(" + x + "px, " + y + "px, 0) scale(" + scale + ") rotate(" + rotate + "deg)";
+ this.css3(div, "backfaceVisibility", "hidden");
+ this.css3(div, "transform", transform);
},
css3: function css3(div, key, val) {
- var bkey = key.charAt(0).toUpperCase() + key.substr(1);
-
- div.style["Webkit" + bkey] = val;
- div.style["Moz" + bkey] = val;
- div.style["O" + bkey] = val;
- div.style["ms" + bkey] = val;
- div.style["" + key] = val;
+ var bkey = key.charAt(0).toUpperCase() + key.substr(1);
+ div.style["Webkit" + bkey] = val;
+ div.style["Moz" + bkey] = val;
+ div.style["O" + bkey] = val;
+ div.style["ms" + bkey] = val;
+ div.style["" + key] = val;
}
-};
-
-var IMG_CACHE = {};
-var CANVAS_CACHE = {};
-var canvasID = 0;
-
-var ImgUtil = {
+ };
+ var imgsCache = {};
+ var canvasCache = {};
+ var canvasId = 0;
+ var ImgUtil = {
/**
* This will get the image data. It could be necessary to create a Proton.Zone.
*
@@ -582,14 +242,11 @@ var ImgUtil = {
* @param {Proton.Rectangle} rect
*/
getImageData: function getImageData(context, image, rect) {
- context.drawImage(image, rect.x, rect.y);
- var imagedata = context.getImageData(rect.x, rect.y, rect.width, rect.height);
- context.clearRect(rect.x, rect.y, rect.width, rect.height);
-
- return imagedata;
+ context.drawImage(image, rect.x, rect.y);
+ var imagedata = context.getImageData(rect.x, rect.y, rect.width, rect.height);
+ context.clearRect(rect.x, rect.y, rect.width, rect.height);
+ return imagedata;
},
-
-
/**
* @memberof Proton#Proton.Util
* @method getImgFromCache
@@ -599,46 +256,38 @@ var ImgUtil = {
*
* @param {Mixed} img
* @param {Proton.Particle} particle
- * @param {Boolean} drawCanvas set to true if a canvas should be saved into particle.transform.canvas
+ * @param {Boolean} drawCanvas set to true if a canvas should be saved into particle.data.canvas
* @param {Boolean} func
*/
getImgFromCache: function getImgFromCache(img, callback, param) {
- var src = typeof img == 'string' ? img : img.src;
-
- if (IMG_CACHE[src]) {
- callback(IMG_CACHE[src], param);
- } else {
- var image = new Image();
- image.onload = function (e) {
- IMG_CACHE[src] = e.target;
- callback(IMG_CACHE[src], param);
- };
-
- image.src = src;
- }
+ var src = typeof img === "string" ? img : img.src;
+ if (imgsCache[src]) {
+ callback(imgsCache[src], param);
+ } else {
+ var image = new Image();
+ image.onload = function (e) {
+ imgsCache[src] = e.target;
+ callback(imgsCache[src], param);
+ };
+ image.src = src;
+ }
},
getCanvasFromCache: function getCanvasFromCache(img, callback, param) {
- var src = img.src;
-
- if (!CANVAS_CACHE[src]) {
- var width = WebGLUtil.nhpot(img.width);
- var height = WebGLUtil.nhpot(img.height);
-
- var canvas = DomUtil.createCanvas('canvas_cache_' + canvasID, width, height);
- var context = canvas.getContext('2d');
- context.drawImage(img, 0, 0, img.width, img.height);
-
- CANVAS_CACHE[src] = canvas;
- }
-
- callback && callback(CANVAS_CACHE[src], param);
-
- return CANVAS_CACHE[src];
+ var src = img.src;
+ if (!canvasCache[src]) {
+ var width = WebGLUtil.nhpot(img.width);
+ var height = WebGLUtil.nhpot(img.height);
+ var canvas = DomUtil.createCanvas("proton_canvas_cache_" + ++canvasId, width, height);
+ var context = canvas.getContext("2d");
+ context.drawImage(img, 0, 0, img.width, img.height);
+ canvasCache[src] = canvas;
+ }
+ callback && callback(canvasCache[src], param);
+ return canvasCache[src];
}
-};
-
-var Util = {
+ };
+ var Util = {
/**
* Returns the default if the value is null or undefined
*
@@ -649,11 +298,9 @@ var Util = {
* @param {Mixed} defaults the default if the value is null or undefined
*/
initValue: function initValue(value, defaults) {
- value = value !== null && value !== undefined ? value : defaults;
- return value;
+ value = value !== null && value !== undefined ? value : defaults;
+ return value;
},
-
-
/**
* Checks if the value is a valid array
*
@@ -662,42 +309,52 @@ var Util = {
*
* @param {Array} value Any array
*
- * @returns {Boolean}
+ * @returns {Boolean}
*/
isArray: function isArray(value) {
- return Object.prototype.toString.call(value) === '[object Array]';
+ return Object.prototype.toString.call(value) === "[object Array]";
},
-
-
/**
* Destroyes the given array
*
* @memberof Proton#Proton.Util
- * @method destroyArray
+ * @method emptyArray
*
* @param {Array} array Any array
*/
- destroyArray: function destroyArray(array) {
- if (array) array.length = 0;
+ emptyArray: function emptyArray(arr) {
+ if (arr) arr.length = 0;
+ },
+ toArray: function toArray(arr) {
+ return this.isArray(arr) ? arr : [arr];
+ },
+ sliceArray: function sliceArray(arr1, index, arr2) {
+ this.emptyArray(arr2);
+ for (var i = index; i < arr1.length; i++) {
+ arr2.push(arr1[i]);
+ }
+ },
+ getRandFromArray: function getRandFromArray(arr) {
+ if (!arr) return null;
+ return arr[Math.floor(arr.length * Math.random())];
},
-
-
/**
* Destroyes the given object
*
* @memberof Proton#Proton.Util
- * @method destroyObject
+ * @method emptyObject
*
* @param {Object} obj Any object
*/
- destroyObject: function destroyObject(obj, ignore) {
- for (var o in obj) {
- if (ignore && ignore.indexOf(o) > -1) continue;
- delete obj[o];
- }
+ emptyObject: function emptyObject(obj, ignore) {
+ if (ignore === void 0) {
+ ignore = null;
+ }
+ for (var key in obj) {
+ if (ignore && ignore.indexOf(key) > -1) continue;
+ delete obj[key];
+ }
},
-
-
/**
* Makes an instance of a class and binds the given array
*
@@ -710,123 +367,16 @@ var Util = {
* @return {Object} The instance of constructor, optionally bind with args
*/
classApply: function classApply(constructor, args) {
- if (!args) return new constructor();
-
- args = [null].concat(args);
- var factoryFunction = constructor.bind.apply(constructor, args);
- return new factoryFunction();
- },
-
-
- /**
- * @memberof Proton#Proton.Util
- * @method setVector2DByObject
- *
- * @todo add description for param `target`
- * @todo add description for param `pOBJ`
- * @todo add description for function
- *
- * @param {Object} target
- * @param {Object} pOBJ
- */
- setVector2DByObject: function setVector2DByObject(target, pOBJ) {
- if (this.hasProp(pOBJ, 'x')) target.p.x = pOBJ['x'];
- if (this.hasProp(pOBJ, 'y')) target.p.y = pOBJ['y'];
-
- if (this.hasProp(pOBJ, 'vx')) target.v.x = pOBJ['vx'];
- if (this.hasProp(pOBJ, 'vy')) target.v.y = pOBJ['vy'];
-
- if (this.hasProp(pOBJ, 'ax')) target.a.x = pOBJ['ax'];
- if (this.hasProp(pOBJ, 'ay')) target.a.y = pOBJ['ay'];
-
- if (this.hasProp(pOBJ, 'p')) particle.p.copy(pOBJ['p']);
- if (this.hasProp(pOBJ, 'v')) particle.v.copy(pOBJ['v']);
- if (this.hasProp(pOBJ, 'a')) particle.a.copy(pOBJ['a']);
-
- if (this.hasProp(pOBJ, 'position')) particle.p.copy(pOBJ['position']);
- if (this.hasProp(pOBJ, 'velocity')) particle.v.copy(pOBJ['velocity']);
- if (this.hasProp(pOBJ, 'accelerate')) particle.a.copy(pOBJ['accelerate']);
- },
- hasProp: function hasProp(obj, key) {
- if (!obj) return false;
- return obj[key] !== undefined;
- // return obj.hasOwnProperty(key);
- },
-
-
- /**
- * set the prototype in a given prototypeObject
- *
- * @memberof Proton#Proton.Util
- * @method setPrototypeByObject
- *
- * @todo add description for param `target`
- * @todo add description for param `filters`
- * @todo translate desription from chinese to english
- *
- * @param {Object} target
- * @param {Object} prototypeObject An object of single prototypes
- * @param {Object} filters
- *
- * @return {Object} target
- */
- setPrototypeByObject: function setPrototypeByObject(target, prototypeObject, filters) {
- for (var singleProp in prototypeObject) {
- if (target.hasOwnProperty(singleProp)) {
- if (filters) {
- if (filters.indexOf(singleProp) < 0) target[singleProp] = this.getSpanValue(prototypeObject[singleProp]);
- } else {
- target[singleProp] = this.getSpanValue(prototypeObject[singleProp]);
- }
- }
- }
-
- return target;
- },
-
-
- /**
- * Returns a new Span object
- *
- * @memberof Proton#Proton.Util
- * @method setSpanValue
- *
- * @todo a, b and c should be 'Mixed' or 'Number'?
- *
- * @param {Mixed | Span} a
- * @param {Mixed} b
- * @param {Mixed} c
- *
- * @return {Span}
- */
- setSpanValue: function setSpanValue(a, b, c) {
- if (a instanceof Span) {
- return a;
- } else {
- if (!b) {
- return new Span(a);
- } else {
- if (!c) return new Span(a, b);else return new Span(a, b, c);
- }
- }
- },
-
-
- /**
- * Returns the value from a Span, if the param is not a Span it will return the given parameter
- *
- * @memberof Proton#Proton.Util
- * @method getSpanValue
- *
- * @param {Mixed | Span} pan
- *
- * @return {Mixed} the value of Span OR the parameter if it is not a Span
- */
- getSpanValue: function getSpanValue(pan) {
- return pan instanceof Span ? pan.getValue() : pan;
+ if (args === void 0) {
+ args = null;
+ }
+ if (!args) {
+ return new constructor();
+ } else {
+ var FactoryFunc = constructor.bind.apply(constructor, [null].concat(args));
+ return new FactoryFunc();
+ }
},
-
-
/**
* This will get the image data. It could be necessary to create a Proton.Zone.
*
@@ -838,65 +388,84 @@ var Util = {
* @param {Proton.Rectangle} rect
*/
getImageData: function getImageData(context, image, rect) {
- return ImgUtil.getImageData(context, image, rect);
+ return ImgUtil.getImageData(context, image, rect);
},
- destroy: function destroy(arr, param) {
- var i = arr.length;
-
- while (i--) {
- try {
- arr[i].destroy(param);
- } catch (e) {}
- delete arr[i];
+ destroyAll: function destroyAll(arr, param) {
+ if (param === void 0) {
+ param = null;
+ }
+ var i = arr.length;
+ while (i--) {
+ try {
+ arr[i].destroy(param);
+ } catch (e) {}
+ delete arr[i];
+ }
+ arr.length = 0;
+ },
+ assign: function assign(target, source) {
+ if (typeof Object.assign !== "function") {
+ for (var key in source) {
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
+ target[key] = source[key];
+ }
}
-
- arr.length = 0;
+ return target;
+ } else {
+ return Object.assign(target, source);
+ }
}
-};
-
-var PUID = {
- id: 0,
- cache: {},
-
- getID: function getID(target) {
- var uid = this.getCacheID(target);
- if (uid) return uid;
-
- uid = 'PUID_' + this.id++;
- this.cache[uid] = target;
+ };
- return uid;
+ var idsMap = {};
+ var Puid = {
+ _index: 0,
+ _cache: {},
+ id: function id(type) {
+ if (idsMap[type] === undefined || idsMap[type] === null) idsMap[type] = 0;
+ return type + "_" + idsMap[type]++;
},
- getCacheID: function getCacheID(target) {
- var obj = void 0;
- for (var id in this.cache) {
- obj = this.cache[id];
-
- if (obj === target) return id;
-
- if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && obj.isInner && target.isInner) {
- if (obj.src === target.src) return id;
- }
- }
-
- return null;
+ getId: function getId(target) {
+ var uid = this.getIdFromCache(target);
+ if (uid) return uid;
+ uid = "PUID_" + this._index++;
+ this._cache[uid] = target;
+ return uid;
+ },
+ getIdFromCache: function getIdFromCache(target) {
+ var obj, id;
+ for (id in this._cache) {
+ obj = this._cache[id];
+ if (obj === target) return id;
+ if (this.isBody(obj, target) && obj.src === target.src) return id;
+ }
+ return null;
+ },
+ isBody: function isBody(obj, target) {
+ return typeof obj === "object" && typeof target === "object" && obj.isInner && target.isInner;
},
getTarget: function getTarget(uid) {
- return this.cache[uid];
+ return this._cache[uid];
}
-};
-
-/**
- * get -> PUID :: uid-> Body
- * -> cache[abc]. -> cache[abc] .pop()
- * -> create [new Body| clone]
- * -> return p1: { __pid: abc }
- *
- * expire -> cache[abc]= [p0, p1];
- *
- */
-var Pool = function () {
+ };
+ /**
+ * Pool is the cache pool of the proton engine, it is very important.
+ *
+ * get(target, params, uid)
+ * Class
+ * uid = Puid.getId -> Puid save target cache
+ * target.__puid = uid
+ *
+ * body
+ * uid = Puid.getId -> Puid save target cache
+ *
+ *
+ * expire(target)
+ * cache[target.__puid] push target
+ *
+ */
+ var Pool = /*#__PURE__*/function () {
/**
* @memberof! Proton#
* @constructor
@@ -909,10 +478,8 @@ var Pool = function () {
* @property {Object} cache
*/
function Pool(num) {
- classCallCheck(this, Pool);
-
- this.total = 0;
- this.cache = {};
+ this.total = 0;
+ this.cache = {};
}
/**
@@ -926,396 +493,361 @@ var Pool = function () {
*
* @return {Object}
*/
+ var _proto = Pool.prototype;
+ _proto.get = function get(target, params, uid) {
+ var p;
+ uid = uid || target.__puid || Puid.getId(target);
+ if (this.cache[uid] && this.cache[uid].length > 0) {
+ p = this.cache[uid].pop();
+ } else {
+ p = this.createOrClone(target, params);
+ }
+ p.__puid = target.__puid || uid;
+ return p;
+ }
+ /**
+ * @todo add description
+ *
+ * @method set
+ * @memberof Proton#Proton.Pool
+ *
+ * @param {Object} target
+ *
+ * @return {Object}
+ */;
+ _proto.expire = function expire(target) {
+ return this.getCache(target.__puid).push(target);
+ }
- createClass(Pool, [{
- key: 'get',
- value: function get$$1(target, params, uid) {
- var p = void 0;
- uid = uid || target.__puid || PUID.getID(target);
-
- if (this.cache[uid] && this.cache[uid].length > 0) p = this.cache[uid].pop();else p = this.createOrClone(target, params);
-
- p.__puid = target.__puid || uid;
- return p;
- }
-
- /**
- * @todo add description
- *
- * @method set
- * @memberof Proton#Proton.Pool
- *
- * @param {Object} target
- *
- * @return {Object}
- */
-
- }, {
- key: 'expire',
- value: function expire(target) {
- return this.getCache(target.__puid).push(target);
- }
-
- /**
- * Creates a new class instance
- *
- * @todo add more documentation
- *
- * @method create
- * @memberof Proton#Proton.Pool
- *
- * @param {Object|Function} target any Object or Function
- * @param {Object} [params] just add if `target` is a function
- *
- * @return {Object}
- */
-
- }, {
- key: 'createOrClone',
- value: function createOrClone(target, params) {
- this.total++;
-
- if (this.create) {
- return this.create(target, params);
- } else if (typeof target == "function") {
- return Util.classApply(target, params);
- } else {
- return target.clone();
- }
- }
-
- /**
- * @todo add description - what is in the cache?
- *
- * @method getCount
- * @memberof Proton#Proton.Pool
- *
- * @return {Number}
- */
-
- }, {
- key: 'getCount',
- value: function getCount() {
- var count = 0;
-
- for (var id in this.cache) {
- count += this.cache[id].length;
- }return count++;
- }
+ /**
+ * Creates a new class instance
+ *
+ * @todo add more documentation
+ *
+ * @method create
+ * @memberof Proton#Proton.Pool
+ *
+ * @param {Object|Function} target any Object or Function
+ * @param {Object} [params] just add if `target` is a function
+ *
+ * @return {Object}
+ */;
+ _proto.createOrClone = function createOrClone(target, params) {
+ this.total++;
+ if (this.create) {
+ return this.create(target, params);
+ } else if (typeof target === "function") {
+ return Util.classApply(target, params);
+ } else {
+ return target.clone();
+ }
+ }
- /**
- * Destroyes all items from Pool.cache
- *
- * @method destroy
- * @memberof Proton#Proton.Pool
- */
-
- }, {
- key: 'destroy',
- value: function destroy() {
- for (var id in this.cache) {
- this.cache[id].length = 0;
- delete this.cache[id];
- }
- }
+ /**
+ * @todo add description - what is in the cache?
+ *
+ * @method getCount
+ * @memberof Proton#Proton.Pool
+ *
+ * @return {Number}
+ */;
+ _proto.getCount = function getCount() {
+ var count = 0;
+ for (var id in this.cache) {
+ count += this.cache[id].length;
+ }
+ return count++;
+ }
- /**
- * Returns Pool.cache
- *
- * @method getCache
- * @memberof Proton#Proton.Pool
- * @private
- *
- * @param {Number} uid the unique id
- *
- * @return {Object}
- */
-
- }, {
- key: 'getCache',
- value: function getCache(uid) {
- uid = uid || "default";
-
- if (!this.cache[uid]) this.cache[uid] = [];
- return this.cache[uid];
- }
- }]);
+ /**
+ * Destroyes all items from Pool.cache
+ *
+ * @method destroy
+ * @memberof Proton#Proton.Pool
+ */;
+ _proto.destroy = function destroy() {
+ for (var id in this.cache) {
+ this.cache[id].length = 0;
+ delete this.cache[id];
+ }
+ }
+
+ /**
+ * Returns Pool.cache
+ *
+ * @method getCache
+ * @memberof Proton#Proton.Pool
+ * @private
+ *
+ * @param {Number} uid the unique id
+ *
+ * @return {Object}
+ */;
+ _proto.getCache = function getCache(uid) {
+ if (uid === void 0) {
+ uid = "default";
+ }
+ if (!this.cache[uid]) this.cache[uid] = [];
+ return this.cache[uid];
+ };
return Pool;
-}();
+ }();
-var Stats = function () {
+ var Stats = /*#__PURE__*/function () {
function Stats(proton) {
- classCallCheck(this, Stats);
-
- this.proton = proton;
- this.container = null;
+ this.proton = proton;
+ this.container = null;
+ this.type = 1;
+ this.emitterIndex = 0;
+ this.rendererIndex = 0;
+ }
+ var _proto = Stats.prototype;
+ _proto.update = function update(style, body) {
+ this.add(style, body);
+ var emitter = this.getEmitter();
+ var renderer = this.getRenderer();
+ var str = "";
+ switch (this.type) {
+ case 2:
+ str += "emitter:" + this.proton.emitters.length + "
";
+ if (emitter) str += "em speed:" + emitter.emitSpeed + "
";
+ if (emitter) str += "pos:" + this.getEmitterPos(emitter);
+ break;
+ case 3:
+ if (emitter) str += "initializes:" + emitter.initializes.length + "
";
+ if (emitter) str += '' + this.concatArr(emitter.initializes) + "
";
+ if (emitter) str += "behaviours:" + emitter.behaviours.length + "
";
+ if (emitter) str += '' + this.concatArr(emitter.behaviours) + "
";
+ break;
+ case 4:
+ if (renderer) str += renderer.name + "
";
+ if (renderer) str += "body:" + this.getCreatedNumber(renderer) + "
";
+ break;
+ default:
+ str += "particles:" + this.proton.getCount() + "
";
+ str += "pool:" + this.proton.pool.getCount() + "
";
+ str += "total:" + this.proton.pool.total;
+ }
+ this.container.innerHTML = str;
+ };
+ _proto.add = function add(style, body) {
+ var _this = this;
+ if (!this.container) {
this.type = 1;
-
- this.emitterIndex = 0;
- this.rendererIndex = 0;
- }
-
- createClass(Stats, [{
- key: "update",
- value: function update(style, body) {
- this.add(style, body);
-
- var emitter = this.getEmitter();
- var renderer = this.getRenderer();
- var str = "";
-
- switch (this.type) {
- case 2:
- str += "emitter:" + this.proton.emitters.length + "
";
- if (emitter) str += "em speed:" + emitter.emitSpeed + "
";
- if (emitter) str += "pos:" + this.getEmitterPos(emitter);
- break;
-
- case 3:
- if (emitter) str += "initializes:" + emitter.initializes.length + "
";
- if (emitter) str += "" + this.concatArr(emitter.initializes) + "
";
- if (emitter) str += "behaviours:" + emitter.behaviours.length + "
";
- if (emitter) str += "" + this.concatArr(emitter.behaviours) + "
";
- break;
-
- case 4:
- if (renderer) str += renderer.name + "
";
- if (renderer) str += "body:" + this.getCreatedNumber(renderer) + "
";
- break;
-
- default:
- str += "particles:" + this.proton.getCount() + "
";
- str += "pool:" + this.proton.pool.getCount() + "
";
- str += "total:" + this.proton.pool.total;
- }
-
- this.container.innerHTML = str;
- }
- }, {
- key: "add",
- value: function add(style, body) {
- var _this = this;
-
- if (!this.container) {
- this.type = 1;
-
- this.container = document.createElement('div');
- this.container.style.cssText = ['position:absolute;bottom:0px;left:0;cursor:pointer;', 'opacity:0.9;z-index:10000;padding:10px;font-size:12px;font-family:Helvetica,Arial,sans-serif;', 'width:120px;height:50px;background-color:#002;color:#0ff;'].join('');
-
- this.container.addEventListener('click', function (e) {
- _this.type++;
- if (_this.type > 4) _this.type = 1;
- }, false);
-
- var bg = void 0,
- color = void 0;
- switch (style) {
- case 2:
- bg = "#201";
- color = "#f08";
- break;
-
- case 3:
- bg = "#020";
- color = "#0f0";
- break;
-
- default:
- bg = "#002";
- color = "#0ff";
- }
-
- this.container.style["background-color"] = bg;
- this.container.style["color"] = color;
- }
-
- if (!this.container.parentNode) {
- body = body || this.body || document.body;
- body.appendChild(this.container);
- }
- }
- }, {
- key: "getEmitter",
- value: function getEmitter() {
- return this.proton.emitters[this.emitterIndex];
- }
- }, {
- key: "getRenderer",
- value: function getRenderer() {
- return this.proton.renderers[this.rendererIndex];
- }
- }, {
- key: "concatArr",
- value: function concatArr(arr) {
- var result = '';
- if (!arr || !arr.length) return result;
-
- for (var i = 0; i < arr.length; i++) {
- result += (arr[i].name || '').substr(0, 1) + '.';
- }
-
- return result;
- }
- }, {
- key: "getCreatedNumber",
- value: function getCreatedNumber(renderer) {
- return renderer.pool.total || renderer.cpool && renderer.cpool.total || 0;
- }
- }, {
- key: "getEmitterPos",
- value: function getEmitterPos(e) {
- return Math.round(e.p.x) + "," + Math.round(e.p.y);
- }
- }]);
+ this.container = document.createElement("div");
+ this.container.style.cssText = ["position:absolute;bottom:0px;left:0;cursor:pointer;", "opacity:0.9;z-index:10000;padding:10px;font-size:12px;font-family:Helvetica,Arial,sans-serif;", "width:120px;height:50px;background-color:#002;color:#0ff;"].join("");
+ this.container.addEventListener("click", function (e) {
+ _this.type++;
+ if (_this.type > 4) _this.type = 1;
+ }, false);
+ var bg, color;
+ switch (style) {
+ case 2:
+ bg = "#201";
+ color = "#f08";
+ break;
+ case 3:
+ bg = "#020";
+ color = "#0f0";
+ break;
+ default:
+ bg = "#002";
+ color = "#0ff";
+ }
+ this.container.style["background-color"] = bg;
+ this.container.style["color"] = color;
+ }
+ if (!this.container.parentNode) {
+ body = body || this.body || document.body;
+ body.appendChild(this.container);
+ }
+ };
+ _proto.getEmitter = function getEmitter() {
+ return this.proton.emitters[this.emitterIndex];
+ };
+ _proto.getRenderer = function getRenderer() {
+ return this.proton.renderers[this.rendererIndex];
+ };
+ _proto.concatArr = function concatArr(arr) {
+ var result = "";
+ if (!arr || !arr.length) return result;
+ for (var i = 0; i < arr.length; i++) {
+ result += (arr[i].name || "").substr(0, 1) + ".";
+ }
+ return result;
+ };
+ _proto.getCreatedNumber = function getCreatedNumber(renderer) {
+ return renderer.pool.total || renderer.cpool && renderer.cpool.total || 0;
+ };
+ _proto.getEmitterPos = function getEmitterPos(e) {
+ return Math.round(e.p.x) + "," + Math.round(e.p.y);
+ };
+ _proto.destroy = function destroy() {
+ if (this.container && this.container.parentNode) {
+ var body = this.body || document.body;
+ body.removeChild(this.container);
+ }
+ this.proton = null;
+ this.container = null;
+ };
return Stats;
-}();
+ }();
-/*
- * EventDispatcher
- * This code reference since http://createjs.com/.
- *
- **/
-
-var EventDispatcher = function () {
+ /*
+ * EventDispatcher
+ * This code reference since http://createjs.com/.
+ *
+ **/
+ var EventDispatcher = /*#__PURE__*/function () {
function EventDispatcher() {
- classCallCheck(this, EventDispatcher);
-
- this._listeners = null;
+ this._listeners = null;
}
-
- createClass(EventDispatcher, [{
- key: "addEventListener",
- value: function addEventListener(type, listener) {
- if (!this._listeners) {
- this._listeners = {};
- } else {
- this.removeEventListener(type, listener);
- }
-
- if (!this._listeners[type]) this._listeners[type] = [];
- this._listeners[type].push(listener);
-
- return listener;
- }
- }, {
- key: "removeEventListener",
- value: function removeEventListener(type, listener) {
- if (!this._listeners) return;
- if (!this._listeners[type]) return;
-
- var arr = this._listeners[type];
- var length = arr.length;
-
- for (var i = 0; i < length; i++) {
- if (arr[i] == listener) {
- if (length == 1) {
- delete this._listeners[type];
- }
-
- // allows for faster checks.
- else {
- arr.splice(i, 1);
- }
-
- break;
- }
- }
- }
- }, {
- key: "removeAllEventListeners",
- value: function removeAllEventListeners(type) {
- if (!type) this._listeners = null;else if (this._listeners) delete this._listeners[type];
- }
- }, {
- key: "dispatchEvent",
- value: function dispatchEvent(type, args) {
- var result = false;
- var listeners = this._listeners;
-
- if (type && listeners) {
- var arr = listeners[type];
- if (!arr) return result;
-
- //arr = arr.slice();
- // to avoid issues with items being removed or added during the dispatch
-
- var handler = void 0;
- var i = arr.length;
- while (i--) {
- handler = arr[i];
- result = result || handler(args);
- }
- }
-
- return !!result;
- }
- }, {
- key: "hasEventListener",
- value: function hasEventListener(type) {
- var listeners = this._listeners;
- return !!(listeners && listeners[type]);
- }
- }], [{
- key: "bind",
- value: function bind(TargetClass) {
- TargetClass.prototype.dispatchEvent = EventDispatcher.prototype.dispatchEvent;
- TargetClass.prototype.hasEventListener = EventDispatcher.prototype.hasEventListener;
- TargetClass.prototype.addEventListener = EventDispatcher.prototype.addEventListener;
- TargetClass.prototype.removeEventListener = EventDispatcher.prototype.removeEventListener;
- TargetClass.prototype.removeAllEventListeners = EventDispatcher.prototype.removeAllEventListeners;
- }
- }]);
+ EventDispatcher.bind = function bind(target) {
+ target.prototype.dispatchEvent = EventDispatcher.prototype.dispatchEvent;
+ target.prototype.hasEventListener = EventDispatcher.prototype.hasEventListener;
+ target.prototype.addEventListener = EventDispatcher.prototype.addEventListener;
+ target.prototype.removeEventListener = EventDispatcher.prototype.removeEventListener;
+ target.prototype.removeAllEventListeners = EventDispatcher.prototype.removeAllEventListeners;
+ };
+ var _proto = EventDispatcher.prototype;
+ _proto.addEventListener = function addEventListener(type, listener) {
+ if (!this._listeners) {
+ this._listeners = {};
+ } else {
+ this.removeEventListener(type, listener);
+ }
+ if (!this._listeners[type]) this._listeners[type] = [];
+ this._listeners[type].push(listener);
+ return listener;
+ };
+ _proto.removeEventListener = function removeEventListener(type, listener) {
+ if (!this._listeners) return;
+ if (!this._listeners[type]) return;
+ var arr = this._listeners[type];
+ var length = arr.length;
+ for (var i = 0; i < length; i++) {
+ if (arr[i] === listener) {
+ if (length === 1) {
+ delete this._listeners[type];
+ }
+
+ // allows for faster checks.
+ else {
+ arr.splice(i, 1);
+ }
+ break;
+ }
+ }
+ };
+ _proto.removeAllEventListeners = function removeAllEventListeners(type) {
+ if (!type) this._listeners = null;else if (this._listeners) delete this._listeners[type];
+ };
+ _proto.dispatchEvent = function dispatchEvent(type, args) {
+ var result = false;
+ var listeners = this._listeners;
+ if (type && listeners) {
+ var arr = listeners[type];
+ if (!arr) return result;
+
+ // arr = arr.slice();
+ // to avoid issues with items being removed or added during the dispatch
+
+ var handler;
+ var i = arr.length;
+ while (i--) {
+ handler = arr[i];
+ result = result || handler(args);
+ }
+ }
+ return !!result;
+ };
+ _proto.hasEventListener = function hasEventListener(type) {
+ var listeners = this._listeners;
+ return !!(listeners && listeners[type]);
+ };
return EventDispatcher;
-}();
-
-var Integration = function () {
- function Integration(type) {
- classCallCheck(this, Integration);
-
- this.type = type;
- }
-
- createClass(Integration, [{
- key: 'calculate',
- value: function calculate(particles, time, damping) {
- this.eulerIntegrate(particles, time, damping);
- }
-
- // Euler Integrate
-
- }, {
- key: 'eulerIntegrate',
- value: function eulerIntegrate(particle, time, damping) {
- if (!particle.sleep) {
- particle.old.p.copy(particle.p);
- particle.old.v.copy(particle.v);
+ }();
- particle.a.multiplyScalar(1 / particle.mass);
- particle.v.add(particle.a.multiplyScalar(time));
- particle.p.add(particle.old.v.multiplyScalar(time));
-
- if (damping) particle.v.multiplyScalar(damping);
+ var PI = 3.1415926;
+ var INFINITY = Infinity;
+ var MathUtil = {
+ PI: PI,
+ PIx2: PI * 2,
+ PI_2: PI / 2,
+ PI_180: PI / 180,
+ N180_PI: 180 / PI,
+ Infinity: -999,
+ isInfinity: function isInfinity(num) {
+ return num === this.Infinity || num === INFINITY;
+ },
+ randomAToB: function randomAToB(a, b, isInt) {
+ if (isInt === void 0) {
+ isInt = false;
+ }
+ if (!isInt) return a + Math.random() * (b - a);else return (Math.random() * (b - a) >> 0) + a;
+ },
+ randomFloating: function randomFloating(center, f, isInt) {
+ return this.randomAToB(center - f, center + f, isInt);
+ },
+ randomColor: function randomColor() {
+ return "#" + ("00000" + (Math.random() * 0x1000000 << 0).toString(16)).slice(-6);
+ },
+ randomZone: function randomZone(display) {},
+ floor: function floor(num, k) {
+ if (k === void 0) {
+ k = 4;
+ }
+ var digits = Math.pow(10, k);
+ return Math.floor(num * digits) / digits;
+ },
+ degreeTransform: function degreeTransform(a) {
+ return a * PI / 180;
+ },
+ toColor16: function toColor16(num) {
+ return "#" + num.toString(16);
+ }
+ };
- particle.a.clear();
- }
- }
- }]);
- return Integration;
-}();
+ var Integration = /*#__PURE__*/function () {
+ function Integration(type) {
+ this.type = type;
+ }
+ var _proto = Integration.prototype;
+ _proto.calculate = function calculate(particles, time, damping) {
+ this.eulerIntegrate(particles, time, damping);
+ }
-var Proton = function () {
+ // Euler Integrate
+ // https://rosettacode.org/wiki/Euler_method
+ ;
+ _proto.eulerIntegrate = function eulerIntegrate(particle, time, damping) {
+ if (!particle.sleep) {
+ particle.old.p.copy(particle.p);
+ particle.old.v.copy(particle.v);
+ particle.a.multiplyScalar(1 / particle.mass);
+ particle.v.add(particle.a.multiplyScalar(time));
+ particle.p.add(particle.old.v.multiplyScalar(time));
+ if (damping) particle.v.multiplyScalar(damping);
+ particle.a.clear();
+ }
+ };
+ return Integration;
+ }();
+
+ var Proton = /*#__PURE__*/function () {
+ // measure 1:100
+
+ // event name
/**
* The constructor to add emitters
*
* @constructor Proton
*
- * @todo proParticleCount is not in use
* @todo add more documentation of the single properties and parameters
*
- * @param {Number} [proParticleCount] not in use?
- * @param {Number} [integrationType=Proton.EULER]
+ * @param {Number | undefined} [integrationType=Proton.EULER]
*
* @property {String} [integrationType=Proton.EULER]
* @property {Array} emitters All added emitter
@@ -1323,4317 +855,4854 @@ var Proton = function () {
* @property {Number} time The active time
* @property {Number} oldtime The old time
*/
-
-
- //1:100
function Proton(integrationType) {
- classCallCheck(this, Proton);
-
-
- this.emitters = [];
- this.renderers = [];
-
- this.time = 0;
- this.oldTime = 0;
- this.elapsed = 0;
-
- this.stats = new Stats(this);
- this.pool = new Pool(80);
-
- this.integrationType = Util.initValue(integrationType, Proton.EULER);
- this.integrator = new Integration(this.integrationType);
+ this.emitters = [];
+ this.renderers = [];
+ this.time = 0;
+ this.now = 0;
+ this.then = 0;
+ this.elapsed = 0;
+ this.stats = new Stats(this);
+ this.pool = new Pool(80);
+ this.integrationType = Util.initValue(integrationType, Proton.EULER);
+ this.integrator = new Integration(this.integrationType);
+ this._fps = "auto";
+ this._interval = Proton.DEFAULT_INTERVAL;
}
/**
- * add a type of Renderer
- *
- * @method addRenderer
- * @memberof Proton
- * @instance
- *
- * @param {Renderer} render
- */
+ * Sets the frames per second (FPS) for the Proton system.
+ * @param {number|string} fps - The desired FPS. Use "auto" for default behavior, or a number for a specific FPS.
+ */
+ var _proto = Proton.prototype;
+ /**
+ * add a type of Renderer
+ *
+ * @method addRenderer
+ * @memberof Proton
+ * @instance
+ *
+ * @param {Renderer} render
+ */
+ _proto.addRenderer = function addRenderer(render) {
+ render.init(this);
+ this.renderers.push(render);
+ }
+ /**
+ * @name add a type of Renderer
+ *
+ * @method addRenderer
+ * @param {Renderer} render
+ */;
+ _proto.removeRenderer = function removeRenderer(render) {
+ var index = this.renderers.indexOf(render);
+ this.renderers.splice(index, 1);
+ render.remove(this);
+ }
- createClass(Proton, [{
- key: 'addRenderer',
- value: function addRenderer(render) {
- render.init(this);
- this.renderers.push(render);
- }
+ /**
+ * add the Emitter
+ *
+ * @method addEmitter
+ * @memberof Proton
+ * @instance
+ *
+ * @param {Emitter} emitter
+ */;
+ _proto.addEmitter = function addEmitter(emitter) {
+ this.emitters.push(emitter);
+ emitter.parent = this;
+ this.dispatchEvent(Proton.EMITTER_ADDED, emitter);
+ }
- /**
- * @name add a type of Renderer
- *
- * @method addRenderer
- * @param {Renderer} render
- */
-
- }, {
- key: 'removeRenderer',
- value: function removeRenderer(render) {
- var index = this.renderers.indexOf(render);
- this.renderers.splice(index, 1);
- render.remove(this);
- }
+ /**
+ * Removes an Emitter
+ *
+ * @method removeEmitter
+ * @memberof Proton
+ * @instance
+ *
+ * @param {Proton.Emitter} emitter
+ */;
+ _proto.removeEmitter = function removeEmitter(emitter) {
+ var index = this.emitters.indexOf(emitter);
+ this.emitters.splice(index, 1);
+ emitter.parent = null;
+ this.dispatchEvent(Proton.EMITTER_REMOVED, emitter);
+ }
- /**
- * add the Emitter
- *
- * @method addEmitter
- * @memberof Proton
- * @instance
- *
- * @param {Emitter} emitter
- */
-
- }, {
- key: 'addEmitter',
- value: function addEmitter(emitter) {
- this.emitters.push(emitter);
- emitter.parent = this;
-
- this.dispatchEvent(Proton.EMITTER_ADDED, emitter);
- }
+ /**
+ * Updates all added emitters
+ *
+ * @method update
+ * @memberof Proton
+ * @instance
+ */;
+ _proto.update = function update() {
+ // 'auto' is the default browser refresh rate, the vast majority is 60fps
+ if (this._fps === "auto") {
+ this.dispatchEvent(Proton.PROTON_UPDATE);
+ if (Proton.USE_CLOCK) {
+ if (!this.then) this.then = new Date().getTime();
+ this.now = new Date().getTime();
+ this.elapsed = (this.now - this.then) * 0.001;
+ // Fix bugs such as chrome browser switching tabs causing excessive time difference
+ this.amendChangeTabsBug();
+ if (this.elapsed > 0) this.emittersUpdate(this.elapsed);
+ this.then = this.now;
+ } else {
+ this.emittersUpdate(Proton.DEFAULT_INTERVAL);
+ }
+ this.dispatchEvent(Proton.PROTON_UPDATE_AFTER);
+ }
+
+ // If the fps frame rate is set
+ else {
+ if (!this.then) this.then = new Date().getTime();
+ this.now = new Date().getTime();
+ this.elapsed = (this.now - this.then) * 0.001;
+ if (this.elapsed > this._interval) {
+ this.dispatchEvent(Proton.PROTON_UPDATE);
+ this.emittersUpdate(this._interval);
+ // https://stackoverflow.com/questions/19764018/controlling-fps-with-requestanimationframe
+ this.then = this.now - this.elapsed % this._interval * 1000;
+ this.dispatchEvent(Proton.PROTON_UPDATE_AFTER);
+ }
+ }
+ };
+ _proto.emittersUpdate = function emittersUpdate(elapsed) {
+ var i = this.emitters.length;
+ while (i--) {
+ this.emitters[i].update(elapsed);
+ }
+ }
- /**
- * Removes an Emitter
- *
- * @method removeEmitter
- * @memberof Proton
- * @instance
- *
- * @param {Proton.Emitter} emitter
- */
-
- }, {
- key: 'removeEmitter',
- value: function removeEmitter(emitter) {
- var index = this.emitters.indexOf(emitter);
- this.emitters.splice(index, 1);
- emitter.parent = null;
-
- this.dispatchEvent(Proton.EMITTER_REMOVED, emitter);
- }
+ /**
+ * @todo add description
+ *
+ * @method amendChangeTabsBug
+ * @memberof Proton
+ * @instance
+ */;
+ _proto.amendChangeTabsBug = function amendChangeTabsBug() {
+ if (!Proton.amendChangeTabsBug) return;
+ if (this.elapsed > 0.5) {
+ this.then = new Date().getTime();
+ this.elapsed = 0;
+ }
+ }
- /**
- * Updates all added emitters
- *
- * @method update
- * @memberof Proton
- * @instance
- */
+ /**
+ * Counts all particles from all emitters
+ *
+ * @method getCount
+ * @memberof Proton
+ * @instance
+ */;
+ _proto.getCount = function getCount() {
+ var total = 0;
+ var i = this.emitters.length;
+ while (i--) {
+ total += this.emitters[i].particles.length;
+ }
+ return total;
+ };
+ _proto.getAllParticles = function getAllParticles() {
+ var particles = [];
+ var i = this.emitters.length;
+ while (i--) {
+ particles = particles.concat(this.emitters[i].particles);
+ }
+ return particles;
+ };
+ _proto.destroyAllEmitters = function destroyAllEmitters() {
+ Util.destroyAll(this.emitters);
+ }
- }, {
- key: 'update',
- value: function update() {
- this.dispatchEvent(Proton.PROTON_UPDATE);
+ /**
+ * Destroys everything related to this Proton instance. This includes all emitters, and all properties
+ *
+ * @method destroy
+ * @memberof Proton
+ * @instance
+ */;
+ _proto.destroy = function destroy(remove) {
+ var _this = this;
+ if (remove === void 0) {
+ remove = false;
+ }
+ var destroyOther = function destroyOther() {
+ _this.time = 0;
+ _this.then = 0;
+ _this.pool.destroy();
+ _this.stats.destroy();
+ Util.destroyAll(_this.emitters);
+ Util.destroyAll(_this.renderers, _this.getAllParticles());
+ _this.integrator = null;
+ _this.renderers = null;
+ _this.emitters = null;
+ _this.stats = null;
+ _this.pool = null;
+ };
+ if (remove) {
+ setTimeout(destroyOther, 200);
+ } else {
+ destroyOther();
+ }
+ };
+ _createClass(Proton, [{
+ key: "fps",
+ get:
+ /**
+ * Gets the current frames per second (FPS) setting.
+ * @returns {number|string} The current FPS setting. Returns "auto" if set to default, or a number representing the specific FPS.
+ */
+ function get() {
+ return this._fps;
+ },
+ set: function set(fps) {
+ this._fps = fps;
+ this._interval = fps === "auto" ? Proton.DEFAULT_INTERVAL : MathUtil.floor(1 / fps, 7);
+ }
+ }]);
+ return Proton;
+ }();
+ Proton.USE_CLOCK = false;
+ Proton.MEASURE = 100;
+ Proton.EULER = "euler";
+ Proton.RK2 = "runge-kutta2";
+ Proton.PARTICLE_CREATED = "PARTICLE_CREATED";
+ Proton.PARTICLE_UPDATE = "PARTICLE_UPDATE";
+ Proton.PARTICLE_SLEEP = "PARTICLE_SLEEP";
+ Proton.PARTICLE_DEAD = "PARTICLE_DEAD";
+ Proton.EMITTER_ADDED = "EMITTER_ADDED";
+ Proton.EMITTER_REMOVED = "EMITTER_REMOVED";
+ Proton.PROTON_UPDATE = "PROTON_UPDATE";
+ Proton.PROTON_UPDATE_AFTER = "PROTON_UPDATE_AFTER";
+ Proton.DEFAULT_INTERVAL = 0.0167;
+ Proton.amendChangeTabsBug = true;
+ EventDispatcher.bind(Proton);
+
+ var Rgb = /*#__PURE__*/function () {
+ function Rgb(r, g, b) {
+ if (r === void 0) {
+ r = 255;
+ }
+ if (g === void 0) {
+ g = 255;
+ }
+ if (b === void 0) {
+ b = 255;
+ }
+ this.r = r;
+ this.g = g;
+ this.b = b;
+ }
+ var _proto = Rgb.prototype;
+ _proto.reset = function reset() {
+ this.r = 255;
+ this.g = 255;
+ this.b = 255;
+ };
+ return Rgb;
+ }();
+
+ /**
+ * Represents a span of values or an array.
+ */
+ var Span = /*#__PURE__*/function () {
+ /**
+ * @type {boolean}
+ * @private
+ */
- if (Proton.USE_CLOCK) {
- if (!this.oldTime) this.oldTime = new Date().getTime();
+ /**
+ * @type {number|number[]}
+ * @private
+ */
- var time = new Date().getTime();
- this.elapsed = (time - this.oldTime) / 1000;
- Proton.amendChangeTabsBug && this.amendChangeTabsBug();
+ /**
+ * @type {number}
+ * @private
+ */
- this.oldTime = time;
- } else {
- this.elapsed = 0.0167;
- }
+ /**
+ * @type {boolean}
+ * @private
+ */
- // emitter update
- if (this.elapsed > 0) this.emittersUpdate(this.elapsed);
+ /**
+ * Creates a new Span instance.
+ * @param {number|number[]} a - The first value or an array of values.
+ * @param {number} [b] - The second value (if a is not an array).
+ * @param {boolean} [center=false] - Whether to use center-based calculation.
+ */
+ function Span(a, b, center) {
+ this.isArray = void 0;
+ this.a = void 0;
+ this.b = void 0;
+ this.center = void 0;
+ if (Util.isArray(a)) {
+ this.isArray = true;
+ this.a = a;
+ } else {
+ this.isArray = false;
+ this.a = Util.initValue(a, 1);
+ this.b = Util.initValue(b, this.a);
+ this.center = Util.initValue(center, false);
+ }
+ }
- this.dispatchEvent(Proton.PROTON_UPDATE_AFTER);
- }
- }, {
- key: 'emittersUpdate',
- value: function emittersUpdate(elapsed) {
- var i = this.emitters.length;
- while (i--) {
- this.emitters[i].update(elapsed);
- }
+ /**
+ * Gets a value from the span.
+ * @param {boolean} [isInt=false] - Whether to return an integer value.
+ * @returns {number} A random value from the span.
+ */
+ var _proto = Span.prototype;
+ _proto.getValue = function getValue(isInt) {
+ if (isInt === void 0) {
+ isInt = false;
+ }
+ if (this.isArray) {
+ return Util.getRandFromArray(this.a);
+ } else {
+ if (!this.center) {
+ return MathUtil.randomAToB(this.a, this.b, isInt);
+ } else {
+ return MathUtil.randomFloating(this.a, this.b, isInt);
}
+ }
+ }
- /**
- * @todo add description
- *
- * @method amendChangeTabsBug
- * @memberof Proton
- * @instance
- */
-
- }, {
- key: 'amendChangeTabsBug',
- value: function amendChangeTabsBug() {
- if (this.elapsed > .5) {
- this.oldTime = new Date().getTime();
- this.elapsed = 0;
- }
+ /**
+ * Returns a new Span object.
+ * @param {*|Span} a - The first value or a Span object.
+ * @param {*} [b] - The second value.
+ * @param {*} [c] - The third value.
+ * @returns {Span} A new Span instance.
+ */;
+ Span.setSpanValue = function setSpanValue(a, b, c) {
+ if (a instanceof Span) {
+ return a;
+ } else {
+ if (b === undefined) {
+ return new Span(a);
+ } else {
+ if (c === undefined) return new Span(a, b);else return new Span(a, b, c);
}
+ }
+ }
- /**
- * Counts all particles from all emitters
- *
- * @method getCount
- * @memberof Proton
- * @instance
- */
-
- }, {
- key: 'getCount',
- value: function getCount() {
- var total = 0;
- var i = this.emitters.length;
-
- while (i--) {
- total += this.emitters[i].particles.length;
- }return total;
- }
- }, {
- key: 'getAllParticles',
- value: function getAllParticles() {
- var particles = [];
- var i = this.emitters.length;
-
- while (i--) {
- particles = particles.concat(this.emitters[i].particles);
- }return particles;
+ /**
+ * Returns the value from a Span, if the param is not a Span it will return the given parameter.
+ * @param {*|Span} pan - The value or Span to get the value from.
+ * @returns {*} The value of Span OR the parameter if it is not a Span.
+ */;
+ Span.getSpanValue = function getSpanValue(pan) {
+ return pan instanceof Span ? pan.getValue() : pan;
+ };
+ return Span;
+ }();
+
+ var PropUtil = {
+ hasProp: function hasProp(target, key) {
+ if (!target) return false;
+ return target[key] !== undefined;
+ // return obj.hasOwnProperty(key);
+ },
+ /**
+ * set the prototype in a given prototypeObject
+ *
+ * @memberof Proton#Proton.Util
+ * @method setProp
+ *
+ * @todo add description for param `target`
+ * @todo translate desription from chinese to english
+ *
+ * @param {Object} target
+ * @param {Object} prototypeObject An object of single prototypes
+ *
+ * @return {Object} target
+ */
+ setProp: function setProp(target, props) {
+ for (var prop in props) {
+ if (target.hasOwnProperty(prop)) {
+ target[prop] = Span.getSpanValue(props[prop]);
}
+ }
+ return target;
+ },
+ /**
+ * @memberof Proton#Proton.Util
+ * @method setVectorVal
+ *
+ * @todo add description for param `target`
+ * @todo add description for param `conf`
+ * @todo add description for function
+ *
+ * @param {Object} target
+ * @param {Object} conf
+ */
+ setVectorVal: function setVectorVal(particle, conf) {
+ if (conf === void 0) {
+ conf = null;
+ }
+ if (!conf) return;
+ if (this.hasProp(conf, "x")) particle.p.x = conf["x"];
+ if (this.hasProp(conf, "y")) particle.p.y = conf["y"];
+ if (this.hasProp(conf, "vx")) particle.v.x = conf["vx"];
+ if (this.hasProp(conf, "vy")) particle.v.y = conf["vy"];
+ if (this.hasProp(conf, "ax")) particle.a.x = conf["ax"];
+ if (this.hasProp(conf, "ay")) particle.a.y = conf["ay"];
+ if (this.hasProp(conf, "p")) particle.p.copy(conf["p"]);
+ if (this.hasProp(conf, "v")) particle.v.copy(conf["v"]);
+ if (this.hasProp(conf, "a")) particle.a.copy(conf["a"]);
+ if (this.hasProp(conf, "position")) particle.p.copy(conf["position"]);
+ if (this.hasProp(conf, "velocity")) particle.v.copy(conf["velocity"]);
+ if (this.hasProp(conf, "accelerate")) particle.a.copy(conf["accelerate"]);
+ }
+ };
- /**
- * Destroys everything related to this Proton instance. This includes all emitters, and all properties
- *
- * @method destroy
- * @memberof Proton
- * @instance
- */
-
- }, {
- key: 'destroy',
- value: function destroy() {
- Util.destroy(this.renderers, this.getAllParticles());
- Util.destroy(this.emitters);
-
- this.time = 0;
- this.oldTime = 0;
-
- this.pool.destroy();
- }
- }]);
- return Proton;
-}();
-
-Proton.USE_CLOCK = false;
-Proton.MEASURE = 100;
-Proton.EULER = 'euler';
-Proton.RK2 = 'runge-kutta2';
-Proton.PARTICLE_CREATED = 'PARTICLE_CREATED';
-Proton.PARTICLE_UPDATE = 'PARTICLE_UPDATE';
-Proton.PARTICLE_SLEEP = 'PARTICLE_SLEEP';
-Proton.PARTICLE_DEAD = 'PARTICLE_DEAD';
-Proton.PROTON_UPDATE = 'PROTON_UPDATE';
-Proton.PROTON_UPDATE_AFTER = 'PROTON_UPDATE_AFTER';
-Proton.EMITTER_ADDED = 'EMITTER_ADDED';
-Proton.EMITTER_REMOVED = 'EMITTER_REMOVED';
-Proton.amendChangeTabsBug = true;
-EventDispatcher.bind(Proton);
-
-var ease = {
+ var ease = {
easeLinear: function easeLinear(value) {
- return value;
+ return value;
},
easeInQuad: function easeInQuad(value) {
- return Math.pow(value, 2);
+ return Math.pow(value, 2);
},
easeOutQuad: function easeOutQuad(value) {
- return -(Math.pow(value - 1, 2) - 1);
+ return -(Math.pow(value - 1, 2) - 1);
},
easeInOutQuad: function easeInOutQuad(value) {
- if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 2);
-
- return -0.5 * ((value -= 2) * value - 2);
+ if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 2);
+ return -0.5 * ((value -= 2) * value - 2);
},
easeInCubic: function easeInCubic(value) {
- return Math.pow(value, 3);
+ return Math.pow(value, 3);
},
easeOutCubic: function easeOutCubic(value) {
- return Math.pow(value - 1, 3) + 1;
+ return Math.pow(value - 1, 3) + 1;
},
easeInOutCubic: function easeInOutCubic(value) {
- if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 3);
-
- return 0.5 * (Math.pow(value - 2, 3) + 2);
+ if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 3);
+ return 0.5 * (Math.pow(value - 2, 3) + 2);
},
easeInQuart: function easeInQuart(value) {
- return Math.pow(value, 4);
+ return Math.pow(value, 4);
},
easeOutQuart: function easeOutQuart(value) {
- return -(Math.pow(value - 1, 4) - 1);
+ return -(Math.pow(value - 1, 4) - 1);
},
easeInOutQuart: function easeInOutQuart(value) {
- if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 4);
-
- return -0.5 * ((value -= 2) * Math.pow(value, 3) - 2);
+ if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 4);
+ return -0.5 * ((value -= 2) * Math.pow(value, 3) - 2);
},
easeInSine: function easeInSine(value) {
- return -Math.cos(value * MathUtils.PI_2) + 1;
+ return -Math.cos(value * MathUtil.PI_2) + 1;
},
easeOutSine: function easeOutSine(value) {
- return Math.sin(value * MathUtils.PI_2);
+ return Math.sin(value * MathUtil.PI_2);
},
easeInOutSine: function easeInOutSine(value) {
- return -0.5 * (Math.cos(MathUtils.PI * value) - 1);
+ return -0.5 * (Math.cos(Math.PI * value) - 1);
},
easeInExpo: function easeInExpo(value) {
- return value === 0 ? 0 : Math.pow(2, 10 * (value - 1));
+ return value === 0 ? 0 : Math.pow(2, 10 * (value - 1));
},
easeOutExpo: function easeOutExpo(value) {
- return value === 1 ? 1 : -Math.pow(2, -10 * value) + 1;
+ return value === 1 ? 1 : -Math.pow(2, -10 * value) + 1;
},
easeInOutExpo: function easeInOutExpo(value) {
- if (value === 0) return 0;
-
- if (value === 1) return 1;
-
- if ((value /= 0.5) < 1) return 0.5 * Math.pow(2, 10 * (value - 1));
-
- return 0.5 * (-Math.pow(2, -10 * --value) + 2);
+ if (value === 0) return 0;
+ if (value === 1) return 1;
+ if ((value /= 0.5) < 1) return 0.5 * Math.pow(2, 10 * (value - 1));
+ return 0.5 * (-Math.pow(2, -10 * --value) + 2);
},
easeInCirc: function easeInCirc(value) {
- return -(Math.sqrt(1 - value * value) - 1);
+ return -(Math.sqrt(1 - value * value) - 1);
},
easeOutCirc: function easeOutCirc(value) {
- return Math.sqrt(1 - Math.pow(value - 1, 2));
+ return Math.sqrt(1 - Math.pow(value - 1, 2));
},
easeInOutCirc: function easeInOutCirc(value) {
- if ((value /= 0.5) < 1) return -0.5 * (Math.sqrt(1 - value * value) - 1);
- return 0.5 * (Math.sqrt(1 - (value -= 2) * value) + 1);
+ if ((value /= 0.5) < 1) return -0.5 * (Math.sqrt(1 - value * value) - 1);
+ return 0.5 * (Math.sqrt(1 - (value -= 2) * value) + 1);
},
easeInBack: function easeInBack(value) {
- var s = 1.70158;
- return value * value * ((s + 1) * value - s);
+ var s = 1.70158;
+ return value * value * ((s + 1) * value - s);
},
easeOutBack: function easeOutBack(value) {
- var s = 1.70158;
- return (value = value - 1) * value * ((s + 1) * value + s) + 1;
+ var s = 1.70158;
+ return (value = value - 1) * value * ((s + 1) * value + s) + 1;
},
easeInOutBack: function easeInOutBack(value) {
- var s = 1.70158;
- if ((value /= 0.5) < 1) return 0.5 * (value * value * (((s *= 1.525) + 1) * value - s));
- return 0.5 * ((value -= 2) * value * (((s *= 1.525) + 1) * value + s) + 2);
+ var s = 1.70158;
+ if ((value /= 0.5) < 1) return 0.5 * (value * value * (((s *= 1.525) + 1) * value - s));
+ return 0.5 * ((value -= 2) * value * (((s *= 1.525) + 1) * value + s) + 2);
},
getEasing: function getEasing(ease) {
- if (typeof ease === 'function') return ease;else return this[ease] || this.easeLinear;
+ if (typeof ease === "function") return ease;else return this[ease] || this.easeLinear;
}
-};
+ };
+
+ var Vector2D = /*#__PURE__*/function () {
+ /** @type {number} */
-var Particle = function () {
+ /** @type {number} */
/**
- * the Particle class
- *
- * @class Proton.Particle
- * @constructor
- * @param {Object} pObj the parameters object;
- * for example {life:3,dead:false}
+ * Creates a new Vector2D instance.
+ * @param {number} [x=0] - The x coordinate.
+ * @param {number} [y=0] - The y coordinate.
*/
- function Particle(pOBJ) {
- classCallCheck(this, Particle);
+ function Vector2D(x, y) {
+ this.x = void 0;
+ this.y = void 0;
+ this.x = x || 0;
+ this.y = y || 0;
+ }
- /**
- * The particle's id;
- * @property id
- * @type {string}
- */
- this.id = 'particle_' + Particle.ID++;
- this.reset('init');
+ /**
+ * Sets the x and y components of this vector.
+ * @param {number} x - The x coordinate.
+ * @param {number} y - The y coordinate.
+ * @returns {Vector2D} This vector.
+ */
+ var _proto = Vector2D.prototype;
+ _proto.set = function set(x, y) {
+ this.x = x;
+ this.y = y;
+ return this;
+ }
- pOBJ && Util.setPrototypeByObject(this, pOBJ);
+ /**
+ * Sets the x component of this vector.
+ * @param {number} x - The x coordinate.
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.setX = function setX(x) {
+ this.x = x;
+ return this;
}
- createClass(Particle, [{
- key: 'getDirection',
- value: function getDirection() {
- return Math.atan2(this.v.x, -this.v.y) * MathUtils.N180_PI;
- }
- }, {
- key: 'reset',
- value: function reset(init) {
- this.life = Infinity;
- this.age = 0;
-
- //Energy loss
- this.energy = 1;
- this.dead = false;
- this.sleep = false;
- this.body = null;
- this.sprite = null;
- this.parent = null;
-
- this.mass = 1;
- this.radius = 10;
- this.alpha = 1;
- this.scale = 1;
- this.rotation = 0;
- this.color = null;
-
- this.easing = ease.easeLinear;
-
- if (init == 'init') {
- this.transform = {};
- this.p = new Vector2D();
- this.v = new Vector2D();
- this.a = new Vector2D();
-
- this.old = {
- p: new Vector2D(),
- v: new Vector2D(),
- a: new Vector2D()
- };
-
- this.behaviours = [];
- } else {
- Util.destroyObject(this.transform, 'rgb');
-
- this.p.set(0, 0);
- this.v.set(0, 0);
- this.a.set(0, 0);
-
- this.old.p.set(0, 0);
- this.old.v.set(0, 0);
- this.old.a.set(0, 0);
-
- this.removeAllBehaviours();
- }
-
- if (!this.transform.rgb) {
- this.transform.rgb = { r: 255, g: 255, b: 255 };
- } else {
- this.transform.rgb.r = 255;
- this.transform.rgb.g = 255;
- this.transform.rgb.b = 255;
- }
-
- return this;
- }
- }, {
- key: 'update',
- value: function update(time, index) {
- if (!this.sleep) {
- this.age += time;
- this.applyBehaviours(time, index);
- }
-
- if (this.age < this.life) {
- var scale = this.easing(this.age / this.life);
- this.energy = Math.max(1 - scale, 0);
- } else {
- this.destroy();
- }
- }
- }, {
- key: 'applyBehaviours',
- value: function applyBehaviours(time, index) {
- var length = this.behaviours.length;
- var i = void 0;
-
- for (i = 0; i < length; i++) {
- this.behaviours[i] && this.behaviours[i].applyBehaviour(this, time, index);
- }
- }
- }, {
- key: 'addBehaviour',
- value: function addBehaviour(behaviour) {
- this.behaviours.push(behaviour);
+ /**
+ * Sets the y component of this vector.
+ * @param {number} y - The y coordinate.
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.setY = function setY(y) {
+ this.y = y;
+ return this;
+ }
- if (behaviour.hasOwnProperty('parents')) behaviour.parents.push(this);
- behaviour.initialize(this);
- }
- }, {
- key: 'addBehaviours',
- value: function addBehaviours(behaviours) {
- var length = behaviours.length;
- var i = void 0;
-
- for (i = 0; i < length; i++) {
- this.addBehaviour(behaviours[i]);
- }
- }
- }, {
- key: 'removeBehaviour',
- value: function removeBehaviour(behaviour) {
- var index = this.behaviours.indexOf(behaviour);
-
- if (index > -1) {
- var _behaviour = this.behaviours.splice(index, 1);
- _behaviour.parents = null;
- }
- }
- }, {
- key: 'removeAllBehaviours',
- value: function removeAllBehaviours() {
- Util.destroyArray(this.behaviours);
- }
+ /**
+ * Calculates the gradient (angle) of this vector.
+ * @returns {number} The gradient in radians.
+ */;
+ _proto.getGradient = function getGradient() {
+ if (this.x !== 0) return Math.atan2(this.y, this.x);else if (this.y > 0) return MathUtil.PI_2;else if (this.y < 0) return -MathUtil.PI_2;
+ }
- /**
- * Destory this particle
- * @method destroy
- */
-
- }, {
- key: 'destroy',
- value: function destroy() {
- this.removeAllBehaviours();
- this.energy = 0;
- this.dead = true;
- this.parent = null;
- }
- }]);
- return Particle;
-}();
+ /**
+ * Copies the values of another vector to this one.
+ * @param {Vector2D} v - The vector to copy from.
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.copy = function copy(v) {
+ this.x = v.x;
+ this.y = v.y;
+ return this;
+ }
-Particle.ID = 0;
+ /**
+ * Adds another vector to this one.
+ * @param {Vector2D} v - The vector to add.
+ * @param {Vector2D} [w] - An optional second vector to add.
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.add = function add(v, w) {
+ if (w !== undefined) {
+ return this.addVectors(v, w);
+ }
+ this.x += v.x;
+ this.y += v.y;
+ return this;
+ }
-var ColorUtil = {
+ /**
+ * Adds scalar values to this vector's components.
+ * @param {number} a - Value to add to x.
+ * @param {number} b - Value to add to y.
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.addXY = function addXY(a, b) {
+ this.x += a;
+ this.y += b;
+ return this;
+ }
/**
- * @typedef {Object} rgbObject
- * @property {Number} r red value
- * @property {Number} g green value
- * @property {Number} b blue value
- */
+ * Adds two vectors and sets the result to this vector.
+ * @param {Vector2D} a - The first vector to add.
+ * @param {Vector2D} b - The second vector to add.
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.addVectors = function addVectors(a, b) {
+ this.x = a.x + b.x;
+ this.y = a.y + b.y;
+ return this;
+ }
+
/**
- * converts a hex value to a rgb object
- *
- * @memberof Proton#Proton.Util
- * @method hexToRGB
- *
- * @param {String} h any hex value, e.g. #000000 or 000000 for black
- *
- * @return {rgbObject}
- */
- hexToRGB: function hexToRGB(h) {
- var hex16 = h.charAt(0) == "#" ? h.substring(1, 7) : h;
- var r = parseInt(hex16.substring(0, 2), 16);
- var g = parseInt(hex16.substring(2, 4), 16);
- var b = parseInt(hex16.substring(4, 6), 16);
+ * Subtracts another vector from this one.
+ * @param {Vector2D} v - The vector to subtract.
+ * @param {Vector2D} [w] - An optional second vector to subtract.
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.sub = function sub(v, w) {
+ if (w !== undefined) {
+ return this.subVectors(v, w);
+ }
+ this.x -= v.x;
+ this.y -= v.y;
+ return this;
+ }
- return { r: r, g: g, b: b };
- },
+ /**
+ * Subtracts one vector from another and sets the result to this vector.
+ * @param {Vector2D} a - The vector to subtract from.
+ * @param {Vector2D} b - The vector to subtract.
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.subVectors = function subVectors(a, b) {
+ this.x = a.x - b.x;
+ this.y = a.y - b.y;
+ return this;
+ }
+ /**
+ * Divides this vector by a scalar.
+ * @param {number} s - The scalar to divide by.
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.divideScalar = function divideScalar(s) {
+ if (s !== 0) {
+ this.x /= s;
+ this.y /= s;
+ } else {
+ this.set(0, 0);
+ }
+ return this;
+ }
/**
- * converts a rgb value to a rgb string
- *
- * @memberof Proton#Proton.Util
- * @method rgbToHex
- *
- * @param {Object | Proton.hexToRGB} rgb a rgb object like in {@link Proton#Proton.}
- *
- * @return {String} rgb()
- */
- rgbToHex: function rgbToHex(rbg) {
- return "rgb(" + rbg.r + ", " + rbg.g + ", " + rbg.b + ")";
- },
- getHex16FromParticle: function getHex16FromParticle(p) {
- return Number(p.transform.rgb.r) * 65536 + Number(p.transform.rgb.g) * 256 + Number(p.transform.rgb.b);
- }
-};
-
-var Polar2D = function () {
- function Polar2D(r, tha) {
- classCallCheck(this, Polar2D);
-
- this.r = Math.abs(r) || 0;
- this.tha = tha || 0;
- }
-
- createClass(Polar2D, [{
- key: 'set',
- value: function set$$1(r, tha) {
- this.r = r;
- this.tha = tha;
- return this;
- }
- }, {
- key: 'setR',
- value: function setR(r) {
- this.r = r;
- return this;
- }
- }, {
- key: 'setTha',
- value: function setTha(tha) {
- this.tha = tha;
- return this;
- }
- }, {
- key: 'copy',
- value: function copy(p) {
- this.r = p.r;
- this.tha = p.tha;
- return this;
- }
- }, {
- key: 'toVector',
- value: function toVector() {
- return new Vector2D(this.getX(), this.getY());
- }
- }, {
- key: 'getX',
- value: function getX() {
- return this.r * Math.sin(this.tha);
- }
- }, {
- key: 'getY',
- value: function getY() {
- return -this.r * Math.cos(this.tha);
- }
- }, {
- key: 'normalize',
- value: function normalize() {
- this.r = 1;
- return this;
- }
- }, {
- key: 'equals',
- value: function equals(v) {
- return v.r === this.r && v.tha === this.tha;
- }
- }, {
- key: 'clear',
- value: function clear() {
- this.r = 0.0;
- this.tha = 0.0;
- return this;
- }
- }, {
- key: 'clone',
- value: function clone() {
- return new Polar2D(this.r, this.tha);
- }
- }]);
- return Polar2D;
-}();
-
-var Mat3 = {
- create: function create(mat3) {
- var mat = new Float32Array(9);
- if (mat3) this.set(mat3, mat);
-
- return mat;
- },
- set: function set(mat1, mat2) {
- for (var i = 0; i < 9; i++) {
- mat2[i] = mat1[i];
- }return mat2;
- },
- multiply: function multiply(mat, mat2, mat3) {
- var a00 = mat[0],
- a01 = mat[1],
- a02 = mat[2],
- a10 = mat[3],
- a11 = mat[4],
- a20 = mat[6],
- a21 = mat[7],
- b00 = mat2[0],
- b01 = mat2[1],
- b02 = mat2[2],
- b10 = mat2[3],
- b11 = mat2[4],
- b20 = mat2[6],
- b21 = mat2[7];
-
- mat3[0] = b00 * a00 + b01 * a10;
- mat3[1] = b00 * a01 + b01 * a11;
- mat3[2] = a02 * b02;
- mat3[3] = b10 * a00 + b11 * a10;
- mat3[4] = b10 * a01 + b11 * a11;
- mat3[6] = b20 * a00 + b21 * a10 + a20;
- mat3[7] = b20 * a01 + b21 * a11 + a21;
-
- return mat3;
- },
- inverse: function inverse(mat, mat3) {
- var a00 = mat[0],
- a01 = mat[1],
- a10 = mat[3],
- a11 = mat[4],
- a20 = mat[6],
- a21 = mat[7],
- b01 = a11,
- b11 = -a10,
- b21 = a21 * a10 - a11 * a20,
- d = a00 * b01 + a01 * b11,
- id = void 0;
-
- id = 1 / d;
- mat3[0] = b01 * id;
- mat3[1] = -a01 * id;
- mat3[3] = b11 * id;
- mat3[4] = a00 * id;
- mat3[6] = b21 * id;
- mat3[7] = (-a21 * a00 + a01 * a20) * id;
-
- return mat3;
- },
- multiplyVec2: function multiplyVec2(m, vec, mat3) {
- var x = vec[0],
- y = vec[1];
-
- mat3[0] = x * m[0] + y * m[3] + m[6];
- mat3[1] = x * m[1] + y * m[4] + m[7];
-
- return mat3;
- }
-};
-
-var ArraySpan = function (_Span) {
- inherits(ArraySpan, _Span);
-
- function ArraySpan(color) {
- classCallCheck(this, ArraySpan);
-
- var _this = possibleConstructorReturn(this, (ArraySpan.__proto__ || Object.getPrototypeOf(ArraySpan)).call(this));
-
- _this._arr = Util.isArray(color) ? color : [color];
- return _this;
+ * Multiplies this vector by a scalar.
+ * @param {number} s - The scalar to multiply by.
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.multiplyScalar = function multiplyScalar(s) {
+ this.x *= s;
+ this.y *= s;
+ return this;
}
- createClass(ArraySpan, [{
- key: 'getValue',
- value: function getValue() {
- var color = this._arr[Math.floor(this._arr.length * Math.random())];
- return color === 'random' || color === 'Random' ? MathUtils.randomColor() : color;
- }
-
- /**
- * Make sure that the color is an instance of Proton.ArraySpan, if not it makes a new instance
- *
- * @method setSpanValue
- * @memberof Proton#Proton.Color
- * @instance
- *
- * @param {Proton.Particle} particle
- * @param {Number} the integrate time 1/ms
- * @param {Int} the particle index
- */
-
- }], [{
- key: 'createArraySpan',
- value: function createArraySpan(arr) {
- if (!arr) return null;
-
- if (arr instanceof ArraySpan) return arr;else return new ArraySpan(arr);
- }
- }]);
- return ArraySpan;
-}(Span);
-
-var Rectangle = function () {
- function Rectangle(x, y, w, h) {
- classCallCheck(this, Rectangle);
-
- this.x = x;
- this.y = y;
-
- this.width = w;
- this.height = h;
-
- this.bottom = this.y + this.height;
- this.right = this.x + this.width;
- }
-
- createClass(Rectangle, [{
- key: "contains",
- value: function contains(x, y) {
- if (x <= this.right && x >= this.x && y <= this.bottom && y >= this.y) return true;else return false;
- }
- }]);
- return Rectangle;
-}();
-
-var Rate = function () {
-
- /**
- * The number of particles per second emission (a [particle]/b [s]);
- * @namespace
- * @memberof! Proton#
- * @constructor
- * @alias Rate
- *
- * @param {Array | Number | Span} numpan the number of each emission;
- * @param {Array | Number | Span} timepan the time of each emission;
- * for example: new Rate(new Span(10, 20), new Span(.1, .25));
- */
- function Rate(numpan, timepan) {
- classCallCheck(this, Rate);
-
- this.numPan = Util.setSpanValue(Util.initValue(numpan, 1));
- this.timePan = Util.setSpanValue(Util.initValue(timepan, 1));
-
- this.startTime = 0;
- this.nextTime = 0;
- this.init();
- }
-
- createClass(Rate, [{
- key: 'init',
- value: function init() {
- this.startTime = 0;
- this.nextTime = this.timePan.getValue();
- }
- }, {
- key: 'getValue',
- value: function getValue(time) {
- this.startTime += time;
-
- if (this.startTime >= this.nextTime) {
- this.startTime = 0;
- this.nextTime = this.timePan.getValue();
-
- if (this.numPan.b == 1) {
- if (this.numPan.getValue(false) > 0.5) return 1;else return 0;
- } else {
- return this.numPan.getValue(true);
- }
- }
-
- return 0;
- }
- }]);
- return Rate;
-}();
-
-var Initialize = function () {
- function Initialize() {
- classCallCheck(this, Initialize);
- }
-
- createClass(Initialize, [{
- key: "reset",
- value: function reset() {}
- }, {
- key: "init",
- value: function init(emitter, particle) {
- if (particle) {
- this.initialize(particle);
- } else {
- this.initialize(emitter);
- }
- }
- }, {
- key: "initialize",
-
-
- ///sub class init
- value: function initialize(target) {}
- }]);
- return Initialize;
-}();
-
-var Life = function (_Initialize) {
- inherits(Life, _Initialize);
-
- function Life(a, b, c) {
- classCallCheck(this, Life);
-
- var _this = possibleConstructorReturn(this, (Life.__proto__ || Object.getPrototypeOf(Life)).call(this));
-
- _this.lifePan = Util.setSpanValue(a, b, c);
- _this.name = 'Life';
- return _this;
- }
-
- createClass(Life, [{
- key: 'initialize',
- value: function initialize(target) {
- if (this.lifePan.a == Infinity) target.life = Infinity;else target.life = this.lifePan.getValue();
- }
- }]);
- return Life;
-}(Initialize);
-
-var Zone = function () {
- function Zone() {
- classCallCheck(this, Zone);
-
- this.vector = new Vector2D(0, 0);
- this.random = 0;
- this.crossType = "dead";
- this.alert = true;
- }
-
- createClass(Zone, [{
- key: "getPosition",
- value: function getPosition() {}
- }, {
- key: "crossing",
- value: function crossing(particle) {}
- }]);
- return Zone;
-}();
-
-var PointZone = function (_Zone) {
- inherits(PointZone, _Zone);
-
- function PointZone(x, y) {
- classCallCheck(this, PointZone);
-
- var _this = possibleConstructorReturn(this, (PointZone.__proto__ || Object.getPrototypeOf(PointZone)).call(this));
-
- _this.x = x;
- _this.y = y;
- return _this;
- }
-
- createClass(PointZone, [{
- key: 'getPosition',
- value: function getPosition() {
- this.vector.x = this.x;
- this.vector.y = this.y;
-
- return this.vector;
- }
- }, {
- key: 'crossing',
- value: function crossing(particle) {
-
- if (this.alert) {
- alert('Sorry PointZone does not support crossing method');
- this.alert = false;
- }
- }
- }]);
- return PointZone;
-}(Zone);
-
-var Position = function (_Initialize) {
- inherits(Position, _Initialize);
-
- function Position(zone) {
- classCallCheck(this, Position);
-
- var _this = possibleConstructorReturn(this, (Position.__proto__ || Object.getPrototypeOf(Position)).call(this));
-
- _this.zone = Util.initValue(zone, new PointZone());
-
- _this.name = 'Position';
- return _this;
- }
-
- createClass(Position, [{
- key: 'reset',
- value: function reset(zone) {
- this.zone = Util.initValue(zone, new PointZone());
- }
- }, {
- key: 'initialize',
- value: function initialize(target) {
- this.zone.getPosition();
-
- target.p.x = this.zone.vector.x;
- target.p.y = this.zone.vector.y;
- }
- }]);
- return Position;
-}(Initialize);
-
-var Velocity = function (_Initialize) {
- inherits(Velocity, _Initialize);
-
- function Velocity(rpan, thapan, type) {
- classCallCheck(this, Velocity);
-
- var _this = possibleConstructorReturn(this, (Velocity.__proto__ || Object.getPrototypeOf(Velocity)).call(this));
-
- _this.rPan = Util.setSpanValue(rpan);
- _this.thaPan = Util.setSpanValue(thapan);
- _this.type = Util.initValue(type, 'vector');
-
- _this.name = 'Velocity';
- return _this;
+ /**
+ * Negates this vector (inverts its direction).
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.negate = function negate() {
+ return this.multiplyScalar(-1);
}
- createClass(Velocity, [{
- key: 'reset',
- value: function reset(rpan, thapan, type) {
- this.rPan = Util.setSpanValue(rpan);
- this.thaPan = Util.setSpanValue(thapan);
- this.type = Util.initValue(type, 'vector');
- }
- }, {
- key: 'normalizeVelocity',
- value: function normalizeVelocity(vr) {
- return vr * Proton.MEASURE;
- }
- }, {
- key: 'initialize',
- value: function initialize(target) {
- if (this.type == 'p' || this.type == 'P' || this.type == 'polar') {
- var polar2d = new Polar2D(this.normalizeVelocity(this.rPan.getValue()), this.thaPan.getValue() * MathUtils.PI_180);
-
- target.v.x = polar2d.getX();
- target.v.y = polar2d.getY();
- } else {
- target.v.x = this.normalizeVelocity(this.rPan.getValue());
- target.v.y = this.normalizeVelocity(this.thaPan.getValue());
- }
- }
- }]);
- return Velocity;
-}(Initialize);
-
-var Mass = function (_Initialize) {
- inherits(Mass, _Initialize);
-
- function Mass(a, b, c) {
- classCallCheck(this, Mass);
-
- var _this = possibleConstructorReturn(this, (Mass.__proto__ || Object.getPrototypeOf(Mass)).call(this));
-
- _this.massPan = Util.setSpanValue(a, b, c);
- _this.name = 'Mass';
- return _this;
- }
-
- createClass(Mass, [{
- key: 'initialize',
- value: function initialize(target) {
- target.mass = this.massPan.getValue();
- }
- }]);
- return Mass;
-}(Initialize);
-
-var Radius = function (_Initialize) {
- inherits(Radius, _Initialize);
-
- function Radius(a, b, c) {
- classCallCheck(this, Radius);
-
- var _this = possibleConstructorReturn(this, (Radius.__proto__ || Object.getPrototypeOf(Radius)).call(this));
-
- _this.radius = Util.setSpanValue(a, b, c);
-
- _this.name = 'Radius';
- return _this;
- }
-
- createClass(Radius, [{
- key: 'reset',
- value: function reset(a, b, c) {
- this.radius = Util.setSpanValue(a, b, c);
- }
- }, {
- key: 'initialize',
- value: function initialize(particle) {
- particle.radius = this.radius.getValue();
- particle.transform.oldRadius = particle.radius;
- }
- }]);
- return Radius;
-}(Initialize);
-
-var Body = function (_Initialize) {
- inherits(Body, _Initialize);
-
- function Body(image, w, h) {
- classCallCheck(this, Body);
-
- var _this = possibleConstructorReturn(this, (Body.__proto__ || Object.getPrototypeOf(Body)).call(this));
-
- _this.image = _this.setSpanValue(image);
- _this.w = Util.initValue(w, 20);
- _this.h = Util.initValue(h, _this.w);
- _this.name = 'Body';
- return _this;
+ /**
+ * Calculates the dot product of this vector with another.
+ * @param {Vector2D} v - The other vector.
+ * @returns {number} The dot product.
+ */;
+ _proto.dot = function dot(v) {
+ return this.x * v.x + this.y * v.y;
}
- createClass(Body, [{
- key: 'initialize',
- value: function initialize(particle) {
- var imagetarget = this.image.getValue();
+ /**
+ * Calculates the squared length of this vector.
+ * @returns {number} The squared length.
+ */;
+ _proto.lengthSq = function lengthSq() {
+ return this.x * this.x + this.y * this.y;
+ }
- if (typeof imagetarget == 'string') {
- particle.body = { width: this.w, height: this.h, src: imagetarget, isInner: true, inner: true };
- } else {
- particle.body = imagetarget;
- }
- }
- }, {
- key: 'setSpanValue',
- value: function setSpanValue(color) {
- return color instanceof ArraySpan ? color : new ArraySpan(color);
- }
- }]);
- return Body;
-}(Initialize);
+ /**
+ * Calculates the length of this vector.
+ * @returns {number} The length.
+ */;
+ _proto.length = function length() {
+ return Math.sqrt(this.x * this.x + this.y * this.y);
+ }
-var Behaviour = function () {
+ /**
+ * Normalizes this vector (makes it unit length).
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.normalize = function normalize() {
+ return this.divideScalar(this.length());
+ }
/**
- * The Behaviour class is the base for the other Behaviour
- *
- * @memberof! -
- * @interface
- * @alias Proton.Behaviour
- *
- * @param {Number} life the behaviours life
- * @param {String} easing The behaviour's decaying trend, for example ease.easeOutQuart
- *
- * @property {String} id The behaviours id
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=ease.easeLinear] this behaviour's easing
- * @property {Number} age=0 How long the particle should be 'alife'
- * @property {Number} energy=1
- * @property {Boolean} dead=false The particle is dead at first
- * @property {Array} parents The behaviour's parents array
- * @property {String} name The behaviour name
- */
- function Behaviour(life, easing) {
- classCallCheck(this, Behaviour);
+ * Calculates the distance to another vector.
+ * @param {Vector2D} v - The other vector.
+ * @returns {number} The distance.
+ */;
+ _proto.distanceTo = function distanceTo(v) {
+ return Math.sqrt(this.distanceToSquared(v));
+ }
+ /**
+ * Rotates this vector by an angle.
+ * @param {number} tha - The angle to rotate by (in radians).
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.rotate = function rotate(tha) {
+ var x = this.x;
+ var y = this.y;
+ this.x = x * Math.cos(tha) + y * Math.sin(tha);
+ this.y = -x * Math.sin(tha) + y * Math.cos(tha);
+ return this;
+ }
- this.life = Util.initValue(life, Infinity);
- this.easing = ease.getEasing(easing);
+ /**
+ * Calculates the squared distance to another vector.
+ * @param {Vector2D} v - The other vector.
+ * @returns {number} The squared distance.
+ */;
+ _proto.distanceToSquared = function distanceToSquared(v) {
+ var dx = this.x - v.x;
+ var dy = this.y - v.y;
+ return dx * dx + dy * dy;
+ }
- this.age = 0;
- this.energy = 1;
- this.dead = false;
- this.parents = [];
+ /**
+ * Linearly interpolates this vector toward another vector.
+ * @param {Vector2D} v - The target vector.
+ * @param {number} alpha - The interpolation factor (0-1).
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.lerp = function lerp(v, alpha) {
+ this.x += (v.x - this.x) * alpha;
+ this.y += (v.y - this.y) * alpha;
+ return this;
+ }
- this.id = 'Behaviour_' + Behaviour.id++;
- this.name = 'Behaviour';
+ /**
+ * Checks if this vector is equal to another vector.
+ * @param {Vector2D} v - The other vector.
+ * @returns {boolean} True if the vectors are equal, false otherwise.
+ */;
+ _proto.equals = function equals(v) {
+ return v.x === this.x && v.y === this.y;
}
/**
- * Reset this behaviour's parameters
- *
- * @method reset
- * @memberof Proton.Behaviour
- * @instance
- *
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=easeLinear] this behaviour's easing
- */
+ * Sets this vector to zero.
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.clear = function clear() {
+ this.x = 0.0;
+ this.y = 0.0;
+ return this;
+ }
+ /**
+ * Creates a new vector with the same x and y values as this one.
+ * @returns {Vector2D} A new Vector2D instance.
+ */;
+ _proto.clone = function clone() {
+ return new Vector2D(this.x, this.y);
+ };
+ return Vector2D;
+ }();
- createClass(Behaviour, [{
- key: 'reset',
- value: function reset(life, easing) {
- this.life = Util.initValue(life, Infinity);
- this.easing = ease.getEasing(easing);
- }
+ /**
+ * Represents a particle in a particle system.
+ * @class Particle
+ */
+ var Particle = /*#__PURE__*/function () {
+ /** @type {string} The unique identifier of the particle */
- /**
- * Normalize a force by 1:100;
- *
- * @method normalizeForce
- * @memberof Proton.Behaviour
- * @instance
- *
- * @param {Proton.Vector2D} force
- */
-
- }, {
- key: 'normalizeForce',
- value: function normalizeForce(force) {
- return force.multiplyScalar(Proton.MEASURE);
- }
+ /** @type {{p:Vector2D,v:Vector2D,a:Vector2D}} Old state of the particle */
- /**
- * Normalize a value by 1:100;
- *
- * @method normalizeValue
- * @memberof Proton.Behaviour
- * @instance
- *
- * @param {Number} value
- */
-
- }, {
- key: 'normalizeValue',
- value: function normalizeValue(value) {
- return value * Proton.MEASURE;
- }
+ /** @type {object} Custom data associated with the particle */
- /**
- * Initialize the behaviour's parameters for all particles
- *
- * @method initialize
- * @memberof Proton.Behaviour
- * @instance
- *
- * @param {Proton.Particle} particle
- */
-
- }, {
- key: 'initialize',
- value: function initialize(particle) {}
-
- /**
- * Apply this behaviour for all particles every time
- *
- * @method applyBehaviour
- * @memberof Proton.Behaviour
- * @instance
- *
- * @param {Proton.Particle} particle
- * @param {Number} time the integrate time 1/ms
- * @param {Int} index the particle index
- */
-
- }, {
- key: 'calculate',
- value: function calculate(particle, time, index) {
- this.age += time;
-
- if (this.age >= this.life || this.dead) {
- this.energy = 0;
- this.dead = true;
- this.destroy();
- } else {
- var scale = this.easing(particle.age / particle.life);
- this.energy = Math.max(1 - scale, 0);
- }
- }
+ /** @type {Behaviour[]} Array of behaviours applied to the particle */
- /**
- * Destory this behaviour
- *
- * @method destroy
- * @memberof Proton.Behaviour
- * @instance
- */
-
- }, {
- key: 'destroy',
- value: function destroy() {
- var i = this.parents.length;
- while (i--) {
- this.parents[i].removeBehaviour(this);
- }
-
- this.parents.length = 0;
- }
- }]);
- return Behaviour;
-}();
-
-Behaviour.id = 0;
-
-var Force = function (_Behaviour) {
- inherits(Force, _Behaviour);
-
- /**
- * @memberof! Proton#
- * @augments Proton.Behaviour
- * @constructor
- * @alias Proton.Force
- *
- * @param {Number} fx
- * @param {Number} fy
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=ease.easeLinear] this behaviour's easing
- *
- * @property {String} name The Behaviour name
- */
- function Force(fx, fy, life, easing) {
- classCallCheck(this, Force);
-
- var _this = possibleConstructorReturn(this, (Force.__proto__ || Object.getPrototypeOf(Force)).call(this, life, easing));
-
- _this.force = _this.normalizeForce(new Vector2D(fx, fy));
- _this.name = "Force";
- return _this;
- }
-
- /**
- * Reset this behaviour's parameters
- *
- * @method reset
- * @memberof Proton#Proton.Force
- * @instance
- *
- * @param {Number} fx
- * @param {Number} fy
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=ease.easeLinear] this behaviour's easing
- */
-
-
- createClass(Force, [{
- key: 'reset',
- value: function reset(fx, fy, life, easing) {
- this.force = this.normalizeForce(new Vector2D(fx, fy));
-
- life && get(Force.prototype.__proto__ || Object.getPrototypeOf(Force.prototype), 'reset', this).call(this, life, easing);
- }
-
- /**
- * Apply this behaviour for all particles every time
- *
- * @method applyBehaviour
- * @memberof Proton#Proton.Force
- * @instance
- *
- * @param {Proton.Particle} particle
- * @param {Number} the integrate time 1/ms
- * @param {Int} the particle index
- */
+ /** @type {Vector2D} Current position of the particle */
- }, {
- key: 'applyBehaviour',
- value: function applyBehaviour(particle, time, index) {
- this.calculate(particle, time, index);
- particle.a.add(this.force);
- }
- }]);
- return Force;
-}(Behaviour);
-
-var Attraction = function (_Behaviour) {
- inherits(Attraction, _Behaviour);
-
- /**
- * This behaviour let the particles follow one specific Proton.Vector2D
- *
- * @memberof! Proton#
- * @augments Proton.Behaviour
- * @constructor
- * @alias Proton.Attraction
- *
- * @todo add description for 'force' and 'radius'
- *
- * @param {Proton.Vector2D} targetPosition the attraction point coordinates
- * @param {Number} [force=100]
- * @param {Number} [radius=1000]
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=ease.easeLinear] this behaviour's easing
- *
- * @property {Proton.Vector2D} targetPosition
- * @property {Number} radius
- * @property {Number} force
- * @property {Number} radiusSq
- * @property {Proton.Vector2D} attractionForce
- * @property {Number} lengthSq
- * @property {String} name The Behaviour name
- */
- function Attraction(targetPosition, force, radius, life, easing) {
- classCallCheck(this, Attraction);
-
- var _this = possibleConstructorReturn(this, (Attraction.__proto__ || Object.getPrototypeOf(Attraction)).call(this, life, easing));
-
- _this.targetPosition = Util.initValue(targetPosition, new Vector2D());
- _this.radius = Util.initValue(radius, 1000);
- _this.force = Util.initValue(_this.normalizeValue(force), 100);
-
- _this.radiusSq = _this.radius * _this.radius;
- _this.attractionForce = new Vector2D();
- _this.lengthSq = 0;
-
- _this.name = "Attraction";
- return _this;
- }
-
- /**
- * Reset this behaviour's parameters
- *
- * @method reset
- * @memberof Proton#Proton.Attraction
- * @instance
- *
- * @todo add description for 'force' and 'radius'
- *
- * @param {Proton.Vector2D} targetPosition the attraction point coordinates
- * @param {Number} [force=100]
- * @param {Number} [radius=1000]
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=ease.easeLinear] this behaviour's easing
- */
-
-
- createClass(Attraction, [{
- key: 'reset',
- value: function reset(targetPosition, force, radius, life, easing) {
- this.targetPosition = Util.initValue(targetPosition, new Vector2D());
- this.radius = Util.initValue(radius, 1000);
- this.force = Util.initValue(this.normalizeValue(force), 100);
-
- this.radiusSq = this.radius * this.radius;
- this.attractionForce = new Vector2D();
- this.lengthSq = 0;
-
- life && get(Attraction.prototype.__proto__ || Object.getPrototypeOf(Attraction.prototype), 'reset', this).call(this, life, easing);
- }
-
- /**
- * Apply this behaviour for all particles every time
- *
- * @memberof Proton#Proton.Attraction
- * @method applyBehaviour
- * @instance
- *
- * @param {Proton.Particle} particle
- * @param {Number} time the integrate time 1/ms
- * @param {Int} index the particle index
- */
+ /** @type {Vector2D} Current velocity of the particle */
- }, {
- key: 'applyBehaviour',
- value: function applyBehaviour(particle, time, index) {
- this.calculate(particle, time, index);
-
- this.attractionForce.copy(this.targetPosition);
- this.attractionForce.sub(particle.p);
- this.lengthSq = this.attractionForce.lengthSq();
-
- if (this.lengthSq > 0.000004 && this.lengthSq < this.radiusSq) {
- this.attractionForce.normalize();
- this.attractionForce.multiplyScalar(1 - this.lengthSq / this.radiusSq);
- this.attractionForce.multiplyScalar(this.force);
-
- particle.a.add(this.attractionForce);
- }
- }
- }]);
- return Attraction;
-}(Behaviour);
-
-var RandomDrift = function (_Behaviour) {
- inherits(RandomDrift, _Behaviour);
-
- /**
- * @memberof! Proton#
- * @augments Behaviour
- * @constructor
- * @alias RandomDrift
- *
- * @param {Number} driftX X value of the new Vector2D
- * @param {Number} driftY Y value of the new Vector2D
- * @param {Number} delay How much delay the drift should have
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=easeLinear] this behaviour's easing
- *
- * @property {Number} time The time of the drift
- * @property {String} name The Behaviour name
- */
- function RandomDrift(driftX, driftY, delay, life, easing) {
- classCallCheck(this, RandomDrift);
-
- var _this = possibleConstructorReturn(this, (RandomDrift.__proto__ || Object.getPrototypeOf(RandomDrift)).call(this, life, easing));
-
- _this.reset(driftX, driftY, delay);
- _this.time = 0;
- _this.name = "RandomDrift";
- return _this;
- }
-
- /**
- * Reset this behaviour's parameters
- *
- * @method reset
- * @memberof Proton#RandomDrift
- * @instance
- *
- * @param {Number} driftX X value of the new Vector2D
- * @param {Number} driftY Y value of the new Vector2D
- * @param {Number} delay How much delay the drift should have
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=easeLinear] this behaviour's easing
- */
-
-
- createClass(RandomDrift, [{
- key: 'reset',
- value: function reset(driftX, driftY, delay, life, easing) {
- this.panFoce = new Vector2D(driftX, driftY);
- this.panFoce = this.normalizeForce(this.panFoce);
- this.delay = delay;
-
- life && get(RandomDrift.prototype.__proto__ || Object.getPrototypeOf(RandomDrift.prototype), 'reset', this).call(this, life, easing);
- }
-
- /**
- * Apply this behaviour for all particles every time
- *
- * @method applyBehaviour
- * @memberof Proton#RandomDrift
- * @instance
- *
- * @param {Particle} particle
- * @param {Number} time the integrate time 1/ms
- * @param {Int} index the particle index
- */
+ /** @type {Vector2D} Current acceleration of the particle */
- }, {
- key: 'applyBehaviour',
- value: function applyBehaviour(particle, time, index) {
- this.calculate(particle, time, index);
- this.time += time;
-
- if (this.time >= this.delay) {
- particle.a.addXY(MathUtils.randomAToB(-this.panFoce.x, this.panFoce.x), MathUtils.randomAToB(-this.panFoce.y, this.panFoce.y));
- this.time = 0;
- }
- }
- }]);
- return RandomDrift;
-}(Behaviour);
-
-var Gravity = function (_Force) {
- inherits(Gravity, _Force);
-
- /**
- * @memberof! Proton#
- * @augments Proton#Proton.Force
- * @constructor
- * @alias Proton.Gravity
- *
- * @param {Number} g Gravity
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=ease.easeLinear] this behaviour's easing
- *
- * @property {String} name The Behaviour name
- */
- function Gravity(g, life, easing) {
- classCallCheck(this, Gravity);
-
- var _this = possibleConstructorReturn(this, (Gravity.__proto__ || Object.getPrototypeOf(Gravity)).call(this, 0, g, life, easing));
-
- _this.name = "Gravity";
- return _this;
- }
-
- /**
- * Reset this behaviour's parameters
- *
- * @method reset
- * @memberof Proton#Proton.Gravity
- * @instance
- *
- * @param {Number} g Gravity
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=ease.easeLinear] this behaviour's easing
- */
-
-
- createClass(Gravity, [{
- key: 'reset',
- value: function reset(g, life, easing) {
- get(Gravity.prototype.__proto__ || Object.getPrototypeOf(Gravity.prototype), 'reset', this).call(this, 0, g, life, easing);
- }
- }]);
- return Gravity;
-}(Force);
-
-//can use Collision(emitter,true,function(){}) or Collision();
-
-var Collision = function (_Behaviour) {
- inherits(Collision, _Behaviour);
-
- /**
- * The callback after collision
- *
- * @callback Callback
- *
- * @param {Proton.Particle} particle
- * @param {Proton.Paritcle} otherParticle
- */
- /**
- * @memberof! Proton#
- * @augments Proton.Behaviour
- * @constructor
- * @alias Proton.Collision
- *
- * @todo add description to mass
- *
- * @param {Proton.Emitter} [emitter=null] the attraction point coordinates
- * @param {Boolean} [mass=true]
- * @param {Callback} [callback=null] the callback after the collision
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=ease.easeLinear] this behaviour's easing
- *
- * @property {String} name The Behaviour name
- */
- function Collision(emitter, mass, callback, life, easing) {
- classCallCheck(this, Collision);
-
- var _this = possibleConstructorReturn(this, (Collision.__proto__ || Object.getPrototypeOf(Collision)).call(this, life, easing));
-
- _this.reset(emitter, mass, callback);
- _this.name = "Collision";
- return _this;
- }
-
- /**
- * Reset this behaviour's parameters
- *
- * @memberof Proton#Proton.Collision
- * @method reset
- * @instance
- *
- * @todo add description to mass
- *
- * @param {Proton.Emitter} [emitter=null] the attraction point coordinates
- * @param {Boolean} [mass=true]
- * @param {Callback} [callback=null] the callback after the collision
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=ease.easeLinear] this behaviour's easing
- */
-
-
- createClass(Collision, [{
- key: 'reset',
- value: function reset(emitter, mass, callback, life, easing) {
- this.emitter = Util.initValue(emitter, null);
- this.mass = Util.initValue(mass, true);
- this.callback = Util.initValue(callback, null);
-
- this.collisionPool = [];
- this.delta = new Vector2D();
-
- life && get(Collision.prototype.__proto__ || Object.getPrototypeOf(Collision.prototype), 'reset', this).call(this, life, easing);
- }
-
- /**
- * Apply this behaviour for all particles every time
- *
- * @memberof Proton#Proton.Collision
- * @method applyBehaviour
- * @instance
- *
- * @param {Proton.Particle} particle
- * @param {Number} time the integrate time 1/ms
- * @param {Int} index the particle index
- */
+ /** @type {Rgb} Color of the particle */
- }, {
- key: 'applyBehaviour',
- value: function applyBehaviour(particle, time, index) {
- var newPool = this.emitter ? this.emitter.particles.slice(index) : this.pool.slice(index);
- var length = newPool.length;
+ /**
+ * Creates a new Particle instance.
+ * @param {Object} [conf] Configuration object for the particle
+ */
+ function Particle(conf) {
+ this.id = "";
+ this.old = null;
+ this.data = null;
+ this.behaviours = null;
+ this.p = null;
+ this.v = null;
+ this.a = null;
+ this.rgb = null;
+ this.name = "Particle";
+ this.id = Puid.id(this.name);
+ this.old = {};
+ this.data = {};
+ this.behaviours = [];
+ this.p = new Vector2D();
+ this.v = new Vector2D();
+ this.a = new Vector2D();
+ this.old.p = new Vector2D();
+ this.old.v = new Vector2D();
+ this.old.a = new Vector2D();
+ this.rgb = new Rgb();
+ this.reset();
+ conf && PropUtil.setProp(this, conf);
+ }
- var otherParticle = void 0;
- var lengthSq = void 0;
- var overlap = void 0;
- var totalMass = void 0;
- var averageMass1 = void 0,
- averageMass2 = void 0;
- var i = void 0;
+ /**
+ * Gets the direction of the particle's movement in degrees.
+ * @returns {number} The direction in degrees
+ */
+ var _proto = Particle.prototype;
+ _proto.getDirection = function getDirection() {
+ return Math.atan2(this.v.x, -this.v.y) * MathUtil.N180_PI;
+ }
- for (i = 0; i < length; i++) {
- otherParticle = newPool[i];
+ /**
+ * Resets the particle to its initial state.
+ * @returns {Particle} The particle instance
+ */;
+ _proto.reset = function reset() {
+ this.life = Infinity;
+ this.age = 0;
+ this.dead = false;
+ this.sleep = false;
+ this.body = null;
+ this.sprite = null;
+ this.parent = null;
+ this.energy = 1; // Energy Loss
+ this.mass = 1;
+ this.radius = 10;
+ this.alpha = 1;
+ this.scale = 1;
+ this.rotation = 0;
+ this.color = null;
+ this.p.set(0, 0);
+ this.v.set(0, 0);
+ this.a.set(0, 0);
+ this.old.p.set(0, 0);
+ this.old.v.set(0, 0);
+ this.old.a.set(0, 0);
+ this.easing = ease.easeLinear;
+ this.rgb.reset();
+ Util.emptyObject(this.data);
+ this.removeAllBehaviours();
+ return this;
+ }
- if (otherParticle !== particle) {
- this.delta.copy(otherParticle.p);
- this.delta.sub(particle.p);
+ /**
+ * Updates the particle's state.
+ * @param {number} time The time elapsed since the last update
+ * @param {number} index The index of the particle in its parent system
+ */;
+ _proto.update = function update(time, index) {
+ if (!this.sleep) {
+ this.age += time;
+ this.applyBehaviours(time, index);
+ }
+ if (this.age < this.life) {
+ var scale = this.easing(this.age / this.life);
+ this.energy = Math.max(1 - scale, 0);
+ } else {
+ this.destroy();
+ }
+ }
- lengthSq = this.delta.lengthSq();
- var distance = particle.radius + otherParticle.radius;
+ /**
+ * Applies all behaviours attached to the particle.
+ * @param {number} time The time elapsed since the last update
+ * @param {number} index The index of the particle in its parent system
+ */;
+ _proto.applyBehaviours = function applyBehaviours(time, index) {
+ var length = this.behaviours.length;
+ var i;
+ for (i = 0; i < length; i++) {
+ this.behaviours[i] && this.behaviours[i].applyBehaviour(this, time, index);
+ }
+ }
- if (lengthSq <= distance * distance) {
- overlap = distance - Math.sqrt(lengthSq);
- overlap += 0.5;
+ /**
+ * Adds a behaviour to the particle.
+ * @param {Behaviour} behaviour The behaviour to add
+ */;
+ _proto.addBehaviour = function addBehaviour(behaviour) {
+ this.behaviours.push(behaviour);
+ if (behaviour.hasOwnProperty("parents")) behaviour.parents.push(this);
+ behaviour.initialize(this);
+ }
- totalMass = particle.mass + otherParticle.mass;
- averageMass1 = this.mass ? otherParticle.mass / totalMass : 0.5;
- averageMass2 = this.mass ? particle.mass / totalMass : 0.5;
+ /**
+ * Adds multiple behaviours to the particle.
+ * @param {Behaviour[]} behaviours An array of behaviours to add
+ */;
+ _proto.addBehaviours = function addBehaviours(behaviours) {
+ var length = behaviours.length;
+ var i;
+ for (i = 0; i < length; i++) {
+ this.addBehaviour(behaviours[i]);
+ }
+ }
- particle.p.add(this.delta.clone().normalize().multiplyScalar(overlap * -averageMass1));
- otherParticle.p.add(this.delta.normalize().multiplyScalar(overlap * averageMass2));
+ /**
+ * Removes a specific behaviour from the particle.
+ * @param {Behaviour} behaviour The behaviour to remove
+ */;
+ _proto.removeBehaviour = function removeBehaviour(behaviour) {
+ var index = this.behaviours.indexOf(behaviour);
+ if (index > -1) {
+ var _behaviour = this.behaviours.splice(index, 1);
+ _behaviour.parents = null;
+ }
+ }
- this.callback && this.callback(particle, otherParticle);
- }
- }
- }
- }
- }]);
- return Collision;
-}(Behaviour);
+ /**
+ * Removes all behaviours from the particle.
+ */;
+ _proto.removeAllBehaviours = function removeAllBehaviours() {
+ Util.emptyArray(this.behaviours);
+ }
-var CrossZone = function (_Behaviour) {
- inherits(CrossZone, _Behaviour);
+ /**
+ * Destroys the particle, removing all behaviours and setting it as dead.
+ */;
+ _proto.destroy = function destroy() {
+ this.removeAllBehaviours();
+ this.energy = 0;
+ this.dead = true;
+ this.parent = null;
+ };
+ return Particle;
+ }();
+ var ColorUtil = {
/**
- * Defines what happens if the particles come to the end of the specified zone
+ * @typedef {Object} rgbObject
+ * @property {Number} r red value
+ * @property {Number} g green value
+ * @property {Number} b blue value
+ */
+ /**
+ * converts a hex value to a rgb object
*
- * @memberof! Proton#
- * @augments Proton.Behaviour
- * @constructor
- * @alias Proton.CrossZone
+ * @memberof Proton#Proton.Util
+ * @method hexToRgb
*
- * @param {Proton.Zone} zone can be any Proton.Zone - e.g. Proton.RectZone()
- * @param {String} [crossType=dead] what happens if the particles pass the zone - allowed strings: dead | bound | cross
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ * @param {String} h any hex value, e.g. #000000 or 000000 for black
*
- * @property {String} name The Behaviour name
+ * @return {rgbObject}
*/
- function CrossZone(zone, crossType, life, easing) {
- classCallCheck(this, CrossZone);
+ hexToRgb: function hexToRgb(h) {
+ var hex16 = h.charAt(0) === "#" ? h.substring(1, 7) : h;
+ var r = parseInt(hex16.substring(0, 2), 16);
+ var g = parseInt(hex16.substring(2, 4), 16);
+ var b = parseInt(hex16.substring(4, 6), 16);
+ return {
+ r: r,
+ g: g,
+ b: b
+ };
+ },
+ /**
+ * converts a rgb value to a rgb string
+ *
+ * @memberof Proton#Proton.Util
+ * @method rgbToHex
+ *
+ * @param {Object | Proton.hexToRgb} rgb a rgb object like in {@link Proton#Proton.}
+ *
+ * @return {String} rgb()
+ */
+ rgbToHex: function rgbToHex(rbg) {
+ return "rgb(" + rbg.r + ", " + rbg.g + ", " + rbg.b + ")";
+ },
+ getHex16FromParticle: function getHex16FromParticle(p) {
+ return Number(p.rgb.r) * 65536 + Number(p.rgb.g) * 256 + Number(p.rgb.b);
+ }
+ };
- var _this = possibleConstructorReturn(this, (CrossZone.__proto__ || Object.getPrototypeOf(CrossZone)).call(this, life, easing));
+ var Polar2D = /*#__PURE__*/function () {
+ function Polar2D(r, tha) {
+ this.r = Math.abs(r) || 0;
+ this.tha = tha || 0;
+ }
+ var _proto = Polar2D.prototype;
+ _proto.set = function set(r, tha) {
+ this.r = r;
+ this.tha = tha;
+ return this;
+ };
+ _proto.setR = function setR(r) {
+ this.r = r;
+ return this;
+ };
+ _proto.setTha = function setTha(tha) {
+ this.tha = tha;
+ return this;
+ };
+ _proto.copy = function copy(p) {
+ this.r = p.r;
+ this.tha = p.tha;
+ return this;
+ };
+ _proto.toVector = function toVector() {
+ return new Vector2D(this.getX(), this.getY());
+ };
+ _proto.getX = function getX() {
+ return this.r * Math.sin(this.tha);
+ };
+ _proto.getY = function getY() {
+ return -this.r * Math.cos(this.tha);
+ };
+ _proto.normalize = function normalize() {
+ this.r = 1;
+ return this;
+ };
+ _proto.equals = function equals(v) {
+ return v.r === this.r && v.tha === this.tha;
+ };
+ _proto.clear = function clear() {
+ this.r = 0.0;
+ this.tha = 0.0;
+ return this;
+ };
+ _proto.clone = function clone() {
+ return new Polar2D(this.r, this.tha);
+ };
+ return Polar2D;
+ }();
+
+ var Mat3 = {
+ create: function create(mat3) {
+ var mat = new Float32Array(9);
+ if (mat3) this.set(mat3, mat);
+ return mat;
+ },
+ set: function set(mat1, mat2) {
+ for (var i = 0; i < 9; i++) {
+ mat2[i] = mat1[i];
+ }
+ return mat2;
+ },
+ multiply: function multiply(mat, mat2, mat3) {
+ var a00 = mat[0],
+ a01 = mat[1],
+ a02 = mat[2],
+ a10 = mat[3],
+ a11 = mat[4],
+ a20 = mat[6],
+ a21 = mat[7],
+ b00 = mat2[0],
+ b01 = mat2[1],
+ b02 = mat2[2],
+ b10 = mat2[3],
+ b11 = mat2[4],
+ b20 = mat2[6],
+ b21 = mat2[7];
+ mat3[0] = b00 * a00 + b01 * a10;
+ mat3[1] = b00 * a01 + b01 * a11;
+ mat3[2] = a02 * b02;
+ mat3[3] = b10 * a00 + b11 * a10;
+ mat3[4] = b10 * a01 + b11 * a11;
+ mat3[6] = b20 * a00 + b21 * a10 + a20;
+ mat3[7] = b20 * a01 + b21 * a11 + a21;
+ return mat3;
+ },
+ inverse: function inverse(mat, mat3) {
+ var a00 = mat[0],
+ a01 = mat[1],
+ a10 = mat[3],
+ a11 = mat[4],
+ a20 = mat[6],
+ a21 = mat[7],
+ b01 = a11,
+ b11 = -a10,
+ b21 = a21 * a10 - a11 * a20,
+ d = a00 * b01 + a01 * b11,
+ id;
+ id = 1 / d;
+ mat3[0] = b01 * id;
+ mat3[1] = -a01 * id;
+ mat3[3] = b11 * id;
+ mat3[4] = a00 * id;
+ mat3[6] = b21 * id;
+ mat3[7] = (-a21 * a00 + a01 * a20) * id;
+ return mat3;
+ },
+ multiplyVec2: function multiplyVec2(m, vec, mat3) {
+ var x = vec[0],
+ y = vec[1];
+ mat3[0] = x * m[0] + y * m[3] + m[6];
+ mat3[1] = x * m[1] + y * m[4] + m[7];
+ return mat3;
+ }
+ };
- _this.reset(zone, crossType);
- _this.name = "CrossZone";
- return _this;
+ var ArraySpan = /*#__PURE__*/function (_Span) {
+ _inheritsLoose(ArraySpan, _Span);
+ function ArraySpan(color) {
+ var _this;
+ _this = _Span.call(this) || this;
+ _this._arr = Util.toArray(color);
+ return _this;
+ }
+ var _proto = ArraySpan.prototype;
+ _proto.getValue = function getValue() {
+ var val = Util.getRandFromArray(this._arr);
+ return val === "random" || val === "Random" ? MathUtil.randomColor() : val;
}
/**
- * Reset this behaviour's parameters
+ * Make sure that the color is an instance of Proton.ArraySpan, if not it makes a new instance
*
- * @method reset
- * @memberof Proton#Proton.CrossZone
+ * @method setSpanValue
+ * @memberof Proton#Proton.Color
* @instance
*
- * @param {Proton.Zone} zone can be any Proton.Zone - e.g. Proton.RectZone()
- * @param {String} [crossType=dead] what happens if the particles pass the zone - allowed strings: dead | bound | cross
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=easeLinear] this behaviour's easing
+ * @param {Proton.Particle} particle
+ * @param {Number} the integrate time 1/ms
+ * @param {Int} the particle index
+ */;
+ ArraySpan.createArraySpan = function createArraySpan(arr) {
+ if (!arr) return null;
+ if (arr instanceof ArraySpan) return arr;else return new ArraySpan(arr);
+ };
+ return ArraySpan;
+ }(Span);
+
+ var Rectangle = /*#__PURE__*/function () {
+ function Rectangle(x, y, w, h) {
+ this.x = x;
+ this.y = y;
+ this.width = w;
+ this.height = h;
+ this.bottom = this.y + this.height;
+ this.right = this.x + this.width;
+ }
+ var _proto = Rectangle.prototype;
+ _proto.contains = function contains(x, y) {
+ if (x <= this.right && x >= this.x && y <= this.bottom && y >= this.y) return true;else return false;
+ };
+ return Rectangle;
+ }();
+
+ /**
+ * Rate class for controlling particle emission rate.
+ */
+ var Rate = /*#__PURE__*/function () {
+ /**
+ * @type {Span}
+ * @private
*/
+ /**
+ * @type {Span}
+ * @private
+ */
+
+ /**
+ * @type {number}
+ * @private
+ */
- createClass(CrossZone, [{
- key: 'reset',
- value: function reset(zone, crossType, life, easing) {
- this.zone = zone;
- this.zone.crossType = Util.initValue(crossType, "dead");
+ /**
+ * @type {number}
+ * @private
+ */
- life && get(CrossZone.prototype.__proto__ || Object.getPrototypeOf(CrossZone.prototype), 'reset', this).call(this, life, easing);
- }
+ /**
+ * Creates a new Rate instance.
+ * The number of particles per second emission (a [particle]/b [s]).
+ * @param {Array|number|Span} [numpan=1] - The number of particles for each emission.
+ * @param {Array|number|Span} [timepan=1] - The time interval between each emission.
+ * @example
+ * // Create a rate of 10-20 particles every 0.1-0.25 seconds
+ * new Rate(new Span(10, 20), new Span(0.1, 0.25));
+ */
+ function Rate(numpan, timepan) {
+ this.numPan = void 0;
+ this.timePan = void 0;
+ this.startTime = void 0;
+ this.nextTime = void 0;
+ this.numPan = Span.setSpanValue(Util.initValue(numpan, 1));
+ this.timePan = Span.setSpanValue(Util.initValue(timepan, 1));
+ this.startTime = 0;
+ this.nextTime = 0;
+ this.init();
+ }
- /**
- * Apply this behaviour for all particles every time
- *
- * @method applyBehaviour
- * @memberof Proton#Proton.CrossZone
- * @instance
- *
- * @param {Proton.Particle} particle
- * @param {Number} the integrate time 1/ms
- * @param {Int} the particle index
- */
-
- }, {
- key: 'applyBehaviour',
- value: function applyBehaviour(particle, time, index) {
- this.calculate(particle, time, index);
- this.zone.crossing(particle);
- }
- }]);
- return CrossZone;
-}(Behaviour);
-
-var Alpha = function (_Behaviour) {
- inherits(Alpha, _Behaviour);
-
- /**
- * @memberof! Proton#
- * @augments Proton.Behaviour
- * @constructor
- * @alias Proton.Alpha
- *
- * @todo add description for 'a' and 'b'
- *
- * @param {Number} a
- * @param {String} b
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=ease.easeLinear] this behaviour's easing
- *
- * @property {String} name The Behaviour name
- */
- function Alpha(a, b, life, easing) {
- classCallCheck(this, Alpha);
-
- var _this = possibleConstructorReturn(this, (Alpha.__proto__ || Object.getPrototypeOf(Alpha)).call(this, life, easing));
-
- _this.reset(a, b);
- _this.name = "Alpha";
- return _this;
- }
-
- /**
- * Reset this behaviour's parameters
- *
- * @method reset
- * @memberof Proton#Proton.Alpha
- * @instance
- *
- * @todo add description for 'a' and 'b'
- *
- * @param {Number} a
- * @param {String} b
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=ease.easeLinear] this behaviour's easing
- */
-
-
- createClass(Alpha, [{
- key: 'reset',
- value: function reset(a, b, life, easing) {
- this.same = b === null || b === undefined ? true : false;
- this.a = Util.setSpanValue(Util.initValue(a, 1));
- this.b = Util.setSpanValue(b);
-
- life && get(Alpha.prototype.__proto__ || Object.getPrototypeOf(Alpha.prototype), 'reset', this).call(this, life, easing);
- }
-
- /**
- * Sets the new alpha value of the particle
- *
- * @method initialize
- * @memberof Proton#Proton.Alpha
- * @instance
- *
- * @param {Proton.Particle} particle A single Proton generated particle
- */
+ /**
+ * Initializes the rate.
+ * @private
+ */
+ var _proto = Rate.prototype;
+ _proto.init = function init() {
+ this.startTime = 0;
+ this.nextTime = this.timePan.getValue();
+ }
- }, {
- key: 'initialize',
- value: function initialize(particle) {
- particle.transform.alphaA = this.a.getValue();
+ /**
+ * Gets the number of particles to emit based on the elapsed time.
+ * @param {number} time - The elapsed time since the last update.
+ * @returns {number} The number of particles to emit.
+ */;
+ _proto.getValue = function getValue(time) {
+ this.startTime += time;
+ if (this.startTime >= this.nextTime) {
+ this.startTime = 0;
+ this.nextTime = this.timePan.getValue();
+ if (this.numPan.b === 1) {
+ if (this.numPan.getValue(false) > 0.5) return 1;else return 0;
+ } else {
+ return this.numPan.getValue(true);
+ }
+ }
+ return 0;
+ };
+ return Rate;
+ }();
+
+ var Initialize = /*#__PURE__*/function () {
+ function Initialize() {}
+ var _proto = Initialize.prototype;
+ _proto.reset = function reset() {};
+ _proto.init = function init(emitter, particle) {
+ if (particle) {
+ this.initialize(particle);
+ } else {
+ this.initialize(emitter);
+ }
+ }
- if (this.same) particle.transform.alphaB = particle.transform.alphaA;else particle.transform.alphaB = this.b.getValue();
- }
+ // sub class init
+ ;
+ _proto.initialize = function initialize(target) {};
+ return Initialize;
+ }();
- /**
- * @method applyBehaviour
- * @memberof Proton#Proton.Alpha
- * @instance
- *
- * @param {Proton.Particle} particle
- * @param {Number} time the integrate time 1/ms
- * @param {Int} index the particle index
- */
-
- }, {
- key: 'applyBehaviour',
- value: function applyBehaviour(particle, time, index) {
- this.calculate(particle, time, index);
-
- particle.alpha = particle.transform.alphaB + (particle.transform.alphaA - particle.transform.alphaB) * this.energy;
- if (particle.alpha < 0.001) particle.alpha = 0;
- }
- }]);
- return Alpha;
-}(Behaviour);
-
-var Scale = function (_Behaviour) {
- inherits(Scale, _Behaviour);
-
- /**
- * @memberof! Proton#
- * @augments Proton.Behaviour
- * @constructor
- * @alias Proton.Scale
- *
- * @todo add description for 'a' and 'b'
- *
- * @param {Number} a
- * @param {String} b
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=ease.easeLinear] this behaviour's easing
- *
- * @property {String} name The Behaviour name
- */
- function Scale(a, b, life, easing) {
- classCallCheck(this, Scale);
-
- var _this = possibleConstructorReturn(this, (Scale.__proto__ || Object.getPrototypeOf(Scale)).call(this, life, easing));
-
- _this.reset(a, b);
- _this.name = "Scale";
- return _this;
- }
-
- /**
- * Reset this behaviour's parameters
- *
- * @method reset
- * @memberof Proton#Proton.Scale
- * @instance
- *
- * @param {Number} a
- * @param {String} b
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=ease.easeLinear] this behaviour's easing
- */
-
-
- createClass(Scale, [{
- key: 'reset',
- value: function reset(a, b, life, easing) {
- this.same = b === null || b === undefined ? true : false;
- this.a = Util.setSpanValue(Util.initValue(a, 1));
- this.b = Util.setSpanValue(b);
-
- life && get(Scale.prototype.__proto__ || Object.getPrototypeOf(Scale.prototype), 'reset', this).call(this, life, easing);
- }
-
- /**
- * Initialize the behaviour's parameters for all particles
- *
- * @method initialize
- * @memberof Proton#Proton.Scale
- * @instance
- *
- * @param {Proton.Particle} particle
+ /**
+ * Life class for initializing particle lifetime.
+ * @extends Initialize
*/
+ var Life = /*#__PURE__*/function (_Initialize) {
+ _inheritsLoose(Life, _Initialize);
+ /**
+ * @type {Span}
+ * @private
+ */
- }, {
- key: 'initialize',
- value: function initialize(particle) {
- particle.transform.scaleA = this.a.getValue();
- particle.transform.oldRadius = particle.radius;
- particle.transform.scaleB = this.same ? particle.transform.scaleA : this.b.getValue();
- }
- }, {
- key: 'applyBehaviour',
+ /**
+ * @type {string}
+ */
+ /**
+ * Creates a new Life instance.
+ * @param {number|Span} a - The lifetime value or the lower bound of the lifetime range.
+ * @param {number} [b] - The upper bound of the lifetime range (if a is a number).
+ * @param {boolean} [c] - Whether to use center-based calculation (if a and b are numbers).
+ */
+ function Life(a, b, c) {
+ var _this;
+ _this = _Initialize.call(this) || this;
+ _this.lifePan = void 0;
+ _this.name = void 0;
+ _this.lifePan = Span.setSpanValue(a, b, c);
+ _this.name = "Life";
+ return _this;
+ }
- /**
- * Apply this behaviour for all particles every time
- *
- * @method applyBehaviour
- * @memberof Proton#Proton.Scale
- * @instance
- *
- * @param {Proton.Particle} particle
- * @param {Number} time the integrate time 1/ms
- * @param {Int} index the particle index
+ /**
+ * Initializes the lifetime of a target particle.
+ * @param {object} target - The target particle to initialize.
+ */
+ var _proto = Life.prototype;
+ _proto.initialize = function initialize(target) {
+ if (this.lifePan.a === Infinity) target.life = Infinity;else target.life = this.lifePan.getValue();
+ };
+ return Life;
+ }(Initialize);
+
+ var Zone = /*#__PURE__*/function () {
+ function Zone() {
+ this.vector = new Vector2D(0, 0);
+ this.random = 0;
+ this.crossType = "dead";
+ this.alert = true;
+ }
+ var _proto = Zone.prototype;
+ _proto.getPosition = function getPosition() {};
+ _proto.crossing = function crossing(particle) {};
+ _proto.destroy = function destroy() {
+ this.vector = null;
+ };
+ return Zone;
+ }();
+
+ /**
+ * Represents a point zone in a 2D space.
+ * @extends Zone
*/
- value: function applyBehaviour(particle, time, index) {
- this.calculate(particle, time, index);
- particle.scale = particle.transform.scaleB + (particle.transform.scaleA - particle.transform.scaleB) * this.energy;
-
- if (particle.scale < 0.0001) particle.scale = 0;
- particle.radius = particle.transform.oldRadius * particle.scale;
- }
- }]);
- return Scale;
-}(Behaviour);
-
-var Rotate = function (_Behaviour) {
- inherits(Rotate, _Behaviour);
-
- /**
- * @memberof! Proton#
- * @augments Proton.Behaviour
- * @constructor
- * @alias Proton.Rotate
- *
- * @todo add description for 'a', 'b' and 'style'
- *
- * @param {String} [influence=Velocity] The rotation's influence
- * @param {String} b
- * @param {String} [style=to]
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=ease.easeLinear] this behaviour's easing
- *
- * @property {String} name The Behaviour name
- */
- function Rotate(influence, b, style, life, easing) {
- classCallCheck(this, Rotate);
-
- var _this = possibleConstructorReturn(this, (Rotate.__proto__ || Object.getPrototypeOf(Rotate)).call(this, life, easing));
-
- _this.reset(influence, b, style);
- _this.name = "Rotate";
- return _this;
- }
-
- /**
- * Reset this behaviour's parameters
- *
- * @method reset
- * @memberof Proton#Proton.Rotate
- * @instance
- *
- * @todo add description for 'a', 'b' and 'style'
- *
- * @param {String} a
- * @param {String} b
- * @param {String} [style=to]
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=ease.easeLinear] this behaviour's easing
- */
-
-
- createClass(Rotate, [{
- key: 'reset',
- value: function reset(a, b, style, life, easing) {
- this.same = b === null || b === undefined ? true : false;
-
- this.a = Util.setSpanValue(Util.initValue(a, "Velocity"));
- this.b = Util.setSpanValue(Util.initValue(b, 0));
- this.style = Util.initValue(style, 'to');
-
- life && get(Rotate.prototype.__proto__ || Object.getPrototypeOf(Rotate.prototype), 'reset', this).call(this, life, easing);
- }
-
- /**
- * Initialize the behaviour's parameters for all particles
- *
- * @method initialize
- * @memberof Proton#Proton.Rotate
- * @instance
- *
- * @param {Proton.Particle} particle
+ var PointZone = /*#__PURE__*/function (_Zone) {
+ _inheritsLoose(PointZone, _Zone);
+ /**
+ * Creates a new PointZone.
+ * @param {number} x - The x-coordinate of the point.
+ * @param {number} y - The y-coordinate of the point.
+ */
+ function PointZone(x, y) {
+ var _this;
+ _this = _Zone.call(this) || this;
+
+ /**
+ * The x-coordinate of the point.
+ * @type {number}
+ */
+ _this.x = x;
+
+ /**
+ * The y-coordinate of the point.
+ * @type {number}
+ */
+ _this.y = y;
+ return _this;
+ }
+
+ /**
+ * Gets the position of the point.
+ * @returns {Object} An object representing the position vector.
+ */
+ var _proto = PointZone.prototype;
+ _proto.getPosition = function getPosition() {
+ this.vector.x = this.x;
+ this.vector.y = this.y;
+ return this.vector;
+ }
+
+ /**
+ * This method is not supported for PointZone.
+ * @param {Object} particle - The particle object (unused).
+ */;
+ _proto.crossing = function crossing(particle) {
+ if (this.alert) {
+ console.error("Sorry, PointZone does not support crossing method!");
+ this.alert = false;
+ }
+ };
+ return PointZone;
+ }(Zone);
+
+ /**
+ * Position class for initializing particle positions.
+ * @extends Initialize
*/
+ var Position = /*#__PURE__*/function (_Initialize) {
+ _inheritsLoose(Position, _Initialize);
+ /**
+ * @type {PointZone|any}
+ * @private
+ */
- }, {
- key: 'initialize',
- value: function initialize(particle) {
- particle.rotation = this.a.getValue();
- particle.transform.rotationA = this.a.getValue();
+ /**
+ * @type {string}
+ */
- if (!this.same) particle.transform.rotationB = this.b.getValue();
- }
- }, {
- key: 'applyBehaviour',
+ /**
+ * Creates a new Position instance.
+ * @param {PointZone|any} [zone] - The zone to use for positioning. Defaults to a new PointZone if not provided.
+ */
+ function Position(zone) {
+ var _this;
+ _this = _Initialize.call(this) || this;
+ _this.zone = void 0;
+ _this.name = void 0;
+ _this.zone = Util.initValue(zone, new PointZone());
+ _this.name = "Position";
+ return _this;
+ }
+ /**
+ * Resets this initializer's parameters.
+ * @param {PointZone|any} [zone] - The new zone to use for positioning. Defaults to a new PointZone if not provided.
+ */
+ var _proto = Position.prototype;
+ _proto.reset = function reset(zone) {
+ this.zone = Util.initValue(zone, new PointZone());
+ }
- /**
- * Apply this behaviour for all particles every time
- *
- * @method applyBehaviour
- * @memberof Proton#Proton.Rotate
- * @instance
- *
- * @param {Proton.Particle} particle
- * @param {Number} time the integrate time 1/ms
- * @param {Int} index the particle index
+ /**
+ * Initializes the particle's position.
+ * @param {object} target - The particle to initialize.
+ * @param {object} target.p - The particle's position object.
+ * @param {number} target.p.x - The particle's x coordinate.
+ * @param {number} target.p.y - The particle's y coordinate.
+ */;
+ _proto.initialize = function initialize(target) {
+ this.zone.getPosition();
+ target.p.x = this.zone.vector.x;
+ target.p.y = this.zone.vector.y;
+ };
+ return Position;
+ }(Initialize);
+
+ /**
+ * Velocity class for initializing particle velocities.
+ * @extends Initialize
*/
- value: function applyBehaviour(particle, time, index) {
- this.calculate(particle, time, index);
-
- if (!this.same) {
- if (this.style == 'to' || this.style == 'TO' || this.style == '_') {
- particle.rotation += particle.transform.rotationB + (particle.transform.rotationA - particle.transform.rotationB) * this.energy;
- } else {
- particle.rotation += particle.transform.rotationB;
- }
- } else if (this.a.a == "V" || this.a.a == "Velocity" || this.a.a == "v") {
- //beta...
- particle.rotation = particle.getDirection();
- }
- }
- }]);
- return Rotate;
-}(Behaviour);
-
-var Color = function (_Behaviour) {
- inherits(Color, _Behaviour);
+ var Velocity = /*#__PURE__*/function (_Initialize) {
+ _inheritsLoose(Velocity, _Initialize);
+ /**
+ * @type {Span}
+ * @private
+ */
/**
- * @memberof! Proton#
- * @augments Proton.Behaviour
- * @constructor
- * @alias Proton.Color
- *
- * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black
- * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=easeLinear] this behaviour's easing
- *
- * @property {String} name The Behaviour name
+ * @type {Span}
+ * @private
*/
- function Color(a, b, life, easing) {
- classCallCheck(this, Color);
- var _this = possibleConstructorReturn(this, (Color.__proto__ || Object.getPrototypeOf(Color)).call(this, life, easing));
+ /**
+ * @type {string}
+ */
- _this.reset(a, b);
- _this.name = "Color";
- return _this;
+ /**
+ * Creates a new Velocity instance.
+ * @param {number|Span} [rpan] - The radial component of the velocity or its range.
+ * @param {number|Span} [thapan] - The angular component of the velocity or its range.
+ * @param {string} [type='vector'] - The type of velocity ('vector' or 'polar').
+ */
+ function Velocity(rpan, thapan, type) {
+ var _this;
+ _this = _Initialize.call(this) || this;
+ _this.rPan = void 0;
+ _this.thaPan = void 0;
+ _this.name = void 0;
+ _this.rPan = Span.setSpanValue(rpan);
+ _this.thaPan = Span.setSpanValue(thapan);
+ _this.type = Util.initValue(type, "vector");
+ _this.name = "Velocity";
+ return _this;
}
/**
- * Reset this behaviour's parameters
- *
- * @method reset
- * @memberof Proton#Proton.Color
- * @instance
- *
- * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black
- * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=easeLinear] this behaviour's easing
+ * Resets the velocity parameters.
+ * @param {number|Span} [rpan] - The radial component of the velocity or its range.
+ * @param {number|Span} [thapan] - The angular component of the velocity or its range.
+ * @param {string} [type='vector'] - The type of velocity ('vector' or 'polar').
*/
+ var _proto = Velocity.prototype;
+ _proto.reset = function reset(rpan, thapan, type) {
+ this.rPan = Span.setSpanValue(rpan);
+ this.thaPan = Span.setSpanValue(thapan);
+ this.type = Util.initValue(type, "vector");
+ }
+ /**
+ * Normalizes the velocity value.
+ * @param {number} vr - The velocity value to normalize.
+ * @returns {number} The normalized velocity value.
+ * @private
+ */;
+ _proto.normalizeVelocity = function normalizeVelocity(vr) {
+ return vr * Proton.MEASURE;
+ }
- createClass(Color, [{
- key: 'reset',
- value: function reset(a, b, life, easing) {
- this.a = ArraySpan.createArraySpan(a);
- this.b = ArraySpan.createArraySpan(b);
-
- life && get(Color.prototype.__proto__ || Object.getPrototypeOf(Color.prototype), 'reset', this).call(this, life, easing);
- }
+ /**
+ * Initializes the particle's velocity.
+ * @param {object} target - The particle to initialize.
+ */;
+ _proto.initialize = function initialize(target) {
+ if (this.type === "p" || this.type === "P" || this.type === "polar") {
+ var polar2d = new Polar2D(this.normalizeVelocity(this.rPan.getValue()), this.thaPan.getValue() * MathUtil.PI_180);
+ target.v.x = polar2d.getX();
+ target.v.y = polar2d.getY();
+ } else {
+ target.v.x = this.normalizeVelocity(this.rPan.getValue());
+ target.v.y = this.normalizeVelocity(this.thaPan.getValue());
+ }
+ };
+ return Velocity;
+ }(Initialize);
- /**
- * Initialize the behaviour's parameters for all particles
- *
- * @method initialize
- * @memberof Proton#Proton.Color
- * @instance
- *
- * @param {Proton.Particle} particle
- */
-
- }, {
- key: 'initialize',
- value: function initialize(particle) {
- particle.color = this.a.getValue();
- particle.transform.colorA = ColorUtil.hexToRGB(particle.color);
-
- if (this.b) particle.transform.colorB = ColorUtil.hexToRGB(this.b.getValue());
- }
- }, {
- key: 'applyBehaviour',
-
-
- /**
- * Apply this behaviour for all particles every time
- *
- * @method applyBehaviour
- * @memberof Proton#Proton.Color
- * @instance
- *
- * @param {Proton.Particle} particle
- * @param {Number} the integrate time 1/ms
- * @param {Int} the particle index
- */
- value: function applyBehaviour(particle, time, index) {
- if (this.b) {
- this.calculate(particle, time, index);
-
- particle.transform.rgb.r = particle.transform.colorB.r + (particle.transform.colorA.r - particle.transform.colorB.r) * this.energy;
- particle.transform.rgb.g = particle.transform.colorB.g + (particle.transform.colorA.g - particle.transform.colorB.g) * this.energy;
- particle.transform.rgb.b = particle.transform.colorB.b + (particle.transform.colorA.b - particle.transform.colorB.b) * this.energy;
-
- particle.transform.rgb.r = Math.floor(particle.transform.rgb.r);
- particle.transform.rgb.g = Math.floor(particle.transform.rgb.g);
- particle.transform.rgb.b = Math.floor(particle.transform.rgb.b);
- } else {
- particle.transform.rgb.r = particle.transform.colorA.r;
- particle.transform.rgb.g = particle.transform.colorA.g;
- particle.transform.rgb.b = particle.transform.colorA.b;
- }
- }
- }]);
- return Color;
-}(Behaviour);
-
-var Repulsion = function (_Attraction) {
- inherits(Repulsion, _Attraction);
-
- /**
- * The oppisite of Proton.Attraction - turns the force
- *
- * @memberof! Proton#
- * @augments Proton#Proton.Attraction
- * @constructor
- * @alias Proton.Repulsion
- *
- * @todo add description for 'force' and 'radius'
- *
- * @param {Proton.Vector2D} targetPosition the attraction point coordinates
- * @param {Number} [force=100]
- * @param {Number} [radius=1000]
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=ease.easeLinear] this behaviour's easing
- *
- * @property {Number} force
- * @property {String} name The Behaviour name
- */
- function Repulsion(targetPosition, force, radius, life, easing) {
- classCallCheck(this, Repulsion);
-
- var _this = possibleConstructorReturn(this, (Repulsion.__proto__ || Object.getPrototypeOf(Repulsion)).call(this, targetPosition, force, radius, life, easing));
-
- _this.force *= -1;
- _this.name = "Repulsion";
- return _this;
- }
-
- /**
- * Reset this behaviour's parameters
- *
- * @method reset
- * @memberof Proton#Proton.Repulsion
- * @instance
- *
- * @todo add description for 'force' and 'radius'
- *
- * @param {Proton.Vector2D} targetPosition the attraction point coordinates
- * @param {Number} [force=100]
- * @param {Number} [radius=1000]
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=ease.easeLinear] this behaviour's easing
- */
-
-
- createClass(Repulsion, [{
- key: 'reset',
- value: function reset(targetPosition, force, radius, life, easing) {
- get(Repulsion.prototype.__proto__ || Object.getPrototypeOf(Repulsion.prototype), 'reset', this).call(this, targetPosition, force, radius, life, easing);
- this.force *= -1;
- }
- }]);
- return Repulsion;
-}(Attraction);
-
-var GravityWell = function (_Behaviour) {
- inherits(GravityWell, _Behaviour);
-
- /**
- * @memberof! Proton#
- * @augments Behaviour
- * @constructor
- * @alias GravityWell
- *
- * @param {Vector2D} [centerPoint=new Vector2D] The point in the center
- * @param {Number} [force=100] The force
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=easeLinear] this behaviour's easing
- *
- * @property {String} name The Behaviour name
- */
- function GravityWell(centerPoint, force, life, easing) {
- classCallCheck(this, GravityWell);
-
- var _this = possibleConstructorReturn(this, (GravityWell.__proto__ || Object.getPrototypeOf(GravityWell)).call(this, life, easing));
-
- _this.distanceVec = new Vector2D();
- _this.centerPoint = Util.initValue(centerPoint, new Vector2D());
- _this.force = Util.initValue(_this.normalizeValue(force), 100);
-
- _this.name = "GravityWell";
- return _this;
- }
-
- /**
- * Reset this behaviour's parameters
- *
- * @method reset
- * @memberof Proton#GravityWell
- * @instance
- *
- * @param {Vector2D} [centerPoint=new Vector2D] The point in the center
- * @param {Number} [force=100] The force
- * @param {Number} [life=Infinity] this behaviour's life
- * @param {String} [easing=easeLinear] this behaviour's easing
- */
-
-
- createClass(GravityWell, [{
- key: 'reset',
- value: function reset(centerPoint, force, life, easing) {
- this.distanceVec = new Vector2D();
- this.centerPoint = Util.initValue(centerPoint, new Vector2D());
- this.force = Util.initValue(this.normalizeValue(force), 100);
-
- life && get(GravityWell.prototype.__proto__ || Object.getPrototypeOf(GravityWell.prototype), 'reset', this).call(this, life, easing);
- }
- }, {
- key: 'initialize',
-
-
- /**
- * @inheritdoc
+ /**
+ * Mass class for initializing particle mass.
+ * @extends Initialize
*/
- value: function initialize(particle) {}
- }, {
- key: 'applyBehaviour',
+ var Mass = /*#__PURE__*/function (_Initialize) {
+ _inheritsLoose(Mass, _Initialize);
+ /**
+ * @type {Span}
+ * @private
+ */
+ /**
+ * @type {string}
+ */
- /**
- * Apply this behaviour for all particles every time
- *
- * @method applyBehaviour
- * @memberof Proton#GravityWell
- * @instance
- *
- * @param {Particle} particle
- * @param {Number} the integrate time 1/ms
- * @param {Int} the particle index
- */
- value: function applyBehaviour(particle, time, index) {
- this.distanceVec.set(this.centerPoint.x - particle.p.x, this.centerPoint.y - particle.p.y);
- var distanceSq = this.distanceVec.lengthSq();
-
- if (distanceSq != 0) {
- var distance = this.distanceVec.length();
- var factor = this.force * time / (distanceSq * distance);
-
- particle.v.x += factor * this.distanceVec.x;
- particle.v.y += factor * this.distanceVec.y;
- }
- }
- }]);
- return GravityWell;
-}(Behaviour);
-
-var InitializeUtil = {
- initialize: function initialize(emitter, particle, initializes) {
- var length = initializes.length;
- var i = void 0;
-
- for (i = 0; i < length; i++) {
- if (initializes[i] instanceof Initialize) initializes[i].init(emitter, particle);else this.init(emitter, particle, initializes[i]);
- }
-
- this.bindEmitter(emitter, particle);
- },
-
-
- //////////////////////init//////////////////////
- init: function init(emitter, particle, initialize) {
- Util.setPrototypeByObject(particle, initialize);
- Util.setVector2DByObject(particle, initialize);
- },
- bindEmitter: function bindEmitter(emitter, particle) {
- if (emitter.bindEmitter) {
- particle.p.add(emitter.p);
- particle.v.add(emitter.v);
- particle.a.add(emitter.a);
-
- particle.v.rotate(MathUtils.degreeTransform(emitter.rotation));
- }
- }
-};
-
-var Emitter = function (_Particle) {
- inherits(Emitter, _Particle);
-
- /**
- * You can use this emit particles.
- *
- * It will dispatch follow events:
- * PARTICLE_CREATED
- * PARTICLE_UPDATA
- * PARTICLE_DEAD
- *
- * @class Emitter
- * @constructor
- * @param {Object} pObj the parameters object;
- * for example {damping:0.01,bindEmitter:false}
- */
- function Emitter(pObj) {
- classCallCheck(this, Emitter);
-
- var _this = possibleConstructorReturn(this, (Emitter.__proto__ || Object.getPrototypeOf(Emitter)).call(this, pObj));
-
- _this.initializes = [];
- _this.particles = [];
- _this.behaviours = [];
-
- _this.emitSpeed = 0;
- _this.emitTime = 0;
- _this.totalTime = -1;
-
- /**
- * The friction coefficient for all particle emit by This;
- * @property damping
- * @type {Number}
- * @default 0.006
- */
- _this.damping = .006;
+ /**
+ * Creates a new Mass instance.
+ * @param {number|Span} a - The mass value or the lower bound of the mass range.
+ * @param {number} [b] - The upper bound of the mass range (if a is a number).
+ * @param {boolean} [c] - Whether to use center-based calculation (if a and b are numbers).
+ */
+ function Mass(a, b, c) {
+ var _this;
+ _this = _Initialize.call(this) || this;
+ _this.massPan = void 0;
+ _this.name = void 0;
+ _this.massPan = Span.setSpanValue(a, b, c);
+ _this.name = "Mass";
+ return _this;
+ }
- /**
- * If bindEmitter the particles can bind this emitter's property;
- * @property bindEmitter
- * @type {Boolean}
- * @default true
+ /**
+ * Initializes the mass of a target particle.
+ * @param {object} target - The target particle to initialize.
+ */
+ var _proto = Mass.prototype;
+ _proto.initialize = function initialize(target) {
+ target.mass = this.massPan.getValue();
+ };
+ return Mass;
+ }(Initialize);
+
+ /**
+ * Radius class for initializing particle radius.
+ * @extends Initialize
*/
- _this.bindEmitter = true;
+ var Radius = /*#__PURE__*/function (_Initialize) {
+ _inheritsLoose(Radius, _Initialize);
+ /**
+ * @type {Span}
+ */
- /**
- * The number of particles per second emit (a [particle]/b [s]);
- * @property rate
- * @type {Rate}
- * @default Rate(1, .1)
- */
- _this.rate = new Rate(1, .1);
-
- _this.id = 'emitter_' + Emitter.ID++;
- _this.name = 'Emitter';
- return _this;
- }
-
- /**
- * start emit particle
- * @method emit
- * @param {Number} emitTime begin emit time;
- * @param {String} life the life of this emitter
- */
-
-
- createClass(Emitter, [{
- key: 'emit',
- value: function emit(totalTime, life) {
- this.stoped = false;
- this.emitTime = 0;
- this.totalTime = Util.initValue(totalTime, Infinity);
-
- if (life == true || life == 'life' || life == 'destroy') {
- this.life = totalTime == 'once' ? 1 : this.totalTime;
- } else if (!isNaN(life)) {
- this.life = life;
- }
-
- this.rate.init();
- }
-
- /**
- * stop emiting
- * @method stop
- */
+ /**
+ * @type {string}
+ */
- }, {
- key: 'stop',
- value: function stop() {
- this.totalTime = -1;
- this.emitTime = 0;
- this.stoped = true;
- }
- }, {
- key: 'preEmit',
- value: function preEmit(time) {
- var oldStoped = this.stoped;
- var oldEmitTime = this.emitTime;
- var oldTotalTime = this.totalTime;
-
- this.stoped = false;
- this.emitTime = 0;
- this.totalTime = time;
- this.rate.init();
-
- var step = 0.0167;
- while (time > step) {
- time -= step;
- this.update(step);
- }
-
- this.stoped = oldStoped;
- this.emitTime = oldEmitTime + Math.max(time, 0);
- this.totalTime = oldTotalTime;
- }
-
- /**
- * remove current all particles
- * @method removeAllParticles
- */
+ /**
+ * Creates a new Radius instance.
+ * @param {number|Span} a - The radius value or the lower bound of the radius range.
+ * @param {number} [b] - The upper bound of the radius range (if a is a number).
+ * @param {boolean} [c] - Whether to use center-based calculation (if a and b are numbers).
+ */
+ function Radius(a, b, c) {
+ var _this;
+ _this = _Initialize.call(this) || this;
+ _this.radius = void 0;
+ _this.name = void 0;
+ _this.radius = Span.setSpanValue(a, b, c);
+ _this.name = "Radius";
+ return _this;
+ }
- }, {
- key: 'removeAllParticles',
- value: function removeAllParticles() {
- var i = this.particles.length;
- while (i--) {
- this.particles[i].dead = true;
- }
- }
-
- /**
- * add initialize to this emitter
- * @method addSelfInitialize
- */
+ /**
+ * Resets this initializer's parameters.
+ * @param {number|Span} a - The radius value or the lower bound of the radius range.
+ * @param {number} [b] - The upper bound of the radius range (if a is a number).
+ * @param {boolean} [c] - Whether to use center-based calculation (if a and b are numbers).
+ */
+ var _proto = Radius.prototype;
+ _proto.reset = function reset(a, b, c) {
+ this.radius = Span.setSpanValue(a, b, c);
+ }
- }, {
- key: 'addSelfInitialize',
- value: function addSelfInitialize(pObj) {
- if (pObj['init']) {
- pObj.init(this);
- } else {
- this.initAll();
- }
- }
-
- /**
- * add the Initialize to particles;
- *
- * you can use initializes array:for example emitter.addInitialize(initialize1,initialize2,initialize3);
- * @method addInitialize
- * @param {Initialize} initialize like this new Radius(1, 12)
+ /**
+ * Initializes the particle's radius.
+ * @param {Particle} particle - The particle to initialize.
+ */;
+ _proto.initialize = function initialize(particle) {
+ particle.radius = this.radius.getValue();
+ particle.data.oldRadius = particle.radius;
+ };
+ return Radius;
+ }(Initialize);
+
+ /**
+ * Body class for initializing particle bodies.
+ * @extends Initialize
*/
+ var Body = /*#__PURE__*/function (_Initialize) {
+ _inheritsLoose(Body, _Initialize);
+ /**
+ * @type {ArraySpan}
+ * @private
+ */
- }, {
- key: 'addInitialize',
- value: function addInitialize() {
- for (var _len = arguments.length, rest = Array(_len), _key = 0; _key < _len; _key++) {
- rest[_key] = arguments[_key];
- }
-
- var i = rest.length;
- while (i--) {
- this.initializes.push(rest[i]);
- }
- }
-
- /**
- * remove the Initialize
- * @method removeInitialize
- * @param {Initialize} initialize a initialize
- */
+ /**
+ * @type {string}
+ */
- }, {
- key: 'removeInitialize',
- value: function removeInitialize(initializer) {
- var index = this.initializes.indexOf(initializer);
- if (index > -1) this.initializes.splice(index, 1);
- }
+ /**
+ * Creates a new Body instance.
+ * @param {string|object|ArraySpan} image - The image source or object to use for the particle body.
+ * @param {number} [w=20] - The width of the particle body.
+ * @param {number} [h] - The height of the particle body. Defaults to the width if not provided.
+ */
+ function Body(image, w, h) {
+ var _this;
+ _this = _Initialize.call(this) || this;
+ _this.image = void 0;
+ _this.name = void 0;
+ _this.image = _this.setSpanValue(image);
+ _this.w = Util.initValue(w, 20);
+ _this.h = Util.initValue(h, _this.w);
+ _this.name = "Body";
+ return _this;
+ }
- /**
- * remove all Initializes
- * @method removeInitializers
- */
+ /**
+ * Initializes the particle's body.
+ * @param {object} particle - The particle to initialize.
+ */
+ var _proto = Body.prototype;
+ _proto.initialize = function initialize(particle) {
+ var imageTarget = this.image.getValue();
+ if (typeof imageTarget === "string") {
+ particle.body = {
+ width: this.w,
+ height: this.h,
+ src: imageTarget,
+ isInner: true,
+ inner: true
+ };
+ } else {
+ particle.body = imageTarget;
+ }
+ }
- }, {
- key: 'removeAllInitializers',
- value: function removeAllInitializers() {
- Util.destroyArray(this.initializes);
- }
-
- /**
- * add the Behaviour to particles;
- *
- * you can use Behaviours array:emitter.addBehaviour(Behaviour1,Behaviour2,Behaviour3);
- * @method addBehaviour
- * @param {Behaviour} behaviour like this new Color('random')
- */
+ /**
+ * Sets the span value for the image.
+ * @param {string|object|ArraySpan} image - The image source or object to set as span value.
+ * @returns {ArraySpan} The ArraySpan instance.
+ * @private
+ */;
+ _proto.setSpanValue = function setSpanValue(image) {
+ return image instanceof ArraySpan ? image : new ArraySpan(image);
+ };
+ return Body;
+ }(Initialize);
- }, {
- key: 'addBehaviour',
- value: function addBehaviour() {
- for (var _len2 = arguments.length, rest = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
- rest[_key2] = arguments[_key2];
- }
-
- var i = arguments.length;
- while (i--) {
- var behaviour = rest[i];
- this.behaviours.push(behaviour);
- if (behaviour.parents) behaviour.parents.push(this);
- }
- }
-
- /**
- * remove the Behaviour
- * @method removeBehaviour
- * @param {Behaviour} behaviour a behaviour
+ /**
+ * The Behaviour class is the base for the other Behaviour
+ * @class
*/
+ var Behaviour = /*#__PURE__*/function () {
+ /**
+ * Create a new Behaviour instance
+ * @param {number} [life=Infinity] - The behaviour's life
+ * @param {string} [easing='easeLinear'] - The behaviour's decaying trend, for example ease.easeOutQuart
+ */
+ function Behaviour(life, easing) {
+ /**
+ * The behaviour's life
+ * @type {number}
+ */
+ this.life = Util.initValue(life, Infinity);
+
+ /**
+ * The behaviour's easing function
+ * @type {function}
+ */
+ this.easing = ease.getEasing(easing);
+
+ /**
+ * The behaviour's current age
+ * @type {number}
+ */
+ this.age = 0;
+
+ /**
+ * The behaviour's current energy
+ * @type {number}
+ */
+ this.energy = 1;
+
+ /**
+ * Whether the behaviour is dead
+ * @type {boolean}
+ */
+ this.dead = false;
+
+ /**
+ * The behaviour's parent emitters
+ * @type {Array}
+ */
+ this.parents = [];
+
+ /**
+ * The behaviour's unique id
+ * @type {string}
+ */
+ this.id = "Behaviour_" + Behaviour.id++;
+
+ /**
+ * The behaviour's name
+ * @type {string}
+ */
+ this.name = "Behaviour";
+ }
- }, {
- key: 'removeBehaviour',
- value: function removeBehaviour(behaviour) {
- var index = this.behaviours.indexOf(behaviour);
- this.behaviours.splice(index, 1);
+ /**
+ * Reset this behaviour's parameters
+ * @param {number} [life=Infinity] - This behaviour's new life
+ * @param {string} [easing='easeLinear'] - This behaviour's new easing
+ */
+ var _proto = Behaviour.prototype;
+ _proto.reset = function reset(life, easing) {
+ this.life = Util.initValue(life, Infinity);
+ this.easing = ease.getEasing(easing);
+ }
- if (behaviour.parents) {
- index = behaviour.parents.indexOf(behaviour);
- behaviour.parents.splice(index, 1);
- }
+ /**
+ * Normalize a force by 1:100
+ * @param {Proton.Vector2D} force - The force to normalize
+ * @returns {Proton.Vector2D} The normalized force
+ */;
+ _proto.normalizeForce = function normalizeForce(force) {
+ return force.multiplyScalar(Proton.MEASURE);
+ }
- return index;
- }
+ /**
+ * Normalize a value by 1:100
+ * @param {number} value - The value to normalize
+ * @returns {number} The normalized value
+ */;
+ _proto.normalizeValue = function normalizeValue(value) {
+ return value * Proton.MEASURE;
+ }
- /**
- * remove all behaviours
- * @method removeAllBehaviours
- */
+ /**
+ * Initialize the behaviour's parameters for a particle
+ * @param {Proton.Particle} particle - The particle to initialize
+ */;
+ _proto.initialize = function initialize(particle) {}
- }, {
- key: 'removeAllBehaviours',
- value: function removeAllBehaviours() {
- Util.destroyArray(this.behaviours);
- }
-
- // emitter update
-
- }, {
- key: 'update',
- value: function update(time) {
- this.age += time;
- if (this.age >= this.life || this.dead) this.destroy();
-
- this.emitting(time);
- this.integrate(time);
- }
- }, {
- key: 'integrate',
- value: function integrate(time) {
- if (!this.parent) return;
-
- var damping = 1 - this.damping;
- this.parent.integrator.calculate(this, time, damping);
-
- var length = this.particles.length;
- var i = void 0,
- particle = void 0;
-
- for (i = length - 1; i >= 0; i--) {
- particle = this.particles[i];
-
- // particle update
- particle.update(time, i);
- this.parent.integrator.calculate(particle, time, damping);
- this.dispatch("PARTICLE_UPDATE", particle);
-
- // check dead
- if (particle.dead) {
- this.dispatch("PARTICLE_DEAD", particle);
-
- this.parent.pool.expire(particle);
- this.particles.splice(i, 1);
- }
- }
- }
- }, {
- key: 'dispatch',
- value: function dispatch(event, target) {
- this.parent && this.parent.dispatchEvent(event, target);
- this.bindEvent && this.dispatchEvent(event, target);
- }
- }, {
- key: 'emitting',
- value: function emitting(time) {
- if (this.totalTime == 'once') {
- var i = void 0;
- var length = this.rate.getValue(99999);
-
- if (length > 0) this.emitSpeed = length;
- for (i = 0; i < length; i++) {
- this.createParticle();
- }this.totalTime = 'none';
- } else {
- this.emitTime += time;
-
- if (this.emitTime < this.totalTime) {
- var _length = this.rate.getValue(time);
- var _i = void 0;
-
- if (_length > 0) this.emitSpeed = _length;
- for (_i = 0; _i < _length; _i++) {
- this.createParticle();
- }
- }
- }
- }
-
- /**
- * create single particle;
- *
- * can use emit({x:10},new Gravity(10),{'particleUpdate',fun}) or emit([{x:10},new Initialize],new Gravity(10),{'particleUpdate',fun})
- * @method removeAllParticles
- */
+ /**
+ * Compute the behaviour's life cycle
+ * @param {Proton.Particle} particle - The particle to calculate for
+ * @param {number} time - The integrate time 1/ms
+ * @param {number} index - The particle index
+ */;
+ _proto.calculate = function calculate(particle, time, index) {
+ this.age += time;
+ if (this.age >= this.life || this.dead) {
+ this.energy = 0;
+ this.dead = true;
+ this.destroy();
+ } else {
+ var scale = this.easing(particle.age / particle.life);
+ this.energy = Math.max(1 - scale, 0);
+ }
+ }
- }, {
- key: 'createParticle',
- value: function createParticle(initialize, behaviour) {
- var particle = this.parent.pool.get(Particle);
- this.setupParticle(particle, initialize, behaviour);
- this.dispatch("PARTICLE_CREATED", particle);
-
- return particle;
- }
- }, {
- key: 'setupParticle',
- value: function setupParticle(particle, initialize, behaviour) {
- var initializes = this.initializes;
- var behaviours = this.behaviours;
-
- if (initialize) {
- initializes = Util.isArray(initialize) ? initialize : [initialize];
- }
-
- if (behaviour) {
- behaviour = Util.isArray(behaviour) ? behaviour : [behaviour];
- }
-
- particle.reset();
- InitializeUtil.initialize(this, particle, initializes);
- particle.addBehaviours(behaviours);
- particle.parent = this;
-
- this.particles.push(particle);
- }
- }, {
- key: 'remove',
- value: function remove() {
- this.stop();
- Util.destroy(this.particles);
- }
-
- /**
- * Destory this Emitter
- * @method destroy
- */
+ /**
+ * Apply this behaviour to a particle
+ * @param {Proton.Particle} particle - The particle to apply the behaviour to
+ * @param {number} time - The integrate time 1/ms
+ * @param {number} index - The particle index
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ this.calculate(particle, time, index);
+ }
- }, {
- key: 'destroy',
- value: function destroy(slow) {
- this.dead = true;
- this.remove();
- this.removeAllInitializers();
- this.removeAllBehaviours();
- this.parent && this.parent.removeEmitter(this);
- }
- }]);
- return Emitter;
-}(Particle);
-
-Emitter.ID = 0;
-EventDispatcher.bind(Emitter);
-
-var BehaviourEmitter = function (_Emitter) {
- inherits(BehaviourEmitter, _Emitter);
-
- /**
- * The BehaviourEmitter class inherits from Proton.Emitter
- *
- * use the BehaviourEmitter you can add behaviours to self;
- * @class Proton.BehaviourEmitter
- * @constructor
- * @param {Object} pObj the parameters object;
- */
- function BehaviourEmitter(pObj) {
- classCallCheck(this, BehaviourEmitter);
-
- var _this = possibleConstructorReturn(this, (BehaviourEmitter.__proto__ || Object.getPrototypeOf(BehaviourEmitter)).call(this, pObj));
-
- _this.selfBehaviours = [];
- return _this;
- }
-
- createClass(BehaviourEmitter, [{
- key: 'addSelfBehaviour',
-
-
- /**
- * add the Behaviour to emitter;
- *
- * you can use Behaviours array:emitter.addSelfBehaviour(Behaviour1,Behaviour2,Behaviour3);
- * @method addSelfBehaviour
- * @param {Proton.Behaviour} behaviour like this new Proton.Color('random')
- */
- value: function addSelfBehaviour() {
- for (var _len = arguments.length, rest = Array(_len), _key = 0; _key < _len; _key++) {
- rest[_key] = arguments[_key];
- }
-
- var length = rest.length;
- var i = void 0;
-
- for (i = 0; i < length; i++) {
- this.selfBehaviours.push(rest[i]);
- }
- }
- }, {
- key: 'removeSelfBehaviour',
-
-
- /**
- * remove the Behaviour for self
- * @method removeSelfBehaviour
- * @param {Proton.Behaviour} behaviour a behaviour
- */
- value: function removeSelfBehaviour(behaviour) {
- var index = this.selfBehaviours.indexOf(behaviour);
- if (index > -1) this.selfBehaviours.splice(index, 1);
- }
- }, {
- key: 'update',
- value: function update(time) {
- get(BehaviourEmitter.prototype.__proto__ || Object.getPrototypeOf(BehaviourEmitter.prototype), 'update', this).call(this, time);
-
- if (!this.sleep) {
- var length = this.selfBehaviours.length;
- var i = void 0;
-
- for (i = 0; i < length; i++) {
- this.selfBehaviours[i].applyBehaviour(this, time, i);
- }
- }
- }
- }]);
- return BehaviourEmitter;
-}(Emitter);
-
-var FollowEmitter = function (_Emitter) {
- inherits(FollowEmitter, _Emitter);
-
- /**
- * The FollowEmitter class inherits from Proton.Emitter
- *
- * use the FollowEmitter will emit particle when mousemoving
- *
- * @class Proton.FollowEmitter
- * @constructor
- * @param {Element} mouseTarget mouseevent's target;
- * @param {Number} ease the easing of following speed;
- * @default 0.7
- * @param {Object} pObj the parameters object;
- */
- function FollowEmitter(mouseTarget, ease, pObj) {
- classCallCheck(this, FollowEmitter);
-
- var _this = possibleConstructorReturn(this, (FollowEmitter.__proto__ || Object.getPrototypeOf(FollowEmitter)).call(this, pObj));
-
- _this.mouseTarget = Util.initValue(mouseTarget, window);
- _this.ease = Util.initValue(ease, .7);
-
- _this._allowEmitting = false;
- _this.initEventHandler();
- return _this;
- }
-
- createClass(FollowEmitter, [{
- key: 'initEventHandler',
- value: function initEventHandler() {
- var _this2 = this;
-
- this.mousemoveHandler = function (e) {
- return _this2.mousemove.call(_this2, e);
- };
- this.mousedownHandler = function (e) {
- return _this2.mousedown.call(_this2, e);
- };
- this.mouseupHandler = function (e) {
- return _this2.mouseup.call(_this2, e);
- };
-
- this.mouseTarget.addEventListener('mousemove', this.mousemoveHandler, false);
- }
-
- /**
- * start emit particle
- * @method emit
- */
+ /**
+ * Destroy this behaviour
+ */;
+ _proto.destroy = function destroy() {
+ var i = this.parents.length;
+ while (i--) {
+ this.parents[i].removeBehaviour(this);
+ }
+ this.parents.length = 0;
+ };
+ return Behaviour;
+ }();
+ Behaviour.id = 0;
- }, {
- key: 'emit',
- value: function emit() {
- this._allowEmitting = true;
- }
+ var Force = /*#__PURE__*/function (_Behaviour) {
+ _inheritsLoose(Force, _Behaviour);
+ /**
+ * @memberof! Proton#
+ * @augments Proton.Behaviour
+ * @constructor
+ * @alias Proton.Force
+ *
+ * @param {Number} fx
+ * @param {Number} fy
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ *
+ * @property {String} name The Behaviour name
+ */
+ function Force(fx, fy, life, easing) {
+ var _this;
+ _this = _Behaviour.call(this, life, easing) || this;
+ _this.force = _this.normalizeForce(new Vector2D(fx, fy));
+ _this.name = "Force";
+ return _this;
+ }
- /**
- * stop emiting
- * @method stop
- */
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @method reset
+ * @memberof Proton#Proton.Force
+ * @instance
+ *
+ * @param {Number} fx
+ * @param {Number} fy
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ */
+ var _proto = Force.prototype;
+ _proto.reset = function reset(fx, fy, life, easing) {
+ this.force = this.normalizeForce(new Vector2D(fx, fy));
+ life && _Behaviour.prototype.reset.call(this, life, easing);
+ }
- }, {
- key: 'stop',
- value: function stop() {
- this._allowEmitting = false;
- }
- }, {
- key: 'mousemove',
- value: function mousemove(e) {
- if (e.layerX || e.layerX === 0) {
- this.p.x += (e.layerX - this.p.x) * this.ease;
- this.p.y += (e.layerY - this.p.y) * this.ease;
- } else if (e.offsetX || e.offsetX === 0) {
- this.p.x += (e.offsetX - this.p.x) * this.ease;
- this.p.y += (e.offsetY - this.p.y) * this.ease;
- }
-
- if (this._allowEmitting) get(FollowEmitter.prototype.__proto__ || Object.getPrototypeOf(FollowEmitter.prototype), 'emit', this).call(this, 'once');
- }
- }, {
- key: 'destroy',
-
-
- /**
- * Destory this Emitter
- * @method destroy
+ /**
+ * Apply this behaviour for all particles every time
+ *
+ * @method applyBehaviour
+ * @memberof Proton#Proton.Force
+ * @instance
+ *
+ * @param {Proton.Particle} particle
+ * @param {Number} the integrate time 1/ms
+ * @param {Int} the particle index
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ this.calculate(particle, time, index);
+ particle.a.add(this.force);
+ };
+ return Force;
+ }(Behaviour);
+
+ /**
+ * Attraction behavior for particles.
+ * This behaviour makes particles follow a specific target position.
+ * @extends Behaviour
*/
- value: function destroy() {
- get(FollowEmitter.prototype.__proto__ || Object.getPrototypeOf(FollowEmitter.prototype), 'destroy', this).call(this);
- this.mouseTarget.removeEventListener('mousemove', this.mousemoveHandler, false);
- }
- }]);
- return FollowEmitter;
-}(Emitter);
-
-var BaseRenderer = function () {
- function BaseRenderer(element, stroke) {
- classCallCheck(this, BaseRenderer);
-
- this.element = element;
- this.stroke = stroke;
-
- this.initHandler();
-
- this.circleConf = { isCircle: true };
- this.pool = new Pool();
- this.name = 'BaseRenderer';
+ var Attraction = /*#__PURE__*/function (_Behaviour) {
+ _inheritsLoose(Attraction, _Behaviour);
+ /**
+ * Creates an instance of Attraction.
+ * @param {Vector2D} targetPosition - The attraction point coordinates.
+ * @param {number} [force=100] - The strength of the attraction force.
+ * @param {number} [radius=1000] - The radius of influence for the attraction.
+ * @param {number} [life=Infinity] - The life span of this behaviour.
+ * @param {string} [easing='ease.easeLinear'] - The easing function for this behaviour.
+ */
+ function Attraction(targetPosition, force, radius, life, easing) {
+ var _this;
+ _this = _Behaviour.call(this, life, easing) || this;
+
+ /**
+ * The target position for attraction.
+ * @type {Vector2D}
+ */
+ _this.targetPosition = Util.initValue(targetPosition, new Vector2D());
+
+ /**
+ * The radius of influence for the attraction.
+ * @type {number}
+ */
+ _this.radius = Util.initValue(radius, 1000);
+
+ /**
+ * The strength of the attraction force.
+ * @type {number}
+ */
+ _this.force = Util.initValue(_this.normalizeValue(force), 100);
+
+ /**
+ * The squared radius (for optimization).
+ * @type {number}
+ */
+ _this.radiusSq = _this.radius * _this.radius;
+
+ /**
+ * The attraction force vector.
+ * @type {Vector2D}
+ */
+ _this.attractionForce = new Vector2D();
+
+ /**
+ * The squared length of the attraction force.
+ * @type {number}
+ */
+ _this.lengthSq = 0;
+
+ /**
+ * The name of the behaviour.
+ * @type {string}
+ */
+ _this.name = "Attraction";
+ return _this;
}
- createClass(BaseRenderer, [{
- key: 'setStroke',
- value: function setStroke(color, thinkness) {
- color = Util.initValue(color, '#000000');
- thinkness = Util.initValue(thinkness, 1);
-
- this.stroke = { color: color, thinkness: thinkness };
- }
- }, {
- key: 'initHandler',
- value: function initHandler() {
- var _this = this;
-
- this._protonUpdateHandler = function () {
- _this.onProtonUpdate.call(_this);
- };
- this._protonUpdateAfterHandler = function () {
- _this.onProtonUpdateAfter.call(_this);
- };
- this._emitterAddedHandler = function (emitter) {
- _this.onEmitterAdded.call(_this, emitter);
- };
- this._emitterRemovedHandler = function (emitter) {
- _this.onEmitterRemoved.call(_this, emitter);
- };
- this._particleCreatedHandler = function (particle) {
- _this.onParticleCreated.call(_this, particle);
- };
- this._particleUpdateHandler = function (particle) {
- _this.onParticleUpdate.call(_this, particle);
- };
- this._particleDeadHandler = function (particle) {
- _this.onParticleDead.call(_this, particle);
- };
- }
- }, {
- key: 'init',
- value: function init(proton) {
- this.parent = proton;
-
- proton.addEventListener('PROTON_UPDATE', this._protonUpdateHandler);
- proton.addEventListener('PROTON_UPDATE_AFTER', this._protonUpdateAfterHandler);
+ /**
+ * Resets the behaviour's parameters.
+ * @param {Vector2D} targetPosition - The new attraction point coordinates.
+ * @param {number} [force=100] - The new strength of the attraction force.
+ * @param {number} [radius=1000] - The new radius of influence for the attraction.
+ * @param {number} [life=Infinity] - The new life span of this behaviour.
+ * @param {string} [easing='ease.easeLinear'] - The new easing function for this behaviour.
+ */
+ var _proto = Attraction.prototype;
+ _proto.reset = function reset(targetPosition, force, radius, life, easing) {
+ this.targetPosition = Util.initValue(targetPosition, new Vector2D());
+ this.radius = Util.initValue(radius, 1000);
+ this.force = Util.initValue(this.normalizeValue(force), 100);
+ this.radiusSq = this.radius * this.radius;
+ this.attractionForce = new Vector2D();
+ this.lengthSq = 0;
+ life && _Behaviour.prototype.reset.call(this, life, easing);
+ }
- proton.addEventListener('EMITTER_ADDED', this._emitterAddedHandler);
- proton.addEventListener('EMITTER_REMOVED', this._emitterRemovedHandler);
+ /**
+ * Applies this behaviour to a particle.
+ * @param {Particle} particle - The particle to apply the behaviour to.
+ * @param {number} time - The current simulation time.
+ * @param {number} index - The index of the particle.
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ this.calculate(particle, time, index);
+ this.attractionForce.copy(this.targetPosition);
+ this.attractionForce.sub(particle.p);
+ this.lengthSq = this.attractionForce.lengthSq();
+ if (this.lengthSq > 0.00004 && this.lengthSq < this.radiusSq) {
+ this.attractionForce.normalize();
+ this.attractionForce.multiplyScalar(1 - this.lengthSq / this.radiusSq);
+ this.attractionForce.multiplyScalar(this.force);
+ particle.a.add(this.attractionForce);
+ }
+ };
+ return Attraction;
+ }(Behaviour);
+
+ var RandomDrift = /*#__PURE__*/function (_Behaviour) {
+ _inheritsLoose(RandomDrift, _Behaviour);
+ /**
+ * @memberof! Proton#
+ * @augments Behaviour
+ * @constructor
+ * @alias RandomDrift
+ *
+ * @param {Number} driftX X value of the new Vector2D
+ * @param {Number} driftY Y value of the new Vector2D
+ * @param {Number} delay How much delay the drift should have
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=easeLinear] this behaviour's easing
+ *
+ * @property {Number} time The time of the drift
+ * @property {String} name The Behaviour name
+ */
+ function RandomDrift(driftX, driftY, delay, life, easing) {
+ var _this;
+ _this = _Behaviour.call(this, life, easing) || this;
+ _this.reset(driftX, driftY, delay);
+ _this.time = 0;
+ _this.name = "RandomDrift";
+ return _this;
+ }
- proton.addEventListener('PARTICLE_CREATED', this._particleCreatedHandler);
- proton.addEventListener('PARTICLE_UPDATE', this._particleUpdateHandler);
- proton.addEventListener('PARTICLE_DEAD', this._particleDeadHandler);
- }
- }, {
- key: 'resize',
- value: function resize(width, height) {}
- }, {
- key: 'remove',
- value: function remove(proton) {
- this.parent.removeEventListener('PROTON_UPDATE', this._protonUpdateHandler);
- this.parent.removeEventListener('PROTON_UPDATE_AFTER', this._protonUpdateAfterHandler);
-
- this.parent.removeEventListener('EMITTER_ADDED', this._emitterAddedHandler);
- this.parent.removeEventListener('EMITTER_REMOVED', this._emitterRemovedHandler);
-
- this.parent.removeEventListener('PARTICLE_CREATED', this._particleCreatedHandler);
- this.parent.removeEventListener('PARTICLE_UPDATE', this._particleUpdateHandler);
- this.parent.removeEventListener('PARTICLE_DEAD', this._particleDeadHandler);
-
- this.parent = null;
- }
- }, {
- key: 'destroy',
- value: function destroy() {
- this.remove();
- }
- }, {
- key: 'onProtonUpdate',
- value: function onProtonUpdate() {}
- }, {
- key: 'onProtonUpdateAfter',
- value: function onProtonUpdateAfter() {}
- }, {
- key: 'onEmitterAdded',
- value: function onEmitterAdded(emitter) {}
- }, {
- key: 'onEmitterRemoved',
- value: function onEmitterRemoved(emitter) {}
- }, {
- key: 'onParticleCreated',
- value: function onParticleCreated(particle) {}
- }, {
- key: 'onParticleUpdate',
- value: function onParticleUpdate(particle) {}
- }, {
- key: 'onParticleDead',
- value: function onParticleDead(particle) {}
- }]);
- return BaseRenderer;
-}();
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @method reset
+ * @memberof Proton#RandomDrift
+ * @instance
+ *
+ * @param {Number} driftX X value of the new Vector2D
+ * @param {Number} driftY Y value of the new Vector2D
+ * @param {Number} delay How much delay the drift should have
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=easeLinear] this behaviour's easing
+ */
+ var _proto = RandomDrift.prototype;
+ _proto.reset = function reset(driftX, driftY, delay, life, easing) {
+ this.panFoce = new Vector2D(driftX, driftY);
+ this.panFoce = this.normalizeForce(this.panFoce);
+ this.delay = delay;
+ life && _Behaviour.prototype.reset.call(this, life, easing);
+ };
+ _proto.initialize = function initialize(particle) {
+ particle.data.time = 0;
+ }
-var CanvasRenderer = function (_BaseRenderer) {
- inherits(CanvasRenderer, _BaseRenderer);
+ /**
+ * Apply this behaviour for all particles every time
+ *
+ * @method applyBehaviour
+ * @memberof Proton#RandomDrift
+ * @instance
+ *
+ * @param {Particle} particle
+ * @param {Number} time the integrate time 1/ms
+ * @param {Int} index the particle index
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ this.calculate(particle, time, index);
+ particle.data.time += time;
+ if (particle.data.time >= this.delay) {
+ particle.a.addXY(MathUtil.randomAToB(-this.panFoce.x, this.panFoce.x), MathUtil.randomAToB(-this.panFoce.y, this.panFoce.y));
+ particle.data.time = 0;
+ }
+ };
+ return RandomDrift;
+ }(Behaviour);
+
+ var Gravity = /*#__PURE__*/function (_Force) {
+ _inheritsLoose(Gravity, _Force);
+ /**
+ * @memberof! Proton#
+ * @augments Proton#Proton.Force
+ * @constructor
+ * @alias Proton.Gravity
+ *
+ * @param {Number} g Gravity
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ *
+ * @property {String} name The Behaviour name
+ */
+ function Gravity(g, life, easing) {
+ var _this;
+ _this = _Force.call(this, 0, g, life, easing) || this;
+ _this.name = "Gravity";
+ return _this;
+ }
- function CanvasRenderer(element) {
- classCallCheck(this, CanvasRenderer);
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @method reset
+ * @memberof Proton#Proton.Gravity
+ * @instance
+ *
+ * @param {Number} g Gravity
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ */
+ var _proto = Gravity.prototype;
+ _proto.reset = function reset(g, life, easing) {
+ _Force.prototype.reset.call(this, 0, g, life, easing);
+ };
+ return Gravity;
+ }(Force);
+
+ var Collision = /*#__PURE__*/function (_Behaviour) {
+ _inheritsLoose(Collision, _Behaviour);
+ /**
+ * The callback after collision
+ *
+ * @callback Callback
+ *
+ * @param {Proton.Particle} particle
+ * @param {Proton.Paritcle} otherParticle
+ */
+ /**
+ * @memberof! Proton#
+ * @augments Proton.Behaviour
+ * @constructor
+ * @alias Proton.Collision
+ *
+ * @todo add description to mass
+ *
+ * @param {Proton.Emitter} [emitter=null] the attraction point coordinates
+ * @param {Boolean} [mass=true]
+ * @param {Callback} [callback=null] the callback after the collision
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ *
+ * @property {String} name The Behaviour name
+ */
+ function Collision(emitter, mass, callback, life, easing) {
+ var _this;
+ _this = _Behaviour.call(this, life, easing) || this;
+ _this.reset(emitter, mass, callback);
+ _this.newPool = [];
+ _this.pool = [];
+ _this.name = "Collision";
+ return _this;
+ }
- var _this = possibleConstructorReturn(this, (CanvasRenderer.__proto__ || Object.getPrototypeOf(CanvasRenderer)).call(this, element));
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @memberof Proton#Proton.Collision
+ * @method reset
+ * @instance
+ *
+ * @todo add description to mass
+ *
+ * @param {Proton.Emitter} [emitter=null] the attraction point coordinates
+ * @param {Boolean} [mass=true]
+ * @param {Callback} [callback=null] the callback after the collision
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ */
+ var _proto = Collision.prototype;
+ _proto.reset = function reset(emitter, mass, callback, life, easing) {
+ this.emitter = Util.initValue(emitter, null);
+ this.mass = Util.initValue(mass, true);
+ this.callback = Util.initValue(callback, null);
+ this.collisionPool = [];
+ this.delta = new Vector2D();
+ life && _Behaviour.prototype.reset.call(this, life, easing);
+ }
- _this.stroke = null;
- _this.context = _this.element.getContext("2d");
- _this.bufferCache = {};
+ /**
+ * Apply this behaviour for all particles every time
+ *
+ * @memberof Proton#Proton.Collision
+ * @method applyBehaviour
+ * @instance
+ *
+ * @param {Proton.Particle} particle
+ * @param {Number} time the integrate time 1/ms
+ * @param {Int} index the particle index
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ if (this.emitter) {
+ Util.sliceArray(this.emitter.particles, index, this.newPool);
+ } else {
+ Util.sliceArray(this.pool, index, this.newPool);
+ }
+ var length = this.newPool.length;
+ var otherParticle;
+ var lengthSq;
+ var overlap;
+ var totalMass;
+ var averageMass1, averageMass2;
+ var i;
+ for (i = 0; i < length; i++) {
+ otherParticle = this.newPool[i];
+ if (otherParticle !== particle) {
+ this.delta.copy(otherParticle.p);
+ this.delta.sub(particle.p);
+ lengthSq = this.delta.lengthSq();
+ var distance = particle.radius + otherParticle.radius;
+ if (lengthSq <= distance * distance) {
+ overlap = distance - Math.sqrt(lengthSq);
+ overlap += 0.5;
+ totalMass = particle.mass + otherParticle.mass;
+ averageMass1 = this.mass ? otherParticle.mass / totalMass : 0.5;
+ averageMass2 = this.mass ? particle.mass / totalMass : 0.5;
+ particle.p.add(this.delta.clone().normalize().multiplyScalar(overlap * -averageMass1));
+ otherParticle.p.add(this.delta.normalize().multiplyScalar(overlap * averageMass2));
+ this.callback && this.callback(particle, otherParticle);
+ }
+ }
+ }
+ };
+ return Collision;
+ }(Behaviour);
+
+ var CrossZone = /*#__PURE__*/function (_Behaviour) {
+ _inheritsLoose(CrossZone, _Behaviour);
+ /**
+ * Defines what happens if the particles come to the end of the specified zone
+ *
+ * @memberof! Proton#
+ * @augments Proton.Behaviour
+ * @constructor
+ * @alias Proton.CrossZone
+ *
+ * @param {Proton.Zone} zone can be any Proton.Zone - e.g. Proton.RectZone()
+ * @param {String} [crossType=dead] what happens if the particles pass the zone - allowed strings: dead | bound | cross
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ *
+ * @property {String} name The Behaviour name
+ */
+ function CrossZone(zone, crossType, life, easing) {
+ var _this;
+ _this = _Behaviour.call(this, life, easing) || this;
+ _this.reset(zone, crossType);
+ _this.name = "CrossZone";
+ return _this;
+ }
- _this.name = 'CanvasRenderer';
- return _this;
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @method reset
+ * @memberof Proton#Proton.CrossZone
+ * @instance
+ *
+ * @param {Proton.Zone} zone can be any Proton.Zone - e.g. Proton.RectZone()
+ * @param {String} [crossType=dead] what happens if the particles pass the zone - allowed strings: dead | bound | cross
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=easeLinear] this behaviour's easing
+ */
+ var _proto = CrossZone.prototype;
+ _proto.reset = function reset(zone, crossType, life, easing) {
+ this.zone = zone;
+ this.zone.crossType = Util.initValue(crossType, "dead");
+ life && _Behaviour.prototype.reset.call(this, life, easing);
}
- createClass(CanvasRenderer, [{
- key: 'resize',
- value: function resize(width, height) {
- this.element.width = width;
- this.element.height = height;
- }
- }, {
- key: 'onProtonUpdate',
- value: function onProtonUpdate() {
- this.context.clearRect(0, 0, this.element.width, this.element.height);
- }
- }, {
- key: 'onParticleCreated',
- value: function onParticleCreated(particle) {
- if (particle.body) ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);else particle.color = particle.color || '#ff0000';
- }
- }, {
- key: 'onParticleUpdate',
- value: function onParticleUpdate(particle) {
- if (particle.body) {
- if (particle.body instanceof Image) this.drawImage(particle);
- } else {
- this.drawCircle(particle);
- }
- }
- }, {
- key: 'onParticleDead',
- value: function onParticleDead(particle) {
- particle.body = null;
- }
+ /**
+ * Apply this behaviour for all particles every time
+ *
+ * @method applyBehaviour
+ * @memberof Proton#Proton.CrossZone
+ * @instance
+ *
+ * @param {Proton.Particle} particle
+ * @param {Number} the integrate time 1/ms
+ * @param {Int} the particle index
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ this.calculate(particle, time, index);
+ this.zone.crossing(particle);
+ };
+ return CrossZone;
+ }(Behaviour);
- // private
+ /**
+ * Alpha behaviour for controlling particle opacity over time.
+ * @extends Behaviour
+ */
+ var Alpha = /*#__PURE__*/function (_Behaviour) {
+ _inheritsLoose(Alpha, _Behaviour);
+ /**
+ * @type {boolean}
+ * @private
+ */
- }, {
- key: 'addImg2Body',
- value: function addImg2Body(img, particle) {
- particle.body = img;
- }
+ /**
+ * @type {Span}
+ * @private
+ */
- // private drawCircle --
-
- }, {
- key: 'drawImage',
- value: function drawImage(particle) {
- var w = particle.body.width * particle.scale | 0;
- var h = particle.body.height * particle.scale | 0;
- var x = particle.p.x - w / 2;
- var y = particle.p.y - h / 2;
-
- if (!!particle.color) {
- if (!particle.transform["buffer"]) particle.transform.buffer = this.createBuffer(particle.body);
-
- var bufferContext = particle.transform.buffer.getContext('2d');
- bufferContext.clearRect(0, 0, particle.transform.buffer.width, particle.transform.buffer.height);
- bufferContext.globalAlpha = particle.alpha;
- bufferContext.drawImage(particle.body, 0, 0);
-
- bufferContext.globalCompositeOperation = "source-atop";
- bufferContext.fillStyle = ColorUtil.rgbToHex(particle.transform.rgb);
- bufferContext.fillRect(0, 0, particle.transform.buffer.width, particle.transform.buffer.height);
- bufferContext.globalCompositeOperation = "source-over";
- bufferContext.globalAlpha = 1;
-
- this.context.drawImage(particle.transform.buffer, 0, 0, particle.transform.buffer.width, particle.transform.buffer.height, x, y, w, h);
- } else {
- this.context.save();
-
- this.context.globalAlpha = particle.alpha;
- this.context.translate(particle.p.x, particle.p.y);
- this.context.rotate(MathUtils.degreeTransform(particle.rotation));
- this.context.translate(-particle.p.x, -particle.p.y);
- this.context.drawImage(particle.body, 0, 0, particle.body.width, particle.body.height, x, y, w, h);
-
- this.context.globalAlpha = 1;
- this.context.restore();
- }
- }
+ /**
+ * @type {Span}
+ * @private
+ */
- // private drawCircle --
+ /**
+ * @type {string}
+ */
- }, {
- key: 'drawCircle',
- value: function drawCircle(particle) {
- if (particle.transform["rgb"]) this.context.fillStyle = 'rgba(' + particle.transform.rgb.r + ',' + particle.transform.rgb.g + ',' + particle.transform.rgb.b + ',' + particle.alpha + ')';else this.context.fillStyle = particle.color;
+ /**
+ * Creates a new Alpha instance.
+ * @param {number|Span} [a=1] - The initial alpha value or range.
+ * @param {number|Span} [b] - The final alpha value or range. If not provided, it will be the same as 'a'.
+ * @param {number} [life=Infinity] - This behaviour's life.
+ * @param {string} [easing='easeLinear'] - This behaviour's easing function.
+ */
+ function Alpha(a, b, life, easing) {
+ var _this;
+ _this = _Behaviour.call(this, life, easing) || this;
+ _this.same = void 0;
+ _this.a = void 0;
+ _this.b = void 0;
+ _this.name = void 0;
+ _this.reset(a, b);
+ _this.name = "Alpha";
+ return _this;
+ }
- // draw circle
- this.context.beginPath();
- this.context.arc(particle.p.x, particle.p.y, particle.radius, 0, Math.PI * 2, true);
+ /**
+ * Resets this behaviour's parameters.
+ * @param {number|Span} [a=1] - The initial alpha value or range.
+ * @param {number|Span} [b] - The final alpha value or range. If not provided, it will be the same as 'a'.
+ * @param {number} [life] - This behaviour's life.
+ * @param {string} [easing] - This behaviour's easing function.
+ */
+ var _proto = Alpha.prototype;
+ _proto.reset = function reset(a, b, life, easing) {
+ this.same = b === null || b === undefined;
+ this.a = Span.setSpanValue(Util.initValue(a, 1));
+ this.b = Span.setSpanValue(b);
+ life && _Behaviour.prototype.reset.call(this, life, easing);
+ }
- if (this.stroke) {
- this.context.strokeStyle = this.stroke.color;
- this.context.lineWidth = this.stroke.thinkness;
- this.context.stroke();
- }
+ /**
+ * Initializes the particle's alpha values.
+ * @param {Particle} particle - The particle to initialize.
+ */;
+ _proto.initialize = function initialize(particle) {
+ particle.data.alphaA = this.a.getValue();
+ if (this.same) particle.data.alphaB = particle.data.alphaA;else particle.data.alphaB = this.b.getValue();
+ }
- this.context.closePath();
- this.context.fill();
- }
+ /**
+ * Applies the alpha behaviour to the particle.
+ * @param {Particle} particle - The particle to apply the behaviour to.
+ * @param {number} time - The current simulation time.
+ * @param {number} index - The index of the particle.
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ this.calculate(particle, time, index);
+ particle.alpha = particle.data.alphaB + (particle.data.alphaA - particle.data.alphaB) * this.energy;
+ if (particle.alpha < 0.001) particle.alpha = 0;
+ };
+ return Alpha;
+ }(Behaviour);
+
+ /**
+ * Scale behaviour for controlling particle size over time.
+ * @extends Behaviour
+ */
+ var Scale = /*#__PURE__*/function (_Behaviour) {
+ _inheritsLoose(Scale, _Behaviour);
+ /**
+ * @type {boolean}
+ * @private
+ */
- // private createBuffer --
+ /**
+ * @type {string}
+ */
- }, {
- key: 'createBuffer',
- value: function createBuffer(image) {
- if (image instanceof Image) {
- var size = image.width + '_' + image.height;
- var canvas = this.bufferCache[size];
+ /**
+ * Creates a new Scale instance.
+ * @param {number|Span} [a=1] - The initial scale value or range.
+ * @param {number|Span} [b] - The final scale value or range. If not provided, it will be the same as 'a'.
+ * @param {number} [life=Infinity] - This behaviour's life.
+ * @param {string} [easing='easeLinear'] - This behaviour's easing function.
+ */
+ function Scale(a, b, life, easing) {
+ var _this;
+ _this = _Behaviour.call(this, life, easing) || this;
+ _this.same = void 0;
+ _this.name = void 0;
+ _this.reset(a, b);
+ _this.name = "Scale";
+ return _this;
+ }
- if (!canvas) {
- canvas = document.createElement('canvas');
- canvas.width = image.width;
- canvas.height = image.height;
- this.bufferCache[size] = canvas;
- }
+ /**
+ * Resets this behaviour's parameters.
+ * @param {number|Span} a - The initial scale value or range.
+ * @param {number|Span} [b] - The final scale value or range. If not provided, it will be the same as 'a'.
+ * @param {number} [life] - This behaviour's life.
+ * @param {string} [easing] - This behaviour's easing function.
+ */
+ var _proto = Scale.prototype;
+ _proto.reset = function reset(a, b, life, easing) {
+ this.same = b === null || b === undefined;
+ this.a = Span.setSpanValue(Util.initValue(a, 1));
+ this.b = Span.setSpanValue(b);
+ life && _Behaviour.prototype.reset.call(this, life, easing);
+ }
- return canvas;
- }
- }
- }]);
- return CanvasRenderer;
-}(BaseRenderer);
+ /**
+ * Initializes the particle's scale values.
+ * @param {Particle} particle - The particle to initialize.
+ */;
+ _proto.initialize = function initialize(particle) {
+ particle.data.scaleA = this.a.getValue();
+ particle.data.oldRadius = particle.radius;
+ particle.data.scaleB = this.same ? particle.data.scaleA : this.b.getValue();
+ }
-var DomRenderer = function (_BaseRenderer) {
- inherits(DomRenderer, _BaseRenderer);
+ /**
+ * Applies the scale behaviour to the particle.
+ * @param {Particle} particle - The particle to apply the behaviour to.
+ * @param {number} time - The current simulation time.
+ * @param {number} index - The index of the particle.
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ this.calculate(particle, time, index);
+ particle.scale = particle.data.scaleB + (particle.data.scaleA - particle.data.scaleB) * this.energy;
+ if (particle.scale < 0.0001) particle.scale = 0;
+ particle.radius = particle.data.oldRadius * particle.scale;
+ };
+ return Scale;
+ }(Behaviour);
+
+ /**
+ * Rotate behaviour for controlling particle rotation.
+ * @extends Behaviour
+ */
+ var Rotate = /*#__PURE__*/function (_Behaviour) {
+ _inheritsLoose(Rotate, _Behaviour);
+ /**
+ * @type {boolean}
+ * @private
+ */
- function DomRenderer(element) {
- classCallCheck(this, DomRenderer);
+ /**
+ * @type {Span}
+ * @private
+ */
- var _this = possibleConstructorReturn(this, (DomRenderer.__proto__ || Object.getPrototypeOf(DomRenderer)).call(this, element));
+ /**
+ * @type {Span}
+ * @private
+ */
- _this.stroke = null;
- _this.pool.create = function (body, particle) {
- return _this.createBody(body, particle);
- };
- _this.addImg2Body = _this.addImg2Body.bind(_this);
+ /**
+ * @type {string}
+ * @private
+ */
- _this.transform3d = false;
+ /**
+ * @type {string}
+ */
- _this.name = 'DomRenderer';
- return _this;
+ /**
+ * Creates a new Rotate instance.
+ * @param {string|number|Span} [influence='Velocity'] - The rotation's influence or initial rotation.
+ * @param {string|number|Span} [b] - The final rotation value or range.
+ * @param {string} [style='to'] - The style of rotation ('to' or 'add').
+ * @param {number} [life=Infinity] - This behaviour's life.
+ * @param {string} [easing='easeLinear'] - This behaviour's easing function.
+ */
+ function Rotate(influence, b, style, life, easing) {
+ var _this;
+ _this = _Behaviour.call(this, life, easing) || this;
+ _this.same = void 0;
+ _this.a = void 0;
+ _this.b = void 0;
+ _this.style = void 0;
+ _this.name = void 0;
+ _this.reset(influence, b, style);
+ _this.name = "Rotate";
+ return _this;
}
- createClass(DomRenderer, [{
- key: 'onParticleCreated',
- value: function onParticleCreated(particle) {
- if (particle.body) {
- ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);
- } else {
- particle.body = this.pool.get(this.circleConf, particle);
- this.element.appendChild(particle.body);
- }
- }
- }, {
- key: 'onParticleUpdate',
- value: function onParticleUpdate(particle) {
- if (this.bodyReady(particle)) {
- if (this.transform3d) DomUtil.transform3d(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);else DomUtil.transform(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);
-
- particle.body.style.opacity = particle.alpha;
- if (particle.body.isCircle) {
- particle.body.style.backgroundColor = particle.color || '#ff0000';
- }
- }
- }
- }, {
- key: 'onParticleDead',
- value: function onParticleDead(particle) {
- if (this.bodyReady(particle)) {
- this.element.removeChild(particle.body);
- this.pool.expire(particle.body);
- particle.body = null;
- }
- }
- }, {
- key: 'bodyReady',
- value: function bodyReady(particle) {
- return _typeof(particle.body) === 'object' && particle.body && !particle.body.isInner;
- }
-
- // private
+ /**
+ * Resets this behaviour's parameters.
+ * @param {string|number|Span} [a='Velocity'] - The rotation's influence or initial rotation.
+ * @param {string|number|Span} [b] - The final rotation value or range.
+ * @param {string} [style='to'] - The style of rotation ('to' or 'add').
+ * @param {number} [life] - This behaviour's life.
+ * @param {string} [easing] - This behaviour's easing function.
+ */
+ var _proto = Rotate.prototype;
+ _proto.reset = function reset(a, b, style, life, easing) {
+ this.same = b === null || b === undefined;
+ this.a = Span.setSpanValue(Util.initValue(a, "Velocity"));
+ this.b = Span.setSpanValue(Util.initValue(b, 0));
+ this.style = Util.initValue(style, "to");
+ life && _Behaviour.prototype.reset.call(this, life, easing);
+ }
- }, {
- key: 'addImg2Body',
- value: function addImg2Body(img, particle) {
- if (particle.dead) return;
- particle.body = this.pool.get(img, particle);
- DomUtil.resize(particle.body, img.width, img.height);
+ /**
+ * Initializes the behaviour's parameters for a particle.
+ * @param {object} particle - The particle to initialize.
+ * @param {number} particle.rotation - The particle's rotation.
+ * @param {object} particle.data - The particle's data object.
+ */;
+ _proto.initialize = function initialize(particle) {
+ particle.rotation = this.a.getValue();
+ particle.data.rotationA = this.a.getValue();
+ if (!this.same) particle.data.rotationB = this.b.getValue();
+ }
- this.element.appendChild(particle.body);
- }
- }, {
- key: 'createBody',
- value: function createBody(body, particle) {
- if (body.isCircle) return this.createCircle(particle);else return this.createSprite(body, particle);
- }
+ /**
+ * Applies this behaviour to a particle.
+ * @param {object} particle - The particle to apply the behaviour to.
+ * @param {number} time - The integrate time (1/ms).
+ * @param {number} index - The particle index.
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ this.calculate(particle, time, index);
+ if (!this.same) {
+ if (this.style === "to" || this.style === "TO" || this.style === "_") {
+ particle.rotation += particle.data.rotationB + (particle.data.rotationA - particle.data.rotationB) * this.energy;
+ } else {
+ particle.rotation += particle.data.rotationB;
+ }
+ } else if (this.a.a === "V" || this.a.a === "Velocity" || this.a.a === "v") {
+ // beta...
+ particle.rotation = particle.getDirection();
+ }
+ };
+ return Rotate;
+ }(Behaviour);
+
+ var Color = /*#__PURE__*/function (_Behaviour) {
+ _inheritsLoose(Color, _Behaviour);
+ /**
+ * @memberof! Proton#
+ * @augments Proton.Behaviour
+ * @constructor
+ * @alias Proton.Color
+ *
+ * @param {Proton.ArraySpan | String} [a] the string should be a hex e.g. #000000 for black
+ * @param {Proton.ArraySpan | String} [b] the string should be a hex e.g. #000000 for black
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=easeLinear] this behaviour's easing
+ *
+ * @property {String} name The Behaviour name
+ */
+ function Color(a, b, life, easing) {
+ var _this;
+ _this = _Behaviour.call(this, life, easing) || this;
+ _this.reset(a, b);
+ _this.name = "Color";
+ return _this;
+ }
- // private --
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @method reset
+ * @memberof Proton#Proton.Color
+ * @instance
+ *
+ * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black
+ * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=easeLinear] this behaviour's easing
+ */
+ var _proto = Color.prototype;
+ _proto.reset = function reset(a, b, life, easing) {
+ this.a = ArraySpan.createArraySpan(a);
+ this.b = ArraySpan.createArraySpan(b);
+ life && _Behaviour.prototype.reset.call(this, life, easing);
+ }
- }, {
- key: 'createCircle',
- value: function createCircle(particle) {
- var dom = DomUtil.createDiv(particle.id + '_dom', 2 * particle.radius, 2 * particle.radius);
- dom.style.borderRadius = particle.radius + 'px';
+ /**
+ * Initialize the behaviour's parameters for all particles
+ *
+ * @method initialize
+ * @memberof Proton#Proton.Color
+ * @instance
+ *
+ * @param {Proton.Particle} particle
+ */;
+ _proto.initialize = function initialize(particle) {
+ particle.color = this.a.getValue();
+ particle.data.colorA = ColorUtil.hexToRgb(particle.color);
+ if (this.b) particle.data.colorB = ColorUtil.hexToRgb(this.b.getValue());
+ }
- if (this.stroke) {
- dom.style.borderColor = this.stroke.color;
- dom.style.borderWidth = this.stroke.thinkness + 'px';
- }
- dom.isCircle = true;
+ /**
+ * Apply this behaviour for all particles every time
+ *
+ * @method applyBehaviour
+ * @memberof Proton#Proton.Color
+ * @instance
+ *
+ * @param {Proton.Particle} particle
+ * @param {Number} the integrate time 1/ms
+ * @param {Int} the particle index
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ if (this.b) {
+ this.calculate(particle, time, index);
+ particle.rgb.r = particle.data.colorB.r + (particle.data.colorA.r - particle.data.colorB.r) * this.energy;
+ particle.rgb.g = particle.data.colorB.g + (particle.data.colorA.g - particle.data.colorB.g) * this.energy;
+ particle.rgb.b = particle.data.colorB.b + (particle.data.colorA.b - particle.data.colorB.b) * this.energy;
+ particle.rgb.r = particle.rgb.r << 0;
+ particle.rgb.g = particle.rgb.g << 0;
+ particle.rgb.b = particle.rgb.b << 0;
+ } else {
+ particle.rgb.r = particle.data.colorA.r;
+ particle.rgb.g = particle.data.colorA.g;
+ particle.rgb.b = particle.data.colorA.b;
+ }
+ };
+ return Color;
+ }(Behaviour);
- return dom;
- }
- }, {
- key: 'createSprite',
- value: function createSprite(body, particle) {
- var url = typeof body === 'string' ? body : body.src;
- var dom = DomUtil.createDiv(particle.id + '_dom', body.width, body.height);
- dom.style.backgroundImage = 'url(' + url + ')';
-
- return dom;
- }
- }]);
- return DomRenderer;
-}(BaseRenderer);
+ var CHANGING = "changing";
+ var Cyclone = /*#__PURE__*/function (_Behaviour) {
+ _inheritsLoose(Cyclone, _Behaviour);
+ /**
+ * @memberof! Proton#
+ * @augments Proton.Behaviour
+ * @constructor
+ * @alias Proton.Cyclone
+ *
+ * @param {Number} angle
+ * @param {Number} force
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ *
+ * @property {String} name The Behaviour name
+ */
+ function Cyclone(angle, force, life, easing) {
+ var _this;
+ _this = _Behaviour.call(this, life, easing) || this;
+ _this.setAngleAndForce(angle, force);
+ _this.name = "Cyclone";
+ return _this;
+ }
+ var _proto = Cyclone.prototype;
+ _proto.setAngleAndForce = function setAngleAndForce(angle, force) {
+ this.force = CHANGING;
+ this.angle = MathUtil.PI / 2;
+ if (angle === "right") {
+ this.angle = MathUtil.PI / 2;
+ } else if (angle === "left") {
+ this.angle = -MathUtil.PI / 2;
+ } else if (angle === "random") {
+ this.angle = "random";
+ } else if (angle instanceof Span) {
+ this.angle = "span";
+ this.span = angle;
+ } else if (angle) {
+ this.angle = angle;
+ }
+ if (String(force).toLowerCase() === "changing" || String(force).toLowerCase() === "chang" || String(force).toLowerCase() === "auto") {
+ this.force = CHANGING;
+ } else if (force) {
+ this.force = force;
+ }
+ }
-var EaselRenderer = function (_BaseRenderer) {
- inherits(EaselRenderer, _BaseRenderer);
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @method reset
+ * @memberof Proton#Proton.Cyclone
+ * @instance
+ *
+ * @param {Number} angle
+ * @param {Number} force
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ */;
+ _proto.reset = function reset(angle, force, life, easing) {
+ this.angle = MathUtil.PI / 2;
+ this.setAngleAndForce(angle, force);
+ life && _Behaviour.prototype.reset.call(this, life, easing);
+ };
+ _proto.initialize = function initialize(particle) {
+ if (this.angle === "random") {
+ particle.data.cangle = MathUtil.randomAToB(-MathUtil.PI, MathUtil.PI);
+ } else if (this.angle === "span") {
+ particle.data.cangle = this.span.getValue();
+ }
+ particle.data.cyclone = new Vector2D(0, 0);
+ }
- function EaselRenderer(element, stroke) {
- classCallCheck(this, EaselRenderer);
+ /**
+ * Apply this behaviour for all particles every time
+ *
+ * @method applyBehaviour
+ * @memberof Proton#Proton.Cyclone
+ * @instance
+ *
+ * @param {Proton.Particle} particle
+ * @param {Number} the integrate time 1/ms
+ * @param {Int} the particle index
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ this.calculate(particle, time, index);
+ var length;
+ var gradient = particle.v.getGradient();
+ if (this.angle === "random" || this.angle === "span") {
+ gradient += particle.data.cangle;
+ } else {
+ gradient += this.angle;
+ }
+ if (this.force === CHANGING) {
+ length = particle.v.length() / 100;
+ } else {
+ length = this.force;
+ }
+ particle.data.cyclone.x = length * Math.cos(gradient);
+ particle.data.cyclone.y = length * Math.sin(gradient);
+ particle.data.cyclone = this.normalizeForce(particle.data.cyclone);
+ particle.a.add(particle.data.cyclone);
+ };
+ return Cyclone;
+ }(Behaviour);
+
+ /**
+ * The opposite of Attraction - turns the force
+ *
+ * @class
+ * @extends Proton.Attraction
+ * @memberof! Proton#
+ * @alias Proton.Repulsion
+ */
+ var Repulsion = /*#__PURE__*/function (_Attraction) {
+ _inheritsLoose(Repulsion, _Attraction);
+ /**
+ * Creates a new Repulsion behaviour instance
+ *
+ * @constructor
+ * @param {Proton.Vector2D} targetPosition - The repulsion point coordinates
+ * @param {number} [force=100] - The strength of the repulsion force
+ * @param {number} [radius=1000] - The radius of influence for the repulsion
+ * @param {number} [life=Infinity] - The behaviour's life
+ * @param {string} [easing='easeLinear'] - The behaviour's easing function
+ */
+ function Repulsion(targetPosition, force, radius, life, easing) {
+ var _this;
+ _this = _Attraction.call(this, targetPosition, force, radius, life, easing) || this;
+
+ /**
+ * The strength of the repulsion force
+ * @type {number}
+ */
+ _this.force *= -1;
+
+ /**
+ * The name of the behaviour
+ * @type {string}
+ */
+ _this.name = "Repulsion";
+ return _this;
+ }
- var _this = possibleConstructorReturn(this, (EaselRenderer.__proto__ || Object.getPrototypeOf(EaselRenderer)).call(this, element));
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @param {Proton.Vector2D} targetPosition - The new repulsion point coordinates
+ * @param {number} [force=100] - The new strength of the repulsion force
+ * @param {number} [radius=1000] - The new radius of influence for the repulsion
+ * @param {number} [life=Infinity] - The new behaviour's life
+ * @param {string} [easing='easeLinear'] - The new behaviour's easing function
+ */
+ var _proto = Repulsion.prototype;
+ _proto.reset = function reset(targetPosition, force, radius, life, easing) {
+ _Attraction.prototype.reset.call(this, targetPosition, force, radius, life, easing);
+ this.force *= -1;
+ };
+ return Repulsion;
+ }(Attraction);
+
+ var GravityWell = /*#__PURE__*/function (_Behaviour) {
+ _inheritsLoose(GravityWell, _Behaviour);
+ /**
+ * @memberof! Proton#
+ * @augments Behaviour
+ * @constructor
+ * @alias GravityWell
+ *
+ * @param {Vector2D} [centerPoint=new Vector2D] The point in the center
+ * @param {Number} [force=100] The force
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=easeLinear] this behaviour's easing
+ *
+ * @property {String} name The Behaviour name
+ */
+ function GravityWell(centerPoint, force, life, easing) {
+ var _this;
+ _this = _Behaviour.call(this, life, easing) || this;
+ _this.distanceVec = new Vector2D();
+ _this.centerPoint = Util.initValue(centerPoint, new Vector2D());
+ _this.force = Util.initValue(_this.normalizeValue(force), 100);
+ _this.name = "GravityWell";
+ return _this;
+ }
- _this.stroke = stroke;
- _this.name = 'EaselRenderer';
- return _this;
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @method reset
+ * @memberof Proton#GravityWell
+ * @instance
+ *
+ * @param {Vector2D} [centerPoint=new Vector2D] The point in the center
+ * @param {Number} [force=100] The force
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=easeLinear] this behaviour's easing
+ */
+ var _proto = GravityWell.prototype;
+ _proto.reset = function reset(centerPoint, force, life, easing) {
+ this.distanceVec = new Vector2D();
+ this.centerPoint = Util.initValue(centerPoint, new Vector2D());
+ this.force = Util.initValue(this.normalizeValue(force), 100);
+ life && _Behaviour.prototype.reset.call(this, life, easing);
}
- createClass(EaselRenderer, [{
- key: 'onParticleCreated',
- value: function onParticleCreated(particle) {
- if (particle.body) {
- this.createSprite(particle);
- } else {
- this.createCircle(particle);
- }
+ /**
+ * @inheritdoc
+ */;
+ _proto.initialize = function initialize(particle) {}
- this.element.addChild(particle.body);
- }
- }, {
- key: 'onParticleUpdate',
- value: function onParticleUpdate(particle) {
- if (particle.body) {
- particle.body.x = particle.p.x;
- particle.body.y = particle.p.y;
-
- particle.body.alpha = particle.alpha;
- particle.body.scaleX = particle.body.scaleY = particle.scale;
- particle.body.rotation = particle.rotation;
- }
- }
- }, {
- key: 'onParticleDead',
- value: function onParticleDead(particle) {
- if (particle.body) {
- particle.body.parent && particle.body.parent.removeChild(particle.body);
- this.pool.expire(particle.body);
- particle.body = null;
- }
-
- if (particle.graphics) this.pool.expire(particle.graphics);
+ /**
+ * Apply this behaviour for all particles every time
+ *
+ * @method applyBehaviour
+ * @memberof Proton#GravityWell
+ * @instance
+ *
+ * @param {Particle} particle
+ * @param {Number} the integrate time 1/ms
+ * @param {Int} the particle index
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ this.distanceVec.set(this.centerPoint.x - particle.p.x, this.centerPoint.y - particle.p.y);
+ var distanceSq = this.distanceVec.lengthSq();
+ if (distanceSq !== 0) {
+ var distance = this.distanceVec.length();
+ var factor = this.force * time / (distanceSq * distance);
+ particle.v.x += factor * this.distanceVec.x;
+ particle.v.y += factor * this.distanceVec.y;
+ }
+ };
+ return GravityWell;
+ }(Behaviour);
+
+ var InitializeUtil = {
+ initialize: function initialize(emitter, particle, initializes) {
+ var length = initializes.length;
+ var i;
+ for (i = 0; i < length; i++) {
+ if (initializes[i] instanceof Initialize) {
+ initializes[i].init(emitter, particle);
+ } else {
+ this.init(emitter, particle, initializes[i]);
}
+ }
+ this.bindEmitter(emitter, particle);
+ },
+ // init
+ init: function init(emitter, particle, initialize) {
+ PropUtil.setProp(particle, initialize);
+ PropUtil.setVectorVal(particle, initialize);
+ },
+ bindEmitter: function bindEmitter(emitter, particle) {
+ if (emitter.bindEmitter) {
+ particle.p.add(emitter.p);
+ particle.v.add(emitter.v);
+ particle.a.add(emitter.a);
+ particle.v.rotate(MathUtil.degreeTransform(emitter.rotation));
+ }
+ }
+ };
- // private
-
- }, {
- key: 'createSprite',
- value: function createSprite(particle) {
- particle.body = this.pool.get(particle.body);
+ var Emitter = /*#__PURE__*/function (_Particle) {
+ _inheritsLoose(Emitter, _Particle);
+ /**
+ * You can use this emit particles.
+ *
+ * It will dispatch follow events:
+ * PARTICLE_CREATED
+ * PARTICLE_UPDATA
+ * PARTICLE_DEAD
+ *
+ * @class Emitter
+ * @constructor
+ * @param {Object} conf the parameters object;
+ * for example {damping:0.01,bindEmitter:false}
+ */
+ function Emitter(conf) {
+ var _this;
+ if (conf === void 0) {
+ conf = {};
+ }
+ _this = _Particle.call(this, conf) || this;
+ _this.particles = [];
+ _this.behaviours = [];
+ _this.initializes = [];
+ _this.emitTime = 0;
+ _this.emitSpeed = 0;
+ _this.totalTime = -1;
+
+ /**
+ * The friction coefficient for all particle emit by This;
+ * @property damping
+ * @type {Number}
+ * @default 0.006
+ */
+ _this.damping = 0.006;
+
+ /**
+ * If bindEmitter the particles can bind this emitter's property;
+ * @property bindEmitter
+ * @type {Boolean}
+ * @default true
+ */
+ _this.bindEmitter = true;
+
+ /**
+ * The number of particles per second emit (a [particle]/b [s]);
+ * @property rate
+ * @type {Rate}
+ * @default Rate(1, .1)
+ */
+ _this.rate = new Rate(1, 0.1);
+ _this.name = "Emitter";
+ _this.id = Puid.id(_this.name);
+ return _this;
+ }
- if (particle.body.parent) return;
- if (particle.body['image']) {
- particle.body.regX = particle.body.image.width / 2;
- particle.body.regY = particle.body.image.height / 2;
- }
- }
- }, {
- key: 'createCircle',
- value: function createCircle(particle) {
- var graphics = this.pool.get(createjs.Graphics);
+ /**
+ * start emit particle
+ * @method emit
+ * @param {Number | String} [totalTime] begin emit time;
+ * @param {String | boolean} [life] the life of this emitter
+ */
+ var _proto = Emitter.prototype;
+ _proto.emit = function emit(totalTime, life) {
+ this.stoped = false;
+ this.emitTime = 0;
+ this.totalTime = Util.initValue(totalTime, Infinity);
+ if (life === true || life === "life" || life === "destroy") {
+ this.life = totalTime === "once" ? 1 : this.totalTime;
+ } else if (!isNaN(life)) {
+ this.life = life;
+ }
+ this.rate.init();
+ }
- if (this.stroke) {
- if (this.stroke instanceof String) graphics.beginStroke(this.stroke);else graphics.beginStroke('#000000');
- }
- graphics.beginFill(particle.color || '#ff0000').drawCircle(0, 0, particle.radius);
+ /**
+ * stop emiting
+ * @method stop
+ */;
+ _proto.stop = function stop() {
+ this.totalTime = -1;
+ this.emitTime = 0;
+ this.stoped = true;
+ };
+ _proto.preEmit = function preEmit(time) {
+ var oldStoped = this.stoped;
+ var oldEmitTime = this.emitTime;
+ var oldTotalTime = this.totalTime;
+ this.stoped = false;
+ this.emitTime = 0;
+ this.totalTime = time;
+ this.rate.init();
+ var step = 0.0167;
+ while (time > step) {
+ time -= step;
+ this.update(step);
+ }
+ this.stoped = oldStoped;
+ this.emitTime = oldEmitTime + Math.max(time, 0);
+ this.totalTime = oldTotalTime;
+ }
- var shape = this.pool.get(createjs.Shape, [graphics]);
+ /**
+ * remove current all particles
+ * @method removeAllParticles
+ */;
+ _proto.removeAllParticles = function removeAllParticles() {
+ var i = this.particles.length;
+ while (i--) {
+ this.particles[i].dead = true;
+ }
+ }
- particle.body = shape;
- particle.graphics = graphics;
- }
- }]);
- return EaselRenderer;
-}(BaseRenderer);
+ /**
+ * add initialize to this emitter
+ * @method addSelfInitialize
+ */;
+ _proto.addSelfInitialize = function addSelfInitialize(initialize) {
+ if (initialize["init"]) {
+ initialize.init(this);
+ }
+ }
-var PixelRenderer = function (_BaseRenderer) {
- inherits(PixelRenderer, _BaseRenderer);
+ /**
+ * add the Initialize to particles;
+ *
+ * you can use initializes array:for example emitter.addInitialize(initialize1,initialize2,initialize3);
+ * @method addInitialize
+ * @param {Initialize} initialize like this new Radius(1, 12)
+ */;
+ _proto.addInitialize = function addInitialize() {
+ for (var _len = arguments.length, rest = new Array(_len), _key = 0; _key < _len; _key++) {
+ rest[_key] = arguments[_key];
+ }
+ var i = rest.length;
+ while (i--) {
+ this.initializes.push(rest[i]);
+ }
+ }
- function PixelRenderer(element, rectangle) {
- classCallCheck(this, PixelRenderer);
+ /**
+ * remove the Initialize
+ * @method removeInitialize
+ * @param {Initialize} initialize a initialize
+ */;
+ _proto.removeInitialize = function removeInitialize(initializer) {
+ var index = this.initializes.indexOf(initializer);
+ if (index > -1) this.initializes.splice(index, 1);
+ }
- var _this = possibleConstructorReturn(this, (PixelRenderer.__proto__ || Object.getPrototypeOf(PixelRenderer)).call(this, element));
+ /**
+ * remove all Initializes
+ * @method removeInitializers
+ */;
+ _proto.removeAllInitializers = function removeAllInitializers() {
+ Util.emptyArray(this.initializes);
+ }
- _this.context = _this.element.getContext('2d');
- _this.imageData = null;
- _this.rectangle = null;
- _this.rectangle = rectangle;
- _this.createImageData(rectangle);
+ /**
+ * add the Behaviour to particles;
+ *
+ * you can use Behaviours array:emitter.addBehaviour(Behaviour1,Behaviour2,Behaviour3);
+ * @method addBehaviour
+ * @param {Behaviour} behaviour like this new Color('random')
+ */;
+ _proto.addBehaviour = function addBehaviour() {
+ for (var _len2 = arguments.length, rest = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ rest[_key2] = arguments[_key2];
+ }
+ var i = arguments.length;
+ while (i--) {
+ var behaviour = rest[i];
+ this.behaviours.push(behaviour);
+ if (behaviour.parents) behaviour.parents.push(this);
+ }
+ }
- _this.name = 'PixelRenderer';
- return _this;
+ /**
+ * remove the Behaviour
+ * @method removeBehaviour
+ * @param {Behaviour} behaviour a behaviour
+ */;
+ _proto.removeBehaviour = function removeBehaviour(behaviour) {
+ var index = this.behaviours.indexOf(behaviour);
+ this.behaviours.splice(index, 1);
+ if (behaviour.parents) {
+ index = behaviour.parents.indexOf(behaviour);
+ behaviour.parents.splice(index, 1);
+ }
+ return index;
}
- createClass(PixelRenderer, [{
- key: 'resize',
- value: function resize(width, height) {
- this.element.width = width;
- this.element.height = height;
- }
- }, {
- key: 'createImageData',
- value: function createImageData(rectangle) {
- this.rectangle = rectangle ? rectangle : new Rectangle(0, 0, this.element.width, this.element.height);
- this.imageData = this.context.createImageData(this.rectangle.width, this.rectangle.height);
- this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);
- }
- }, {
- key: 'onProtonUpdate',
- value: function onProtonUpdate() {
- this.context.clearRect(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height);
- this.imageData = this.context.getImageData(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height);
- }
- }, {
- key: 'onProtonUpdateAfter',
- value: function onProtonUpdateAfter() {
- this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);
- }
- }, {
- key: 'onParticleCreated',
- value: function onParticleCreated(particle) {}
- }, {
- key: 'onParticleUpdate',
- value: function onParticleUpdate(particle) {
- if (this.imageData) {
- this.setPixel(this.imageData, Math.floor(particle.p.x - this.rectangle.x), Math.floor(particle.p.y - this.rectangle.y), particle);
- }
- }
- }, {
- key: 'setPixel',
- value: function setPixel(imagedata, x, y, particle) {
- var rgb = particle.transform.rgb;
+ /**
+ * remove all behaviours
+ * @method removeAllBehaviours
+ */;
+ _proto.removeAllBehaviours = function removeAllBehaviours() {
+ Util.emptyArray(this.behaviours);
+ }
- if (x < 0 || x > this.element.width || y < 0 || y > this.elementwidth) return;
+ // emitter update
+ ;
+ _proto.update = function update(time) {
+ this.age += time;
+ if (this.age >= this.life || this.dead) this.destroy();
+ this.emitting(time);
+ this.integrate(time);
+ };
+ _proto.integrate = function integrate(time) {
+ if (!this.parent) return;
+ var damping = 1 - this.damping;
+ this.parent.integrator.calculate(this, time, damping);
+ var length = this.particles.length;
+ var i, particle;
+ for (i = length - 1; i >= 0; i--) {
+ particle = this.particles[i];
+
+ // particle update
+ particle.update(time, i);
+ this.parent.integrator.calculate(particle, time, damping);
+ this.dispatch("PARTICLE_UPDATE", particle);
+
+ // check dead
+ if (particle.dead) {
+ this.dispatch("PARTICLE_DEAD", particle);
+ this.parent.pool.expire(particle);
+ this.particles.splice(i, 1);
+ }
+ }
+ };
+ _proto.dispatch = function dispatch(event, target) {
+ this.parent && this.parent.dispatchEvent(event, target);
+ this.bindEvent && this.dispatchEvent(event, target);
+ };
+ _proto.emitting = function emitting(time) {
+ if (this.stoped) return;
+ if (this.totalTime === "none") {
+ this.emitTime += time;
+ } else if (this.totalTime === "once") {
+ var i;
+ var length = this.rate.getValue(99999);
+ if (length > 0) this.emitSpeed = length;
+ for (i = 0; i < length; i++) {
+ this.createParticle();
+ }
+ this.totalTime = "none";
+ } else {
+ this.emitTime += time;
+ if (this.emitTime < this.totalTime) {
+ var _length = this.rate.getValue(time);
+ var _i;
+ if (_length > 0) this.emitSpeed = _length;
+ for (_i = 0; _i < _length; _i++) {
+ this.createParticle();
+ }
+ }
+ }
+ }
- var i = ((y >> 0) * imagedata.width + (x >> 0)) * 4;
+ /**
+ * create single particle;
+ *
+ * can use emit({x:10},new Gravity(10),{'particleUpdate',fun}) or emit([{x:10},new Initialize],new Gravity(10),{'particleUpdate',fun})
+ * @method removeAllParticles
+ */;
+ _proto.createParticle = function createParticle(initialize, behaviour) {
+ var particle = this.parent.pool.get(Particle);
+ this.setupParticle(particle, initialize, behaviour);
+ this.dispatch("PARTICLE_CREATED", particle);
+ return particle;
+ };
+ _proto.setupParticle = function setupParticle(particle, initialize, behaviour) {
+ var initializes = this.initializes;
+ var behaviours = this.behaviours;
+ if (initialize) initializes = Util.toArray(initialize);
+ if (behaviour) behaviours = Util.toArray(behaviour);
+ particle.reset();
+ InitializeUtil.initialize(this, particle, initializes);
+ particle.addBehaviours(behaviours);
+ particle.parent = this;
+ this.particles.push(particle);
+ };
+ _proto.remove = function remove() {
+ this.stop();
+ Util.destroyAll(this.particles);
+ }
- imagedata.data[i] = rgb.r;
- imagedata.data[i + 1] = rgb.g;
- imagedata.data[i + 2] = rgb.b;
- imagedata.data[i + 3] = particle.alpha * 255;
- }
- }, {
- key: 'onParticleDead',
- value: function onParticleDead(particle) {}
- }]);
- return PixelRenderer;
-}(BaseRenderer);
+ /**
+ * Destory this Emitter
+ * @method destroy
+ */;
+ _proto.destroy = function destroy() {
+ this.dead = true;
+ this.remove();
+ this.removeAllInitializers();
+ this.removeAllBehaviours();
+ this.parent && this.parent.removeEmitter(this);
+ this.rate = null;
+ this.old = null;
+ this.rgb = null;
+ this.v = null;
+ this.a = null;
+ this.p = null;
+ };
+ return Emitter;
+ }(Particle);
+ EventDispatcher.bind(Emitter);
+
+ var BehaviourEmitter = /*#__PURE__*/function (_Emitter) {
+ _inheritsLoose(BehaviourEmitter, _Emitter);
+ /**
+ * The BehaviourEmitter class inherits from Proton.Emitter
+ *
+ * use the BehaviourEmitter you can add behaviours to self;
+ * @class Proton.BehaviourEmitter
+ * @constructor
+ * @param {Object} conf the parameters object;
+ */
+ function BehaviourEmitter(conf) {
+ var _this;
+ _this = _Emitter.call(this, conf) || this;
+ _this.selfBehaviours = [];
+ return _this;
+ }
-var PixiRenderer = function (_BaseRenderer) {
- inherits(PixiRenderer, _BaseRenderer);
+ /**
+ * add the Behaviour to emitter;
+ *
+ * you can use Behaviours array:emitter.addSelfBehaviour(Behaviour1,Behaviour2,Behaviour3);
+ * @method addSelfBehaviour
+ * @param {Proton.Behaviour} behaviour like this new Proton.Color('random')
+ */
+ var _proto = BehaviourEmitter.prototype;
+ _proto.addSelfBehaviour = function addSelfBehaviour() {
+ for (var _len = arguments.length, rest = new Array(_len), _key = 0; _key < _len; _key++) {
+ rest[_key] = arguments[_key];
+ }
+ var i,
+ length = rest.length;
+ for (i = 0; i < length; i++) {
+ var behaviour = rest[i];
+ this.selfBehaviours.push(behaviour);
+ behaviour.initialize(this);
+ }
+ }
- function PixiRenderer(element, stroke) {
- classCallCheck(this, PixiRenderer);
+ /**
+ * remove the Behaviour for self
+ * @method removeSelfBehaviour
+ * @param {Proton.Behaviour} behaviour a behaviour
+ */;
+ _proto.removeSelfBehaviour = function removeSelfBehaviour(behaviour) {
+ var index = this.selfBehaviours.indexOf(behaviour);
+ if (index > -1) this.selfBehaviours.splice(index, 1);
+ };
+ _proto.update = function update(time) {
+ _Emitter.prototype.update.call(this, time);
+ if (!this.sleep) {
+ var length = this.selfBehaviours.length;
+ var i;
+ for (i = 0; i < length; i++) {
+ this.selfBehaviours[i].applyBehaviour(this, time, i);
+ }
+ }
+ };
+ return BehaviourEmitter;
+ }(Emitter);
+
+ var FollowEmitter = /*#__PURE__*/function (_Emitter) {
+ _inheritsLoose(FollowEmitter, _Emitter);
+ /**
+ * The FollowEmitter class inherits from Proton.Emitter
+ *
+ * use the FollowEmitter will emit particle when mousemoving
+ *
+ * @class Proton.FollowEmitter
+ * @constructor
+ * @param {Element} mouseTarget mouseevent's target;
+ * @param {Number} ease the easing of following speed;
+ * @default 0.7
+ * @param {Object} conf the parameters object;
+ */
+ function FollowEmitter(mouseTarget, ease, conf) {
+ var _this;
+ _this = _Emitter.call(this, conf) || this;
+ _this.mouseTarget = Util.initValue(mouseTarget, window);
+ _this.ease = Util.initValue(ease, 0.7);
+ _this._allowEmitting = false;
+ _this.initEventHandler();
+ return _this;
+ }
+ var _proto = FollowEmitter.prototype;
+ _proto.initEventHandler = function initEventHandler() {
+ var _this2 = this;
+ this.mousemoveHandler = function (e) {
+ return _this2.mousemove.call(_this2, e);
+ };
+ this.mousedownHandler = function (e) {
+ return _this2.mousedown.call(_this2, e);
+ };
+ this.mouseupHandler = function (e) {
+ return _this2.mouseup.call(_this2, e);
+ };
+ this.mouseTarget.addEventListener("mousemove", this.mousemoveHandler, false);
+ }
- var _this = possibleConstructorReturn(this, (PixiRenderer.__proto__ || Object.getPrototypeOf(PixiRenderer)).call(this, element));
+ /**
+ * start emit particle
+ * @method emit
+ */;
+ _proto.emit = function emit() {
+ this._allowEmitting = true;
+ }
- _this.stroke = stroke;
- _this.setColor = false;
- _this.pool.create = function (body, particle) {
- return _this.createBody(body, particle);
- };
- _this.name = 'PixiRenderer';
- return _this;
+ /**
+ * stop emiting
+ * @method stop
+ */;
+ _proto.stop = function stop() {
+ this._allowEmitting = false;
+ };
+ _proto.mousemove = function mousemove(e) {
+ if (e.layerX || e.layerX === 0) {
+ this.p.x += (e.layerX - this.p.x) * this.ease;
+ this.p.y += (e.layerY - this.p.y) * this.ease;
+ } else if (e.offsetX || e.offsetX === 0) {
+ this.p.x += (e.offsetX - this.p.x) * this.ease;
+ this.p.y += (e.offsetY - this.p.y) * this.ease;
+ }
+ if (this._allowEmitting) _Emitter.prototype.emit.call(this, "once");
+ }
+
+ /**
+ * Destory this Emitter
+ * @method destroy
+ */;
+ _proto.destroy = function destroy() {
+ _Emitter.prototype.destroy.call(this);
+ this.mouseTarget.removeEventListener("mousemove", this.mousemoveHandler, false);
+ };
+ return FollowEmitter;
+ }(Emitter);
+
+ var Types = {
+ /**
+ * Determine whether it is a picture object
+ *
+ * @return {boolean} is or no
+ */
+ isImage: function isImage(obj) {
+ if (!obj) return false;
+ if (obj.__isImage) return true;
+ var tagName = ("" + obj.tagName).toUpperCase();
+ var nodeName = ("" + obj.nodeName).toUpperCase();
+ if (nodeName === "IMG" || tagName === "IMG") {
+ obj.__isImage = true;
+ return true;
+ }
+ return false;
+ },
+ /**
+ * Determine whether it is a string object
+ *
+ * @return {boolean} is or no
+ */
+ isString: function isString(obj) {
+ return typeof obj === "string";
}
+ };
- createClass(PixiRenderer, [{
- key: 'onProtonUpdate',
- value: function onProtonUpdate() {}
+ var BaseRenderer = /*#__PURE__*/function () {
+ function BaseRenderer(element, stroke) {
+ this.pool = new Pool();
+ this.element = element;
+ this.stroke = stroke;
+ this.circleConf = {
+ isCircle: true
+ };
+ this.initEventHandler();
+ this.name = "BaseRenderer";
+ }
+ var _proto = BaseRenderer.prototype;
+ _proto.setStroke = function setStroke(color, thinkness) {
+ if (color === void 0) {
+ color = "#000000";
+ }
+ if (thinkness === void 0) {
+ thinkness = 1;
+ }
+ this.stroke = {
+ color: color,
+ thinkness: thinkness
+ };
+ };
+ _proto.initEventHandler = function initEventHandler() {
+ var _this = this;
+ this._protonUpdateHandler = function () {
+ _this.onProtonUpdate.call(_this);
+ };
+ this._protonUpdateAfterHandler = function () {
+ _this.onProtonUpdateAfter.call(_this);
+ };
+ this._emitterAddedHandler = function (emitter) {
+ _this.onEmitterAdded.call(_this, emitter);
+ };
+ this._emitterRemovedHandler = function (emitter) {
+ _this.onEmitterRemoved.call(_this, emitter);
+ };
+ this._particleCreatedHandler = function (particle) {
+ _this.onParticleCreated.call(_this, particle);
+ };
+ this._particleUpdateHandler = function (particle) {
+ _this.onParticleUpdate.call(_this, particle);
+ };
+ this._particleDeadHandler = function (particle) {
+ _this.onParticleDead.call(_this, particle);
+ };
+ };
+ _proto.init = function init(proton) {
+ this.parent = proton;
+ proton.addEventListener("PROTON_UPDATE", this._protonUpdateHandler);
+ proton.addEventListener("PROTON_UPDATE_AFTER", this._protonUpdateAfterHandler);
+ proton.addEventListener("EMITTER_ADDED", this._emitterAddedHandler);
+ proton.addEventListener("EMITTER_REMOVED", this._emitterRemovedHandler);
+ proton.addEventListener("PARTICLE_CREATED", this._particleCreatedHandler);
+ proton.addEventListener("PARTICLE_UPDATE", this._particleUpdateHandler);
+ proton.addEventListener("PARTICLE_DEAD", this._particleDeadHandler);
+ };
+ _proto.resize = function resize(width, height) {};
+ _proto.destroy = function destroy() {
+ this.remove();
+ this.pool.destroy();
+ this.pool = null;
+ this.element = null;
+ this.stroke = null;
+ };
+ _proto.remove = function remove(proton) {
+ this.parent.removeEventListener("PROTON_UPDATE", this._protonUpdateHandler);
+ this.parent.removeEventListener("PROTON_UPDATE_AFTER", this._protonUpdateAfterHandler);
+ this.parent.removeEventListener("EMITTER_ADDED", this._emitterAddedHandler);
+ this.parent.removeEventListener("EMITTER_REMOVED", this._emitterRemovedHandler);
+ this.parent.removeEventListener("PARTICLE_CREATED", this._particleCreatedHandler);
+ this.parent.removeEventListener("PARTICLE_UPDATE", this._particleUpdateHandler);
+ this.parent.removeEventListener("PARTICLE_DEAD", this._particleDeadHandler);
+ this.parent = null;
+ };
+ _proto.onProtonUpdate = function onProtonUpdate() {};
+ _proto.onProtonUpdateAfter = function onProtonUpdateAfter() {};
+ _proto.onEmitterAdded = function onEmitterAdded(emitter) {};
+ _proto.onEmitterRemoved = function onEmitterRemoved(emitter) {};
+ _proto.onParticleCreated = function onParticleCreated(particle) {};
+ _proto.onParticleUpdate = function onParticleUpdate(particle) {};
+ _proto.onParticleDead = function onParticleDead(particle) {};
+ return BaseRenderer;
+ }();
- /**
- * @param particle
- */
+ /**
+ * CanvasRenderer class for rendering particles on a canvas element.
+ * @extends BaseRenderer
+ */
+ var CanvasRenderer = /*#__PURE__*/function (_BaseRenderer) {
+ _inheritsLoose(CanvasRenderer, _BaseRenderer);
+ /**
+ * @type {object|null}
+ * @private
+ */
- }, {
- key: 'onParticleCreated',
- value: function onParticleCreated(particle) {
- if (particle.body) {
- particle.body = this.pool.get(particle.body, particle);
- } else {
- particle.body = this.pool.get(this.circleConf, particle);
- }
+ /**
+ * @type {CanvasRenderingContext2D}
+ * @private
+ */
- this.element.addChild(particle.body);
- }
+ /**
+ * @type {object}
+ * @private
+ */
- /**
- * @param particle
- */
+ /**
+ * @type {string}
+ */
- }, {
- key: 'onParticleUpdate',
- value: function onParticleUpdate(particle) {
- this.transform(particle, particle.body);
- if (this.setColor) particle.body.tint = ColorUtil.getHex16FromParticle(particle);
- }
+ /**
+ * Creates a new CanvasRenderer instance.
+ * @param {HTMLCanvasElement} element - The canvas element to render on.
+ */
+ function CanvasRenderer(element) {
+ var _this;
+ _this = _BaseRenderer.call(this, element) || this;
+ _this.stroke = void 0;
+ _this.context = void 0;
+ _this.bufferCache = void 0;
+ _this.name = void 0;
+ _this.stroke = null;
+ _this.context = _this.element.getContext("2d");
+ _this.bufferCache = {};
+ _this.name = "CanvasRenderer";
+ return _this;
+ }
- /**
- * @param particle
- */
+ /**
+ * Resizes the canvas element.
+ * @param {number} width - The new width of the canvas.
+ * @param {number} height - The new height of the canvas.
+ */
+ var _proto = CanvasRenderer.prototype;
+ _proto.resize = function resize(width, height) {
+ this.element.width = width;
+ this.element.height = height;
+ }
- }, {
- key: 'onParticleDead',
- value: function onParticleDead(particle) {
- this.element.removeChild(particle.body);
- this.pool.expire(particle.body);
- particle.body = null;
- }
- }, {
- key: 'destroy',
- value: function destroy(particles) {
- get(PixiRenderer.prototype.__proto__ || Object.getPrototypeOf(PixiRenderer.prototype), 'destroy', this).call(this);
- this.pool.destroy();
-
- var i = particles.length;
- while (i--) {
- var particle = particles[i];
- if (particle.body) {
- this.element.removeChild(particle.body);
- }
- }
- }
- }, {
- key: 'transform',
- value: function transform(particle, target) {
- target.x = particle.p.x;
- target.y = particle.p.y;
+ /**
+ * Clears the canvas on Proton update.
+ */;
+ _proto.onProtonUpdate = function onProtonUpdate() {
+ this.context.clearRect(0, 0, this.element.width, this.element.height);
+ }
- target.alpha = particle.alpha;
+ /**
+ * Handles particle creation.
+ * @param {object} particle - The created particle.
+ */;
+ _proto.onParticleCreated = function onParticleCreated(particle) {
+ if (particle.body) {
+ ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);
+ } else {
+ particle.color = particle.color || "#ff0000";
+ }
+ }
- target.scale.x = particle.scale;
- target.scale.y = particle.scale;
+ /**
+ * Handles particle updates.
+ * @param {object} particle - The updated particle.
+ */;
+ _proto.onParticleUpdate = function onParticleUpdate(particle) {
+ if (particle.body) {
+ if (Types.isImage(particle.body)) {
+ this.drawImage(particle);
+ }
+ } else {
+ this.drawCircle(particle);
+ }
+ }
- // using cached version of MathUtils.PI_180 for slight performance increase.
- target.rotation = particle.rotation * MathUtils.PI_180; // MathUtils.PI_180;
- }
- }, {
- key: 'createBody',
- value: function createBody(body, particle) {
- if (body.isCircle) return this.createCircle(particle);else return this.createSprite(body);
- }
- }, {
- key: 'createSprite',
- value: function createSprite(body) {
- var sprite = body.isInner ? PIXI.Sprite.fromImage(body.src) : new PIXI.Sprite(body);
- sprite.anchor.x = 0.5;
- sprite.anchor.y = 0.5;
-
- return sprite;
- }
- }, {
- key: 'createCircle',
- value: function createCircle(particle) {
- var graphics = new PIXI.Graphics();
+ /**
+ * Handles particle destruction.
+ * @param {object} particle - The destroyed particle.
+ */;
+ _proto.onParticleDead = function onParticleDead(particle) {
+ particle.body = null;
+ }
- if (this.stroke) {
- var stroke = this.stroke instanceof String ? this.stroke : 0x000000;
- graphics.beginStroke(this.stroke);
- }
+ /**
+ * Adds an image to the particle body.
+ * @param {HTMLImageElement} img - The image to add.
+ * @param {object} particle - The particle to add the image to.
+ * @private
+ */;
+ _proto.addImg2Body = function addImg2Body(img, particle) {
+ particle.body = img;
+ }
- graphics.beginFill(particle.color || 0x008ced);
- graphics.drawCircle(0, 0, particle.radius);
- graphics.endFill();
+ /**
+ * Draws an image particle.
+ * @param {object} particle - The particle to draw.
+ * @private
+ */;
+ _proto.drawImage = function drawImage(particle) {
+ var w = particle.body.width * particle.scale | 0;
+ var h = particle.body.height * particle.scale | 0;
+ var x = particle.p.x - w / 2;
+ var y = particle.p.y - h / 2;
+ if (!!particle.color) {
+ if (!particle.data["buffer"]) particle.data.buffer = this.createBuffer(particle.body);
+ var bufContext = particle.data.buffer.getContext("2d");
+ bufContext.clearRect(0, 0, particle.data.buffer.width, particle.data.buffer.height);
+ bufContext.globalAlpha = particle.alpha;
+ bufContext.drawImage(particle.body, 0, 0);
+ bufContext.globalCompositeOperation = "source-atop";
+ bufContext.fillStyle = ColorUtil.rgbToHex(particle.rgb);
+ bufContext.fillRect(0, 0, particle.data.buffer.width, particle.data.buffer.height);
+ bufContext.globalCompositeOperation = "source-over";
+ bufContext.globalAlpha = 1;
+ this.context.drawImage(particle.data.buffer, 0, 0, particle.data.buffer.width, particle.data.buffer.height, x, y, w, h);
+ } else {
+ this.context.save();
+ this.context.globalAlpha = particle.alpha;
+ this.context.translate(particle.p.x, particle.p.y);
+ this.context.rotate(MathUtil.degreeTransform(particle.rotation));
+ this.context.translate(-particle.p.x, -particle.p.y);
+ this.context.drawImage(particle.body, 0, 0, particle.body.width, particle.body.height, x, y, w, h);
+ this.context.globalAlpha = 1;
+ this.context.restore();
+ }
+ }
- return graphics;
- }
- }]);
- return PixiRenderer;
-}(BaseRenderer);
-
-var MStack = function () {
- function MStack() {
- classCallCheck(this, MStack);
-
- this.mats = [];
- this.size = 0;
-
- for (var i = 0; i < 20; i++) {
- this.mats.push(Mat3.create([0, 0, 0, 0, 0, 0, 0, 0, 0]));
- }
- }
-
- createClass(MStack, [{
- key: 'set',
- value: function set$$1(m, i) {
- if (i == 0) Mat3.set(m, this.mats[0]);else Mat3.multiply(this.mats[i - 1], m, this.mats[i]);
-
- this.size = Math.max(this.size, i + 1);
- }
- }, {
- key: 'push',
- value: function push(m) {
- if (this.size == 0) Mat3.set(m, this.mats[0]);else Mat3.multiply(this.mats[this.size - 1], m, this.mats[this.size]);
-
- this.size++;
- }
- }, {
- key: 'pop',
- value: function pop() {
- if (this.size > 0) this.size--;
- }
- }, {
- key: 'top',
- value: function top() {
- return this.mats[this.size - 1];
- }
- }]);
- return MStack;
-}();
-
-var WebGLRenderer = function (_BaseRenderer) {
- inherits(WebGLRenderer, _BaseRenderer);
+ /**
+ * Draws a circular particle.
+ * @param {object} particle - The particle to draw.
+ * @private
+ */;
+ _proto.drawCircle = function drawCircle(particle) {
+ if (particle.rgb) {
+ this.context.fillStyle = "rgba(" + particle.rgb.r + "," + particle.rgb.g + "," + particle.rgb.b + "," + particle.alpha + ")";
+ } else {
+ this.context.fillStyle = particle.color;
+ }
+ this.context.beginPath();
+ this.context.arc(particle.p.x, particle.p.y, particle.radius, 0, Math.PI * 2, true);
+ if (this.stroke) {
+ this.context.strokeStyle = this.stroke.color;
+ this.context.lineWidth = this.stroke.thinkness;
+ this.context.stroke();
+ }
+ this.context.closePath();
+ this.context.fill();
+ }
- function WebGLRenderer(element) {
- classCallCheck(this, WebGLRenderer);
+ /**
+ * Creates a buffer for image particles.
+ * @param {HTMLImageElement} image - The image to create a buffer for.
+ * @returns {HTMLCanvasElement|undefined} The created buffer canvas.
+ * @private
+ */;
+ _proto.createBuffer = function createBuffer(image) {
+ if (Types.isImage(image)) {
+ var size = image.width + "_" + image.height;
+ var canvas = this.bufferCache[size];
+ if (!canvas) {
+ canvas = document.createElement("canvas");
+ canvas.width = image.width;
+ canvas.height = image.height;
+ this.bufferCache[size] = canvas;
+ }
+ return canvas;
+ }
+ }
- var _this = possibleConstructorReturn(this, (WebGLRenderer.__proto__ || Object.getPrototypeOf(WebGLRenderer)).call(this, element));
+ /**
+ * Destroys the renderer and cleans up resources.
+ */;
+ _proto.destroy = function destroy() {
+ _BaseRenderer.prototype.destroy.call(this);
+ this.stroke = null;
+ this.context = null;
+ this.bufferCache = null;
+ };
+ return CanvasRenderer;
+ }(BaseRenderer);
- _this.gl = _this.element.getContext('experimental-webgl', { antialias: true, stencil: false, depth: false });
- if (!_this.gl) alert("Sorry your browser do not suppest WebGL!");
+ /**
+ * Represents a DOM-based renderer for particle systems.
+ * @extends BaseRenderer
+ */
+ var DomRenderer = /*#__PURE__*/function (_BaseRenderer) {
+ _inheritsLoose(DomRenderer, _BaseRenderer);
+ /**
+ * Creates a new DomRenderer instance.
+ * @param {HTMLElement} element - The HTML element to render to.
+ */
+ function DomRenderer(element) {
+ var _this;
+ _this = _BaseRenderer.call(this, element) || this;
+ _this.stroke = null;
+ _this.transform3d = false;
+ _this.pool.create = function (body, particle) {
+ return _this.createBody(body, particle);
+ };
+ _this.addImg2Body = _this.addImg2Body.bind(_assertThisInitialized(_this));
+ _this.name = "DomRenderer";
+ return _this;
+ }
+ var _proto = DomRenderer.prototype;
+ _proto.onParticleCreated = function onParticleCreated(particle) {
+ if (particle.body) {
+ ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);
+ } else {
+ particle.body = this.pool.get(this.circleConf, particle);
+ this.element.appendChild(particle.body);
+ }
+ };
+ _proto.onParticleUpdate = function onParticleUpdate(particle) {
+ if (this.bodyReady(particle)) {
+ if (this.transform3d) {
+ DomUtil.transform3d(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);
+ } else {
+ DomUtil.transform(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);
+ }
+ particle.body.style.opacity = particle.alpha;
+ if (particle.body.isCircle) {
+ particle.body.style.backgroundColor = particle.color || "#ff0000";
+ }
+ }
+ };
+ _proto.onParticleDead = function onParticleDead(particle) {
+ if (this.bodyReady(particle)) {
+ this.element.removeChild(particle.body);
+ this.pool.expire(particle.body);
+ particle.body = null;
+ }
+ };
+ _proto.bodyReady = function bodyReady(particle) {
+ return typeof particle.body === "object" && particle.body && !particle.body.isInner;
+ }
- _this.initVar();
- _this.setMaxRadius();
- _this.initShaders();
- _this.initBuffers();
+ // private method
+ ;
+ _proto.addImg2Body = function addImg2Body(img, particle) {
+ if (particle.dead) return;
+ particle.body = this.pool.get(img, particle);
+ DomUtil.resize(particle.body, img.width, img.height);
+ this.element.appendChild(particle.body);
+ };
+ _proto.createBody = function createBody(body, particle) {
+ if (body.isCircle) return this.createCircle(particle);
+ return this.createSprite(body, particle);
+ }
- _this.gl.blendEquation(_this.gl.FUNC_ADD);
- _this.gl.blendFunc(_this.gl.SRC_ALPHA, _this.gl.ONE_MINUS_SRC_ALPHA);
- _this.gl.enable(_this.gl.BLEND);
+ // private methods
+ ;
+ _proto.createCircle = function createCircle(particle) {
+ var dom = DomUtil.createDiv(particle.id + "_dom", 2 * particle.radius, 2 * particle.radius);
+ dom.style.borderRadius = particle.radius + "px";
+ if (this.stroke) {
+ dom.style.borderColor = this.stroke.color;
+ dom.style.borderWidth = this.stroke.thinkness + "px";
+ }
+ dom.isCircle = true;
+ return dom;
+ };
+ _proto.createSprite = function createSprite(body, particle) {
+ var url = typeof body === "string" ? body : body.src;
+ var dom = DomUtil.createDiv(particle.id + "_dom", body.width, body.height);
+ dom.style.backgroundImage = "url(" + url + ")";
+ return dom;
+ }
- _this.addImg2Body = _this.addImg2Body.bind(_this);
+ /**
+ * Destroys the renderer and cleans up resources.
+ */;
+ _proto.destroy = function destroy() {
+ _BaseRenderer.prototype.destroy.call(this);
+ this.stroke = null;
+ };
+ return DomRenderer;
+ }(BaseRenderer);
- _this.name = 'WebGLRenderer';
- return _this;
+ var EaselRenderer = /*#__PURE__*/function (_BaseRenderer) {
+ _inheritsLoose(EaselRenderer, _BaseRenderer);
+ function EaselRenderer(element, stroke) {
+ var _this;
+ _this = _BaseRenderer.call(this, element) || this;
+ _this.stroke = stroke;
+ _this.name = "EaselRenderer";
+ return _this;
+ }
+ var _proto = EaselRenderer.prototype;
+ _proto.onParticleCreated = function onParticleCreated(particle) {
+ if (particle.body) {
+ this.createSprite(particle);
+ } else {
+ this.createCircle(particle);
+ }
+ this.element.addChild(particle.body);
+ };
+ _proto.onParticleUpdate = function onParticleUpdate(particle) {
+ if (particle.body) {
+ particle.body.x = particle.p.x;
+ particle.body.y = particle.p.y;
+ particle.body.alpha = particle.alpha;
+ particle.body.scaleX = particle.body.scaleY = particle.scale;
+ particle.body.rotation = particle.rotation;
+ }
+ };
+ _proto.onParticleDead = function onParticleDead(particle) {
+ if (particle.body) {
+ particle.body.parent && particle.body.parent.removeChild(particle.body);
+ this.pool.expire(particle.body);
+ particle.body = null;
+ }
+ if (particle.graphics) this.pool.expire(particle.graphics);
}
- createClass(WebGLRenderer, [{
- key: 'init',
- value: function init(proton) {
- get(WebGLRenderer.prototype.__proto__ || Object.getPrototypeOf(WebGLRenderer.prototype), 'init', this).call(this, proton);
- this.resize(this.element.width, this.element.height);
- }
- }, {
- key: 'resize',
- value: function resize(width, height) {
- this.umat[4] = -2;
- this.umat[7] = 1;
+ // private
+ ;
+ _proto.createSprite = function createSprite(particle) {
+ particle.body = this.pool.get(particle.body);
+ if (particle.body.parent) return;
+ if (particle.body["image"]) {
+ particle.body.regX = particle.body.image.width / 2;
+ particle.body.regY = particle.body.image.height / 2;
+ }
+ };
+ _proto.createCircle = function createCircle(particle) {
+ var graphics = this.pool.get(window.createjs.Graphics);
+ if (this.stroke) {
+ if (Types.isString(this.stroke)) {
+ graphics.beginStroke(this.stroke);
+ } else {
+ graphics.beginStroke("#000000");
+ }
+ }
+ graphics.beginFill(particle.color || "#ff0000").drawCircle(0, 0, particle.radius);
+ var shape = this.pool.get(window.createjs.Shape, [graphics]);
+ particle.body = shape;
+ particle.graphics = graphics;
+ };
+ _proto.destroy = function destroy() {
+ _BaseRenderer.prototype.destroy.call(this);
+ this.stroke = null;
+ };
+ return EaselRenderer;
+ }(BaseRenderer);
- this.smat[0] = 1 / width;
- this.smat[4] = 1 / height;
+ /**
+ * Represents a pixel-based renderer for particle systems.
+ * @extends BaseRenderer
+ */
+ var PixelRenderer = /*#__PURE__*/function (_BaseRenderer) {
+ _inheritsLoose(PixelRenderer, _BaseRenderer);
+ /**
+ * Creates a new PixelRenderer instance.
+ * @param {HTMLCanvasElement} element - The canvas element to render to.
+ * @param {Rectangle} [rectangle] - The rectangle defining the rendering area.
+ */
+ function PixelRenderer(element, rectangle) {
+ var _this;
+ _this = _BaseRenderer.call(this, element) || this;
+ _this.context = _this.element.getContext("2d");
+ _this.imageData = null;
+ _this.rectangle = rectangle;
+ _this.createImageData(rectangle);
+ _this.name = "PixelRenderer";
+ return _this;
+ }
+ var _proto = PixelRenderer.prototype;
+ _proto.resize = function resize(width, height) {
+ this.element.width = width;
+ this.element.height = height;
+ };
+ _proto.createImageData = function createImageData(rectangle) {
+ this.rectangle = rectangle ? rectangle : new Rectangle(0, 0, this.element.width, this.element.height);
+ this.imageData = this.context.createImageData(this.rectangle.width, this.rectangle.height);
+ this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);
+ };
+ _proto.onProtonUpdate = function onProtonUpdate() {
+ this.context.clearRect(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height);
+ this.imageData = this.context.getImageData(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height);
+ };
+ _proto.onProtonUpdateAfter = function onProtonUpdateAfter() {
+ this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);
+ };
+ _proto.onParticleCreated = function onParticleCreated(particle) {};
+ _proto.onParticleUpdate = function onParticleUpdate(particle) {
+ if (this.imageData) {
+ this.setPixel(this.imageData, particle.p.x - this.rectangle.x >> 0, particle.p.y - this.rectangle.y >> 0, particle);
+ }
+ };
+ _proto.setPixel = function setPixel(imagedata, x, y, particle) {
+ var rgb = particle.rgb;
+ if (x < 0 || x > this.element.width || y < 0 || y > this.element.height) return;
+ var i = ((y >> 0) * imagedata.width + (x >> 0)) * 4;
+ imagedata.data[i] = rgb.r;
+ imagedata.data[i + 1] = rgb.g;
+ imagedata.data[i + 2] = rgb.b;
+ imagedata.data[i + 3] = particle.alpha * 255;
+ };
+ _proto.onParticleDead = function onParticleDead(particle) {}
- this.mstack.set(this.umat, 0);
- this.mstack.set(this.smat, 1);
+ /**
+ * Destroys the renderer and cleans up resources.
+ */;
+ _proto.destroy = function destroy() {
+ _BaseRenderer.prototype.destroy.call(this);
+ this.stroke = null;
+ this.context = null;
+ this.imageData = null;
+ this.rectangle = null;
+ };
+ return PixelRenderer;
+ }(BaseRenderer);
- this.gl.viewport(0, 0, width, height);
- this.element.width = width;
- this.element.height = height;
- }
- }, {
- key: 'setMaxRadius',
- value: function setMaxRadius(radius) {
- this.circleCanvasURL = this.createCircle(radius);
- }
- }, {
- key: 'getVertexShader',
- value: function getVertexShader() {
- var vsSource = ["uniform vec2 viewport;", "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "uniform mat3 tMat;", "varying vec2 vTextureCoord;", "varying float alpha;", "void main() {", "vec3 v = tMat * vec3(aVertexPosition, 1.0);", "gl_Position = vec4(v.x, v.y, 0, 1);", "vTextureCoord = aTextureCoord;", "alpha = tMat[0][2];", "}"].join("\n");
- return vsSource;
- }
- }, {
- key: 'getFragmentShader',
- value: function getFragmentShader() {
- var fsSource = ["precision mediump float;", "varying vec2 vTextureCoord;", "varying float alpha;", "uniform sampler2D uSampler;", "uniform vec4 color;", "uniform bool useTexture;", "uniform vec3 uColor;", "void main() {", "vec4 textureColor = texture2D(uSampler, vTextureCoord);", "gl_FragColor = textureColor * vec4(uColor, 1.0);", "gl_FragColor.w *= alpha;", "}"].join("\n");
- return fsSource;
- }
- }, {
- key: 'initVar',
- value: function initVar() {
- this.mstack = new MStack();
- this.umat = Mat3.create([2, 0, 1, 0, -2, 0, -1, 1, 1]);
- this.smat = Mat3.create([1 / 100, 0, 1, 0, 1 / 100, 0, 0, 0, 1]);
- this.texturebuffers = {};
- }
- }, {
- key: 'blendEquation',
- value: function blendEquation(A) {
- this.gl.blendEquation(this.gl[A]);
- }
- }, {
- key: 'blendFunc',
- value: function blendFunc(A, B) {
- this.gl.blendFunc(this.gl[A], this.gl[B]);
- }
- }, {
- key: 'getShader',
- value: function getShader(gl, str, fs) {
- var shader = fs ? gl.createShader(gl.FRAGMENT_SHADER) : gl.createShader(gl.VERTEX_SHADER);
+ var PIXIClass;
- gl.shaderSource(shader, str);
- gl.compileShader(shader);
+ /**
+ * Represents a PIXI-based renderer for particle systems.
+ * @extends BaseRenderer
+ */
+ var PixiRenderer = /*#__PURE__*/function (_BaseRenderer) {
+ _inheritsLoose(PixiRenderer, _BaseRenderer);
+ /**
+ * Creates a new PixiRenderer instance.
+ * @param {PIXI.Container} element - The PIXI container to render to.
+ * @param {string|number} [stroke] - The stroke color for particles.
+ */
+ function PixiRenderer(element, stroke) {
+ var _this;
+ _this = _BaseRenderer.call(this, element) || this;
+ _this.stroke = stroke;
+ _this.color = false;
+ _this.setColor = false;
+ _this.blendMode = null;
+ _this.pool.create = function (body, particle) {
+ return _this.createBody(body, particle);
+ };
+ _this.setPIXI(window.PIXI);
+ _this.name = "PixiRenderer";
+ return _this;
+ }
+ var _proto = PixiRenderer.prototype;
+ _proto.setPIXI = function setPIXI(PIXI) {
+ try {
+ PIXIClass = PIXI || {
+ Sprite: {}
+ };
+ this.createFromImage = PIXIClass.Sprite.from || PIXIClass.Sprite.fromImage;
+ } catch (e) {}
+ };
+ _proto.onProtonUpdate = function onProtonUpdate() {}
- if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
- alert(gl.getShaderInfoLog(shader));
- return null;
- }
+ /**
+ * @param particle
+ */;
+ _proto.onParticleCreated = function onParticleCreated(particle) {
+ if (particle.body) {
+ particle.body = this.pool.get(particle.body, particle);
+ } else {
+ particle.body = this.pool.get(this.circleConf, particle);
+ }
+ if (this.blendMode) {
+ particle.body.blendMode = this.blendMode;
+ }
+ this.element.addChild(particle.body);
+ }
- return shader;
- }
- }, {
- key: 'initShaders',
- value: function initShaders() {
- var fragmentShader = this.getShader(this.gl, this.getFragmentShader(), true);
- var vertexShader = this.getShader(this.gl, this.getVertexShader(), false);
-
- this.sprogram = this.gl.createProgram();
- this.gl.attachShader(this.sprogram, vertexShader);
- this.gl.attachShader(this.sprogram, fragmentShader);
- this.gl.linkProgram(this.sprogram);
-
- if (!this.gl.getProgramParameter(this.sprogram, this.gl.LINK_STATUS)) alert("Could not initialise shaders");
-
- this.gl.useProgram(this.sprogram);
- this.sprogram.vpa = this.gl.getAttribLocation(this.sprogram, "aVertexPosition");
- this.sprogram.tca = this.gl.getAttribLocation(this.sprogram, "aTextureCoord");
- this.gl.enableVertexAttribArray(this.sprogram.tca);
- this.gl.enableVertexAttribArray(this.sprogram.vpa);
-
- this.sprogram.tMatUniform = this.gl.getUniformLocation(this.sprogram, "tMat");
- this.sprogram.samplerUniform = this.gl.getUniformLocation(this.sprogram, "uSampler");
- this.sprogram.useTex = this.gl.getUniformLocation(this.sprogram, "useTexture");
- this.sprogram.color = this.gl.getUniformLocation(this.sprogram, "uColor");
- this.gl.uniform1i(this.sprogram.useTex, 1);
- }
- }, {
- key: 'initBuffers',
- value: function initBuffers() {
- var vs = [0, 3, 1, 0, 2, 3];
- var idx = void 0;
-
- this.unitIBuffer = this.gl.createBuffer();
- this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);
- this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(vs), this.gl.STATIC_DRAW);
-
- var i = void 0;
- var ids = [];
- for (i = 0; i < 100; i++) {
- ids.push(i);
- }idx = new Uint16Array(ids);
-
- this.unitI33 = this.gl.createBuffer();
- this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitI33);
- this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);
-
- ids = [];
- for (i = 0; i < 100; i++) {
- ids.push(i, i + 1, i + 2);
- }idx = new Uint16Array(ids);
-
- this.stripBuffer = this.gl.createBuffer();
- this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.stripBuffer);
- this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);
- }
- }, {
- key: 'createCircle',
- value: function createCircle(raidus) {
- this.circleCanvasRadius = WebGLUtil.nhpot(Util.initValue(raidus, 32));
- var canvas = DomUtil.createCanvas('circle_canvas', this.circleCanvasRadius * 2, this.circleCanvasRadius * 2);
- var context = canvas.getContext('2d');
-
- context.beginPath();
- context.arc(this.circleCanvasRadius, this.circleCanvasRadius, this.circleCanvasRadius, 0, Math.PI * 2, true);
- context.closePath();
- context.fillStyle = '#FFF';
- context.fill();
-
- return canvas.toDataURL();
- }
- }, {
- key: 'drawImg2Canvas',
- value: function drawImg2Canvas(particle) {
- var _w = particle.body.width;
- var _h = particle.body.height;
+ /**
+ * @param particle
+ */;
+ _proto.onParticleUpdate = function onParticleUpdate(particle) {
+ this.transform(particle, particle.body);
+ if (this.setColor === true || this.color === true) {
+ particle.body.tint = ColorUtil.getHex16FromParticle(particle);
+ }
+ }
- var _width = WebGLUtil.nhpot(particle.body.width);
- var _height = WebGLUtil.nhpot(particle.body.height);
+ /**
+ * @param particle
+ */;
+ _proto.onParticleDead = function onParticleDead(particle) {
+ this.element.removeChild(particle.body);
+ this.pool.expire(particle.body);
+ particle.body = null;
+ };
+ _proto.transform = function transform(particle, target) {
+ target.x = particle.p.x;
+ target.y = particle.p.y;
+ target.alpha = particle.alpha;
+ target.scale.x = particle.scale;
+ target.scale.y = particle.scale;
+
+ // using cached version of MathUtil.PI_180 for slight performance increase.
+ target.rotation = particle.rotation * MathUtil.PI_180; // MathUtil.PI_180;
+ };
+ _proto.createBody = function createBody(body, particle) {
+ if (body.isCircle) return this.createCircle(particle);else return this.createSprite(body);
+ };
+ _proto.createSprite = function createSprite(body) {
+ var sprite = body.isInner ? this.createFromImage(body.src) : new PIXIClass.Sprite(body);
+ sprite.anchor.x = 0.5;
+ sprite.anchor.y = 0.5;
+ return sprite;
+ };
+ _proto.createCircle = function createCircle(particle) {
+ var graphics = new PIXIClass.Graphics();
+ if (this.stroke) {
+ var stroke = Types.isString(this.stroke) ? this.stroke : 0x000000;
+ graphics.beginStroke(stroke);
+ }
+ graphics.beginFill(particle.color || 0x008ced);
+ graphics.drawCircle(0, 0, particle.radius);
+ graphics.endFill();
+ return graphics;
+ }
- var _scaleX = particle.body.width / _width;
- var _scaleY = particle.body.height / _height;
+ /**
+ * Destroys the renderer and cleans up resources.
+ * @param {Array} particles - The particles to clean up.
+ */;
+ _proto.destroy = function destroy(particles) {
+ _BaseRenderer.prototype.destroy.call(this);
+ var i = particles.length;
+ while (i--) {
+ var particle = particles[i];
+ if (particle.body) {
+ this.element.removeChild(particle.body);
+ }
+ }
+ };
+ return PixiRenderer;
+ }(BaseRenderer);
+
+ var MStack = /*#__PURE__*/function () {
+ function MStack() {
+ this.mats = [];
+ this.size = 0;
+ for (var i = 0; i < 20; i++) {
+ this.mats.push(Mat3.create([0, 0, 0, 0, 0, 0, 0, 0, 0]));
+ }
+ }
+ var _proto = MStack.prototype;
+ _proto.set = function set(m, i) {
+ if (i === 0) Mat3.set(m, this.mats[0]);else Mat3.multiply(this.mats[i - 1], m, this.mats[i]);
+ this.size = Math.max(this.size, i + 1);
+ };
+ _proto.push = function push(m) {
+ if (this.size === 0) Mat3.set(m, this.mats[0]);else Mat3.multiply(this.mats[this.size - 1], m, this.mats[this.size]);
+ this.size++;
+ };
+ _proto.pop = function pop() {
+ if (this.size > 0) this.size--;
+ };
+ _proto.top = function top() {
+ return this.mats[this.size - 1];
+ };
+ return MStack;
+ }();
+
+ /**
+ * Represents a WebGL-based renderer for particle systems.
+ * @extends BaseRenderer
+ */
+ var WebGLRenderer = /*#__PURE__*/function (_BaseRenderer) {
+ _inheritsLoose(WebGLRenderer, _BaseRenderer);
+ /**
+ * Creates a new WebGLRenderer instance.
+ * @param {HTMLCanvasElement} element - The canvas element to render to.
+ */
+ function WebGLRenderer(element) {
+ var _this;
+ _this = _BaseRenderer.call(this, element) || this;
+ _this.gl = _this.element.getContext("experimental-webgl", {
+ antialias: true,
+ stencil: false,
+ depth: false
+ });
+ if (!_this.gl) alert("Sorry your browser do not suppest WebGL!");
+ _this.initVar();
+ _this.setMaxRadius();
+ _this.initShaders();
+ _this.initBuffers();
+ _this.gl.blendEquation(_this.gl.FUNC_ADD);
+ _this.gl.blendFunc(_this.gl.SRC_ALPHA, _this.gl.ONE_MINUS_SRC_ALPHA);
+ _this.gl.enable(_this.gl.BLEND);
+ _this.addImg2Body = _this.addImg2Body.bind(_assertThisInitialized(_this));
+ _this.name = "WebGLRenderer";
+ return _this;
+ }
+ var _proto = WebGLRenderer.prototype;
+ _proto.init = function init(proton) {
+ _BaseRenderer.prototype.init.call(this, proton);
+ this.resize(this.element.width, this.element.height);
+ };
+ _proto.resize = function resize(width, height) {
+ this.umat[4] = -2;
+ this.umat[7] = 1;
+ this.smat[0] = 1 / width;
+ this.smat[4] = 1 / height;
+ this.mstack.set(this.umat, 0);
+ this.mstack.set(this.smat, 1);
+ this.gl.viewport(0, 0, width, height);
+ this.element.width = width;
+ this.element.height = height;
+ };
+ _proto.setMaxRadius = function setMaxRadius(radius) {
+ this.circleCanvasURL = this.createCircle(radius);
+ };
+ _proto.getVertexShader = function getVertexShader() {
+ var vsSource = ["uniform vec2 viewport;", "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "uniform mat3 tMat;", "varying vec2 vTextureCoord;", "varying float alpha;", "void main() {", "vec3 v = tMat * vec3(aVertexPosition, 1.0);", "gl_Position = vec4(v.x, v.y, 0, 1);", "vTextureCoord = aTextureCoord;", "alpha = tMat[0][2];", "}"].join("\n");
+ return vsSource;
+ };
+ _proto.getFragmentShader = function getFragmentShader() {
+ var fsSource = ["precision mediump float;", "varying vec2 vTextureCoord;", "varying float alpha;", "uniform sampler2D uSampler;", "uniform vec4 color;", "uniform bool useTexture;", "uniform vec3 uColor;", "void main() {", "vec4 textureColor = texture2D(uSampler, vTextureCoord);", "gl_FragColor = textureColor * vec4(uColor, 1.0);", "gl_FragColor.w *= alpha;", "}"].join("\n");
+ return fsSource;
+ };
+ _proto.initVar = function initVar() {
+ this.mstack = new MStack();
+ this.umat = Mat3.create([2, 0, 1, 0, -2, 0, -1, 1, 1]);
+ this.smat = Mat3.create([1 / 100, 0, 1, 0, 1 / 100, 0, 0, 0, 1]);
+ this.texturebuffers = {};
+ };
+ _proto.blendEquation = function blendEquation(A) {
+ this.gl.blendEquation(this.gl[A]);
+ };
+ _proto.blendFunc = function blendFunc(A, B) {
+ this.gl.blendFunc(this.gl[A], this.gl[B]);
+ };
+ _proto.getShader = function getShader(gl, str, fs) {
+ var shader = fs ? gl.createShader(gl.FRAGMENT_SHADER) : gl.createShader(gl.VERTEX_SHADER);
+ gl.shaderSource(shader, str);
+ gl.compileShader(shader);
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
+ alert(gl.getShaderInfoLog(shader));
+ return null;
+ }
+ return shader;
+ };
+ _proto.initShaders = function initShaders() {
+ var fragmentShader = this.getShader(this.gl, this.getFragmentShader(), true);
+ var vertexShader = this.getShader(this.gl, this.getVertexShader(), false);
+ this.sprogram = this.gl.createProgram();
+ this.gl.attachShader(this.sprogram, vertexShader);
+ this.gl.attachShader(this.sprogram, fragmentShader);
+ this.gl.linkProgram(this.sprogram);
+ if (!this.gl.getProgramParameter(this.sprogram, this.gl.LINK_STATUS)) alert("Could not initialise shaders");
+ this.gl.useProgram(this.sprogram);
+ this.sprogram.vpa = this.gl.getAttribLocation(this.sprogram, "aVertexPosition");
+ this.sprogram.tca = this.gl.getAttribLocation(this.sprogram, "aTextureCoord");
+ this.gl.enableVertexAttribArray(this.sprogram.tca);
+ this.gl.enableVertexAttribArray(this.sprogram.vpa);
+ this.sprogram.tMatUniform = this.gl.getUniformLocation(this.sprogram, "tMat");
+ this.sprogram.samplerUniform = this.gl.getUniformLocation(this.sprogram, "uSampler");
+ this.sprogram.useTex = this.gl.getUniformLocation(this.sprogram, "useTexture");
+ this.sprogram.color = this.gl.getUniformLocation(this.sprogram, "uColor");
+ this.gl.uniform1i(this.sprogram.useTex, 1);
+ };
+ _proto.initBuffers = function initBuffers() {
+ var vs = [0, 3, 1, 0, 2, 3];
+ var idx;
+ this.unitIBuffer = this.gl.createBuffer();
+ this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);
+ this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(vs), this.gl.STATIC_DRAW);
+ var i;
+ var ids = [];
+ for (i = 0; i < 100; i++) {
+ ids.push(i);
+ }
+ idx = new Uint16Array(ids);
+ this.unitI33 = this.gl.createBuffer();
+ this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitI33);
+ this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);
+ ids = [];
+ for (i = 0; i < 100; i++) {
+ ids.push(i, i + 1, i + 2);
+ }
+ idx = new Uint16Array(ids);
+ this.stripBuffer = this.gl.createBuffer();
+ this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.stripBuffer);
+ this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);
+ };
+ _proto.createCircle = function createCircle(raidus) {
+ this.circleCanvasRadius = WebGLUtil.nhpot(Util.initValue(raidus, 32));
+ var canvas = DomUtil.createCanvas("circle_canvas", this.circleCanvasRadius * 2, this.circleCanvasRadius * 2);
+ var context = canvas.getContext("2d");
+ context.beginPath();
+ context.arc(this.circleCanvasRadius, this.circleCanvasRadius, this.circleCanvasRadius, 0, Math.PI * 2, true);
+ context.closePath();
+ context.fillStyle = "#FFF";
+ context.fill();
+ return canvas.toDataURL();
+ };
+ _proto.drawImg2Canvas = function drawImg2Canvas(particle) {
+ var _w = particle.body.width;
+ var _h = particle.body.height;
+ var _width = WebGLUtil.nhpot(particle.body.width);
+ var _height = WebGLUtil.nhpot(particle.body.height);
+ var _scaleX = particle.body.width / _width;
+ var _scaleY = particle.body.height / _height;
+ if (!this.texturebuffers[particle.data.src]) this.texturebuffers[particle.data.src] = [this.gl.createTexture(), this.gl.createBuffer(), this.gl.createBuffer()];
+ particle.data.texture = this.texturebuffers[particle.data.src][0];
+ particle.data.vcBuffer = this.texturebuffers[particle.data.src][1];
+ particle.data.tcBuffer = this.texturebuffers[particle.data.src][2];
+ this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.tcBuffer);
+ this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, _scaleX, 0.0, 0.0, _scaleY, _scaleY, _scaleY]), this.gl.STATIC_DRAW);
+ this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.vcBuffer);
+ this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, _w, 0.0, 0.0, _h, _w, _h]), this.gl.STATIC_DRAW);
+ var context = particle.data.canvas.getContext("2d");
+ var data = context.getImageData(0, 0, _width, _height);
+ this.gl.bindTexture(this.gl.TEXTURE_2D, particle.data.texture);
+ this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, data);
+ this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);
+ this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_NEAREST);
+ this.gl.generateMipmap(this.gl.TEXTURE_2D);
+ particle.data.textureLoaded = true;
+ particle.data.textureWidth = _w;
+ particle.data.textureHeight = _h;
+ };
+ _proto.onProtonUpdate = function onProtonUpdate() {
+ // this.gl.clearColor(0, 0, 0, 1);
+ // this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);
+ };
+ _proto.onParticleCreated = function onParticleCreated(particle) {
+ particle.data.textureLoaded = false;
+ particle.data.tmat = Mat3.create();
+ particle.data.tmat[8] = 1;
+ particle.data.imat = Mat3.create();
+ particle.data.imat[8] = 1;
+ if (particle.body) {
+ ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);
+ } else {
+ ImgUtil.getImgFromCache(this.circleCanvasURL, this.addImg2Body, particle);
+ particle.data.oldScale = particle.radius / this.circleCanvasRadius;
+ }
+ }
- if (!this.texturebuffers[particle.transform.src]) this.texturebuffers[particle.transform.src] = [this.gl.createTexture(), this.gl.createBuffer(), this.gl.createBuffer()];
+ // private
+ ;
+ _proto.addImg2Body = function addImg2Body(img, particle) {
+ if (particle.dead) return;
+ particle.body = img;
+ particle.data.src = img.src;
+ particle.data.canvas = ImgUtil.getCanvasFromCache(img);
+ particle.data.oldScale = 1;
+ this.drawImg2Canvas(particle);
+ };
+ _proto.onParticleUpdate = function onParticleUpdate(particle) {
+ if (particle.data.textureLoaded) {
+ this.updateMatrix(particle);
+ this.gl.uniform3f(this.sprogram.color, particle.rgb.r / 255, particle.rgb.g / 255, particle.rgb.b / 255);
+ this.gl.uniformMatrix3fv(this.sprogram.tMatUniform, false, this.mstack.top());
+ this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.vcBuffer);
+ this.gl.vertexAttribPointer(this.sprogram.vpa, 2, this.gl.FLOAT, false, 0, 0);
+ this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.tcBuffer);
+ this.gl.vertexAttribPointer(this.sprogram.tca, 2, this.gl.FLOAT, false, 0, 0);
+ this.gl.bindTexture(this.gl.TEXTURE_2D, particle.data.texture);
+ this.gl.uniform1i(this.sprogram.samplerUniform, 0);
+ this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);
+ this.gl.drawElements(this.gl.TRIANGLES, 6, this.gl.UNSIGNED_SHORT, 0);
+ this.mstack.pop();
+ }
+ };
+ _proto.onParticleDead = function onParticleDead(particle) {};
+ _proto.updateMatrix = function updateMatrix(particle) {
+ var moveOriginMatrix = WebGLUtil.makeTranslation(-particle.data.textureWidth / 2, -particle.data.textureHeight / 2);
+ var translationMatrix = WebGLUtil.makeTranslation(particle.p.x, particle.p.y);
+ var angel = particle.rotation * MathUtil.PI_180;
+ var rotationMatrix = WebGLUtil.makeRotation(angel);
+ var scale = particle.scale * particle.data.oldScale;
+ var scaleMatrix = WebGLUtil.makeScale(scale, scale);
+ var matrix = WebGLUtil.matrixMultiply(moveOriginMatrix, scaleMatrix);
+ matrix = WebGLUtil.matrixMultiply(matrix, rotationMatrix);
+ matrix = WebGLUtil.matrixMultiply(matrix, translationMatrix);
+ Mat3.inverse(matrix, particle.data.imat);
+ matrix[2] = particle.alpha;
+ this.mstack.push(matrix);
+ };
+ _proto.destroy = function destroy() {
+ _BaseRenderer.prototype.destroy.call(this);
+ this.gl = null;
+ this.mstack = null;
+ this.umat = null;
+ this.smat = null;
+ this.texturebuffers = null;
+ };
+ return WebGLRenderer;
+ }(BaseRenderer);
- particle.transform.texture = this.texturebuffers[particle.transform.src][0];
- particle.transform.vcBuffer = this.texturebuffers[particle.transform.src][1];
- particle.transform.tcBuffer = this.texturebuffers[particle.transform.src][2];
+ /**
+ * Represents a custom renderer that extends the BaseRenderer.
+ * @extends BaseRenderer
+ */
+ var CustomRenderer = /*#__PURE__*/function (_BaseRenderer) {
+ _inheritsLoose(CustomRenderer, _BaseRenderer);
+ /**
+ * Creates a new CustomRenderer instance.
+ * @param {HTMLElement} element - The HTML element to render to.
+ */
+ function CustomRenderer(element) {
+ var _this;
+ _this = _BaseRenderer.call(this, element) || this;
+
+ /**
+ * The name of the renderer.
+ * @type {string}
+ */
+ _this.name = "CustomRenderer";
+ return _this;
+ }
+ return CustomRenderer;
+ }(BaseRenderer);
- this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.tcBuffer);
- this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, _scaleX, 0.0, 0.0, _scaleY, _scaleY, _scaleY]), this.gl.STATIC_DRAW);
- this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.vcBuffer);
- this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, _w, 0.0, 0.0, _h, _w, _h]), this.gl.STATIC_DRAW);
+ /**
+ * Represents a line zone for particle systems.
+ * @extends Zone
+ */
+ var LineZone = /*#__PURE__*/function (_Zone) {
+ _inheritsLoose(LineZone, _Zone);
+ /**
+ * Creates a new LineZone.
+ * @param {number} x1 - The x-coordinate of the first point.
+ * @param {number} y1 - The y-coordinate of the first point.
+ * @param {number} [x2] - The x-coordinate of the second point.
+ * @param {number} [y2] - The y-coordinate of the second point.
+ * @param {string} [direction=">"] - The direction of the line.
+ */
+ function LineZone(x1, y1, x2, y2, direction) {
+ var _this;
+ if (direction === void 0) {
+ direction = ">";
+ }
+ _this = _Zone.call(this) || this;
+ if (x2 - x1 >= 0) {
+ _this.x1 = x1;
+ _this.y1 = y1;
+ _this.x2 = x2;
+ _this.y2 = y2;
+ } else {
+ _this.x1 = x2;
+ _this.y1 = y2;
+ _this.x2 = x1;
+ _this.y2 = y1;
+ }
+ _this.dx = _this.x2 - _this.x1;
+ _this.dy = _this.y2 - _this.y1;
+ _this.minx = Math.min(_this.x1, _this.x2);
+ _this.miny = Math.min(_this.y1, _this.y2);
+ _this.maxx = Math.max(_this.x1, _this.x2);
+ _this.maxy = Math.max(_this.y1, _this.y2);
+ _this.dot = _this.x2 * _this.y1 - _this.x1 * _this.y2;
+ _this.xxyy = _this.dx * _this.dx + _this.dy * _this.dy;
+ _this.gradient = _this.getGradient();
+ _this.length = _this.getLength();
+ _this.direction = Util.initValue(direction, ">");
+ return _this;
+ }
- var context = particle.transform.canvas.getContext('2d');
- var data = context.getImageData(0, 0, _width, _height);
+ /**
+ * Gets a random position on the line.
+ * @returns {Vector2D} A vector representing the random position.
+ */
+ var _proto = LineZone.prototype;
+ _proto.getPosition = function getPosition() {
+ this.random = Math.random();
+ this.vector.x = this.x1 + this.random * this.length * Math.cos(this.gradient);
+ this.vector.y = this.y1 + this.random * this.length * Math.sin(this.gradient);
+ return this.vector;
+ }
- this.gl.bindTexture(this.gl.TEXTURE_2D, particle.transform.texture);
- this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, data);
- this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);
- this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_NEAREST);
- this.gl.generateMipmap(this.gl.TEXTURE_2D);
+ /**
+ * Determines which side of the line a point is on.
+ * @param {number} x - The x-coordinate of the point.
+ * @param {number} y - The y-coordinate of the point.
+ * @returns {boolean} True if the point is on the positive side of the line, false otherwise.
+ */;
+ _proto.getDirection = function getDirection(x, y) {
+ var A = this.dy;
+ var B = -this.dx;
+ var C = this.dot;
+ var D = B === 0 ? 1 : B;
+ if ((A * x + B * y + C) * D > 0) return true;else return false;
+ }
- particle.transform.textureLoaded = true;
- particle.transform.textureWidth = _w;
- particle.transform.textureHeight = _h;
- }
- }, {
- key: 'onProtonUpdate',
- value: function onProtonUpdate() {
- //this.gl.clearColor(0, 0, 0, 1);
- //this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);
- }
- }, {
- key: 'onParticleCreated',
- value: function onParticleCreated(particle) {
- particle.transform.textureLoaded = false;
- particle.transform.tmat = Mat3.create();
- particle.transform.tmat[8] = 1;
- particle.transform.imat = Mat3.create();
- particle.transform.imat[8] = 1;
-
- if (particle.body) {
- ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);
- } else {
- ImgUtil.getImgFromCache(this.circleCanvasURL, this.addImg2Body, particle);
- particle.transform.oldScale = particle.radius / this.circleCanvasRadius;
- }
- }
+ /**
+ * Calculates the distance of a point from the line.
+ * @param {number} x - The x-coordinate of the point.
+ * @param {number} y - The y-coordinate of the point.
+ * @returns {number} The distance from the point to the line.
+ */;
+ _proto.getDistance = function getDistance(x, y) {
+ var A = this.dy;
+ var B = -this.dx;
+ var C = this.dot;
+ var D = A * x + B * y + C;
+ return D / Math.sqrt(this.xxyy);
+ }
- // private
+ /**
+ * Calculates the symmetric vector of a given vector with respect to the line.
+ * @param {Vector2D} v - The vector to reflect.
+ * @returns {Vector2D} The reflected vector.
+ */;
+ _proto.getSymmetric = function getSymmetric(v) {
+ var tha2 = v.getGradient();
+ var tha1 = this.getGradient();
+ var tha = 2 * (tha1 - tha2);
+ var oldx = v.x;
+ var oldy = v.y;
+ v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);
+ v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);
+ return v;
+ }
- }, {
- key: 'addImg2Body',
- value: function addImg2Body(img, particle) {
- if (particle.dead) return;
+ /**
+ * Gets the gradient (angle) of the line.
+ * @returns {number} The gradient of the line in radians.
+ */;
+ _proto.getGradient = function getGradient() {
+ return Math.atan2(this.dy, this.dx);
+ }
- particle.body = img;
- particle.transform.src = img.src;
- particle.transform.canvas = ImgUtil.getCanvasFromCache(img);
- particle.transform.oldScale = 1;
+ /**
+ * Checks if a particle is outside the range of the line.
+ * @param {Particle} particle - The particle to check.
+ * @returns {boolean} True if the particle is within range, false otherwise.
+ */;
+ _proto.rangeOut = function rangeOut(particle) {
+ var angle = Math.abs(this.getGradient());
+ if (angle <= MathUtil.PI / 4) {
+ if (particle.p.x <= this.maxx && particle.p.x >= this.minx) return true;
+ } else {
+ if (particle.p.y <= this.maxy && particle.p.y >= this.miny) return true;
+ }
+ return false;
+ }
- this.drawImg2Canvas(particle);
- }
- }, {
- key: 'onParticleUpdate',
- value: function onParticleUpdate(particle) {
- if (particle.transform.textureLoaded) {
- this.updateMatrix(particle);
-
- this.gl.uniform3f(this.sprogram.color, particle.transform.rgb.r / 255, particle.transform.rgb.g / 255, particle.transform.rgb.b / 255);
- this.gl.uniformMatrix3fv(this.sprogram.tMatUniform, false, this.mstack.top());
-
- this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.vcBuffer);
- this.gl.vertexAttribPointer(this.sprogram.vpa, 2, this.gl.FLOAT, false, 0, 0);
- this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.tcBuffer);
- this.gl.vertexAttribPointer(this.sprogram.tca, 2, this.gl.FLOAT, false, 0, 0);
- this.gl.bindTexture(this.gl.TEXTURE_2D, particle.transform.texture);
- this.gl.uniform1i(this.sprogram.samplerUniform, 0);
- this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);
-
- this.gl.drawElements(this.gl.TRIANGLES, 6, this.gl.UNSIGNED_SHORT, 0);
-
- this.mstack.pop();
- }
- }
- }, {
- key: 'onParticleDead',
- value: function onParticleDead(particle) {}
- }, {
- key: 'updateMatrix',
- value: function updateMatrix(particle) {
- var moveOriginMatrix = WebGLUtil.makeTranslation(-particle.transform.textureWidth / 2, -particle.transform.textureHeight / 2);
- var translationMatrix = WebGLUtil.makeTranslation(particle.p.x, particle.p.y);
+ /**
+ * Gets the length of the line.
+ * @returns {number} The length of the line.
+ */;
+ _proto.getLength = function getLength() {
+ return Math.sqrt(this.dx * this.dx + this.dy * this.dy);
+ }
- var angel = particle.rotation * MathUtils.PI_180;
- var rotationMatrix = WebGLUtil.makeRotation(angel);
+ /**
+ * Handles particle crossing behavior based on the crossType.
+ * @param {Particle} particle - The particle to check for crossing.
+ */;
+ _proto.crossing = function crossing(particle) {
+ if (this.crossType === "dead") {
+ if (this.direction === ">" || this.direction === "R" || this.direction === "right" || this.direction === "down") {
+ if (!this.rangeOut(particle)) return;
+ if (this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;
+ } else {
+ if (!this.rangeOut(particle)) return;
+ if (!this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;
+ }
+ } else if (this.crossType === "bound") {
+ if (!this.rangeOut(particle)) return;
+ if (this.getDistance(particle.p.x, particle.p.y) <= particle.radius) {
+ if (this.dx === 0) {
+ particle.v.x *= -1;
+ } else if (this.dy === 0) {
+ particle.v.y *= -1;
+ } else {
+ this.getSymmetric(particle.v);
+ }
+ }
+ } else if (this.crossType === "cross") {
+ if (this.alert) {
+ console.error("Sorry, LineZone does not support cross method!");
+ this.alert = false;
+ }
+ }
+ };
+ return LineZone;
+ }(Zone);
+
+ /**
+ * Represents a circular zone in a 2D space.
+ * @extends Zone
+ */
+ var CircleZone = /*#__PURE__*/function (_Zone) {
+ _inheritsLoose(CircleZone, _Zone);
+ /**
+ * Creates a new CircleZone.
+ * @param {number} x - The x-coordinate of the circle's center.
+ * @param {number} y - The y-coordinate of the circle's center.
+ * @param {number} [radius] - The radius of the circle.
+ */
+ function CircleZone(x, y, radius) {
+ var _this;
+ _this = _Zone.call(this) || this;
+ _this.x = x;
+ _this.y = y;
+ _this.radius = radius;
+ _this.angle = 0;
+ _this.center = {
+ x: x,
+ y: y
+ };
+ return _this;
+ }
- var scale = particle.scale * particle.transform.oldScale;
- var scaleMatrix = WebGLUtil.makeScale(scale, scale);
- var matrix = WebGLUtil.matrixMultiply(moveOriginMatrix, scaleMatrix);
+ /**
+ * Gets a random position within the circle.
+ * @returns {Object} An object with x and y coordinates.
+ */
+ var _proto = CircleZone.prototype;
+ _proto.getPosition = function getPosition() {
+ this.angle = MathUtil.PIx2 * Math.random();
+ this.randomRadius = Math.random() * this.radius;
+ this.vector.x = this.x + this.randomRadius * Math.cos(this.angle);
+ this.vector.y = this.y + this.randomRadius * Math.sin(this.angle);
+ return this.vector;
+ }
- matrix = WebGLUtil.matrixMultiply(matrix, rotationMatrix);
- matrix = WebGLUtil.matrixMultiply(matrix, translationMatrix);
+ /**
+ * Sets the center of the circle.
+ * @param {number} x - The new x-coordinate of the center.
+ * @param {number} y - The new y-coordinate of the center.
+ */;
+ _proto.setCenter = function setCenter(x, y) {
+ this.center.x = x;
+ this.center.y = y;
+ }
- Mat3.inverse(matrix, particle.transform.imat);
- matrix[2] = particle.alpha;
+ /**
+ * Handles particle crossing behavior.
+ * @param {Object} particle - The particle to check for crossing.
+ */;
+ _proto.crossing = function crossing(particle) {
+ var d = particle.p.distanceTo(this.center);
+ if (this.crossType === "dead") {
+ if (d - particle.radius > this.radius) particle.dead = true;
+ } else if (this.crossType === "bound") {
+ if (d + particle.radius >= this.radius) this.getSymmetric(particle);
+ } else if (this.crossType === "cross") {
+ if (this.alert) {
+ console.error("Sorry, CircleZone does not support cross method!");
+ this.alert = false;
+ }
+ }
+ }
- this.mstack.push(matrix);
- }
- }]);
- return WebGLRenderer;
-}(BaseRenderer);
+ /**
+ * Calculates the symmetric position of a particle.
+ * @param {Object} particle - The particle to calculate symmetry for.
+ */;
+ _proto.getSymmetric = function getSymmetric(particle) {
+ var tha2 = particle.v.getGradient();
+ var tha1 = this.getGradient(particle);
+ var tha = 2 * (tha1 - tha2);
+ var oldx = particle.v.x;
+ var oldy = particle.v.y;
+ particle.v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);
+ particle.v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);
+ }
-var CustomRenderer = function (_BaseRenderer) {
- inherits(CustomRenderer, _BaseRenderer);
+ /**
+ * Calculates the gradient for a particle.
+ * @param {Object} particle - The particle to calculate the gradient for.
+ * @returns {number} The calculated gradient.
+ */;
+ _proto.getGradient = function getGradient(particle) {
+ return -MathUtil.PI_2 + Math.atan2(particle.p.y - this.center.y, particle.p.x - this.center.x);
+ };
+ return CircleZone;
+ }(Zone);
- function CustomRenderer(element) {
- classCallCheck(this, CustomRenderer);
+ /**
+ * Represents a rectangular zone for particle systems.
+ * @extends Zone
+ */
+ var RectZone = /*#__PURE__*/function (_Zone) {
+ _inheritsLoose(RectZone, _Zone);
+ /**
+ * Creates a new RectZone.
+ * @param {number} x - The x-coordinate of the top-left corner of the rectangle.
+ * @param {number} y - The y-coordinate of the top-left corner of the rectangle.
+ * @param {number} [width] - The width of the rectangle.
+ * @param {number} [height] - The height of the rectangle.
+ */
+ function RectZone(x, y, width, height) {
+ var _this;
+ if (width === void 0) {
+ width = 200;
+ }
+ if (height === void 0) {
+ height = 200;
+ }
+ _this = _Zone.call(this) || this;
+ _this.x = x;
+ _this.y = y;
+ _this.width = width;
+ _this.height = height;
+ return _this;
+ }
- var _this = possibleConstructorReturn(this, (CustomRenderer.__proto__ || Object.getPrototypeOf(CustomRenderer)).call(this, element));
+ /**
+ * Gets a random position within the rectangular zone.
+ * @returns {Vector2D} A vector representing the random position.
+ */
+ var _proto = RectZone.prototype;
+ _proto.getPosition = function getPosition() {
+ this.vector.x = this.x + Math.random() * this.width;
+ this.vector.y = this.y + Math.random() * this.height;
+ return this.vector;
+ }
- _this.name = 'CustomRenderer';
- return _this;
+ /**
+ * Handles particle crossing behavior based on the crossType.
+ * @param {Particle} particle - The particle to check for crossing.
+ */;
+ _proto.crossing = function crossing(particle) {
+ // particle dead zone
+ if (this.crossType === "dead") {
+ if (particle.p.x + particle.radius < this.x) particle.dead = true;else if (particle.p.x - particle.radius > this.x + this.width) particle.dead = true;
+ if (particle.p.y + particle.radius < this.y) particle.dead = true;else if (particle.p.y - particle.radius > this.y + this.height) particle.dead = true;
+ }
+
+ // particle bound zone
+ else if (this.crossType === "bound") {
+ if (particle.p.x - particle.radius < this.x) {
+ particle.p.x = this.x + particle.radius;
+ particle.v.x *= -1;
+ } else if (particle.p.x + particle.radius > this.x + this.width) {
+ particle.p.x = this.x + this.width - particle.radius;
+ particle.v.x *= -1;
+ }
+ if (particle.p.y - particle.radius < this.y) {
+ particle.p.y = this.y + particle.radius;
+ particle.v.y *= -1;
+ } else if (particle.p.y + particle.radius > this.y + this.height) {
+ particle.p.y = this.y + this.height - particle.radius;
+ particle.v.y *= -1;
+ }
+ }
+
+ // particle cross zone
+ else if (this.crossType === "cross") {
+ if (particle.p.x + particle.radius < this.x && particle.v.x <= 0) {
+ particle.p.x = this.x + this.width + particle.radius;
+ } else if (particle.p.x - particle.radius > this.x + this.width && particle.v.x >= 0) {
+ particle.p.x = this.x - particle.radius;
+ }
+ if (particle.p.y + particle.radius < this.y && particle.v.y <= 0) {
+ particle.p.y = this.y + this.height + particle.radius;
+ } else if (particle.p.y - particle.radius > this.y + this.height && particle.v.y >= 0) {
+ particle.p.y = this.y - particle.radius;
+ }
+ }
+ };
+ return RectZone;
+ }(Zone);
+
+ /**
+ * Represents a zone based on image data.
+ * @extends Zone
+ */
+ var ImageZone = /*#__PURE__*/function (_Zone) {
+ _inheritsLoose(ImageZone, _Zone);
+ /**
+ * Creates an ImageZone.
+ * @param {ImageData} imageData - The image data to use for the zone.
+ * @param {number} [x=0] - The x-coordinate offset.
+ * @param {number} [y=0] - The y-coordinate offset.
+ * @param {number} [d=2] - The sampling density.
+ */
+ function ImageZone(imageData, x, y, d) {
+ var _this;
+ _this = _Zone.call(this) || this;
+ _this.reset(imageData, x, y, d);
+ return _this;
}
- return CustomRenderer;
-}(BaseRenderer);
-
-var LineZone = function (_Zone) {
- inherits(LineZone, _Zone);
-
- function LineZone(x1, y1, x2, y2, direction) {
- classCallCheck(this, LineZone);
-
- var _this = possibleConstructorReturn(this, (LineZone.__proto__ || Object.getPrototypeOf(LineZone)).call(this));
-
- if (x2 - x1 >= 0) {
- _this.x1 = x1;
- _this.y1 = y1;
- _this.x2 = x2;
- _this.y2 = y2;
- } else {
- _this.x1 = x2;
- _this.y1 = y2;
- _this.x2 = x1;
- _this.y2 = y1;
- }
-
- _this.dx = _this.x2 - _this.x1;
- _this.dy = _this.y2 - _this.y1;
-
- _this.minx = Math.min(_this.x1, _this.x2);
- _this.miny = Math.min(_this.y1, _this.y2);
- _this.maxx = Math.max(_this.x1, _this.x2);
- _this.maxy = Math.max(_this.y1, _this.y2);
-
- _this.dot = _this.x2 * _this.y1 - _this.x1 * _this.y2;
- _this.xxyy = _this.dx * _this.dx + _this.dy * _this.dy;
-
- _this.gradient = _this.getGradient();
- _this.length = _this.getLength();
- _this.direction = Util.initValue(direction, '>');
- return _this;
- }
-
- createClass(LineZone, [{
- key: 'getPosition',
- value: function getPosition() {
- this.random = Math.random();
- this.vector.x = this.x1 + this.random * this.length * Math.cos(this.gradient);
- this.vector.y = this.y1 + this.random * this.length * Math.sin(this.gradient);
-
- return this.vector;
- }
- }, {
- key: 'getDirection',
- value: function getDirection(x, y) {
- var A = this.dy;
- var B = -this.dx;
- var C = this.dot;
- var D = B == 0 ? 1 : B;
-
- if ((A * x + B * y + C) * D > 0) return true;else return false;
- }
- }, {
- key: 'getDistance',
- value: function getDistance(x, y) {
- var A = this.dy;
- var B = -this.dx;
- var C = this.dot;
- var D = A * x + B * y + C;
-
- return D / Math.sqrt(this.xxyy);
- }
- }, {
- key: 'getSymmetric',
- value: function getSymmetric(v) {
- var tha2 = v.getGradient();
- var tha1 = this.getGradient();
- var tha = 2 * (tha1 - tha2);
-
- var oldx = v.x;
- var oldy = v.y;
-
- v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);
- v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);
-
- return v;
- }
- }, {
- key: 'getGradient',
- value: function getGradient() {
- return Math.atan2(this.dy, this.dx);
- }
- }, {
- key: 'rangeOut',
- value: function rangeOut(particle) {
- var angle = Math.abs(this.getGradient());
-
- if (angle <= MathUtils.PI / 4) {
- if (particle.p.x <= this.maxx && particle.p.x >= this.minx) return true;
- } else {
- if (particle.p.y <= this.maxy && particle.p.y >= this.miny) return true;
- }
-
- return false;
- }
- }, {
- key: 'getLength',
- value: function getLength() {
- return Math.sqrt(this.dx * this.dx + this.dy * this.dy);
- }
- }, {
- key: 'crossing',
- value: function crossing(particle) {
- if (this.crossType == "dead") {
- if (this.direction == ">" || this.direction == "R" || this.direction == "right" || this.direction == "down") {
- if (!this.rangeOut(particle)) return;
- if (this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;
- } else {
- if (!this.rangeOut(particle)) return;
- if (!this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;
- }
- } else if (this.crossType == "bound") {
- if (!this.rangeOut(particle)) return;
-
- if (this.getDistance(particle.p.x, particle.p.y) <= particle.radius) {
- if (this.dx == 0) {
- particle.v.x *= -1;
- } else if (this.dy == 0) {
- particle.v.y *= -1;
- } else {
- this.getSymmetric(particle.v);
- }
- }
- } else if (this.crossType == "cross") {
- if (this.alert) {
- console.error('Sorry lineZone does not support cross method');
- this.alert = false;
- }
- }
- }
- }]);
- return LineZone;
-}(Zone);
-
-var CircleZone = function (_Zone) {
- inherits(CircleZone, _Zone);
+ /**
+ * Resets the ImageZone with new parameters.
+ * @param {ImageData} imageData - The image data to use for the zone.
+ * @param {number} [x=0] - The x-coordinate offset.
+ * @param {number} [y=0] - The y-coordinate offset.
+ * @param {number} [d=2] - The sampling density.
+ */
+ var _proto = ImageZone.prototype;
+ _proto.reset = function reset(imageData, x, y, d) {
+ this.imageData = imageData;
+ this.x = Util.initValue(x, 0);
+ this.y = Util.initValue(y, 0);
+ this.d = Util.initValue(d, 2);
+ this.vectors = [];
+ this.setVectors();
+ }
- function CircleZone(x, y, radius) {
- classCallCheck(this, CircleZone);
+ /**
+ * Sets up vectors based on the image data.
+ * @returns {Object} The vector object.
+ */;
+ _proto.setVectors = function setVectors() {
+ var i, j;
+ var length1 = this.imageData.width;
+ var length2 = this.imageData.height;
+ for (i = 0; i < length1; i += this.d) {
+ for (j = 0; j < length2; j += this.d) {
+ var index = ((j >> 0) * length1 + (i >> 0)) * 4;
+ if (this.imageData.data[index + 3] > 0) {
+ this.vectors.push({
+ x: i + this.x,
+ y: j + this.y
+ });
+ }
+ }
+ }
+ return this.vector;
+ }
- var _this = possibleConstructorReturn(this, (CircleZone.__proto__ || Object.getPrototypeOf(CircleZone)).call(this));
+ /**
+ * Checks if a point is within the bounds of the image.
+ * @param {number} x - The x-coordinate to check.
+ * @param {number} y - The y-coordinate to check.
+ * @returns {boolean} True if the point is within bounds, false otherwise.
+ */;
+ _proto.getBound = function getBound(x, y) {
+ var index = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;
+ return this.imageData.data[index + 3] > 0;
+ }
- _this.x = x;
- _this.y = y;
- _this.radius = radius;
+ /**
+ * Gets a random position within the image zone.
+ * @returns {Object} A vector representing the position.
+ */;
+ _proto.getPosition = function getPosition() {
+ var vector = Util.getRandFromArray(this.vectors);
+ return this.vector.copy(vector);
+ }
- _this.angle = 0;
- _this.center = { x: x, y: y };
- return _this;
+ /**
+ * Gets the color at a specific point in the image.
+ * @param {number} x - The x-coordinate.
+ * @param {number} y - The y-coordinate.
+ * @returns {Object} An object containing r, g, b, and a values.
+ */;
+ _proto.getColor = function getColor(x, y) {
+ x -= this.x;
+ y -= this.y;
+ var i = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;
+ return {
+ r: this.imageData.data[i],
+ g: this.imageData.data[i + 1],
+ b: this.imageData.data[i + 2],
+ a: this.imageData.data[i + 3]
+ };
}
- createClass(CircleZone, [{
- key: 'getPosition',
- value: function getPosition() {
- this.random = Math.random();
- this.angle = MathUtils.PIx2 * Math.random();
+ /**
+ * Handles particle crossing behavior.
+ * @param {Object} particle - The particle to check for crossing.
+ */;
+ _proto.crossing = function crossing(particle) {
+ if (this.crossType === "dead") {
+ particle.dead = this.getBound(particle.p.x - this.x, particle.p.y - this.y);
+ } else if (this.crossType === "bound") {
+ if (!this.getBound(particle.p.x - this.x, particle.p.y - this.y)) particle.v.negate();
+ }
+ }
- this.vector.x = this.x + this.random * this.radius * Math.cos(this.angle);
- this.vector.y = this.y + this.random * this.radius * Math.sin(this.angle);
+ /**
+ * Destroys the ImageZone and cleans up resources.
+ */;
+ _proto.destroy = function destroy() {
+ _Zone.prototype.destroy.call(this);
+ this.imageData = null;
+ };
+ return ImageZone;
+ }(Zone);
+
+ var Debug = {
+ addEventListener: function addEventListener(proton, func) {
+ proton.addEventListener("PROTON_UPDATE_AFTER", function () {
+ return func();
+ });
+ },
+ getStyle: function getStyle(color) {
+ if (color === void 0) {
+ color = "#ff0000";
+ }
+ var rgb = ColorUtil.hexToRgb(color);
+ return "rgba(" + rgb.r + ", " + rgb.g + ", " + rgb.b + ", 0.5)";
+ },
+ drawZone: function drawZone(proton, canvas, zone, clear) {
+ var context = canvas.getContext("2d");
+ var style = this.getStyle();
+ this.addEventListener(proton, function () {
+ if (clear) context.clearRect(0, 0, canvas.width, canvas.height);
+ if (zone instanceof PointZone) {
+ context.beginPath();
+ context.fillStyle = style;
+ context.arc(zone.x, zone.y, 10, 0, Math.PI * 2, true);
+ context.fill();
+ context.closePath();
+ } else if (zone instanceof LineZone) {
+ context.beginPath();
+ context.strokeStyle = style;
+ context.moveTo(zone.x1, zone.y1);
+ context.lineTo(zone.x2, zone.y2);
+ context.stroke();
+ context.closePath();
+ } else if (zone instanceof RectZone) {
+ context.beginPath();
+ context.strokeStyle = style;
+ context.drawRect(zone.x, zone.y, zone.width, zone.height);
+ context.stroke();
+ context.closePath();
+ } else if (zone instanceof CircleZone) {
+ context.beginPath();
+ context.strokeStyle = style;
+ context.arc(zone.x, zone.y, zone.radius, 0, Math.PI * 2, true);
+ context.stroke();
+ context.closePath();
+ }
+ });
+ },
+ drawEmitter: function drawEmitter(proton, canvas, emitter, clear) {
+ var context = canvas.getContext("2d");
+ var style = this.getStyle();
+ this.addEventListener(proton, function () {
+ if (clear) context.clearRect(0, 0, canvas.width, canvas.height);
+ context.beginPath();
+ context.fillStyle = style;
+ context.arc(emitter.p.x, emitter.p.y, 10, 0, Math.PI * 2, true);
+ context.fill();
+ context.closePath();
+ });
+ }
+ };
- return this.vector;
- }
- }, {
- key: 'setCenter',
- value: function setCenter(x, y) {
- this.center.x = x;
- this.center.y = y;
- }
- }, {
- key: 'crossing',
- value: function crossing(particle) {
- var d = particle.p.distanceTo(this.center);
-
- if (this.crossType == "dead") {
- if (d - particle.radius > this.radius) particle.dead = true;
- } else if (this.crossType == "bound") {
- if (d + particle.radius >= this.radius) this.getSymmetric(particle);
- } else if (this.crossType == "cross") {
- if (this.alert) {
- alert('Sorry CircleZone does not support cross method');
- this.alert = false;
- }
- }
- }
- }, {
- key: 'getSymmetric',
- value: function getSymmetric(particle) {
- var tha2 = particle.v.getGradient();
- var tha1 = this.getGradient(particle);
-
- var tha = 2 * (tha1 - tha2);
- var oldx = particle.v.x;
- var oldy = particle.v.y;
-
- particle.v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);
- particle.v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);
- }
- }, {
- key: 'getGradient',
- value: function getGradient(particle) {
- return -MathUtils.PI_2 + Math.atan2(particle.p.y - this.center.y, particle.p.x - this.center.x);
- }
- }]);
- return CircleZone;
-}(Zone);
-
-var RectZone = function (_Zone) {
- inherits(RectZone, _Zone);
-
- function RectZone(x, y, width, height) {
- classCallCheck(this, RectZone);
-
- var _this = possibleConstructorReturn(this, (RectZone.__proto__ || Object.getPrototypeOf(RectZone)).call(this));
-
- _this.x = x;
- _this.y = y;
- _this.width = width;
- _this.height = height;
- return _this;
- }
-
- createClass(RectZone, [{
- key: "getPosition",
- value: function getPosition() {
- this.vector.x = this.x + Math.random() * this.width;
- this.vector.y = this.y + Math.random() * this.height;
-
- return this.vector;
- }
- }, {
- key: "crossing",
- value: function crossing(particle) {
- if (this.crossType == "dead") {
- if (particle.p.x + particle.radius < this.x) particle.dead = true;else if (particle.p.x - particle.radius > this.x + this.width) particle.dead = true;
-
- if (particle.p.y + particle.radius < this.y) particle.dead = true;else if (particle.p.y - particle.radius > this.y + this.height) particle.dead = true;
- } else if (this.crossType == "bound") {
- if (particle.p.x - particle.radius < this.x) {
- particle.p.x = this.x + particle.radius;
- particle.v.x *= -1;
- } else if (particle.p.x + particle.radius > this.x + this.width) {
- particle.p.x = this.x + this.width - particle.radius;
- particle.v.x *= -1;
- }
-
- if (particle.p.y - particle.radius < this.y) {
- particle.p.y = this.y + particle.radius;
- particle.v.y *= -1;
- } else if (particle.p.y + particle.radius > this.y + this.height) {
- particle.p.y = this.y + this.height - particle.radius;
- particle.v.y *= -1;
- }
- } else if (this.crossType == "cross") {
- if (particle.p.x + particle.radius < this.x && particle.v.x <= 0) particle.p.x = this.x + this.width + particle.radius;else if (particle.p.x - particle.radius > this.x + this.width && particle.v.x >= 0) particle.p.x = this.x - particle.radius;
-
- if (particle.p.y + particle.radius < this.y && particle.v.y <= 0) particle.p.y = this.y + this.height + particle.radius;else if (particle.p.y - particle.radius > this.y + this.height && particle.v.y >= 0) particle.p.y = this.y - particle.radius;
- }
- }
- }]);
- return RectZone;
-}(Zone);
-
-var ImageZone = function (_Zone) {
- inherits(ImageZone, _Zone);
-
- function ImageZone(imageData, x, y, d) {
- classCallCheck(this, ImageZone);
-
- var _this = possibleConstructorReturn(this, (ImageZone.__proto__ || Object.getPrototypeOf(ImageZone)).call(this));
-
- _this.reset(imageData, x, y, d);
- return _this;
- }
-
- createClass(ImageZone, [{
- key: 'reset',
- value: function reset(imageData, x, y, d) {
- this.imageData = imageData;
- this.x = Util.initValue(x, 0);
- this.y = Util.initValue(y, 0);
- this.d = Util.initValue(d, 2);
-
- this.vectors = [];
- this.setVectors();
- }
- }, {
- key: 'setVectors',
- value: function setVectors() {
- var i = void 0,
- j = void 0;
- var length1 = this.imageData.width;
- var length2 = this.imageData.height;
-
- for (i = 0; i < length1; i += this.d) {
- for (j = 0; j < length2; j += this.d) {
- var index = ((j >> 0) * length1 + (i >> 0)) * 4;
-
- if (this.imageData.data[index + 3] > 0) {
- this.vectors.push({ x: i + this.x, y: j + this.y });
- }
- }
- }
-
- return this.vector;
- }
- }, {
- key: 'getBound',
- value: function getBound(x, y) {
- var index = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;
- if (this.imageData.data[index + 3] > 0) return true;else return false;
- }
- }, {
- key: 'getPosition',
- value: function getPosition() {
- return this.vector.copy(this.vectors[Math.floor(Math.random() * this.vectors.length)]);
- }
- }, {
- key: 'getColor',
- value: function getColor(x, y) {
- x -= this.x;
- y -= this.y;
- var i = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;
-
- return {
- r: this.imageData.data[i],
- g: this.imageData.data[i + 1],
- b: this.imageData.data[i + 2],
- a: this.imageData.data[i + 3]
- };
- }
- }, {
- key: 'crossing',
- value: function crossing(particle) {
- if (this.crossType == "dead") {
- if (this.getBound(particle.p.x - this.x, particle.p.y - this.y)) particle.dead = true;else particle.dead = false;
- } else if (this.crossType == "bound") {
- if (!this.getBound(particle.p.x - this.x, particle.p.y - this.y)) particle.v.negate();
- }
- }
- }]);
- return ImageZone;
-}(Zone);
-
-var Debug = {
- addEventListener: function addEventListener(proton, fun) {
- proton.addEventListener("PROTON_UPDATE_AFTER", function () {
- return fun();
- });
- },
- getStyle: function getStyle(color) {
- var rgb = ColorUtil.hexToRGB(color || '#ff0000');
- return 'rgba(' + rgb.r + ', ' + rgb.g + ', ' + rgb.b + ', 0.5)';
- },
- drawZone: function drawZone(proton, canvas, zone, clear) {
- var context = canvas.getContext('2d');
- var style = this.getStyle();
-
- this.addEventListener(proton, function () {
- if (clear) context.clearRect(0, 0, canvas.width, canvas.height);
-
- if (zone instanceof PointZone) {
- context.beginPath();
- context.fillStyle = style;
- context.arc(zone.x, zone.y, 10, 0, Math.PI * 2, true);
- context.fill();
- context.closePath();
- } else if (zone instanceof LineZone) {
- context.beginPath();
- context.strokeStyle = style;
- context.moveTo(zone.x1, zone.y1);
- context.lineTo(zone.x2, zone.y2);
- context.stroke();
- context.closePath();
- } else if (zone instanceof RectZone) {
- context.beginPath();
- context.strokeStyle = style;
- context.drawRect(zone.x, zone.y, zone.width, zone.height);
- context.stroke();
- context.closePath();
- } else if (zone instanceof CircleZone) {
- context.beginPath();
- context.strokeStyle = style;
- context.arc(zone.x, zone.y, zone.radius, 0, Math.PI * 2, true);
- context.stroke();
- context.closePath();
- }
- });
- },
- drawEmitter: function drawEmitter(proton, canvas, emitter, clear) {
- var context = canvas.getContext('2d');
- var style = this.getStyle();
-
- this.addEventListener(proton, function () {
- if (clear) context.clearRect(0, 0, canvas.width, canvas.height);
-
- context.beginPath();
- context.fillStyle = style;
- context.arc(emitter.p.x, emitter.p.y, 10, 0, Math.PI * 2, true);
- context.fill();
- context.closePath();
- });
- }
-};
-
-// http://paulirish.com/2011/requestanimationframe-for-smart-animating/
-// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
-
-// requestAnimationFrame polyfill by Erik Möller
-// fixes from Paul Irish and Tino Zijdel
-(function () {
- var lastTime = 0;
- var vendors = ['ms', 'moz', 'webkit', 'o'];
- for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
- window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
- window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];
- }
-
- if (!window.requestAnimationFrame) window.requestAnimationFrame = function (callback, element) {
- var currTime = new Date().getTime();
- var timeToCall = Math.max(0, 16 - (currTime - lastTime));
- var id = window.setTimeout(function () {
- callback(currTime + timeToCall);
- }, timeToCall);
- lastTime = currTime + timeToCall;
- return id;
- };
-
- if (!window.cancelAnimationFrame) window.cancelAnimationFrame = function (id) {
- clearTimeout(id);
- };
-})();
-
-// import
-// namespace
-Proton.Particle = Proton.P = Particle;
-Proton.Pool = Pool;
-
-Proton.Util = Util;
-Proton.ColorUtil = ColorUtil;
-Proton.MathUtils = MathUtils;
-Proton.Vector2D = Proton.Vector = Vector2D;
-Proton.Polar2D = Proton.Polar = Polar2D;
-Proton.ArraySpan = ArraySpan;
-Proton.Rectangle = Rectangle;
-Proton.Rate = Rate;
-Proton.ease = ease;
-Proton.Span = Span;
-Proton.Mat3 = Mat3;
-Proton.getSpan = function (a, b, center) {
- return new Span(a, b, center);
-};
-Proton.createArraySpan = ArraySpan.createArraySpan;
-
-Proton.Initialize = Proton.Init = Initialize;
-Proton.Life = Proton.L = Life;
-Proton.Position = Proton.P = Position;
-Proton.Velocity = Proton.V = Velocity;
-Proton.Mass = Proton.M = Mass;
-Proton.Radius = Proton.R = Radius;
-Proton.Body = Proton.B = Body;
-
-Proton.Behaviour = Behaviour;
-Proton.Force = Proton.F = Force;
-Proton.Attraction = Proton.A = Attraction;
-Proton.RandomDrift = Proton.RD = RandomDrift;
-Proton.Gravity = Proton.G = Gravity;
-Proton.Collision = Collision;
-Proton.CrossZone = CrossZone;
-Proton.Alpha = Proton.A = Alpha;
-Proton.Scale = Proton.S = Scale;
-Proton.Rotate = Rotate;
-Proton.Color = Color;
-Proton.Repulsion = Repulsion;
-Proton.GravityWell = GravityWell;
-
-Proton.Emitter = Emitter;
-Proton.BehaviourEmitter = BehaviourEmitter;
-Proton.FollowEmitter = FollowEmitter;
-
-Proton.Zone = Zone;
-Proton.LineZone = LineZone;
-Proton.CircleZone = CircleZone;
-Proton.PointZone = PointZone;
-Proton.RectZone = RectZone;
-Proton.ImageZone = ImageZone;
-
-Proton.CanvasRenderer = CanvasRenderer;
-Proton.DomRenderer = DomRenderer;
-Proton.EaselRenderer = EaselRenderer;
-Proton.PixiRenderer = PixiRenderer;
-Proton.PixelRenderer = PixelRenderer;
-Proton.WebGLRenderer = Proton.WebGlRenderer = WebGLRenderer;
-Proton.CustomRenderer = CustomRenderer;
-
-Proton.Debug = Debug;
-
-Object.assign(Proton, ease);
-
-return Proton;
-
-})));
-//# sourceMappingURL=proton.js.map
+ // namespace
+ Proton.Particle = Particle;
+ Proton.Pool = Pool;
+ Proton.Util = Util;
+ Proton.ColorUtil = ColorUtil;
+ Proton.MathUtil = MathUtil;
+ Proton.Vector2D = Proton.Vector = Vector2D;
+ Proton.Polar2D = Proton.Polar = Polar2D;
+ Proton.ArraySpan = ArraySpan;
+ Proton.Rectangle = Rectangle;
+ Proton.Rate = Rate;
+ Proton.ease = ease;
+ Proton.Span = Span;
+ Proton.Mat3 = Mat3;
+ Proton.getSpan = function (a, b, center) {
+ return new Span(a, b, center);
+ };
+ Proton.createArraySpan = ArraySpan.createArraySpan;
+ Proton.Initialize = Proton.Init = Initialize;
+ Proton.Life = Proton.L = Life;
+ Proton.Position = Proton.P = Position;
+ Proton.Velocity = Proton.V = Velocity;
+ Proton.Mass = Proton.M = Mass;
+ Proton.Radius = Proton.R = Radius;
+ Proton.Body = Proton.B = Body;
+ Proton.Behaviour = Behaviour;
+ Proton.Force = Proton.F = Force;
+ Proton.Attraction = Proton.A = Attraction;
+ Proton.RandomDrift = Proton.RD = RandomDrift;
+ Proton.Gravity = Proton.G = Gravity;
+ Proton.Collision = Collision;
+ Proton.CrossZone = CrossZone;
+ Proton.Alpha = Alpha;
+ Proton.Scale = Proton.S = Scale;
+ Proton.Rotate = Rotate;
+ Proton.Color = Color;
+ Proton.Repulsion = Repulsion;
+ Proton.Cyclone = Cyclone;
+ Proton.GravityWell = GravityWell;
+ Proton.Emitter = Emitter;
+ Proton.BehaviourEmitter = BehaviourEmitter;
+ Proton.FollowEmitter = FollowEmitter;
+ Proton.Zone = Zone;
+ Proton.LineZone = LineZone;
+ Proton.CircleZone = CircleZone;
+ Proton.PointZone = PointZone;
+ Proton.RectZone = RectZone;
+ Proton.ImageZone = ImageZone;
+ Proton.CanvasRenderer = CanvasRenderer;
+ Proton.DomRenderer = DomRenderer;
+ Proton.EaselRenderer = EaselRenderer;
+ Proton.PixiRenderer = PixiRenderer;
+ Proton.PixelRenderer = PixelRenderer;
+ Proton.WebGLRenderer = Proton.WebGlRenderer = WebGLRenderer;
+ Proton.CustomRenderer = CustomRenderer;
+ Proton.Debug = Debug;
+ Util.assign(Proton, ease);
+
+ exports.Alpha = Alpha;
+ exports.ArraySpan = ArraySpan;
+ exports.Attraction = Attraction;
+ exports.Behaviour = Behaviour;
+ exports.BehaviourEmitter = BehaviourEmitter;
+ exports.Body = Body;
+ exports.CanvasRenderer = CanvasRenderer;
+ exports.CircleZone = CircleZone;
+ exports.Collision = Collision;
+ exports.Color = Color;
+ exports.ColorUtil = ColorUtil;
+ exports.CrossZone = CrossZone;
+ exports.CustomRenderer = CustomRenderer;
+ exports.Cyclone = Cyclone;
+ exports.Debug = Debug;
+ exports.DomRenderer = DomRenderer;
+ exports.EaselRenderer = EaselRenderer;
+ exports.Emitter = Emitter;
+ exports.FollowEmitter = FollowEmitter;
+ exports.Force = Force;
+ exports.Gravity = Gravity;
+ exports.GravityWell = GravityWell;
+ exports.ImageZone = ImageZone;
+ exports.Initialize = Initialize;
+ exports.Life = Life;
+ exports.LineZone = LineZone;
+ exports.Mass = Mass;
+ exports.Mat3 = Mat3;
+ exports.MathUtil = MathUtil;
+ exports.Particle = Particle;
+ exports.PixelRenderer = PixelRenderer;
+ exports.PixiRenderer = PixiRenderer;
+ exports.PointZone = PointZone;
+ exports.Polar2D = Polar2D;
+ exports.Pool = Pool;
+ exports.Position = Position;
+ exports.Radius = Radius;
+ exports.RandomDrift = RandomDrift;
+ exports.Rate = Rate;
+ exports.RectZone = RectZone;
+ exports.Rectangle = Rectangle;
+ exports.Repulsion = Repulsion;
+ exports.Rotate = Rotate;
+ exports.Scale = Scale;
+ exports.Span = Span;
+ exports.Util = Util;
+ exports.Vector2D = Vector2D;
+ exports.Velocity = Velocity;
+ exports.WebGLRenderer = WebGLRenderer;
+ exports.Zone = Zone;
+ exports.default = Proton;
+ exports.ease = ease;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdG9uLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvV2ViR0xVdGlsLmpzIiwiLi4vc3JjL3V0aWxzL0RvbVV0aWwuanMiLCIuLi9zcmMvdXRpbHMvSW1nVXRpbC5qcyIsIi4uL3NyYy91dGlscy9VdGlsLmpzIiwiLi4vc3JjL3V0aWxzL1B1aWQuanMiLCIuLi9zcmMvY29yZS9Qb29sLmpzIiwiLi4vc3JjL2RlYnVnL1N0YXRzLmpzIiwiLi4vc3JjL2V2ZW50cy9FdmVudERpc3BhdGNoZXIuanMiLCIuLi9zcmMvbWF0aC9NYXRoVXRpbC5qcyIsIi4uL3NyYy9tYXRoL0ludGVncmF0aW9uLmpzIiwiLi4vc3JjL2NvcmUvUHJvdG9uLmpzIiwiLi4vc3JjL3V0aWxzL1JnYi5qcyIsIi4uL3NyYy9tYXRoL1NwYW4uanMiLCIuLi9zcmMvdXRpbHMvUHJvcFV0aWwuanMiLCIuLi9zcmMvbWF0aC9lYXNlLmpzIiwiLi4vc3JjL21hdGgvVmVjdG9yMkQuanMiLCIuLi9zcmMvY29yZS9QYXJ0aWNsZS5qcyIsIi4uL3NyYy91dGlscy9Db2xvclV0aWwuanMiLCIuLi9zcmMvbWF0aC9Qb2xhcjJELmpzIiwiLi4vc3JjL21hdGgvTWF0My5qcyIsIi4uL3NyYy9tYXRoL0FycmF5U3Bhbi5qcyIsIi4uL3NyYy9tYXRoL1JlY3RhbmdsZS5qcyIsIi4uL3NyYy9pbml0aWFsaXplL1JhdGUuanMiLCIuLi9zcmMvaW5pdGlhbGl6ZS9Jbml0aWFsaXplLmpzIiwiLi4vc3JjL2luaXRpYWxpemUvTGlmZS5qcyIsIi4uL3NyYy96b25lL1pvbmUuanMiLCIuLi9zcmMvem9uZS9Qb2ludFpvbmUuanMiLCIuLi9zcmMvaW5pdGlhbGl6ZS9Qb3NpdGlvbi5qcyIsIi4uL3NyYy9pbml0aWFsaXplL1ZlbG9jaXR5LmpzIiwiLi4vc3JjL2luaXRpYWxpemUvTWFzcy5qcyIsIi4uL3NyYy9pbml0aWFsaXplL1JhZGl1cy5qcyIsIi4uL3NyYy9pbml0aWFsaXplL0JvZHkuanMiLCIuLi9zcmMvYmVoYXZpb3VyL0JlaGF2aW91ci5qcyIsIi4uL3NyYy9iZWhhdmlvdXIvRm9yY2UuanMiLCIuLi9zcmMvYmVoYXZpb3VyL0F0dHJhY3Rpb24uanMiLCIuLi9zcmMvYmVoYXZpb3VyL1JhbmRvbURyaWZ0LmpzIiwiLi4vc3JjL2JlaGF2aW91ci9HcmF2aXR5LmpzIiwiLi4vc3JjL2JlaGF2aW91ci9Db2xsaXNpb24uanMiLCIuLi9zcmMvYmVoYXZpb3VyL0Nyb3NzWm9uZS5qcyIsIi4uL3NyYy9iZWhhdmlvdXIvQWxwaGEuanMiLCIuLi9zcmMvYmVoYXZpb3VyL1NjYWxlLmpzIiwiLi4vc3JjL2JlaGF2aW91ci9Sb3RhdGUuanMiLCIuLi9zcmMvYmVoYXZpb3VyL0NvbG9yLmpzIiwiLi4vc3JjL2JlaGF2aW91ci9DeWNsb25lLmpzIiwiLi4vc3JjL2JlaGF2aW91ci9SZXB1bHNpb24uanMiLCIuLi9zcmMvYmVoYXZpb3VyL0dyYXZpdHlXZWxsLmpzIiwiLi4vc3JjL2luaXRpYWxpemUvSW5pdGlhbGl6ZVV0aWwuanMiLCIuLi9zcmMvZW1pdHRlci9FbWl0dGVyLmpzIiwiLi4vc3JjL2VtaXR0ZXIvQmVoYXZpb3VyRW1pdHRlci5qcyIsIi4uL3NyYy9lbWl0dGVyL0ZvbGxvd0VtaXR0ZXIuanMiLCIuLi9zcmMvdXRpbHMvVHlwZXMuanMiLCIuLi9zcmMvcmVuZGVyL0Jhc2VSZW5kZXJlci5qcyIsIi4uL3NyYy9yZW5kZXIvQ2FudmFzUmVuZGVyZXIuanMiLCIuLi9zcmMvcmVuZGVyL0RvbVJlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlci9FYXNlbFJlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlci9QaXhlbFJlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlci9QaXhpUmVuZGVyZXIuanMiLCIuLi9zcmMvdXRpbHMvTVN0YWNrLmpzIiwiLi4vc3JjL3JlbmRlci9XZWJHTFJlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlci9DdXN0b21SZW5kZXJlci5qcyIsIi4uL3NyYy96b25lL0xpbmVab25lLmpzIiwiLi4vc3JjL3pvbmUvQ2lyY2xlWm9uZS5qcyIsIi4uL3NyYy96b25lL1JlY3Rab25lLmpzIiwiLi4vc3JjL3pvbmUvSW1hZ2Vab25lLmpzIiwiLi4vc3JjL2RlYnVnL0RlYnVnLmpzIiwiLi4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLldlYkdMVXRpbFxuICAgKiBAbWV0aG9kIGlwb3RcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uXG4gICAqIEB0b2RvIGFkZCBsZW5ndGggZGVzY3JpcHRpb25cbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aFxuICAgKlxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXBvdChsZW5ndGgpIHtcbiAgICByZXR1cm4gKGxlbmd0aCAmIChsZW5ndGggLSAxKSkgPT09IDA7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLldlYkdMVXRpbFxuICAgKiBAbWV0aG9kIG5ocG90XG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKiBAdG9kbyBhZGQgbGVuZ3RoIGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBsZW5ndGhcbiAgICpcbiAgICogQHJldHVybiB7TnVtYmVyfVxuICAgKi9cbiAgbmhwb3QobGVuZ3RoKSB7XG4gICAgLS1sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCAzMjsgaSA8PD0gMSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgKGxlbmd0aCA+PiBpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGVuZ3RoICsgMTtcbiAgfSxcblxuICAvKipcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uV2ViR0xVdGlsXG4gICAqIEBtZXRob2QgbWFrZVRyYW5zbGF0aW9uXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKiBAdG9kbyBhZGQgdHgsIHR5IGRlc2NyaXB0aW9uXG4gICAqIEB0b2RvIGFkZCByZXR1cm4gZGVzY3JpcHRpb25cbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHR4IGVpdGhlciAwIG9yIDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHR5IGVpdGhlciAwIG9yIDFcbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgbWFrZVRyYW5zbGF0aW9uKHR4LCB0eSkge1xuICAgIHJldHVybiBbMSwgMCwgMCwgMCwgMSwgMCwgdHgsIHR5LCAxXTtcbiAgfSxcblxuICAvKipcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uV2ViR0xVdGlsXG4gICAqIEBtZXRob2QgbWFrZVJvdGF0aW9uXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKiBAdG9kbyBhZGQgcmV0dXJuIGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBhbmdsZUluUmFkaWFuc1xuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBtYWtlUm90YXRpb24oYW5nbGVJblJhZGlhbnMpIHtcbiAgICBsZXQgYyA9IE1hdGguY29zKGFuZ2xlSW5SYWRpYW5zKTtcbiAgICBsZXQgcyA9IE1hdGguc2luKGFuZ2xlSW5SYWRpYW5zKTtcblxuICAgIHJldHVybiBbYywgLXMsIDAsIHMsIGMsIDAsIDAsIDAsIDFdO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5XZWJHTFV0aWxcbiAgICogQG1ldGhvZCBtYWtlU2NhbGVcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uXG4gICAqIEB0b2RvIGFkZCB0eCwgdHkgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gYWRkIHJldHVybiBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gc3ggZWl0aGVyIDAgb3IgMVxuICAgKiBAcGFyYW0ge051bWJlcn0gc3kgZWl0aGVyIDAgb3IgMVxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBtYWtlU2NhbGUoc3gsIHN5KSB7XG4gICAgcmV0dXJuIFtzeCwgMCwgMCwgMCwgc3ksIDAsIDAsIDAsIDFdO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5XZWJHTFV0aWxcbiAgICogQG1ldGhvZCBtYXRyaXhNdWx0aXBseVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gYWRkIGEsIGIgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gYWRkIHJldHVybiBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYVxuICAgKiBAcGFyYW0ge09iamVjdH0gYlxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBtYXRyaXhNdWx0aXBseShhLCBiKSB7XG4gICAgbGV0IGEwMCA9IGFbMCAqIDMgKyAwXTtcbiAgICBsZXQgYTAxID0gYVswICogMyArIDFdO1xuICAgIGxldCBhMDIgPSBhWzAgKiAzICsgMl07XG4gICAgbGV0IGExMCA9IGFbMSAqIDMgKyAwXTtcbiAgICBsZXQgYTExID0gYVsxICogMyArIDFdO1xuICAgIGxldCBhMTIgPSBhWzEgKiAzICsgMl07XG4gICAgbGV0IGEyMCA9IGFbMiAqIDMgKyAwXTtcbiAgICBsZXQgYTIxID0gYVsyICogMyArIDFdO1xuICAgIGxldCBhMjIgPSBhWzIgKiAzICsgMl07XG4gICAgbGV0IGIwMCA9IGJbMCAqIDMgKyAwXTtcbiAgICBsZXQgYjAxID0gYlswICogMyArIDFdO1xuICAgIGxldCBiMDIgPSBiWzAgKiAzICsgMl07XG4gICAgbGV0IGIxMCA9IGJbMSAqIDMgKyAwXTtcbiAgICBsZXQgYjExID0gYlsxICogMyArIDFdO1xuICAgIGxldCBiMTIgPSBiWzEgKiAzICsgMl07XG4gICAgbGV0IGIyMCA9IGJbMiAqIDMgKyAwXTtcbiAgICBsZXQgYjIxID0gYlsyICogMyArIDFdO1xuICAgIGxldCBiMjIgPSBiWzIgKiAzICsgMl07XG5cbiAgICByZXR1cm4gW1xuICAgICAgYTAwICogYjAwICsgYTAxICogYjEwICsgYTAyICogYjIwLFxuICAgICAgYTAwICogYjAxICsgYTAxICogYjExICsgYTAyICogYjIxLFxuICAgICAgYTAwICogYjAyICsgYTAxICogYjEyICsgYTAyICogYjIyLFxuICAgICAgYTEwICogYjAwICsgYTExICogYjEwICsgYTEyICogYjIwLFxuICAgICAgYTEwICogYjAxICsgYTExICogYjExICsgYTEyICogYjIxLFxuICAgICAgYTEwICogYjAyICsgYTExICogYjEyICsgYTEyICogYjIyLFxuICAgICAgYTIwICogYjAwICsgYTIxICogYjEwICsgYTIyICogYjIwLFxuICAgICAgYTIwICogYjAxICsgYTIxICogYjExICsgYTIyICogYjIxLFxuICAgICAgYTIwICogYjAyICsgYTIxICogYjEyICsgYTIyICogYjIyXG4gICAgXTtcbiAgfVxufTtcbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgY2FudmFzLiBUaGUgb3BhY2l0eSBpcyBieSBkZWZhdWx0IHNldCB0byAwXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkRvbVV0aWxcbiAgICogQG1ldGhvZCBjcmVhdGVDYW52YXNcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9ICRpZCB0aGUgY2FudmFzJyBpZFxuICAgKiBAcGFyYW0ge051bWJlcn0gJHdpZHRoIHRoZSBjYW52YXMnIHdpZHRoXG4gICAqIEBwYXJhbSB7TnVtYmVyfSAkaGVpZ2h0IHRoZSBjYW52YXMnIGhlaWdodFxuICAgKiBAcGFyYW0ge1N0cmluZ30gWyRwb3NpdGlvbj1hYnNvbHV0ZV0gdGhlIGNhbnZhcycgcG9zaXRpb24sIGRlZmF1bHQgaXMgJ2Fic29sdXRlJ1xuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBjcmVhdGVDYW52YXMoaWQsIHdpZHRoLCBoZWlnaHQsIHBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiKSB7XG4gICAgY29uc3QgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcblxuICAgIGRvbS5pZCA9IGlkO1xuICAgIGRvbS53aWR0aCA9IHdpZHRoO1xuICAgIGRvbS5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgZG9tLnN0eWxlLm9wYWNpdHkgPSAwO1xuICAgIGRvbS5zdHlsZS5wb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgIHRoaXMudHJhbnNmb3JtKGRvbSwgLTUwMCwgLTUwMCwgMCwgMCk7XG5cbiAgICByZXR1cm4gZG9tO1xuICB9LFxuXG4gIGNyZWF0ZURpdihpZCwgd2lkdGgsIGhlaWdodCkge1xuICAgIGNvbnN0IGRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cbiAgICBkb20uaWQgPSBpZDtcbiAgICBkb20uc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgdGhpcy5yZXNpemUoZG9tLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgIHJldHVybiBkb207XG4gIH0sXG5cbiAgcmVzaXplKGRvbSwgd2lkdGgsIGhlaWdodCkge1xuICAgIGRvbS5zdHlsZS53aWR0aCA9IHdpZHRoICsgXCJweFwiO1xuICAgIGRvbS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyBcInB4XCI7XG4gICAgZG9tLnN0eWxlLm1hcmdpbkxlZnQgPSAtd2lkdGggLyAyICsgXCJweFwiO1xuICAgIGRvbS5zdHlsZS5tYXJnaW5Ub3AgPSAtaGVpZ2h0IC8gMiArIFwicHhcIjtcbiAgfSxcblxuICAvKipcbiAgICogQWRkcyBhIHRyYW5zZm9ybTogdHJhbnNsYXRlKCksIHNjYWxlKCksIHJvdGF0ZSgpIHRvIGEgZ2l2ZW4gZGl2IGRvbSBmb3IgYWxsIGJyb3dzZXJzXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkRvbVV0aWxcbiAgICogQG1ldGhvZCB0cmFuc2Zvcm1cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudH0gZGl2XG4gICAqIEBwYXJhbSB7TnVtYmVyfSAkeFxuICAgKiBAcGFyYW0ge051bWJlcn0gJHlcbiAgICogQHBhcmFtIHtOdW1iZXJ9ICRzY2FsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gJHJvdGF0ZVxuICAgKi9cbiAgdHJhbnNmb3JtKGRpdiwgeCwgeSwgc2NhbGUsIHJvdGF0ZSkge1xuICAgIGRpdi5zdHlsZS53aWxsQ2hhbmdlID0gXCJ0cmFuc2Zvcm1cIjtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7eH1weCwgJHt5fXB4KSBzY2FsZSgke3NjYWxlfSkgcm90YXRlKCR7cm90YXRlfWRlZylgO1xuICAgIHRoaXMuY3NzMyhkaXYsIFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSk7XG4gIH0sXG5cbiAgdHJhbnNmb3JtM2QoZGl2LCB4LCB5LCBzY2FsZSwgcm90YXRlKSB7XG4gICAgZGl2LnN0eWxlLndpbGxDaGFuZ2UgPSBcInRyYW5zZm9ybVwiO1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgke3h9cHgsICR7eX1weCwgMCkgc2NhbGUoJHtzY2FsZX0pIHJvdGF0ZSgke3JvdGF0ZX1kZWcpYDtcbiAgICB0aGlzLmNzczMoZGl2LCBcImJhY2tmYWNlVmlzaWJpbGl0eVwiLCBcImhpZGRlblwiKTtcbiAgICB0aGlzLmNzczMoZGl2LCBcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0pO1xuICB9LFxuXG4gIGNzczMoZGl2LCBrZXksIHZhbCkge1xuICAgIGNvbnN0IGJrZXkgPSBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc3Vic3RyKDEpO1xuXG4gICAgZGl2LnN0eWxlW2BXZWJraXQke2JrZXl9YF0gPSB2YWw7XG4gICAgZGl2LnN0eWxlW2BNb3oke2JrZXl9YF0gPSB2YWw7XG4gICAgZGl2LnN0eWxlW2BPJHtia2V5fWBdID0gdmFsO1xuICAgIGRpdi5zdHlsZVtgbXMke2JrZXl9YF0gPSB2YWw7XG4gICAgZGl2LnN0eWxlW2Ake2tleX1gXSA9IHZhbDtcbiAgfVxufTtcbiIsImltcG9ydCBXZWJHTFV0aWwgZnJvbSBcIi4vV2ViR0xVdGlsXCI7XG5pbXBvcnQgRG9tVXRpbCBmcm9tIFwiLi9Eb21VdGlsXCI7XG5cbmNvbnN0IGltZ3NDYWNoZSA9IHt9O1xuY29uc3QgY2FudmFzQ2FjaGUgPSB7fTtcbmxldCBjYW52YXNJZCA9IDA7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIFRoaXMgd2lsbCBnZXQgdGhlIGltYWdlIGRhdGEuIEl0IGNvdWxkIGJlIG5lY2Vzc2FyeSB0byBjcmVhdGUgYSBQcm90b24uWm9uZS5cbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGdldEltYWdlRGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSAgIGNvbnRleHQgYW55IGNhbnZhcywgbXVzdCBiZSBhIDJkQ29udGV4dCAnY2FudmFzLmdldENvbnRleHQoJzJkJyknXG4gICAqIEBwYXJhbSB7T2JqZWN0fSAgICAgICAgICAgICAgaW1hZ2UgICBjb3VsZCBiZSBhbnkgZG9tIGltYWdlLCBlLmcuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGlzSXNBbkltZ1RhZycpO1xuICAgKiBAcGFyYW0ge1Byb3Rvbi5SZWN0YW5nbGV9ICAgIHJlY3RcbiAgICovXG4gIGdldEltYWdlRGF0YShjb250ZXh0LCBpbWFnZSwgcmVjdCkge1xuICAgIGNvbnRleHQuZHJhd0ltYWdlKGltYWdlLCByZWN0LngsIHJlY3QueSk7XG4gICAgY29uc3QgaW1hZ2VkYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTtcbiAgICBjb250ZXh0LmNsZWFyUmVjdChyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpO1xuXG4gICAgcmV0dXJuIGltYWdlZGF0YTtcbiAgfSxcblxuICAvKipcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGdldEltZ0Zyb21DYWNoZVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gZGVzY3JpYmUgZnVuY1xuICAgKlxuICAgKiBAcGFyYW0ge01peGVkfSAgICAgICAgICAgICAgIGltZ1xuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gICAgIHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gICAgICAgICAgICAgZHJhd0NhbnZhcyAgc2V0IHRvIHRydWUgaWYgYSBjYW52YXMgc2hvdWxkIGJlIHNhdmVkIGludG8gcGFydGljbGUuZGF0YS5jYW52YXNcbiAgICogQHBhcmFtIHtCb29sZWFufSAgICAgICAgICAgICBmdW5jXG4gICAqL1xuICBnZXRJbWdGcm9tQ2FjaGUoaW1nLCBjYWxsYmFjaywgcGFyYW0pIHtcbiAgICBjb25zdCBzcmMgPSB0eXBlb2YgaW1nID09PSBcInN0cmluZ1wiID8gaW1nIDogaW1nLnNyYztcblxuICAgIGlmIChpbWdzQ2FjaGVbc3JjXSkge1xuICAgICAgY2FsbGJhY2soaW1nc0NhY2hlW3NyY10sIHBhcmFtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgIGltYWdlLm9ubG9hZCA9IGUgPT4ge1xuICAgICAgICBpbWdzQ2FjaGVbc3JjXSA9IGUudGFyZ2V0O1xuICAgICAgICBjYWxsYmFjayhpbWdzQ2FjaGVbc3JjXSwgcGFyYW0pO1xuICAgICAgfTtcblxuICAgICAgaW1hZ2Uuc3JjID0gc3JjO1xuICAgIH1cbiAgfSxcblxuICBnZXRDYW52YXNGcm9tQ2FjaGUoaW1nLCBjYWxsYmFjaywgcGFyYW0pIHtcbiAgICBjb25zdCBzcmMgPSBpbWcuc3JjO1xuXG4gICAgaWYgKCFjYW52YXNDYWNoZVtzcmNdKSB7XG4gICAgICBjb25zdCB3aWR0aCA9IFdlYkdMVXRpbC5uaHBvdChpbWcud2lkdGgpO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gV2ViR0xVdGlsLm5ocG90KGltZy5oZWlnaHQpO1xuXG4gICAgICBjb25zdCBjYW52YXMgPSBEb21VdGlsLmNyZWF0ZUNhbnZhcyhgcHJvdG9uX2NhbnZhc19jYWNoZV8keysrY2FudmFzSWR9YCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCwgaW1nLndpZHRoLCBpbWcuaGVpZ2h0KTtcblxuICAgICAgY2FudmFzQ2FjaGVbc3JjXSA9IGNhbnZhcztcbiAgICB9XG5cbiAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhjYW52YXNDYWNoZVtzcmNdLCBwYXJhbSk7XG5cbiAgICByZXR1cm4gY2FudmFzQ2FjaGVbc3JjXTtcbiAgfVxufTtcbiIsImltcG9ydCBJbWdVdGlsIGZyb20gXCIuL0ltZ1V0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBpZiB0aGUgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWRcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGluaXRWYWx1ZVxuICAgKlxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBhIHNwZWNpZmljIHZhbHVlLCBjb3VsZCBiZSBldmVyeXRoaW5nIGJ1dCBudWxsIG9yIHVuZGVmaW5lZFxuICAgKiBAcGFyYW0ge01peGVkfSBkZWZhdWx0cyB0aGUgZGVmYXVsdCBpZiB0aGUgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWRcbiAgICovXG4gIGluaXRWYWx1ZSh2YWx1ZSwgZGVmYXVsdHMpIHtcbiAgICB2YWx1ZSA9IHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IGRlZmF1bHRzO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIGFycmF5XG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBpc0FycmF5XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlIEFueSBhcnJheVxuICAgKlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIGlzQXJyYXkodmFsdWUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZXN0cm95ZXMgdGhlIGdpdmVuIGFycmF5XG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBlbXB0eUFycmF5XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IEFueSBhcnJheVxuICAgKi9cbiAgZW1wdHlBcnJheShhcnIpIHtcbiAgICBpZiAoYXJyKSBhcnIubGVuZ3RoID0gMDtcbiAgfSxcblxuICB0b0FycmF5KGFycikge1xuICAgIHJldHVybiB0aGlzLmlzQXJyYXkoYXJyKSA/IGFyciA6IFthcnJdO1xuICB9LFxuXG4gIHNsaWNlQXJyYXkoYXJyMSwgaW5kZXgsIGFycjIpIHtcbiAgICB0aGlzLmVtcHR5QXJyYXkoYXJyMik7XG4gICAgZm9yIChsZXQgaSA9IGluZGV4OyBpIDwgYXJyMS5sZW5ndGg7IGkrKykge1xuICAgICAgYXJyMi5wdXNoKGFycjFbaV0pO1xuICAgIH1cbiAgfSxcblxuICBnZXRSYW5kRnJvbUFycmF5KGFycikge1xuICAgIGlmICghYXJyKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gYXJyW01hdGguZmxvb3IoYXJyLmxlbmd0aCAqIE1hdGgucmFuZG9tKCkpXTtcbiAgfSxcblxuICAvKipcbiAgICogRGVzdHJveWVzIHRoZSBnaXZlbiBvYmplY3RcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGVtcHR5T2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogQW55IG9iamVjdFxuICAgKi9cbiAgZW1wdHlPYmplY3Qob2JqLCBpZ25vcmUgPSBudWxsKSB7XG4gICAgZm9yIChsZXQga2V5IGluIG9iaikge1xuICAgICAgaWYgKGlnbm9yZSAmJiBpZ25vcmUuaW5kZXhPZihrZXkpID4gLTEpIGNvbnRpbnVlO1xuICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogTWFrZXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyBhbmQgYmluZHMgdGhlIGdpdmVuIGFycmF5XG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBjbGFzc0FwcGx5XG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yIEEgY2xhc3MgdG8gbWFrZSBhbiBpbnN0YW5jZSBmcm9tXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcmdzXSBBbnkgYXJyYXkgdG8gYmluZCBpdCB0byB0aGUgY29uc3RydWN0b3JcbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgaW5zdGFuY2Ugb2YgY29uc3RydWN0b3IsIG9wdGlvbmFsbHkgYmluZCB3aXRoIGFyZ3NcbiAgICovXG4gIGNsYXNzQXBwbHkoY29uc3RydWN0b3IsIGFyZ3MgPSBudWxsKSB7XG4gICAgaWYgKCFhcmdzKSB7XG4gICAgICByZXR1cm4gbmV3IGNvbnN0cnVjdG9yKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IEZhY3RvcnlGdW5jID0gY29uc3RydWN0b3IuYmluZC5hcHBseShjb25zdHJ1Y3RvciwgW251bGxdLmNvbmNhdChhcmdzKSk7XG4gICAgICByZXR1cm4gbmV3IEZhY3RvcnlGdW5jKCk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBUaGlzIHdpbGwgZ2V0IHRoZSBpbWFnZSBkYXRhLiBJdCBjb3VsZCBiZSBuZWNlc3NhcnkgdG8gY3JlYXRlIGEgUHJvdG9uLlpvbmUuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBnZXRJbWFnZURhdGFcbiAgICpcbiAgICogQHBhcmFtIHtIVE1MQ2FudmFzRWxlbWVudH0gICBjb250ZXh0IGFueSBjYW52YXMsIG11c3QgYmUgYSAyZENvbnRleHQgJ2NhbnZhcy5nZXRDb250ZXh0KCcyZCcpJ1xuICAgKiBAcGFyYW0ge09iamVjdH0gICAgICAgICAgICAgIGltYWdlICAgY291bGQgYmUgYW55IGRvbSBpbWFnZSwgZS5nLiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhpc0lzQW5JbWdUYWcnKTtcbiAgICogQHBhcmFtIHtQcm90b24uUmVjdGFuZ2xlfSAgICByZWN0XG4gICAqL1xuICBnZXRJbWFnZURhdGEoY29udGV4dCwgaW1hZ2UsIHJlY3QpIHtcbiAgICByZXR1cm4gSW1nVXRpbC5nZXRJbWFnZURhdGEoY29udGV4dCwgaW1hZ2UsIHJlY3QpO1xuICB9LFxuXG4gIGRlc3Ryb3lBbGwoYXJyLCBwYXJhbSA9IG51bGwpIHtcbiAgICBsZXQgaSA9IGFyci5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhcnJbaV0uZGVzdHJveShwYXJhbSk7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICBkZWxldGUgYXJyW2ldO1xuICAgIH1cblxuICAgIGFyci5sZW5ndGggPSAwO1xuICB9LFxuXG4gIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkge1xuICAgIGlmICh0eXBlb2YgT2JqZWN0LmFzc2lnbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBmb3IgKGxldCBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSk7XG4gICAgfVxuICB9XG59O1xuIiwiY29uc3QgaWRzTWFwID0ge307XG5cbmNvbnN0IFB1aWQgPSB7XG4gIF9pbmRleDogMCxcbiAgX2NhY2hlOiB7fSxcblxuICBpZCh0eXBlKSB7XG4gICAgaWYgKGlkc01hcFt0eXBlXSA9PT0gdW5kZWZpbmVkIHx8IGlkc01hcFt0eXBlXSA9PT0gbnVsbCkgaWRzTWFwW3R5cGVdID0gMDtcbiAgICByZXR1cm4gYCR7dHlwZX1fJHtpZHNNYXBbdHlwZV0rK31gO1xuICB9LFxuXG4gIGdldElkKHRhcmdldCkge1xuICAgIGxldCB1aWQgPSB0aGlzLmdldElkRnJvbUNhY2hlKHRhcmdldCk7XG4gICAgaWYgKHVpZCkgcmV0dXJuIHVpZDtcblxuICAgIHVpZCA9IGBQVUlEXyR7dGhpcy5faW5kZXgrK31gO1xuICAgIHRoaXMuX2NhY2hlW3VpZF0gPSB0YXJnZXQ7XG4gICAgcmV0dXJuIHVpZDtcbiAgfSxcblxuICBnZXRJZEZyb21DYWNoZSh0YXJnZXQpIHtcbiAgICBsZXQgb2JqLCBpZDtcblxuICAgIGZvciAoaWQgaW4gdGhpcy5fY2FjaGUpIHtcbiAgICAgIG9iaiA9IHRoaXMuX2NhY2hlW2lkXTtcblxuICAgICAgaWYgKG9iaiA9PT0gdGFyZ2V0KSByZXR1cm4gaWQ7XG4gICAgICBpZiAodGhpcy5pc0JvZHkob2JqLCB0YXJnZXQpICYmIG9iai5zcmMgPT09IHRhcmdldC5zcmMpIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcblxuICBpc0JvZHkob2JqLCB0YXJnZXQpIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiICYmIG9iai5pc0lubmVyICYmIHRhcmdldC5pc0lubmVyO1xuICB9LFxuXG4gIGdldFRhcmdldCh1aWQpIHtcbiAgICByZXR1cm4gdGhpcy5fY2FjaGVbdWlkXTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUHVpZDtcbiIsIi8qKlxuICogUG9vbCBpcyB0aGUgY2FjaGUgcG9vbCBvZiB0aGUgcHJvdG9uIGVuZ2luZSwgaXQgaXMgdmVyeSBpbXBvcnRhbnQuXG4gKlxuICogZ2V0KHRhcmdldCwgcGFyYW1zLCB1aWQpXG4gKiAgQ2xhc3NcbiAqICAgIHVpZCA9IFB1aWQuZ2V0SWQgLT4gUHVpZCBzYXZlIHRhcmdldCBjYWNoZVxuICogICAgdGFyZ2V0Ll9fcHVpZCA9IHVpZFxuICpcbiAqICBib2R5XG4gKiAgICB1aWQgPSBQdWlkLmdldElkIC0+IFB1aWQgc2F2ZSB0YXJnZXQgY2FjaGVcbiAqXG4gKlxuICogZXhwaXJlKHRhcmdldClcbiAqICBjYWNoZVt0YXJnZXQuX19wdWlkXSBwdXNoIHRhcmdldFxuICpcbiAqL1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBQdWlkIGZyb20gXCIuLi91dGlscy9QdWlkXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvb2wge1xuICAvKipcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUHJvdG9uLlBvb2xcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiBvZiBwcm9wZXJ0aWVzXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSB0b3RhbFxuICAgKiBAcHJvcGVydHkge09iamVjdH0gY2FjaGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKG51bSkge1xuICAgIHRoaXMudG90YWwgPSAwO1xuICAgIHRoaXMuY2FjaGUgPSB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICpcbiAgICogQG1ldGhvZCBnZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uUG9vbFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSBqdXN0IGFkZCBpZiBgdGFyZ2V0YCBpcyBhIGZ1bmN0aW9uXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIGdldCh0YXJnZXQsIHBhcmFtcywgdWlkKSB7XG4gICAgbGV0IHA7XG4gICAgdWlkID0gdWlkIHx8IHRhcmdldC5fX3B1aWQgfHwgUHVpZC5nZXRJZCh0YXJnZXQpO1xuXG4gICAgaWYgKHRoaXMuY2FjaGVbdWlkXSAmJiB0aGlzLmNhY2hlW3VpZF0ubGVuZ3RoID4gMCkge1xuICAgICAgcCA9IHRoaXMuY2FjaGVbdWlkXS5wb3AoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcCA9IHRoaXMuY3JlYXRlT3JDbG9uZSh0YXJnZXQsIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgcC5fX3B1aWQgPSB0YXJnZXQuX19wdWlkIHx8IHVpZDtcbiAgICByZXR1cm4gcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICpcbiAgICogQG1ldGhvZCBzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uUG9vbFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIGV4cGlyZSh0YXJnZXQpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDYWNoZSh0YXJnZXQuX19wdWlkKS5wdXNoKHRhcmdldCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBjbGFzcyBpbnN0YW5jZVxuICAgKlxuICAgKiBAdG9kbyBhZGQgbW9yZSBkb2N1bWVudGF0aW9uXG4gICAqXG4gICAqIEBtZXRob2QgY3JlYXRlXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlBvb2xcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R8RnVuY3Rpb259IHRhcmdldCBhbnkgT2JqZWN0IG9yIEZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSBqdXN0IGFkZCBpZiBgdGFyZ2V0YCBpcyBhIGZ1bmN0aW9uXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIGNyZWF0ZU9yQ2xvbmUodGFyZ2V0LCBwYXJhbXMpIHtcbiAgICB0aGlzLnRvdGFsKys7XG5cbiAgICBpZiAodGhpcy5jcmVhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZSh0YXJnZXQsIHBhcmFtcyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBVdGlsLmNsYXNzQXBwbHkodGFyZ2V0LCBwYXJhbXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGFyZ2V0LmNsb25lKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiAtIHdoYXQgaXMgaW4gdGhlIGNhY2hlP1xuICAgKlxuICAgKiBAbWV0aG9kIGdldENvdW50XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlBvb2xcbiAgICpcbiAgICogQHJldHVybiB7TnVtYmVyfVxuICAgKi9cbiAgZ2V0Q291bnQoKSB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBmb3IgKGxldCBpZCBpbiB0aGlzLmNhY2hlKSBjb3VudCArPSB0aGlzLmNhY2hlW2lkXS5sZW5ndGg7XG4gICAgcmV0dXJuIGNvdW50Kys7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveWVzIGFsbCBpdGVtcyBmcm9tIFBvb2wuY2FjaGVcbiAgICpcbiAgICogQG1ldGhvZCBkZXN0cm95XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlBvb2xcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgZm9yIChsZXQgaWQgaW4gdGhpcy5jYWNoZSkge1xuICAgICAgdGhpcy5jYWNoZVtpZF0ubGVuZ3RoID0gMDtcbiAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlW2lkXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBQb29sLmNhY2hlXG4gICAqXG4gICAqIEBtZXRob2QgZ2V0Q2FjaGVcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uUG9vbFxuICAgKiBAcHJpdmF0ZVxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gdWlkIHRoZSB1bmlxdWUgaWRcbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgZ2V0Q2FjaGUodWlkID0gXCJkZWZhdWx0XCIpIHtcbiAgICBpZiAoIXRoaXMuY2FjaGVbdWlkXSkgdGhpcy5jYWNoZVt1aWRdID0gW107XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVbdWlkXTtcbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdHMge1xuICBjb25zdHJ1Y3Rvcihwcm90b24pIHtcbiAgICB0aGlzLnByb3RvbiA9IHByb3RvbjtcbiAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG4gICAgdGhpcy50eXBlID0gMTtcblxuICAgIHRoaXMuZW1pdHRlckluZGV4ID0gMDtcbiAgICB0aGlzLnJlbmRlcmVySW5kZXggPSAwO1xuICB9XG5cbiAgdXBkYXRlKHN0eWxlLCBib2R5KSB7XG4gICAgdGhpcy5hZGQoc3R5bGUsIGJvZHkpO1xuXG4gICAgY29uc3QgZW1pdHRlciA9IHRoaXMuZ2V0RW1pdHRlcigpO1xuICAgIGNvbnN0IHJlbmRlcmVyID0gdGhpcy5nZXRSZW5kZXJlcigpO1xuICAgIGxldCBzdHIgPSBcIlwiO1xuXG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgc3RyICs9IFwiZW1pdHRlcjpcIiArIHRoaXMucHJvdG9uLmVtaXR0ZXJzLmxlbmd0aCArIFwiPGJyPlwiO1xuICAgICAgICBpZiAoZW1pdHRlcikgc3RyICs9IFwiZW0gc3BlZWQ6XCIgKyBlbWl0dGVyLmVtaXRTcGVlZCArIFwiPGJyPlwiO1xuICAgICAgICBpZiAoZW1pdHRlcikgc3RyICs9IFwicG9zOlwiICsgdGhpcy5nZXRFbWl0dGVyUG9zKGVtaXR0ZXIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAzOlxuICAgICAgICBpZiAoZW1pdHRlcikgc3RyICs9IFwiaW5pdGlhbGl6ZXM6XCIgKyBlbWl0dGVyLmluaXRpYWxpemVzLmxlbmd0aCArIFwiPGJyPlwiO1xuICAgICAgICBpZiAoZW1pdHRlcilcbiAgICAgICAgICBzdHIgKz0gJzxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7XCI+JyArIHRoaXMuY29uY2F0QXJyKGVtaXR0ZXIuaW5pdGlhbGl6ZXMpICsgXCI8L3NwYW4+PGJyPlwiO1xuICAgICAgICBpZiAoZW1pdHRlcikgc3RyICs9IFwiYmVoYXZpb3VyczpcIiArIGVtaXR0ZXIuYmVoYXZpb3Vycy5sZW5ndGggKyBcIjxicj5cIjtcbiAgICAgICAgaWYgKGVtaXR0ZXIpIHN0ciArPSAnPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jaztcIj4nICsgdGhpcy5jb25jYXRBcnIoZW1pdHRlci5iZWhhdmlvdXJzKSArIFwiPC9zcGFuPjxicj5cIjtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgNDpcbiAgICAgICAgaWYgKHJlbmRlcmVyKSBzdHIgKz0gcmVuZGVyZXIubmFtZSArIFwiPGJyPlwiO1xuICAgICAgICBpZiAocmVuZGVyZXIpIHN0ciArPSBcImJvZHk6XCIgKyB0aGlzLmdldENyZWF0ZWROdW1iZXIocmVuZGVyZXIpICsgXCI8YnI+XCI7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzdHIgKz0gXCJwYXJ0aWNsZXM6XCIgKyB0aGlzLnByb3Rvbi5nZXRDb3VudCgpICsgXCI8YnI+XCI7XG4gICAgICAgIHN0ciArPSBcInBvb2w6XCIgKyB0aGlzLnByb3Rvbi5wb29sLmdldENvdW50KCkgKyBcIjxicj5cIjtcbiAgICAgICAgc3RyICs9IFwidG90YWw6XCIgKyB0aGlzLnByb3Rvbi5wb29sLnRvdGFsO1xuICAgIH1cblxuICAgIHRoaXMuY29udGFpbmVyLmlubmVySFRNTCA9IHN0cjtcbiAgfVxuXG4gIGFkZChzdHlsZSwgYm9keSkge1xuICAgIGlmICghdGhpcy5jb250YWluZXIpIHtcbiAgICAgIHRoaXMudHlwZSA9IDE7XG5cbiAgICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBbXG4gICAgICAgIFwicG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOjBweDtsZWZ0OjA7Y3Vyc29yOnBvaW50ZXI7XCIsXG4gICAgICAgIFwib3BhY2l0eTowLjk7ei1pbmRleDoxMDAwMDtwYWRkaW5nOjEwcHg7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6SGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7XCIsXG4gICAgICAgIFwid2lkdGg6MTIwcHg7aGVpZ2h0OjUwcHg7YmFja2dyb3VuZC1jb2xvcjojMDAyO2NvbG9yOiMwZmY7XCJcbiAgICAgIF0uam9pbihcIlwiKTtcblxuICAgICAgdGhpcy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICBlID0+IHtcbiAgICAgICAgICB0aGlzLnR5cGUrKztcbiAgICAgICAgICBpZiAodGhpcy50eXBlID4gNCkgdGhpcy50eXBlID0gMTtcbiAgICAgICAgfSxcbiAgICAgICAgZmFsc2VcbiAgICAgICk7XG5cbiAgICAgIGxldCBiZywgY29sb3I7XG4gICAgICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBiZyA9IFwiIzIwMVwiO1xuICAgICAgICAgIGNvbG9yID0gXCIjZjA4XCI7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGJnID0gXCIjMDIwXCI7XG4gICAgICAgICAgY29sb3IgPSBcIiMwZjBcIjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJnID0gXCIjMDAyXCI7XG4gICAgICAgICAgY29sb3IgPSBcIiMwZmZcIjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb250YWluZXIuc3R5bGVbXCJiYWNrZ3JvdW5kLWNvbG9yXCJdID0gYmc7XG4gICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZVtcImNvbG9yXCJdID0gY29sb3I7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lci5wYXJlbnROb2RlKSB7XG4gICAgICBib2R5ID0gYm9keSB8fCB0aGlzLmJvZHkgfHwgZG9jdW1lbnQuYm9keTtcbiAgICAgIGJvZHkuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIpO1xuICAgIH1cbiAgfVxuXG4gIGdldEVtaXR0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvdG9uLmVtaXR0ZXJzW3RoaXMuZW1pdHRlckluZGV4XTtcbiAgfVxuXG4gIGdldFJlbmRlcmVyKCkge1xuICAgIHJldHVybiB0aGlzLnByb3Rvbi5yZW5kZXJlcnNbdGhpcy5yZW5kZXJlckluZGV4XTtcbiAgfVxuXG4gIGNvbmNhdEFycihhcnIpIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBpZiAoIWFyciB8fCAhYXJyLmxlbmd0aCkgcmV0dXJuIHJlc3VsdDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHQgKz0gKGFycltpXS5uYW1lIHx8IFwiXCIpLnN1YnN0cigwLCAxKSArIFwiLlwiO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBnZXRDcmVhdGVkTnVtYmVyKHJlbmRlcmVyKSB7XG4gICAgcmV0dXJuIHJlbmRlcmVyLnBvb2wudG90YWwgfHwgKHJlbmRlcmVyLmNwb29sICYmIHJlbmRlcmVyLmNwb29sLnRvdGFsKSB8fCAwO1xuICB9XG5cbiAgZ2V0RW1pdHRlclBvcyhlKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoZS5wLngpICsgXCIsXCIgKyBNYXRoLnJvdW5kKGUucC55KTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuY29udGFpbmVyICYmIHRoaXMuY29udGFpbmVyLnBhcmVudE5vZGUpIHtcbiAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLmJvZHkgfHwgZG9jdW1lbnQuYm9keTtcbiAgICAgIGJvZHkucmVtb3ZlQ2hpbGQodGhpcy5jb250YWluZXIpO1xuICAgIH1cblxuICAgIHRoaXMucHJvdG9uID0gbnVsbDtcbiAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG4gIH1cbn1cbiIsIi8qXG4gKiBFdmVudERpc3BhdGNoZXJcbiAqIFRoaXMgY29kZSByZWZlcmVuY2Ugc2luY2UgaHR0cDovL2NyZWF0ZWpzLmNvbS8uXG4gKlxuICoqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFdmVudERpc3BhdGNoZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSBudWxsO1xuICB9XG5cbiAgc3RhdGljIGJpbmQodGFyZ2V0KSB7XG4gICAgdGFyZ2V0LnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50ID0gRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50O1xuICAgIHRhcmdldC5wcm90b3R5cGUuaGFzRXZlbnRMaXN0ZW5lciA9IEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUuaGFzRXZlbnRMaXN0ZW5lcjtcbiAgICB0YXJnZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXI7XG4gICAgdGFyZ2V0LnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyID0gRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyO1xuICAgIHRhcmdldC5wcm90b3R5cGUucmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMgPSBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzO1xuICB9XG5cbiAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgIGlmICghdGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMgPSB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2xpc3RlbmVyc1t0eXBlXSkgdGhpcy5fbGlzdGVuZXJzW3R5cGVdID0gW107XG4gICAgdGhpcy5fbGlzdGVuZXJzW3R5cGVdLnB1c2gobGlzdGVuZXIpO1xuXG4gICAgcmV0dXJuIGxpc3RlbmVyO1xuICB9XG5cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgIGlmICghdGhpcy5fbGlzdGVuZXJzKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnNbdHlwZV0pIHJldHVybjtcblxuICAgIGNvbnN0IGFyciA9IHRoaXMuX2xpc3RlbmVyc1t0eXBlXTtcbiAgICBjb25zdCBsZW5ndGggPSBhcnIubGVuZ3RoO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycltpXSA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLl9saXN0ZW5lcnNbdHlwZV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbGxvd3MgZm9yIGZhc3RlciBjaGVja3MuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGFyci5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW1vdmVBbGxFdmVudExpc3RlbmVycyh0eXBlKSB7XG4gICAgaWYgKCF0eXBlKSB0aGlzLl9saXN0ZW5lcnMgPSBudWxsO1xuICAgIGVsc2UgaWYgKHRoaXMuX2xpc3RlbmVycykgZGVsZXRlIHRoaXMuX2xpc3RlbmVyc1t0eXBlXTtcbiAgfVxuXG4gIGRpc3BhdGNoRXZlbnQodHlwZSwgYXJncykge1xuICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XG5cbiAgICBpZiAodHlwZSAmJiBsaXN0ZW5lcnMpIHtcbiAgICAgIGxldCBhcnIgPSBsaXN0ZW5lcnNbdHlwZV07XG4gICAgICBpZiAoIWFycikgcmV0dXJuIHJlc3VsdDtcblxuICAgICAgLy8gYXJyID0gYXJyLnNsaWNlKCk7XG4gICAgICAvLyB0byBhdm9pZCBpc3N1ZXMgd2l0aCBpdGVtcyBiZWluZyByZW1vdmVkIG9yIGFkZGVkIGR1cmluZyB0aGUgZGlzcGF0Y2hcblxuICAgICAgbGV0IGhhbmRsZXI7XG4gICAgICBsZXQgaSA9IGFyci5sZW5ndGg7XG4gICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIGhhbmRsZXIgPSBhcnJbaV07XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCBoYW5kbGVyKGFyZ3MpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAhIXJlc3VsdDtcbiAgfVxuXG4gIGhhc0V2ZW50TGlzdGVuZXIodHlwZSkge1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcbiAgICByZXR1cm4gISEobGlzdGVuZXJzICYmIGxpc3RlbmVyc1t0eXBlXSk7XG4gIH1cbn1cbiIsImNvbnN0IFBJID0gMy4xNDE1OTI2O1xuY29uc3QgSU5GSU5JVFkgPSBJbmZpbml0eTtcblxuY29uc3QgTWF0aFV0aWwgPSB7XG4gIFBJOiBQSSxcbiAgUEl4MjogUEkgKiAyLFxuICBQSV8yOiBQSSAvIDIsXG4gIFBJXzE4MDogUEkgLyAxODAsXG4gIE4xODBfUEk6IDE4MCAvIFBJLFxuICBJbmZpbml0eTogLTk5OSxcblxuICBpc0luZmluaXR5KG51bSkge1xuICAgIHJldHVybiBudW0gPT09IHRoaXMuSW5maW5pdHkgfHwgbnVtID09PSBJTkZJTklUWTtcbiAgfSxcblxuICByYW5kb21BVG9CKGEsIGIsIGlzSW50ID0gZmFsc2UpIHtcbiAgICBpZiAoIWlzSW50KSByZXR1cm4gYSArIE1hdGgucmFuZG9tKCkgKiAoYiAtIGEpO1xuICAgIGVsc2UgcmV0dXJuICgoTWF0aC5yYW5kb20oKSAqIChiIC0gYSkpID4+IDApICsgYTtcbiAgfSxcblxuICByYW5kb21GbG9hdGluZyhjZW50ZXIsIGYsIGlzSW50KSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQVRvQihjZW50ZXIgLSBmLCBjZW50ZXIgKyBmLCBpc0ludCk7XG4gIH0sXG5cbiAgcmFuZG9tQ29sb3IoKSB7XG4gICAgcmV0dXJuIFwiI1wiICsgKFwiMDAwMDBcIiArICgoTWF0aC5yYW5kb20oKSAqIDB4MTAwMDAwMCkgPDwgMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNik7XG4gIH0sXG5cbiAgcmFuZG9tWm9uZShkaXNwbGF5KSB7fSxcblxuICBmbG9vcihudW0sIGsgPSA0KSB7XG4gICAgY29uc3QgZGlnaXRzID0gTWF0aC5wb3coMTAsIGspO1xuICAgIHJldHVybiBNYXRoLmZsb29yKG51bSAqIGRpZ2l0cykgLyBkaWdpdHM7XG4gIH0sXG5cbiAgZGVncmVlVHJhbnNmb3JtKGEpIHtcbiAgICByZXR1cm4gKGEgKiBQSSkgLyAxODA7XG4gIH0sXG5cbiAgdG9Db2xvcjE2KG51bSkge1xuICAgIHJldHVybiBgIyR7bnVtLnRvU3RyaW5nKDE2KX1gO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNYXRoVXRpbDtcbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEludGVncmF0aW9uIHtcbiAgY29uc3RydWN0b3IodHlwZSkge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICBjYWxjdWxhdGUocGFydGljbGVzLCB0aW1lLCBkYW1waW5nKSB7XG4gICAgdGhpcy5ldWxlckludGVncmF0ZShwYXJ0aWNsZXMsIHRpbWUsIGRhbXBpbmcpO1xuICB9XG5cbiAgLy8gRXVsZXIgSW50ZWdyYXRlXG4gIC8vIGh0dHBzOi8vcm9zZXR0YWNvZGUub3JnL3dpa2kvRXVsZXJfbWV0aG9kXG4gIGV1bGVySW50ZWdyYXRlKHBhcnRpY2xlLCB0aW1lLCBkYW1waW5nKSB7XG4gICAgaWYgKCFwYXJ0aWNsZS5zbGVlcCkge1xuICAgICAgcGFydGljbGUub2xkLnAuY29weShwYXJ0aWNsZS5wKTtcbiAgICAgIHBhcnRpY2xlLm9sZC52LmNvcHkocGFydGljbGUudik7XG5cbiAgICAgIHBhcnRpY2xlLmEubXVsdGlwbHlTY2FsYXIoMSAvIHBhcnRpY2xlLm1hc3MpO1xuICAgICAgcGFydGljbGUudi5hZGQocGFydGljbGUuYS5tdWx0aXBseVNjYWxhcih0aW1lKSk7XG4gICAgICBwYXJ0aWNsZS5wLmFkZChwYXJ0aWNsZS5vbGQudi5tdWx0aXBseVNjYWxhcih0aW1lKSk7XG5cbiAgICAgIGlmIChkYW1waW5nKSBwYXJ0aWNsZS52Lm11bHRpcGx5U2NhbGFyKGRhbXBpbmcpO1xuXG4gICAgICBwYXJ0aWNsZS5hLmNsZWFyKCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgUG9vbCBmcm9tIFwiLi9Qb29sXCI7XG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IFN0YXRzIGZyb20gXCIuLi9kZWJ1Zy9TdGF0c1wiO1xuaW1wb3J0IEV2ZW50RGlzcGF0Y2hlciBmcm9tIFwiLi4vZXZlbnRzL0V2ZW50RGlzcGF0Y2hlclwiO1xuaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuLi9tYXRoL01hdGhVdGlsXCI7XG5pbXBvcnQgSW50ZWdyYXRpb24gZnJvbSBcIi4uL21hdGgvSW50ZWdyYXRpb25cIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvdG9uIHtcbiAgc3RhdGljIFVTRV9DTE9DSyA9IGZhbHNlO1xuXG4gIC8vIG1lYXN1cmUgMToxMDBcbiAgc3RhdGljIE1FQVNVUkUgPSAxMDA7XG4gIHN0YXRpYyBFVUxFUiA9IFwiZXVsZXJcIjtcbiAgc3RhdGljIFJLMiA9IFwicnVuZ2Uta3V0dGEyXCI7XG5cbiAgLy8gZXZlbnQgbmFtZVxuICBzdGF0aWMgUEFSVElDTEVfQ1JFQVRFRCA9IFwiUEFSVElDTEVfQ1JFQVRFRFwiO1xuICBzdGF0aWMgUEFSVElDTEVfVVBEQVRFID0gXCJQQVJUSUNMRV9VUERBVEVcIjtcbiAgc3RhdGljIFBBUlRJQ0xFX1NMRUVQID0gXCJQQVJUSUNMRV9TTEVFUFwiO1xuICBzdGF0aWMgUEFSVElDTEVfREVBRCA9IFwiUEFSVElDTEVfREVBRFwiO1xuXG4gIHN0YXRpYyBFTUlUVEVSX0FEREVEID0gXCJFTUlUVEVSX0FEREVEXCI7XG4gIHN0YXRpYyBFTUlUVEVSX1JFTU9WRUQgPSBcIkVNSVRURVJfUkVNT1ZFRFwiO1xuXG4gIHN0YXRpYyBQUk9UT05fVVBEQVRFID0gXCJQUk9UT05fVVBEQVRFXCI7XG4gIHN0YXRpYyBQUk9UT05fVVBEQVRFX0FGVEVSID0gXCJQUk9UT05fVVBEQVRFX0FGVEVSXCI7XG4gIHN0YXRpYyBERUZBVUxUX0lOVEVSVkFMID0gMC4wMTY3O1xuXG4gIHN0YXRpYyBhbWVuZENoYW5nZVRhYnNCdWcgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBUaGUgY29uc3RydWN0b3IgdG8gYWRkIGVtaXR0ZXJzXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvciBQcm90b25cbiAgICpcbiAgICogQHRvZG8gYWRkIG1vcmUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgc2luZ2xlIHByb3BlcnRpZXMgYW5kIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXIgfCB1bmRlZmluZWR9IFtpbnRlZ3JhdGlvblR5cGU9UHJvdG9uLkVVTEVSXVxuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gW2ludGVncmF0aW9uVHlwZT1Qcm90b24uRVVMRVJdXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXl9IGVtaXR0ZXJzICAgQWxsIGFkZGVkIGVtaXR0ZXJcbiAgICogQHByb3BlcnR5IHtBcnJheX0gcmVuZGVyZXJzICBBbGwgYWRkZWQgcmVuZGVyZXJcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHRpbWUgICAgICBUaGUgYWN0aXZlIHRpbWVcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IG9sZHRpbWUgICBUaGUgb2xkIHRpbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGludGVncmF0aW9uVHlwZSkge1xuICAgIHRoaXMuZW1pdHRlcnMgPSBbXTtcbiAgICB0aGlzLnJlbmRlcmVycyA9IFtdO1xuXG4gICAgdGhpcy50aW1lID0gMDtcbiAgICB0aGlzLm5vdyA9IDA7XG4gICAgdGhpcy50aGVuID0gMDtcbiAgICB0aGlzLmVsYXBzZWQgPSAwO1xuXG4gICAgdGhpcy5zdGF0cyA9IG5ldyBTdGF0cyh0aGlzKTtcbiAgICB0aGlzLnBvb2wgPSBuZXcgUG9vbCg4MCk7XG5cbiAgICB0aGlzLmludGVncmF0aW9uVHlwZSA9IFV0aWwuaW5pdFZhbHVlKGludGVncmF0aW9uVHlwZSwgUHJvdG9uLkVVTEVSKTtcbiAgICB0aGlzLmludGVncmF0b3IgPSBuZXcgSW50ZWdyYXRpb24odGhpcy5pbnRlZ3JhdGlvblR5cGUpO1xuXG4gICAgdGhpcy5fZnBzID0gXCJhdXRvXCI7XG4gICAgdGhpcy5faW50ZXJ2YWwgPSBQcm90b24uREVGQVVMVF9JTlRFUlZBTDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBmcmFtZXMgcGVyIHNlY29uZCAoRlBTKSBmb3IgdGhlIFByb3RvbiBzeXN0ZW0uXG4gICAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gZnBzIC0gVGhlIGRlc2lyZWQgRlBTLiBVc2UgXCJhdXRvXCIgZm9yIGRlZmF1bHQgYmVoYXZpb3IsIG9yIGEgbnVtYmVyIGZvciBhIHNwZWNpZmljIEZQUy5cbiAgICovXG4gIHNldCBmcHMoZnBzKSB7XG4gICAgdGhpcy5fZnBzID0gZnBzO1xuICAgIHRoaXMuX2ludGVydmFsID0gZnBzID09PSBcImF1dG9cIiA/IFByb3Rvbi5ERUZBVUxUX0lOVEVSVkFMIDogTWF0aFV0aWwuZmxvb3IoMSAvIGZwcywgNyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBmcmFtZXMgcGVyIHNlY29uZCAoRlBTKSBzZXR0aW5nLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfHN0cmluZ30gVGhlIGN1cnJlbnQgRlBTIHNldHRpbmcuIFJldHVybnMgXCJhdXRvXCIgaWYgc2V0IHRvIGRlZmF1bHQsIG9yIGEgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgc3BlY2lmaWMgRlBTLlxuICAgKi9cbiAgZ2V0IGZwcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZnBzO1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZCBhIHR5cGUgb2YgUmVuZGVyZXJcbiAgICpcbiAgICogQG1ldGhvZCBhZGRSZW5kZXJlclxuICAgKiBAbWVtYmVyb2YgUHJvdG9uXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJcbiAgICovXG4gIGFkZFJlbmRlcmVyKHJlbmRlcikge1xuICAgIHJlbmRlci5pbml0KHRoaXMpO1xuICAgIHRoaXMucmVuZGVyZXJzLnB1c2gocmVuZGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbmFtZSBhZGQgYSB0eXBlIG9mIFJlbmRlcmVyXG4gICAqXG4gICAqIEBtZXRob2QgYWRkUmVuZGVyZXJcbiAgICogQHBhcmFtIHtSZW5kZXJlcn0gcmVuZGVyXG4gICAqL1xuICByZW1vdmVSZW5kZXJlcihyZW5kZXIpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMucmVuZGVyZXJzLmluZGV4T2YocmVuZGVyKTtcbiAgICB0aGlzLnJlbmRlcmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJlbmRlci5yZW1vdmUodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogYWRkIHRoZSBFbWl0dGVyXG4gICAqXG4gICAqIEBtZXRob2QgYWRkRW1pdHRlclxuICAgKiBAbWVtYmVyb2YgUHJvdG9uXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge0VtaXR0ZXJ9IGVtaXR0ZXJcbiAgICovXG4gIGFkZEVtaXR0ZXIoZW1pdHRlcikge1xuICAgIHRoaXMuZW1pdHRlcnMucHVzaChlbWl0dGVyKTtcbiAgICBlbWl0dGVyLnBhcmVudCA9IHRoaXM7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoUHJvdG9uLkVNSVRURVJfQURERUQsIGVtaXR0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gRW1pdHRlclxuICAgKlxuICAgKiBAbWV0aG9kIHJlbW92ZUVtaXR0ZXJcbiAgICogQG1lbWJlcm9mIFByb3RvblxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uRW1pdHRlcn0gZW1pdHRlclxuICAgKi9cbiAgcmVtb3ZlRW1pdHRlcihlbWl0dGVyKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmVtaXR0ZXJzLmluZGV4T2YoZW1pdHRlcik7XG4gICAgdGhpcy5lbWl0dGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGVtaXR0ZXIucGFyZW50ID0gbnVsbDtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChQcm90b24uRU1JVFRFUl9SRU1PVkVELCBlbWl0dGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGFsbCBhZGRlZCBlbWl0dGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHVwZGF0ZVxuICAgKiBAbWVtYmVyb2YgUHJvdG9uXG4gICAqIEBpbnN0YW5jZVxuICAgKi9cbiAgdXBkYXRlKCkge1xuICAgIC8vICdhdXRvJyBpcyB0aGUgZGVmYXVsdCBicm93c2VyIHJlZnJlc2ggcmF0ZSwgdGhlIHZhc3QgbWFqb3JpdHkgaXMgNjBmcHNcbiAgICBpZiAodGhpcy5fZnBzID09PSBcImF1dG9cIikge1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFByb3Rvbi5QUk9UT05fVVBEQVRFKTtcblxuICAgICAgaWYgKFByb3Rvbi5VU0VfQ0xPQ0spIHtcbiAgICAgICAgaWYgKCF0aGlzLnRoZW4pIHRoaXMudGhlbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICB0aGlzLm5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICB0aGlzLmVsYXBzZWQgPSAodGhpcy5ub3cgLSB0aGlzLnRoZW4pICogMC4wMDE7XG4gICAgICAgIC8vIEZpeCBidWdzIHN1Y2ggYXMgY2hyb21lIGJyb3dzZXIgc3dpdGNoaW5nIHRhYnMgY2F1c2luZyBleGNlc3NpdmUgdGltZSBkaWZmZXJlbmNlXG4gICAgICAgIHRoaXMuYW1lbmRDaGFuZ2VUYWJzQnVnKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZWxhcHNlZCA+IDApIHRoaXMuZW1pdHRlcnNVcGRhdGUodGhpcy5lbGFwc2VkKTtcbiAgICAgICAgdGhpcy50aGVuID0gdGhpcy5ub3c7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVtaXR0ZXJzVXBkYXRlKFByb3Rvbi5ERUZBVUxUX0lOVEVSVkFMKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFByb3Rvbi5QUk9UT05fVVBEQVRFX0FGVEVSKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgZnBzIGZyYW1lIHJhdGUgaXMgc2V0XG4gICAgZWxzZSB7XG4gICAgICBpZiAoIXRoaXMudGhlbikgdGhpcy50aGVuID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICB0aGlzLm5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgdGhpcy5lbGFwc2VkID0gKHRoaXMubm93IC0gdGhpcy50aGVuKSAqIDAuMDAxO1xuXG4gICAgICBpZiAodGhpcy5lbGFwc2VkID4gdGhpcy5faW50ZXJ2YWwpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFByb3Rvbi5QUk9UT05fVVBEQVRFKTtcbiAgICAgICAgdGhpcy5lbWl0dGVyc1VwZGF0ZSh0aGlzLl9pbnRlcnZhbCk7XG4gICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE5NzY0MDE4L2NvbnRyb2xsaW5nLWZwcy13aXRoLXJlcXVlc3RhbmltYXRpb25mcmFtZVxuICAgICAgICB0aGlzLnRoZW4gPSB0aGlzLm5vdyAtICh0aGlzLmVsYXBzZWQgJSB0aGlzLl9pbnRlcnZhbCkgKiAxMDAwO1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoUHJvdG9uLlBST1RPTl9VUERBVEVfQUZURVIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGVtaXR0ZXJzVXBkYXRlKGVsYXBzZWQpIHtcbiAgICBsZXQgaSA9IHRoaXMuZW1pdHRlcnMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHRoaXMuZW1pdHRlcnNbaV0udXBkYXRlKGVsYXBzZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBAbWV0aG9kIGFtZW5kQ2hhbmdlVGFic0J1Z1xuICAgKiBAbWVtYmVyb2YgUHJvdG9uXG4gICAqIEBpbnN0YW5jZVxuICAgKi9cbiAgYW1lbmRDaGFuZ2VUYWJzQnVnKCkge1xuICAgIGlmICghUHJvdG9uLmFtZW5kQ2hhbmdlVGFic0J1ZykgcmV0dXJuO1xuICAgIGlmICh0aGlzLmVsYXBzZWQgPiAwLjUpIHtcbiAgICAgIHRoaXMudGhlbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgdGhpcy5lbGFwc2VkID0gMDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ291bnRzIGFsbCBwYXJ0aWNsZXMgZnJvbSBhbGwgZW1pdHRlcnNcbiAgICpcbiAgICogQG1ldGhvZCBnZXRDb3VudFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uXG4gICAqIEBpbnN0YW5jZVxuICAgKi9cbiAgZ2V0Q291bnQoKSB7XG4gICAgbGV0IHRvdGFsID0gMDtcbiAgICBsZXQgaSA9IHRoaXMuZW1pdHRlcnMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSkgdG90YWwgKz0gdGhpcy5lbWl0dGVyc1tpXS5wYXJ0aWNsZXMubGVuZ3RoO1xuICAgIHJldHVybiB0b3RhbDtcbiAgfVxuXG4gIGdldEFsbFBhcnRpY2xlcygpIHtcbiAgICBsZXQgcGFydGljbGVzID0gW107XG4gICAgbGV0IGkgPSB0aGlzLmVtaXR0ZXJzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHBhcnRpY2xlcyA9IHBhcnRpY2xlcy5jb25jYXQodGhpcy5lbWl0dGVyc1tpXS5wYXJ0aWNsZXMpO1xuICAgIHJldHVybiBwYXJ0aWNsZXM7XG4gIH1cblxuICBkZXN0cm95QWxsRW1pdHRlcnMoKSB7XG4gICAgVXRpbC5kZXN0cm95QWxsKHRoaXMuZW1pdHRlcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIGV2ZXJ5dGhpbmcgcmVsYXRlZCB0byB0aGlzIFByb3RvbiBpbnN0YW5jZS4gVGhpcyBpbmNsdWRlcyBhbGwgZW1pdHRlcnMsIGFuZCBhbGwgcHJvcGVydGllc1xuICAgKlxuICAgKiBAbWV0aG9kIGRlc3Ryb3lcbiAgICogQG1lbWJlcm9mIFByb3RvblxuICAgKiBAaW5zdGFuY2VcbiAgICovXG4gIGRlc3Ryb3kocmVtb3ZlID0gZmFsc2UpIHtcbiAgICBjb25zdCBkZXN0cm95T3RoZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLnRpbWUgPSAwO1xuICAgICAgdGhpcy50aGVuID0gMDtcbiAgICAgIHRoaXMucG9vbC5kZXN0cm95KCk7XG4gICAgICB0aGlzLnN0YXRzLmRlc3Ryb3koKTtcblxuICAgICAgVXRpbC5kZXN0cm95QWxsKHRoaXMuZW1pdHRlcnMpO1xuICAgICAgVXRpbC5kZXN0cm95QWxsKHRoaXMucmVuZGVyZXJzLCB0aGlzLmdldEFsbFBhcnRpY2xlcygpKTtcblxuICAgICAgdGhpcy5pbnRlZ3JhdG9yID0gbnVsbDtcbiAgICAgIHRoaXMucmVuZGVyZXJzID0gbnVsbDtcbiAgICAgIHRoaXMuZW1pdHRlcnMgPSBudWxsO1xuICAgICAgdGhpcy5zdGF0cyA9IG51bGw7XG4gICAgICB0aGlzLnBvb2wgPSBudWxsO1xuICAgIH07XG5cbiAgICBpZiAocmVtb3ZlKSB7XG4gICAgICBzZXRUaW1lb3V0KGRlc3Ryb3lPdGhlciwgMjAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVzdHJveU90aGVyKCk7XG4gICAgfVxuICB9XG59XG5cbkV2ZW50RGlzcGF0Y2hlci5iaW5kKFByb3Rvbik7XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBSZ2Ige1xuICBjb25zdHJ1Y3RvcihyID0gMjU1LCBnID0gMjU1LCBiID0gMjU1KSB7XG4gICAgdGhpcy5yID0gcjtcbiAgICB0aGlzLmcgPSBnO1xuICAgIHRoaXMuYiA9IGI7XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLnIgPSAyNTU7XG4gICAgdGhpcy5nID0gMjU1O1xuICAgIHRoaXMuYiA9IDI1NTtcbiAgfVxufVxuIiwiaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzcGFuIG9mIHZhbHVlcyBvciBhbiBhcnJheS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3BhbiB7XG4gIC8qKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzQXJyYXk7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtudW1iZXJ8bnVtYmVyW119XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBhO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYjtcblxuICAvKipcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjZW50ZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgU3BhbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtudW1iZXJ8bnVtYmVyW119IGEgLSBUaGUgZmlyc3QgdmFsdWUgb3IgYW4gYXJyYXkgb2YgdmFsdWVzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2JdIC0gVGhlIHNlY29uZCB2YWx1ZSAoaWYgYSBpcyBub3QgYW4gYXJyYXkpLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjZW50ZXI9ZmFsc2VdIC0gV2hldGhlciB0byB1c2UgY2VudGVyLWJhc2VkIGNhbGN1bGF0aW9uLlxuICAgKi9cbiAgY29uc3RydWN0b3IoYSwgYiwgY2VudGVyKSB7XG4gICAgaWYgKFV0aWwuaXNBcnJheShhKSkge1xuICAgICAgdGhpcy5pc0FycmF5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuYSA9IGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNBcnJheSA9IGZhbHNlO1xuICAgICAgdGhpcy5hID0gVXRpbC5pbml0VmFsdWUoYSwgMSk7XG4gICAgICB0aGlzLmIgPSBVdGlsLmluaXRWYWx1ZShiLCB0aGlzLmEpO1xuICAgICAgdGhpcy5jZW50ZXIgPSBVdGlsLmluaXRWYWx1ZShjZW50ZXIsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHZhbHVlIGZyb20gdGhlIHNwYW4uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzSW50PWZhbHNlXSAtIFdoZXRoZXIgdG8gcmV0dXJuIGFuIGludGVnZXIgdmFsdWUuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IEEgcmFuZG9tIHZhbHVlIGZyb20gdGhlIHNwYW4uXG4gICAqL1xuICBnZXRWYWx1ZShpc0ludCA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuaXNBcnJheSkge1xuICAgICAgcmV0dXJuIFV0aWwuZ2V0UmFuZEZyb21BcnJheSh0aGlzLmEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXRoaXMuY2VudGVyKSB7XG4gICAgICAgIHJldHVybiBNYXRoVXRpbC5yYW5kb21BVG9CKHRoaXMuYSwgdGhpcy5iLCBpc0ludCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gTWF0aFV0aWwucmFuZG9tRmxvYXRpbmcodGhpcy5hLCB0aGlzLmIsIGlzSW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIG5ldyBTcGFuIG9iamVjdC5cbiAgICogQHBhcmFtIHsqfFNwYW59IGEgLSBUaGUgZmlyc3QgdmFsdWUgb3IgYSBTcGFuIG9iamVjdC5cbiAgICogQHBhcmFtIHsqfSBbYl0gLSBUaGUgc2Vjb25kIHZhbHVlLlxuICAgKiBAcGFyYW0geyp9IFtjXSAtIFRoZSB0aGlyZCB2YWx1ZS5cbiAgICogQHJldHVybnMge1NwYW59IEEgbmV3IFNwYW4gaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgc2V0U3BhblZhbHVlKGEsIGIsIGMpIHtcbiAgICBpZiAoYSBpbnN0YW5jZW9mIFNwYW4pIHtcbiAgICAgIHJldHVybiBhO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3BhbihhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjID09PSB1bmRlZmluZWQpIHJldHVybiBuZXcgU3BhbihhLCBiKTtcbiAgICAgICAgZWxzZSByZXR1cm4gbmV3IFNwYW4oYSwgYiwgYyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbHVlIGZyb20gYSBTcGFuLCBpZiB0aGUgcGFyYW0gaXMgbm90IGEgU3BhbiBpdCB3aWxsIHJldHVybiB0aGUgZ2l2ZW4gcGFyYW1ldGVyLlxuICAgKiBAcGFyYW0geyp8U3Bhbn0gcGFuIC0gVGhlIHZhbHVlIG9yIFNwYW4gdG8gZ2V0IHRoZSB2YWx1ZSBmcm9tLlxuICAgKiBAcmV0dXJucyB7Kn0gVGhlIHZhbHVlIG9mIFNwYW4gT1IgdGhlIHBhcmFtZXRlciBpZiBpdCBpcyBub3QgYSBTcGFuLlxuICAgKi9cbiAgc3RhdGljIGdldFNwYW5WYWx1ZShwYW4pIHtcbiAgICByZXR1cm4gcGFuIGluc3RhbmNlb2YgU3BhbiA/IHBhbi5nZXRWYWx1ZSgpIDogcGFuO1xuICB9XG59XG4iLCJpbXBvcnQgU3BhbiBmcm9tIFwiLi4vbWF0aC9TcGFuXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaGFzUHJvcCh0YXJnZXQsIGtleSkge1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgLy8gcmV0dXJuIG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBzZXQgdGhlIHByb3RvdHlwZSBpbiBhIGdpdmVuIHByb3RvdHlwZU9iamVjdFxuICAgKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5VdGlsXG4gICAqIEBtZXRob2Qgc2V0UHJvcFxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gZm9yIHBhcmFtIGB0YXJnZXRgXG4gICAqIEB0b2RvIHRyYW5zbGF0ZSBkZXNyaXB0aW9uIGZyb20gY2hpbmVzZSB0byBlbmdsaXNoXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXRcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZU9iamVjdCBBbiBvYmplY3Qgb2Ygc2luZ2xlIHByb3RvdHlwZXNcbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fSB0YXJnZXRcbiAgICovXG4gIHNldFByb3AodGFyZ2V0LCBwcm9wcykge1xuICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHtcbiAgICAgIGlmICh0YXJnZXQuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgdGFyZ2V0W3Byb3BdID0gU3Bhbi5nZXRTcGFuVmFsdWUocHJvcHNbcHJvcF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBzZXRWZWN0b3JWYWxcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciBwYXJhbSBgdGFyZ2V0YFxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gZm9yIHBhcmFtIGBjb25mYFxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gZm9yIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXRcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZcbiAgICovXG4gIHNldFZlY3RvclZhbChwYXJ0aWNsZSwgY29uZiA9IG51bGwpIHtcbiAgICBpZiAoIWNvbmYpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJ4XCIpKSBwYXJ0aWNsZS5wLnggPSBjb25mW1wieFwiXTtcbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwieVwiKSkgcGFydGljbGUucC55ID0gY29uZltcInlcIl07XG5cbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwidnhcIikpIHBhcnRpY2xlLnYueCA9IGNvbmZbXCJ2eFwiXTtcbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwidnlcIikpIHBhcnRpY2xlLnYueSA9IGNvbmZbXCJ2eVwiXTtcblxuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJheFwiKSkgcGFydGljbGUuYS54ID0gY29uZltcImF4XCJdO1xuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJheVwiKSkgcGFydGljbGUuYS55ID0gY29uZltcImF5XCJdO1xuXG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcInBcIikpIHBhcnRpY2xlLnAuY29weShjb25mW1wicFwiXSk7XG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcInZcIikpIHBhcnRpY2xlLnYuY29weShjb25mW1widlwiXSk7XG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcImFcIikpIHBhcnRpY2xlLmEuY29weShjb25mW1wiYVwiXSk7XG5cbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwicG9zaXRpb25cIikpIHBhcnRpY2xlLnAuY29weShjb25mW1wicG9zaXRpb25cIl0pO1xuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJ2ZWxvY2l0eVwiKSkgcGFydGljbGUudi5jb3B5KGNvbmZbXCJ2ZWxvY2l0eVwiXSk7XG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcImFjY2VsZXJhdGVcIikpIHBhcnRpY2xlLmEuY29weShjb25mW1wiYWNjZWxlcmF0ZVwiXSk7XG4gIH1cbn07XG4iLCJpbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4vTWF0aFV0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBlYXNlTGluZWFyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9LFxuXG4gIGVhc2VJblF1YWQodmFsdWUpIHtcbiAgICByZXR1cm4gTWF0aC5wb3codmFsdWUsIDIpO1xuICB9LFxuXG4gIGVhc2VPdXRRdWFkKHZhbHVlKSB7XG4gICAgcmV0dXJuIC0oTWF0aC5wb3codmFsdWUgLSAxLCAyKSAtIDEpO1xuICB9LFxuXG4gIGVhc2VJbk91dFF1YWQodmFsdWUpIHtcbiAgICBpZiAoKHZhbHVlIC89IDAuNSkgPCAxKSByZXR1cm4gMC41ICogTWF0aC5wb3codmFsdWUsIDIpO1xuXG4gICAgcmV0dXJuIC0wLjUgKiAoKHZhbHVlIC09IDIpICogdmFsdWUgLSAyKTtcbiAgfSxcblxuICBlYXNlSW5DdWJpYyh2YWx1ZSkge1xuICAgIHJldHVybiBNYXRoLnBvdyh2YWx1ZSwgMyk7XG4gIH0sXG5cbiAgZWFzZU91dEN1YmljKHZhbHVlKSB7XG4gICAgcmV0dXJuIE1hdGgucG93KHZhbHVlIC0gMSwgMykgKyAxO1xuICB9LFxuXG4gIGVhc2VJbk91dEN1YmljKHZhbHVlKSB7XG4gICAgaWYgKCh2YWx1ZSAvPSAwLjUpIDwgMSkgcmV0dXJuIDAuNSAqIE1hdGgucG93KHZhbHVlLCAzKTtcblxuICAgIHJldHVybiAwLjUgKiAoTWF0aC5wb3codmFsdWUgLSAyLCAzKSArIDIpO1xuICB9LFxuXG4gIGVhc2VJblF1YXJ0KHZhbHVlKSB7XG4gICAgcmV0dXJuIE1hdGgucG93KHZhbHVlLCA0KTtcbiAgfSxcblxuICBlYXNlT3V0UXVhcnQodmFsdWUpIHtcbiAgICByZXR1cm4gLShNYXRoLnBvdyh2YWx1ZSAtIDEsIDQpIC0gMSk7XG4gIH0sXG5cbiAgZWFzZUluT3V0UXVhcnQodmFsdWUpIHtcbiAgICBpZiAoKHZhbHVlIC89IDAuNSkgPCAxKSByZXR1cm4gMC41ICogTWF0aC5wb3codmFsdWUsIDQpO1xuXG4gICAgcmV0dXJuIC0wLjUgKiAoKHZhbHVlIC09IDIpICogTWF0aC5wb3codmFsdWUsIDMpIC0gMik7XG4gIH0sXG5cbiAgZWFzZUluU2luZSh2YWx1ZSkge1xuICAgIHJldHVybiAtTWF0aC5jb3ModmFsdWUgKiBNYXRoVXRpbC5QSV8yKSArIDE7XG4gIH0sXG5cbiAgZWFzZU91dFNpbmUodmFsdWUpIHtcbiAgICByZXR1cm4gTWF0aC5zaW4odmFsdWUgKiBNYXRoVXRpbC5QSV8yKTtcbiAgfSxcblxuICBlYXNlSW5PdXRTaW5lKHZhbHVlKSB7XG4gICAgcmV0dXJuIC0wLjUgKiAoTWF0aC5jb3MoTWF0aC5QSSAqIHZhbHVlKSAtIDEpO1xuICB9LFxuXG4gIGVhc2VJbkV4cG8odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyAwIDogTWF0aC5wb3coMiwgMTAgKiAodmFsdWUgLSAxKSk7XG4gIH0sXG5cbiAgZWFzZU91dEV4cG8odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDEgPyAxIDogLU1hdGgucG93KDIsIC0xMCAqIHZhbHVlKSArIDE7XG4gIH0sXG5cbiAgZWFzZUluT3V0RXhwbyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gMCkgcmV0dXJuIDA7XG5cbiAgICBpZiAodmFsdWUgPT09IDEpIHJldHVybiAxO1xuXG4gICAgaWYgKCh2YWx1ZSAvPSAwLjUpIDwgMSkgcmV0dXJuIDAuNSAqIE1hdGgucG93KDIsIDEwICogKHZhbHVlIC0gMSkpO1xuXG4gICAgcmV0dXJuIDAuNSAqICgtTWF0aC5wb3coMiwgLTEwICogLS12YWx1ZSkgKyAyKTtcbiAgfSxcblxuICBlYXNlSW5DaXJjKHZhbHVlKSB7XG4gICAgcmV0dXJuIC0oTWF0aC5zcXJ0KDEgLSB2YWx1ZSAqIHZhbHVlKSAtIDEpO1xuICB9LFxuXG4gIGVhc2VPdXRDaXJjKHZhbHVlKSB7XG4gICAgcmV0dXJuIE1hdGguc3FydCgxIC0gTWF0aC5wb3codmFsdWUgLSAxLCAyKSk7XG4gIH0sXG5cbiAgZWFzZUluT3V0Q2lyYyh2YWx1ZSkge1xuICAgIGlmICgodmFsdWUgLz0gMC41KSA8IDEpIHJldHVybiAtMC41ICogKE1hdGguc3FydCgxIC0gdmFsdWUgKiB2YWx1ZSkgLSAxKTtcbiAgICByZXR1cm4gMC41ICogKE1hdGguc3FydCgxIC0gKHZhbHVlIC09IDIpICogdmFsdWUpICsgMSk7XG4gIH0sXG5cbiAgZWFzZUluQmFjayh2YWx1ZSkge1xuICAgIGxldCBzID0gMS43MDE1ODtcbiAgICByZXR1cm4gdmFsdWUgKiB2YWx1ZSAqICgocyArIDEpICogdmFsdWUgLSBzKTtcbiAgfSxcblxuICBlYXNlT3V0QmFjayh2YWx1ZSkge1xuICAgIGxldCBzID0gMS43MDE1ODtcbiAgICByZXR1cm4gKHZhbHVlID0gdmFsdWUgLSAxKSAqIHZhbHVlICogKChzICsgMSkgKiB2YWx1ZSArIHMpICsgMTtcbiAgfSxcblxuICBlYXNlSW5PdXRCYWNrKHZhbHVlKSB7XG4gICAgbGV0IHMgPSAxLjcwMTU4O1xuICAgIGlmICgodmFsdWUgLz0gMC41KSA8IDEpIHJldHVybiAwLjUgKiAodmFsdWUgKiB2YWx1ZSAqICgoKHMgKj0gMS41MjUpICsgMSkgKiB2YWx1ZSAtIHMpKTtcbiAgICByZXR1cm4gMC41ICogKCh2YWx1ZSAtPSAyKSAqIHZhbHVlICogKCgocyAqPSAxLjUyNSkgKyAxKSAqIHZhbHVlICsgcykgKyAyKTtcbiAgfSxcblxuICBnZXRFYXNpbmcoZWFzZSkge1xuICAgIGlmICh0eXBlb2YgZWFzZSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZWFzZTtcbiAgICBlbHNlIHJldHVybiB0aGlzW2Vhc2VdIHx8IHRoaXMuZWFzZUxpbmVhcjtcbiAgfVxufTtcbiIsImltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWN0b3IyRCB7XG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICB4O1xuXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICB5O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFZlY3RvcjJEIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgeCBjb29yZGluYXRlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBUaGUgeSBjb29yZGluYXRlLlxuICAgKi9cbiAgY29uc3RydWN0b3IoeCwgeSkge1xuICAgIHRoaXMueCA9IHggfHwgMDtcbiAgICB0aGlzLnkgPSB5IHx8IDA7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgeCBhbmQgeSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZS5cbiAgICogQHJldHVybnMge1ZlY3RvcjJEfSBUaGlzIHZlY3Rvci5cbiAgICovXG4gIHNldCh4LCB5KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHggY29tcG9uZW50IG9mIHRoaXMgdmVjdG9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUuXG4gICAqIEByZXR1cm5zIHtWZWN0b3IyRH0gVGhpcyB2ZWN0b3IuXG4gICAqL1xuICBzZXRYKHgpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHkgY29tcG9uZW50IG9mIHRoaXMgdmVjdG9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUuXG4gICAqIEByZXR1cm5zIHtWZWN0b3IyRH0gVGhpcyB2ZWN0b3IuXG4gICAqL1xuICBzZXRZKHkpIHtcbiAgICB0aGlzLnkgPSB5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIGdyYWRpZW50IChhbmdsZSkgb2YgdGhpcyB2ZWN0b3IuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBncmFkaWVudCBpbiByYWRpYW5zLlxuICAgKi9cbiAgZ2V0R3JhZGllbnQoKSB7XG4gICAgaWYgKHRoaXMueCAhPT0gMCkgcmV0dXJuIE1hdGguYXRhbjIodGhpcy55LCB0aGlzLngpO1xuICAgIGVsc2UgaWYgKHRoaXMueSA+IDApIHJldHVybiBNYXRoVXRpbC5QSV8yO1xuICAgIGVsc2UgaWYgKHRoaXMueSA8IDApIHJldHVybiAtTWF0aFV0aWwuUElfMjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBhbm90aGVyIHZlY3RvciB0byB0aGlzIG9uZS5cbiAgICogQHBhcmFtIHtWZWN0b3IyRH0gdiAtIFRoZSB2ZWN0b3IgdG8gY29weSBmcm9tLlxuICAgKiBAcmV0dXJucyB7VmVjdG9yMkR9IFRoaXMgdmVjdG9yLlxuICAgKi9cbiAgY29weSh2KSB7XG4gICAgdGhpcy54ID0gdi54O1xuICAgIHRoaXMueSA9IHYueTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW5vdGhlciB2ZWN0b3IgdG8gdGhpcyBvbmUuXG4gICAqIEBwYXJhbSB7VmVjdG9yMkR9IHYgLSBUaGUgdmVjdG9yIHRvIGFkZC5cbiAgICogQHBhcmFtIHtWZWN0b3IyRH0gW3ddIC0gQW4gb3B0aW9uYWwgc2Vjb25kIHZlY3RvciB0byBhZGQuXG4gICAqIEByZXR1cm5zIHtWZWN0b3IyRH0gVGhpcyB2ZWN0b3IuXG4gICAqL1xuICBhZGQodiwgdykge1xuICAgIGlmICh3ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkZFZlY3RvcnModiwgdyk7XG4gICAgfVxuXG4gICAgdGhpcy54ICs9IHYueDtcbiAgICB0aGlzLnkgKz0gdi55O1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBzY2FsYXIgdmFsdWVzIHRvIHRoaXMgdmVjdG9yJ3MgY29tcG9uZW50cy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGEgLSBWYWx1ZSB0byBhZGQgdG8geC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGIgLSBWYWx1ZSB0byBhZGQgdG8geS5cbiAgICogQHJldHVybnMge1ZlY3RvcjJEfSBUaGlzIHZlY3Rvci5cbiAgICovXG4gIGFkZFhZKGEsIGIpIHtcbiAgICB0aGlzLnggKz0gYTtcbiAgICB0aGlzLnkgKz0gYjtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdHdvIHZlY3RvcnMgYW5kIHNldHMgdGhlIHJlc3VsdCB0byB0aGlzIHZlY3Rvci5cbiAgICogQHBhcmFtIHtWZWN0b3IyRH0gYSAtIFRoZSBmaXJzdCB2ZWN0b3IgdG8gYWRkLlxuICAgKiBAcGFyYW0ge1ZlY3RvcjJEfSBiIC0gVGhlIHNlY29uZCB2ZWN0b3IgdG8gYWRkLlxuICAgKiBAcmV0dXJucyB7VmVjdG9yMkR9IFRoaXMgdmVjdG9yLlxuICAgKi9cbiAgYWRkVmVjdG9ycyhhLCBiKSB7XG4gICAgdGhpcy54ID0gYS54ICsgYi54O1xuICAgIHRoaXMueSA9IGEueSArIGIueTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnRyYWN0cyBhbm90aGVyIHZlY3RvciBmcm9tIHRoaXMgb25lLlxuICAgKiBAcGFyYW0ge1ZlY3RvcjJEfSB2IC0gVGhlIHZlY3RvciB0byBzdWJ0cmFjdC5cbiAgICogQHBhcmFtIHtWZWN0b3IyRH0gW3ddIC0gQW4gb3B0aW9uYWwgc2Vjb25kIHZlY3RvciB0byBzdWJ0cmFjdC5cbiAgICogQHJldHVybnMge1ZlY3RvcjJEfSBUaGlzIHZlY3Rvci5cbiAgICovXG4gIHN1Yih2LCB3KSB7XG4gICAgaWYgKHcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3ViVmVjdG9ycyh2LCB3KTtcbiAgICB9XG5cbiAgICB0aGlzLnggLT0gdi54O1xuICAgIHRoaXMueSAtPSB2Lnk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJ0cmFjdHMgb25lIHZlY3RvciBmcm9tIGFub3RoZXIgYW5kIHNldHMgdGhlIHJlc3VsdCB0byB0aGlzIHZlY3Rvci5cbiAgICogQHBhcmFtIHtWZWN0b3IyRH0gYSAtIFRoZSB2ZWN0b3IgdG8gc3VidHJhY3QgZnJvbS5cbiAgICogQHBhcmFtIHtWZWN0b3IyRH0gYiAtIFRoZSB2ZWN0b3IgdG8gc3VidHJhY3QuXG4gICAqIEByZXR1cm5zIHtWZWN0b3IyRH0gVGhpcyB2ZWN0b3IuXG4gICAqL1xuICBzdWJWZWN0b3JzKGEsIGIpIHtcbiAgICB0aGlzLnggPSBhLnggLSBiLng7XG4gICAgdGhpcy55ID0gYS55IC0gYi55O1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGl2aWRlcyB0aGlzIHZlY3RvciBieSBhIHNjYWxhci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHMgLSBUaGUgc2NhbGFyIHRvIGRpdmlkZSBieS5cbiAgICogQHJldHVybnMge1ZlY3RvcjJEfSBUaGlzIHZlY3Rvci5cbiAgICovXG4gIGRpdmlkZVNjYWxhcihzKSB7XG4gICAgaWYgKHMgIT09IDApIHtcbiAgICAgIHRoaXMueCAvPSBzO1xuICAgICAgdGhpcy55IC89IHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0KDAsIDApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE11bHRpcGxpZXMgdGhpcyB2ZWN0b3IgYnkgYSBzY2FsYXIuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzIC0gVGhlIHNjYWxhciB0byBtdWx0aXBseSBieS5cbiAgICogQHJldHVybnMge1ZlY3RvcjJEfSBUaGlzIHZlY3Rvci5cbiAgICovXG4gIG11bHRpcGx5U2NhbGFyKHMpIHtcbiAgICB0aGlzLnggKj0gcztcbiAgICB0aGlzLnkgKj0gcztcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE5lZ2F0ZXMgdGhpcyB2ZWN0b3IgKGludmVydHMgaXRzIGRpcmVjdGlvbikuXG4gICAqIEByZXR1cm5zIHtWZWN0b3IyRH0gVGhpcyB2ZWN0b3IuXG4gICAqL1xuICBuZWdhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoLTEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHRoaXMgdmVjdG9yIHdpdGggYW5vdGhlci5cbiAgICogQHBhcmFtIHtWZWN0b3IyRH0gdiAtIFRoZSBvdGhlciB2ZWN0b3IuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBkb3QgcHJvZHVjdC5cbiAgICovXG4gIGRvdCh2KSB7XG4gICAgcmV0dXJuIHRoaXMueCAqIHYueCArIHRoaXMueSAqIHYueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiB0aGlzIHZlY3Rvci5cbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIHNxdWFyZWQgbGVuZ3RoLlxuICAgKi9cbiAgbGVuZ3RoU3EoKSB7XG4gICAgcmV0dXJuIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgdGhpcyB2ZWN0b3IuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBsZW5ndGguXG4gICAqL1xuICBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgdGhpcyB2ZWN0b3IgKG1ha2VzIGl0IHVuaXQgbGVuZ3RoKS5cbiAgICogQHJldHVybnMge1ZlY3RvcjJEfSBUaGlzIHZlY3Rvci5cbiAgICovXG4gIG5vcm1hbGl6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgZGlzdGFuY2UgdG8gYW5vdGhlciB2ZWN0b3IuXG4gICAqIEBwYXJhbSB7VmVjdG9yMkR9IHYgLSBUaGUgb3RoZXIgdmVjdG9yLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgZGlzdGFuY2UuXG4gICAqL1xuICBkaXN0YW5jZVRvKHYpIHtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvdGF0ZXMgdGhpcyB2ZWN0b3IgYnkgYW4gYW5nbGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aGEgLSBUaGUgYW5nbGUgdG8gcm90YXRlIGJ5IChpbiByYWRpYW5zKS5cbiAgICogQHJldHVybnMge1ZlY3RvcjJEfSBUaGlzIHZlY3Rvci5cbiAgICovXG4gIHJvdGF0ZSh0aGEpIHtcbiAgICBjb25zdCB4ID0gdGhpcy54O1xuICAgIGNvbnN0IHkgPSB0aGlzLnk7XG5cbiAgICB0aGlzLnggPSB4ICogTWF0aC5jb3ModGhhKSArIHkgKiBNYXRoLnNpbih0aGEpO1xuICAgIHRoaXMueSA9IC14ICogTWF0aC5zaW4odGhhKSArIHkgKiBNYXRoLmNvcyh0aGEpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBkaXN0YW5jZSB0byBhbm90aGVyIHZlY3Rvci5cbiAgICogQHBhcmFtIHtWZWN0b3IyRH0gdiAtIFRoZSBvdGhlciB2ZWN0b3IuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBzcXVhcmVkIGRpc3RhbmNlLlxuICAgKi9cbiAgZGlzdGFuY2VUb1NxdWFyZWQodikge1xuICAgIGNvbnN0IGR4ID0gdGhpcy54IC0gdi54O1xuICAgIGNvbnN0IGR5ID0gdGhpcy55IC0gdi55O1xuXG4gICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xuICB9XG5cbiAgLyoqXG4gICAqIExpbmVhcmx5IGludGVycG9sYXRlcyB0aGlzIHZlY3RvciB0b3dhcmQgYW5vdGhlciB2ZWN0b3IuXG4gICAqIEBwYXJhbSB7VmVjdG9yMkR9IHYgLSBUaGUgdGFyZ2V0IHZlY3Rvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIC0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yICgwLTEpLlxuICAgKiBAcmV0dXJucyB7VmVjdG9yMkR9IFRoaXMgdmVjdG9yLlxuICAgKi9cbiAgbGVycCh2LCBhbHBoYSkge1xuICAgIHRoaXMueCArPSAodi54IC0gdGhpcy54KSAqIGFscGhhO1xuICAgIHRoaXMueSArPSAodi55IC0gdGhpcy55KSAqIGFscGhhO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoaXMgdmVjdG9yIGlzIGVxdWFsIHRvIGFub3RoZXIgdmVjdG9yLlxuICAgKiBAcGFyYW0ge1ZlY3RvcjJEfSB2IC0gVGhlIG90aGVyIHZlY3Rvci5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBlcXVhbHModikge1xuICAgIHJldHVybiB2LnggPT09IHRoaXMueCAmJiB2LnkgPT09IHRoaXMueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoaXMgdmVjdG9yIHRvIHplcm8uXG4gICAqIEByZXR1cm5zIHtWZWN0b3IyRH0gVGhpcyB2ZWN0b3IuXG4gICAqL1xuICBjbGVhcigpIHtcbiAgICB0aGlzLnggPSAwLjA7XG4gICAgdGhpcy55ID0gMC4wO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgdmVjdG9yIHdpdGggdGhlIHNhbWUgeCBhbmQgeSB2YWx1ZXMgYXMgdGhpcyBvbmUuXG4gICAqIEByZXR1cm5zIHtWZWN0b3IyRH0gQSBuZXcgVmVjdG9yMkQgaW5zdGFuY2UuXG4gICAqL1xuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IFZlY3RvcjJEKHRoaXMueCwgdGhpcy55KTtcbiAgfVxufVxuIiwiaW1wb3J0IFJnYiBmcm9tIFwiLi4vdXRpbHMvUmdiXCI7XG5pbXBvcnQgUHVpZCBmcm9tIFwiLi4vdXRpbHMvUHVpZFwiO1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBQcm9wVXRpbCBmcm9tIFwiLi4vdXRpbHMvUHJvcFV0aWxcIjtcbmltcG9ydCBlYXNlIGZyb20gXCIuLi9tYXRoL2Vhc2VcIjtcbmltcG9ydCBWZWN0b3IyRCBmcm9tIFwiLi4vbWF0aC9WZWN0b3IyRFwiO1xuaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuLi9tYXRoL01hdGhVdGlsXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHBhcnRpY2xlIGluIGEgcGFydGljbGUgc3lzdGVtLlxuICogQGNsYXNzIFBhcnRpY2xlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcnRpY2xlIHtcbiAgLyoqIEB0eXBlIHtzdHJpbmd9IFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcGFydGljbGUgKi9cbiAgaWQgPSBcIlwiO1xuXG4gIC8qKiBAdHlwZSB7e3A6VmVjdG9yMkQsdjpWZWN0b3IyRCxhOlZlY3RvcjJEfX0gT2xkIHN0YXRlIG9mIHRoZSBwYXJ0aWNsZSAqL1xuICBvbGQgPSBudWxsO1xuXG4gIC8qKiBAdHlwZSB7b2JqZWN0fSBDdXN0b20gZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcnRpY2xlICovXG4gIGRhdGEgPSBudWxsO1xuXG4gIC8qKiBAdHlwZSB7QmVoYXZpb3VyW119IEFycmF5IG9mIGJlaGF2aW91cnMgYXBwbGllZCB0byB0aGUgcGFydGljbGUgKi9cbiAgYmVoYXZpb3VycyA9IG51bGw7XG5cbiAgLyoqIEB0eXBlIHtWZWN0b3IyRH0gQ3VycmVudCBwb3NpdGlvbiBvZiB0aGUgcGFydGljbGUgKi9cbiAgcCA9IG51bGw7XG5cbiAgLyoqIEB0eXBlIHtWZWN0b3IyRH0gQ3VycmVudCB2ZWxvY2l0eSBvZiB0aGUgcGFydGljbGUgKi9cbiAgdiA9IG51bGw7XG5cbiAgLyoqIEB0eXBlIHtWZWN0b3IyRH0gQ3VycmVudCBhY2NlbGVyYXRpb24gb2YgdGhlIHBhcnRpY2xlICovXG4gIGEgPSBudWxsO1xuXG4gIC8qKiBAdHlwZSB7UmdifSBDb2xvciBvZiB0aGUgcGFydGljbGUgKi9cbiAgcmdiID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBQYXJ0aWNsZSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtPYmplY3R9IFtjb25mXSBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhlIHBhcnRpY2xlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25mKSB7XG4gICAgdGhpcy5uYW1lID0gXCJQYXJ0aWNsZVwiO1xuICAgIHRoaXMuaWQgPSBQdWlkLmlkKHRoaXMubmFtZSk7XG4gICAgdGhpcy5vbGQgPSB7fTtcbiAgICB0aGlzLmRhdGEgPSB7fTtcbiAgICB0aGlzLmJlaGF2aW91cnMgPSBbXTtcblxuICAgIHRoaXMucCA9IG5ldyBWZWN0b3IyRCgpO1xuICAgIHRoaXMudiA9IG5ldyBWZWN0b3IyRCgpO1xuICAgIHRoaXMuYSA9IG5ldyBWZWN0b3IyRCgpO1xuICAgIHRoaXMub2xkLnAgPSBuZXcgVmVjdG9yMkQoKTtcbiAgICB0aGlzLm9sZC52ID0gbmV3IFZlY3RvcjJEKCk7XG4gICAgdGhpcy5vbGQuYSA9IG5ldyBWZWN0b3IyRCgpO1xuXG4gICAgdGhpcy5yZ2IgPSBuZXcgUmdiKCk7XG4gICAgdGhpcy5yZXNldCgpO1xuICAgIGNvbmYgJiYgUHJvcFV0aWwuc2V0UHJvcCh0aGlzLCBjb25mKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHBhcnRpY2xlJ3MgbW92ZW1lbnQgaW4gZGVncmVlcy5cbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIGRpcmVjdGlvbiBpbiBkZWdyZWVzXG4gICAqL1xuICBnZXREaXJlY3Rpb24oKSB7XG4gICAgcmV0dXJuIE1hdGguYXRhbjIodGhpcy52LngsIC10aGlzLnYueSkgKiBNYXRoVXRpbC5OMTgwX1BJO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgcGFydGljbGUgdG8gaXRzIGluaXRpYWwgc3RhdGUuXG4gICAqIEByZXR1cm5zIHtQYXJ0aWNsZX0gVGhlIHBhcnRpY2xlIGluc3RhbmNlXG4gICAqL1xuICByZXNldCgpIHtcbiAgICB0aGlzLmxpZmUgPSBJbmZpbml0eTtcbiAgICB0aGlzLmFnZSA9IDA7XG5cbiAgICB0aGlzLmRlYWQgPSBmYWxzZTtcbiAgICB0aGlzLnNsZWVwID0gZmFsc2U7XG4gICAgdGhpcy5ib2R5ID0gbnVsbDtcbiAgICB0aGlzLnNwcml0ZSA9IG51bGw7XG4gICAgdGhpcy5wYXJlbnQgPSBudWxsO1xuXG4gICAgdGhpcy5lbmVyZ3kgPSAxOyAvLyBFbmVyZ3kgTG9zc1xuICAgIHRoaXMubWFzcyA9IDE7XG4gICAgdGhpcy5yYWRpdXMgPSAxMDtcbiAgICB0aGlzLmFscGhhID0gMTtcbiAgICB0aGlzLnNjYWxlID0gMTtcbiAgICB0aGlzLnJvdGF0aW9uID0gMDtcbiAgICB0aGlzLmNvbG9yID0gbnVsbDtcblxuICAgIHRoaXMucC5zZXQoMCwgMCk7XG4gICAgdGhpcy52LnNldCgwLCAwKTtcbiAgICB0aGlzLmEuc2V0KDAsIDApO1xuICAgIHRoaXMub2xkLnAuc2V0KDAsIDApO1xuICAgIHRoaXMub2xkLnYuc2V0KDAsIDApO1xuICAgIHRoaXMub2xkLmEuc2V0KDAsIDApO1xuICAgIHRoaXMuZWFzaW5nID0gZWFzZS5lYXNlTGluZWFyO1xuXG4gICAgdGhpcy5yZ2IucmVzZXQoKTtcbiAgICBVdGlsLmVtcHR5T2JqZWN0KHRoaXMuZGF0YSk7XG4gICAgdGhpcy5yZW1vdmVBbGxCZWhhdmlvdXJzKCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBwYXJ0aWNsZSdzIHN0YXRlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSBUaGUgdGltZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHVwZGF0ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBwYXJ0aWNsZSBpbiBpdHMgcGFyZW50IHN5c3RlbVxuICAgKi9cbiAgdXBkYXRlKHRpbWUsIGluZGV4KSB7XG4gICAgaWYgKCF0aGlzLnNsZWVwKSB7XG4gICAgICB0aGlzLmFnZSArPSB0aW1lO1xuICAgICAgdGhpcy5hcHBseUJlaGF2aW91cnModGltZSwgaW5kZXgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFnZSA8IHRoaXMubGlmZSkge1xuICAgICAgY29uc3Qgc2NhbGUgPSB0aGlzLmVhc2luZyh0aGlzLmFnZSAvIHRoaXMubGlmZSk7XG4gICAgICB0aGlzLmVuZXJneSA9IE1hdGgubWF4KDEgLSBzY2FsZSwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGFsbCBiZWhhdmlvdXJzIGF0dGFjaGVkIHRvIHRoZSBwYXJ0aWNsZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgVGhlIHRpbWUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB1cGRhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgcGFydGljbGUgaW4gaXRzIHBhcmVudCBzeXN0ZW1cbiAgICovXG4gIGFwcGx5QmVoYXZpb3Vycyh0aW1lLCBpbmRleCkge1xuICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuYmVoYXZpb3Vycy5sZW5ndGg7XG4gICAgbGV0IGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuYmVoYXZpb3Vyc1tpXSAmJiB0aGlzLmJlaGF2aW91cnNbaV0uYXBwbHlCZWhhdmlvdXIodGhpcywgdGltZSwgaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgYmVoYXZpb3VyIHRvIHRoZSBwYXJ0aWNsZS5cbiAgICogQHBhcmFtIHtCZWhhdmlvdXJ9IGJlaGF2aW91ciBUaGUgYmVoYXZpb3VyIHRvIGFkZFxuICAgKi9cbiAgYWRkQmVoYXZpb3VyKGJlaGF2aW91cikge1xuICAgIHRoaXMuYmVoYXZpb3Vycy5wdXNoKGJlaGF2aW91cik7XG5cbiAgICBpZiAoYmVoYXZpb3VyLmhhc093blByb3BlcnR5KFwicGFyZW50c1wiKSkgYmVoYXZpb3VyLnBhcmVudHMucHVzaCh0aGlzKTtcbiAgICBiZWhhdmlvdXIuaW5pdGlhbGl6ZSh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIG11bHRpcGxlIGJlaGF2aW91cnMgdG8gdGhlIHBhcnRpY2xlLlxuICAgKiBAcGFyYW0ge0JlaGF2aW91cltdfSBiZWhhdmlvdXJzIEFuIGFycmF5IG9mIGJlaGF2aW91cnMgdG8gYWRkXG4gICAqL1xuICBhZGRCZWhhdmlvdXJzKGJlaGF2aW91cnMpIHtcbiAgICBjb25zdCBsZW5ndGggPSBiZWhhdmlvdXJzLmxlbmd0aDtcbiAgICBsZXQgaTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5hZGRCZWhhdmlvdXIoYmVoYXZpb3Vyc1tpXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBzcGVjaWZpYyBiZWhhdmlvdXIgZnJvbSB0aGUgcGFydGljbGUuXG4gICAqIEBwYXJhbSB7QmVoYXZpb3VyfSBiZWhhdmlvdXIgVGhlIGJlaGF2aW91ciB0byByZW1vdmVcbiAgICovXG4gIHJlbW92ZUJlaGF2aW91cihiZWhhdmlvdXIpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuYmVoYXZpb3Vycy5pbmRleE9mKGJlaGF2aW91cik7XG5cbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgY29uc3QgYmVoYXZpb3VyID0gdGhpcy5iZWhhdmlvdXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICBiZWhhdmlvdXIucGFyZW50cyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYWxsIGJlaGF2aW91cnMgZnJvbSB0aGUgcGFydGljbGUuXG4gICAqL1xuICByZW1vdmVBbGxCZWhhdmlvdXJzKCkge1xuICAgIFV0aWwuZW1wdHlBcnJheSh0aGlzLmJlaGF2aW91cnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBwYXJ0aWNsZSwgcmVtb3ZpbmcgYWxsIGJlaGF2aW91cnMgYW5kIHNldHRpbmcgaXQgYXMgZGVhZC5cbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5yZW1vdmVBbGxCZWhhdmlvdXJzKCk7XG4gICAgdGhpcy5lbmVyZ3kgPSAwO1xuICAgIHRoaXMuZGVhZCA9IHRydWU7XG4gICAgdGhpcy5wYXJlbnQgPSBudWxsO1xuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBAdHlwZWRlZiAge09iamVjdH0gcmdiT2JqZWN0XG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSByIHJlZCB2YWx1ZVxuICAgKiBAcHJvcGVydHkge051bWJlcn0gZyBncmVlbiB2YWx1ZVxuICAgKiBAcHJvcGVydHkge051bWJlcn0gYiBibHVlIHZhbHVlXG4gICAqL1xuICAvKipcbiAgICogY29udmVydHMgYSBoZXggdmFsdWUgdG8gYSByZ2Igb2JqZWN0XG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBoZXhUb1JnYlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gaCBhbnkgaGV4IHZhbHVlLCBlLmcuICMwMDAwMDAgb3IgMDAwMDAwIGZvciBibGFja1xuICAgKlxuICAgKiBAcmV0dXJuIHtyZ2JPYmplY3R9XG4gICAqL1xuICBoZXhUb1JnYihoKSB7XG4gICAgY29uc3QgaGV4MTYgPSBoLmNoYXJBdCgwKSA9PT0gXCIjXCIgPyBoLnN1YnN0cmluZygxLCA3KSA6IGg7XG4gICAgY29uc3QgciA9IHBhcnNlSW50KGhleDE2LnN1YnN0cmluZygwLCAyKSwgMTYpO1xuICAgIGNvbnN0IGcgPSBwYXJzZUludChoZXgxNi5zdWJzdHJpbmcoMiwgNCksIDE2KTtcbiAgICBjb25zdCBiID0gcGFyc2VJbnQoaGV4MTYuc3Vic3RyaW5nKDQsIDYpLCAxNik7XG5cbiAgICByZXR1cm4geyByLCBnLCBiIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNvbnZlcnRzIGEgcmdiIHZhbHVlIHRvIGEgcmdiIHN0cmluZ1xuICAgKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5VdGlsXG4gICAqIEBtZXRob2QgcmdiVG9IZXhcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3QgfCBQcm90b24uaGV4VG9SZ2J9IHJnYiBhIHJnYiBvYmplY3QgbGlrZSBpbiB7QGxpbmsgUHJvdG9uI1Byb3Rvbi59XG4gICAqXG4gICAqIEByZXR1cm4ge1N0cmluZ30gcmdiKClcbiAgICovXG4gIHJnYlRvSGV4KHJiZykge1xuICAgIHJldHVybiBgcmdiKCR7cmJnLnJ9LCAke3JiZy5nfSwgJHtyYmcuYn0pYDtcbiAgfSxcblxuICBnZXRIZXgxNkZyb21QYXJ0aWNsZShwKSB7XG4gICAgcmV0dXJuIE51bWJlcihwLnJnYi5yKSAqIDY1NTM2ICsgTnVtYmVyKHAucmdiLmcpICogMjU2ICsgTnVtYmVyKHAucmdiLmIpO1xuICB9XG59O1xuIiwiaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuL1ZlY3RvcjJEXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvbGFyMkQge1xuICBjb25zdHJ1Y3RvcihyLCB0aGEpIHtcbiAgICB0aGlzLnIgPSBNYXRoLmFicyhyKSB8fCAwO1xuICAgIHRoaXMudGhhID0gdGhhIHx8IDA7XG4gIH1cblxuICBzZXQociwgdGhhKSB7XG4gICAgdGhpcy5yID0gcjtcbiAgICB0aGlzLnRoYSA9IHRoYTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFIocikge1xuICAgIHRoaXMuciA9IHI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRUaGEodGhhKSB7XG4gICAgdGhpcy50aGEgPSB0aGE7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjb3B5KHApIHtcbiAgICB0aGlzLnIgPSBwLnI7XG4gICAgdGhpcy50aGEgPSBwLnRoYTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRvVmVjdG9yKCkge1xuICAgIHJldHVybiBuZXcgVmVjdG9yMkQodGhpcy5nZXRYKCksIHRoaXMuZ2V0WSgpKTtcbiAgfVxuXG4gIGdldFgoKSB7XG4gICAgcmV0dXJuIHRoaXMuciAqIE1hdGguc2luKHRoaXMudGhhKTtcbiAgfVxuXG4gIGdldFkoKSB7XG4gICAgcmV0dXJuIC10aGlzLnIgKiBNYXRoLmNvcyh0aGlzLnRoYSk7XG4gIH1cblxuICBub3JtYWxpemUoKSB7XG4gICAgdGhpcy5yID0gMTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGVxdWFscyh2KSB7XG4gICAgcmV0dXJuIHYuciA9PT0gdGhpcy5yICYmIHYudGhhID09PSB0aGlzLnRoYTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuciA9IDAuMDtcbiAgICB0aGlzLnRoYSA9IDAuMDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgUG9sYXIyRCh0aGlzLnIsIHRoaXMudGhhKTtcbiAgfVxufVxuIiwiY29uc3QgTWF0MyA9IHtcbiAgY3JlYXRlKG1hdDMpIHtcbiAgICBjb25zdCBtYXQgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgIGlmIChtYXQzKSB0aGlzLnNldChtYXQzLCBtYXQpO1xuXG4gICAgcmV0dXJuIG1hdDtcbiAgfSxcblxuICBzZXQobWF0MSwgbWF0Mikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgOTsgaSsrKSBtYXQyW2ldID0gbWF0MVtpXTtcblxuICAgIHJldHVybiBtYXQyO1xuICB9LFxuXG4gIG11bHRpcGx5KG1hdCwgbWF0MiwgbWF0Mykge1xuICAgIGxldCBhMDAgPSBtYXRbMF0sXG4gICAgICBhMDEgPSBtYXRbMV0sXG4gICAgICBhMDIgPSBtYXRbMl0sXG4gICAgICBhMTAgPSBtYXRbM10sXG4gICAgICBhMTEgPSBtYXRbNF0sXG4gICAgICBhMjAgPSBtYXRbNl0sXG4gICAgICBhMjEgPSBtYXRbN10sXG4gICAgICBiMDAgPSBtYXQyWzBdLFxuICAgICAgYjAxID0gbWF0MlsxXSxcbiAgICAgIGIwMiA9IG1hdDJbMl0sXG4gICAgICBiMTAgPSBtYXQyWzNdLFxuICAgICAgYjExID0gbWF0Mls0XSxcbiAgICAgIGIyMCA9IG1hdDJbNl0sXG4gICAgICBiMjEgPSBtYXQyWzddO1xuXG4gICAgbWF0M1swXSA9IGIwMCAqIGEwMCArIGIwMSAqIGExMDtcbiAgICBtYXQzWzFdID0gYjAwICogYTAxICsgYjAxICogYTExO1xuICAgIG1hdDNbMl0gPSBhMDIgKiBiMDI7XG4gICAgbWF0M1szXSA9IGIxMCAqIGEwMCArIGIxMSAqIGExMDtcbiAgICBtYXQzWzRdID0gYjEwICogYTAxICsgYjExICogYTExO1xuICAgIG1hdDNbNl0gPSBiMjAgKiBhMDAgKyBiMjEgKiBhMTAgKyBhMjA7XG4gICAgbWF0M1s3XSA9IGIyMCAqIGEwMSArIGIyMSAqIGExMSArIGEyMTtcblxuICAgIHJldHVybiBtYXQzO1xuICB9LFxuXG4gIGludmVyc2UobWF0LCBtYXQzKSB7XG4gICAgbGV0IGEwMCA9IG1hdFswXSxcbiAgICAgIGEwMSA9IG1hdFsxXSxcbiAgICAgIGExMCA9IG1hdFszXSxcbiAgICAgIGExMSA9IG1hdFs0XSxcbiAgICAgIGEyMCA9IG1hdFs2XSxcbiAgICAgIGEyMSA9IG1hdFs3XSxcbiAgICAgIGIwMSA9IGExMSxcbiAgICAgIGIxMSA9IC1hMTAsXG4gICAgICBiMjEgPSBhMjEgKiBhMTAgLSBhMTEgKiBhMjAsXG4gICAgICBkID0gYTAwICogYjAxICsgYTAxICogYjExLFxuICAgICAgaWQ7XG5cbiAgICBpZCA9IDEgLyBkO1xuICAgIG1hdDNbMF0gPSBiMDEgKiBpZDtcbiAgICBtYXQzWzFdID0gLWEwMSAqIGlkO1xuICAgIG1hdDNbM10gPSBiMTEgKiBpZDtcbiAgICBtYXQzWzRdID0gYTAwICogaWQ7XG4gICAgbWF0M1s2XSA9IGIyMSAqIGlkO1xuICAgIG1hdDNbN10gPSAoLWEyMSAqIGEwMCArIGEwMSAqIGEyMCkgKiBpZDtcblxuICAgIHJldHVybiBtYXQzO1xuICB9LFxuXG4gIG11bHRpcGx5VmVjMihtLCB2ZWMsIG1hdDMpIHtcbiAgICBsZXQgeCA9IHZlY1swXSxcbiAgICAgIHkgPSB2ZWNbMV07XG5cbiAgICBtYXQzWzBdID0geCAqIG1bMF0gKyB5ICogbVszXSArIG1bNl07XG4gICAgbWF0M1sxXSA9IHggKiBtWzFdICsgeSAqIG1bNF0gKyBtWzddO1xuXG4gICAgcmV0dXJuIG1hdDM7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1hdDM7XG4iLCJpbXBvcnQgU3BhbiBmcm9tIFwiLi9TcGFuXCI7XG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuL01hdGhVdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFycmF5U3BhbiBleHRlbmRzIFNwYW4ge1xuICBjb25zdHJ1Y3Rvcihjb2xvcikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fYXJyID0gVXRpbC50b0FycmF5KGNvbG9yKTtcbiAgfVxuXG4gIGdldFZhbHVlKCkge1xuICAgIGNvbnN0IHZhbCA9IFV0aWwuZ2V0UmFuZEZyb21BcnJheSh0aGlzLl9hcnIpO1xuICAgIHJldHVybiB2YWwgPT09IFwicmFuZG9tXCIgfHwgdmFsID09PSBcIlJhbmRvbVwiID8gTWF0aFV0aWwucmFuZG9tQ29sb3IoKSA6IHZhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIHN1cmUgdGhhdCB0aGUgY29sb3IgaXMgYW4gaW5zdGFuY2Ugb2YgUHJvdG9uLkFycmF5U3BhbiwgaWYgbm90IGl0IG1ha2VzIGEgbmV3IGluc3RhbmNlXG4gICAqXG4gICAqIEBtZXRob2Qgc2V0U3BhblZhbHVlXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkNvbG9yXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7SW50fSB0aGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVBcnJheVNwYW4oYXJyKSB7XG4gICAgaWYgKCFhcnIpIHJldHVybiBudWxsO1xuXG4gICAgaWYgKGFyciBpbnN0YW5jZW9mIEFycmF5U3BhbikgcmV0dXJuIGFycjtcbiAgICBlbHNlIHJldHVybiBuZXcgQXJyYXlTcGFuKGFycik7XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlY3RhbmdsZSB7XG4gIGNvbnN0cnVjdG9yKHgsIHksIHcsIGgpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG5cbiAgICB0aGlzLndpZHRoID0gdztcbiAgICB0aGlzLmhlaWdodCA9IGg7XG5cbiAgICB0aGlzLmJvdHRvbSA9IHRoaXMueSArIHRoaXMuaGVpZ2h0O1xuICAgIHRoaXMucmlnaHQgPSB0aGlzLnggKyB0aGlzLndpZHRoO1xuICB9XG5cbiAgY29udGFpbnMoeCwgeSkge1xuICAgIGlmICh4IDw9IHRoaXMucmlnaHQgJiYgeCA+PSB0aGlzLnggJiYgeSA8PSB0aGlzLmJvdHRvbSAmJiB5ID49IHRoaXMueSkgcmV0dXJuIHRydWU7XG4gICAgZWxzZSByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsImltcG9ydCBTcGFuIGZyb20gXCIuLi9tYXRoL1NwYW5cIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5cbi8qKlxuICogUmF0ZSBjbGFzcyBmb3IgY29udHJvbGxpbmcgcGFydGljbGUgZW1pc3Npb24gcmF0ZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmF0ZSB7XG4gIC8qKlxuICAgKiBAdHlwZSB7U3Bhbn1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIG51bVBhbjtcblxuICAvKipcbiAgICogQHR5cGUge1NwYW59XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0aW1lUGFuO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3RhcnRUaW1lO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbmV4dFRpbWU7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgUmF0ZSBpbnN0YW5jZS5cbiAgICogVGhlIG51bWJlciBvZiBwYXJ0aWNsZXMgcGVyIHNlY29uZCBlbWlzc2lvbiAoYSBbcGFydGljbGVdL2IgW3NdKS5cbiAgICogQHBhcmFtIHtBcnJheXxudW1iZXJ8U3Bhbn0gW251bXBhbj0xXSAtIFRoZSBudW1iZXIgb2YgcGFydGljbGVzIGZvciBlYWNoIGVtaXNzaW9uLlxuICAgKiBAcGFyYW0ge0FycmF5fG51bWJlcnxTcGFufSBbdGltZXBhbj0xXSAtIFRoZSB0aW1lIGludGVydmFsIGJldHdlZW4gZWFjaCBlbWlzc2lvbi5cbiAgICogQGV4YW1wbGVcbiAgICogLy8gQ3JlYXRlIGEgcmF0ZSBvZiAxMC0yMCBwYXJ0aWNsZXMgZXZlcnkgMC4xLTAuMjUgc2Vjb25kc1xuICAgKiBuZXcgUmF0ZShuZXcgU3BhbigxMCwgMjApLCBuZXcgU3BhbigwLjEsIDAuMjUpKTtcbiAgICovXG4gIGNvbnN0cnVjdG9yKG51bXBhbiwgdGltZXBhbikge1xuICAgIHRoaXMubnVtUGFuID0gU3Bhbi5zZXRTcGFuVmFsdWUoVXRpbC5pbml0VmFsdWUobnVtcGFuLCAxKSk7XG4gICAgdGhpcy50aW1lUGFuID0gU3Bhbi5zZXRTcGFuVmFsdWUoVXRpbC5pbml0VmFsdWUodGltZXBhbiwgMSkpO1xuXG4gICAgdGhpcy5zdGFydFRpbWUgPSAwO1xuICAgIHRoaXMubmV4dFRpbWUgPSAwO1xuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSByYXRlLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaW5pdCgpIHtcbiAgICB0aGlzLnN0YXJ0VGltZSA9IDA7XG4gICAgdGhpcy5uZXh0VGltZSA9IHRoaXMudGltZVBhbi5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWJlciBvZiBwYXJ0aWNsZXMgdG8gZW1pdCBiYXNlZCBvbiB0aGUgZWxhcHNlZCB0aW1lLlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRoZSBlbGFwc2VkIHRpbWUgc2luY2UgdGhlIGxhc3QgdXBkYXRlLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIHBhcnRpY2xlcyB0byBlbWl0LlxuICAgKi9cbiAgZ2V0VmFsdWUodGltZSkge1xuICAgIHRoaXMuc3RhcnRUaW1lICs9IHRpbWU7XG5cbiAgICBpZiAodGhpcy5zdGFydFRpbWUgPj0gdGhpcy5uZXh0VGltZSkge1xuICAgICAgdGhpcy5zdGFydFRpbWUgPSAwO1xuICAgICAgdGhpcy5uZXh0VGltZSA9IHRoaXMudGltZVBhbi5nZXRWYWx1ZSgpO1xuXG4gICAgICBpZiAodGhpcy5udW1QYW4uYiA9PT0gMSkge1xuICAgICAgICBpZiAodGhpcy5udW1QYW4uZ2V0VmFsdWUoZmFsc2UpID4gMC41KSByZXR1cm4gMTtcbiAgICAgICAgZWxzZSByZXR1cm4gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLm51bVBhbi5nZXRWYWx1ZSh0cnVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW5pdGlhbGl6ZSB7XG4gIHJlc2V0KCkge31cblxuICBpbml0KGVtaXR0ZXIsIHBhcnRpY2xlKSB7XG4gICAgaWYgKHBhcnRpY2xlKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemUocGFydGljbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluaXRpYWxpemUoZW1pdHRlcik7XG4gICAgfVxuICB9XG5cbiAgLy8gc3ViIGNsYXNzIGluaXRcbiAgaW5pdGlhbGl6ZSh0YXJnZXQpIHt9XG59XG4iLCJpbXBvcnQgU3BhbiBmcm9tIFwiLi4vbWF0aC9TcGFuXCI7XG5pbXBvcnQgSW5pdGlhbGl6ZSBmcm9tIFwiLi9Jbml0aWFsaXplXCI7XG5cbi8qKlxuICogTGlmZSBjbGFzcyBmb3IgaW5pdGlhbGl6aW5nIHBhcnRpY2xlIGxpZmV0aW1lLlxuICogQGV4dGVuZHMgSW5pdGlhbGl6ZVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlIGV4dGVuZHMgSW5pdGlhbGl6ZSB7XG4gIC8qKlxuICAgKiBAdHlwZSB7U3Bhbn1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGxpZmVQYW47XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBuYW1lO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IExpZmUgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfFNwYW59IGEgLSBUaGUgbGlmZXRpbWUgdmFsdWUgb3IgdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBsaWZldGltZSByYW5nZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtiXSAtIFRoZSB1cHBlciBib3VuZCBvZiB0aGUgbGlmZXRpbWUgcmFuZ2UgKGlmIGEgaXMgYSBudW1iZXIpLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjXSAtIFdoZXRoZXIgdG8gdXNlIGNlbnRlci1iYXNlZCBjYWxjdWxhdGlvbiAoaWYgYSBhbmQgYiBhcmUgbnVtYmVycykuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhLCBiLCBjKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMubGlmZVBhbiA9IFNwYW4uc2V0U3BhblZhbHVlKGEsIGIsIGMpO1xuICAgIHRoaXMubmFtZSA9IFwiTGlmZVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBsaWZldGltZSBvZiBhIHRhcmdldCBwYXJ0aWNsZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IHRhcmdldCAtIFRoZSB0YXJnZXQgcGFydGljbGUgdG8gaW5pdGlhbGl6ZS5cbiAgICovXG4gIGluaXRpYWxpemUodGFyZ2V0KSB7XG4gICAgaWYgKHRoaXMubGlmZVBhbi5hID09PSBJbmZpbml0eSkgdGFyZ2V0LmxpZmUgPSBJbmZpbml0eTtcbiAgICBlbHNlIHRhcmdldC5saWZlID0gdGhpcy5saWZlUGFuLmdldFZhbHVlKCk7XG4gIH1cbn1cbiIsImltcG9ydCBWZWN0b3IyRCBmcm9tIFwiLi4vbWF0aC9WZWN0b3IyRFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBab25lIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy52ZWN0b3IgPSBuZXcgVmVjdG9yMkQoMCwgMCk7XG4gICAgdGhpcy5yYW5kb20gPSAwO1xuICAgIHRoaXMuY3Jvc3NUeXBlID0gXCJkZWFkXCI7XG4gICAgdGhpcy5hbGVydCA9IHRydWU7XG4gIH1cblxuICBnZXRQb3NpdGlvbigpIHt9XG5cbiAgY3Jvc3NpbmcocGFydGljbGUpIHt9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnZlY3RvciA9IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCBab25lIGZyb20gXCIuL1pvbmVcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcG9pbnQgem9uZSBpbiBhIDJEIHNwYWNlLlxuICogQGV4dGVuZHMgWm9uZVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQb2ludFpvbmUgZXh0ZW5kcyBab25lIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgUG9pbnRab25lLlxuICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LlxuICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LlxuICAgKi9cbiAgY29uc3RydWN0b3IoeCwgeSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBwb2ludC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMueCA9IHg7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBwb2ludC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMueSA9IHk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIHBvaW50LlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwb3NpdGlvbiB2ZWN0b3IuXG4gICAqL1xuICBnZXRQb3NpdGlvbigpIHtcbiAgICB0aGlzLnZlY3Rvci54ID0gdGhpcy54O1xuICAgIHRoaXMudmVjdG9yLnkgPSB0aGlzLnk7XG5cbiAgICByZXR1cm4gdGhpcy52ZWN0b3I7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBmb3IgUG9pbnRab25lLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFydGljbGUgLSBUaGUgcGFydGljbGUgb2JqZWN0ICh1bnVzZWQpLlxuICAgKi9cbiAgY3Jvc3NpbmcocGFydGljbGUpIHtcbiAgICBpZiAodGhpcy5hbGVydCkge1xuICAgICAgY29uc29sZS5lcnJvcihcIlNvcnJ5LCBQb2ludFpvbmUgZG9lcyBub3Qgc3VwcG9ydCBjcm9zc2luZyBtZXRob2QhXCIpO1xuICAgICAgdGhpcy5hbGVydCA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBQb2ludFpvbmUgZnJvbSBcIi4uL3pvbmUvUG9pbnRab25lXCI7XG5pbXBvcnQgSW5pdGlhbGl6ZSBmcm9tIFwiLi9Jbml0aWFsaXplXCI7XG5cbi8qKlxuICogUG9zaXRpb24gY2xhc3MgZm9yIGluaXRpYWxpemluZyBwYXJ0aWNsZSBwb3NpdGlvbnMuXG4gKiBAZXh0ZW5kcyBJbml0aWFsaXplXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvc2l0aW9uIGV4dGVuZHMgSW5pdGlhbGl6ZSB7XG4gIC8qKlxuICAgKiBAdHlwZSB7UG9pbnRab25lfGFueX1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHpvbmU7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBuYW1lO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFBvc2l0aW9uIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge1BvaW50Wm9uZXxhbnl9IFt6b25lXSAtIFRoZSB6b25lIHRvIHVzZSBmb3IgcG9zaXRpb25pbmcuIERlZmF1bHRzIHRvIGEgbmV3IFBvaW50Wm9uZSBpZiBub3QgcHJvdmlkZWQuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih6b25lKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnpvbmUgPSBVdGlsLmluaXRWYWx1ZSh6b25lLCBuZXcgUG9pbnRab25lKCkpO1xuICAgIHRoaXMubmFtZSA9IFwiUG9zaXRpb25cIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhpcyBpbml0aWFsaXplcidzIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB7UG9pbnRab25lfGFueX0gW3pvbmVdIC0gVGhlIG5ldyB6b25lIHRvIHVzZSBmb3IgcG9zaXRpb25pbmcuIERlZmF1bHRzIHRvIGEgbmV3IFBvaW50Wm9uZSBpZiBub3QgcHJvdmlkZWQuXG4gICAqL1xuICByZXNldCh6b25lKSB7XG4gICAgdGhpcy56b25lID0gVXRpbC5pbml0VmFsdWUoem9uZSwgbmV3IFBvaW50Wm9uZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGFydGljbGUncyBwb3NpdGlvbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IHRhcmdldCAtIFRoZSBwYXJ0aWNsZSB0byBpbml0aWFsaXplLlxuICAgKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0LnAgLSBUaGUgcGFydGljbGUncyBwb3NpdGlvbiBvYmplY3QuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0YXJnZXQucC54IC0gVGhlIHBhcnRpY2xlJ3MgeCBjb29yZGluYXRlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGFyZ2V0LnAueSAtIFRoZSBwYXJ0aWNsZSdzIHkgY29vcmRpbmF0ZS5cbiAgICovXG4gIGluaXRpYWxpemUodGFyZ2V0KSB7XG4gICAgdGhpcy56b25lLmdldFBvc2l0aW9uKCk7XG5cbiAgICB0YXJnZXQucC54ID0gdGhpcy56b25lLnZlY3Rvci54O1xuICAgIHRhcmdldC5wLnkgPSB0aGlzLnpvbmUudmVjdG9yLnk7XG4gIH1cbn1cbiIsImltcG9ydCBQcm90b24gZnJvbSBcIi4uL2NvcmUvUHJvdG9uXCI7XG5pbXBvcnQgU3BhbiBmcm9tIFwiLi4vbWF0aC9TcGFuXCI7XG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IEluaXRpYWxpemUgZnJvbSBcIi4vSW5pdGlhbGl6ZVwiO1xuaW1wb3J0IFBvbGFyMkQgZnJvbSBcIi4uL21hdGgvUG9sYXIyRFwiO1xuaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuLi9tYXRoL01hdGhVdGlsXCI7XG5cbi8qKlxuICogVmVsb2NpdHkgY2xhc3MgZm9yIGluaXRpYWxpemluZyBwYXJ0aWNsZSB2ZWxvY2l0aWVzLlxuICogQGV4dGVuZHMgSW5pdGlhbGl6ZVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2l0eSBleHRlbmRzIEluaXRpYWxpemUge1xuICAvKipcbiAgICogQHR5cGUge1NwYW59XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByUGFuO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7U3Bhbn1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRoYVBhbjtcblxuICAvKipcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIG5hbWU7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgVmVsb2NpdHkgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfFNwYW59IFtycGFuXSAtIFRoZSByYWRpYWwgY29tcG9uZW50IG9mIHRoZSB2ZWxvY2l0eSBvciBpdHMgcmFuZ2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfFNwYW59IFt0aGFwYW5dIC0gVGhlIGFuZ3VsYXIgY29tcG9uZW50IG9mIHRoZSB2ZWxvY2l0eSBvciBpdHMgcmFuZ2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZT0ndmVjdG9yJ10gLSBUaGUgdHlwZSBvZiB2ZWxvY2l0eSAoJ3ZlY3Rvcicgb3IgJ3BvbGFyJykuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihycGFuLCB0aGFwYW4sIHR5cGUpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5yUGFuID0gU3Bhbi5zZXRTcGFuVmFsdWUocnBhbik7XG4gICAgdGhpcy50aGFQYW4gPSBTcGFuLnNldFNwYW5WYWx1ZSh0aGFwYW4pO1xuICAgIHRoaXMudHlwZSA9IFV0aWwuaW5pdFZhbHVlKHR5cGUsIFwidmVjdG9yXCIpO1xuXG4gICAgdGhpcy5uYW1lID0gXCJWZWxvY2l0eVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgdmVsb2NpdHkgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtudW1iZXJ8U3Bhbn0gW3JwYW5dIC0gVGhlIHJhZGlhbCBjb21wb25lbnQgb2YgdGhlIHZlbG9jaXR5IG9yIGl0cyByYW5nZS5cbiAgICogQHBhcmFtIHtudW1iZXJ8U3Bhbn0gW3RoYXBhbl0gLSBUaGUgYW5ndWxhciBjb21wb25lbnQgb2YgdGhlIHZlbG9jaXR5IG9yIGl0cyByYW5nZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFt0eXBlPSd2ZWN0b3InXSAtIFRoZSB0eXBlIG9mIHZlbG9jaXR5ICgndmVjdG9yJyBvciAncG9sYXInKS5cbiAgICovXG4gIHJlc2V0KHJwYW4sIHRoYXBhbiwgdHlwZSkge1xuICAgIHRoaXMuclBhbiA9IFNwYW4uc2V0U3BhblZhbHVlKHJwYW4pO1xuICAgIHRoaXMudGhhUGFuID0gU3Bhbi5zZXRTcGFuVmFsdWUodGhhcGFuKTtcbiAgICB0aGlzLnR5cGUgPSBVdGlsLmluaXRWYWx1ZSh0eXBlLCBcInZlY3RvclwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIHRoZSB2ZWxvY2l0eSB2YWx1ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHZyIC0gVGhlIHZlbG9jaXR5IHZhbHVlIHRvIG5vcm1hbGl6ZS5cbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIG5vcm1hbGl6ZWQgdmVsb2NpdHkgdmFsdWUuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBub3JtYWxpemVWZWxvY2l0eSh2cikge1xuICAgIHJldHVybiB2ciAqIFByb3Rvbi5NRUFTVVJFO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBwYXJ0aWNsZSdzIHZlbG9jaXR5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0IC0gVGhlIHBhcnRpY2xlIHRvIGluaXRpYWxpemUuXG4gICAqL1xuICBpbml0aWFsaXplKHRhcmdldCkge1xuICAgIGlmICh0aGlzLnR5cGUgPT09IFwicFwiIHx8IHRoaXMudHlwZSA9PT0gXCJQXCIgfHwgdGhpcy50eXBlID09PSBcInBvbGFyXCIpIHtcbiAgICAgIGNvbnN0IHBvbGFyMmQgPSBuZXcgUG9sYXIyRChcbiAgICAgICAgdGhpcy5ub3JtYWxpemVWZWxvY2l0eSh0aGlzLnJQYW4uZ2V0VmFsdWUoKSksXG4gICAgICAgIHRoaXMudGhhUGFuLmdldFZhbHVlKCkgKiBNYXRoVXRpbC5QSV8xODBcbiAgICAgICk7XG5cbiAgICAgIHRhcmdldC52LnggPSBwb2xhcjJkLmdldFgoKTtcbiAgICAgIHRhcmdldC52LnkgPSBwb2xhcjJkLmdldFkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LnYueCA9IHRoaXMubm9ybWFsaXplVmVsb2NpdHkodGhpcy5yUGFuLmdldFZhbHVlKCkpO1xuICAgICAgdGFyZ2V0LnYueSA9IHRoaXMubm9ybWFsaXplVmVsb2NpdHkodGhpcy50aGFQYW4uZ2V0VmFsdWUoKSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgU3BhbiBmcm9tIFwiLi4vbWF0aC9TcGFuXCI7XG5pbXBvcnQgSW5pdGlhbGl6ZSBmcm9tIFwiLi9Jbml0aWFsaXplXCI7XG5cbi8qKlxuICogTWFzcyBjbGFzcyBmb3IgaW5pdGlhbGl6aW5nIHBhcnRpY2xlIG1hc3MuXG4gKiBAZXh0ZW5kcyBJbml0aWFsaXplXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hc3MgZXh0ZW5kcyBJbml0aWFsaXplIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtTcGFufVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbWFzc1BhbjtcblxuICAvKipcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIG5hbWU7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgTWFzcyBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtudW1iZXJ8U3Bhbn0gYSAtIFRoZSBtYXNzIHZhbHVlIG9yIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgbWFzcyByYW5nZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtiXSAtIFRoZSB1cHBlciBib3VuZCBvZiB0aGUgbWFzcyByYW5nZSAoaWYgYSBpcyBhIG51bWJlcikuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NdIC0gV2hldGhlciB0byB1c2UgY2VudGVyLWJhc2VkIGNhbGN1bGF0aW9uIChpZiBhIGFuZCBiIGFyZSBudW1iZXJzKS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGEsIGIsIGMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubWFzc1BhbiA9IFNwYW4uc2V0U3BhblZhbHVlKGEsIGIsIGMpO1xuICAgIHRoaXMubmFtZSA9IFwiTWFzc1wiO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBtYXNzIG9mIGEgdGFyZ2V0IHBhcnRpY2xlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0IC0gVGhlIHRhcmdldCBwYXJ0aWNsZSB0byBpbml0aWFsaXplLlxuICAgKi9cbiAgaW5pdGlhbGl6ZSh0YXJnZXQpIHtcbiAgICB0YXJnZXQubWFzcyA9IHRoaXMubWFzc1Bhbi5nZXRWYWx1ZSgpO1xuICB9XG59XG4iLCJpbXBvcnQgU3BhbiBmcm9tIFwiLi4vbWF0aC9TcGFuXCI7XG5pbXBvcnQgSW5pdGlhbGl6ZSBmcm9tIFwiLi9Jbml0aWFsaXplXCI7XG5cbi8qKlxuICogUmFkaXVzIGNsYXNzIGZvciBpbml0aWFsaXppbmcgcGFydGljbGUgcmFkaXVzLlxuICogQGV4dGVuZHMgSW5pdGlhbGl6ZVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSYWRpdXMgZXh0ZW5kcyBJbml0aWFsaXplIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtTcGFufVxuICAgKi9cbiAgcmFkaXVzO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgbmFtZTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBSYWRpdXMgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfFNwYW59IGEgLSBUaGUgcmFkaXVzIHZhbHVlIG9yIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgcmFkaXVzIHJhbmdlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2JdIC0gVGhlIHVwcGVyIGJvdW5kIG9mIHRoZSByYWRpdXMgcmFuZ2UgKGlmIGEgaXMgYSBudW1iZXIpLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjXSAtIFdoZXRoZXIgdG8gdXNlIGNlbnRlci1iYXNlZCBjYWxjdWxhdGlvbiAoaWYgYSBhbmQgYiBhcmUgbnVtYmVycykuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhLCBiLCBjKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJhZGl1cyA9IFNwYW4uc2V0U3BhblZhbHVlKGEsIGIsIGMpO1xuICAgIHRoaXMubmFtZSA9IFwiUmFkaXVzXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoaXMgaW5pdGlhbGl6ZXIncyBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge251bWJlcnxTcGFufSBhIC0gVGhlIHJhZGl1cyB2YWx1ZSBvciB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIHJhZGl1cyByYW5nZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtiXSAtIFRoZSB1cHBlciBib3VuZCBvZiB0aGUgcmFkaXVzIHJhbmdlIChpZiBhIGlzIGEgbnVtYmVyKS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbY10gLSBXaGV0aGVyIHRvIHVzZSBjZW50ZXItYmFzZWQgY2FsY3VsYXRpb24gKGlmIGEgYW5kIGIgYXJlIG51bWJlcnMpLlxuICAgKi9cbiAgcmVzZXQoYSwgYiwgYykge1xuICAgIHRoaXMucmFkaXVzID0gU3Bhbi5zZXRTcGFuVmFsdWUoYSwgYiwgYyk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHBhcnRpY2xlJ3MgcmFkaXVzLlxuICAgKiBAcGFyYW0ge1BhcnRpY2xlfSBwYXJ0aWNsZSAtIFRoZSBwYXJ0aWNsZSB0byBpbml0aWFsaXplLlxuICAgKi9cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLnJhZGl1cyA9IHRoaXMucmFkaXVzLmdldFZhbHVlKCk7XG4gICAgcGFydGljbGUuZGF0YS5vbGRSYWRpdXMgPSBwYXJ0aWNsZS5yYWRpdXM7XG4gIH1cbn1cbiIsImltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgQXJyYXlTcGFuIGZyb20gXCIuLi9tYXRoL0FycmF5U3BhblwiO1xuaW1wb3J0IEluaXRpYWxpemUgZnJvbSBcIi4vSW5pdGlhbGl6ZVwiO1xuXG4vKipcbiAqIEJvZHkgY2xhc3MgZm9yIGluaXRpYWxpemluZyBwYXJ0aWNsZSBib2RpZXMuXG4gKiBAZXh0ZW5kcyBJbml0aWFsaXplXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvZHkgZXh0ZW5kcyBJbml0aWFsaXplIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtBcnJheVNwYW59XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpbWFnZTtcblxuICAvKipcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIG5hbWU7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQm9keSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fEFycmF5U3Bhbn0gaW1hZ2UgLSBUaGUgaW1hZ2Ugc291cmNlIG9yIG9iamVjdCB0byB1c2UgZm9yIHRoZSBwYXJ0aWNsZSBib2R5LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3c9MjBdIC0gVGhlIHdpZHRoIG9mIHRoZSBwYXJ0aWNsZSBib2R5LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2hdIC0gVGhlIGhlaWdodCBvZiB0aGUgcGFydGljbGUgYm9keS4gRGVmYXVsdHMgdG8gdGhlIHdpZHRoIGlmIG5vdCBwcm92aWRlZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGltYWdlLCB3LCBoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuaW1hZ2UgPSB0aGlzLnNldFNwYW5WYWx1ZShpbWFnZSk7XG4gICAgdGhpcy53ID0gVXRpbC5pbml0VmFsdWUodywgMjApO1xuICAgIHRoaXMuaCA9IFV0aWwuaW5pdFZhbHVlKGgsIHRoaXMudyk7XG4gICAgdGhpcy5uYW1lID0gXCJCb2R5XCI7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHBhcnRpY2xlJ3MgYm9keS5cbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcnRpY2xlIC0gVGhlIHBhcnRpY2xlIHRvIGluaXRpYWxpemUuXG4gICAqL1xuICBpbml0aWFsaXplKHBhcnRpY2xlKSB7XG4gICAgY29uc3QgaW1hZ2VUYXJnZXQgPSB0aGlzLmltYWdlLmdldFZhbHVlKCk7XG5cbiAgICBpZiAodHlwZW9mIGltYWdlVGFyZ2V0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5ID0ge1xuICAgICAgICB3aWR0aDogdGhpcy53LFxuICAgICAgICBoZWlnaHQ6IHRoaXMuaCxcbiAgICAgICAgc3JjOiBpbWFnZVRhcmdldCxcbiAgICAgICAgaXNJbm5lcjogdHJ1ZSxcbiAgICAgICAgaW5uZXI6IHRydWVcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnRpY2xlLmJvZHkgPSBpbWFnZVRhcmdldDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc3BhbiB2YWx1ZSBmb3IgdGhlIGltYWdlLlxuICAgKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R8QXJyYXlTcGFufSBpbWFnZSAtIFRoZSBpbWFnZSBzb3VyY2Ugb3Igb2JqZWN0IHRvIHNldCBhcyBzcGFuIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7QXJyYXlTcGFufSBUaGUgQXJyYXlTcGFuIGluc3RhbmNlLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2V0U3BhblZhbHVlKGltYWdlKSB7XG4gICAgcmV0dXJuIGltYWdlIGluc3RhbmNlb2YgQXJyYXlTcGFuID8gaW1hZ2UgOiBuZXcgQXJyYXlTcGFuKGltYWdlKTtcbiAgfVxufVxuIiwiaW1wb3J0IFByb3RvbiBmcm9tIFwiLi4vY29yZS9Qcm90b25cIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgZWFzZSBmcm9tIFwiLi4vbWF0aC9lYXNlXCI7XG5cbi8qKlxuICogVGhlIEJlaGF2aW91ciBjbGFzcyBpcyB0aGUgYmFzZSBmb3IgdGhlIG90aGVyIEJlaGF2aW91clxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJlaGF2aW91ciB7XG4gIHN0YXRpYyBpZCA9IDA7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBCZWhhdmlvdXIgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtsaWZlPUluZmluaXR5XSAtIFRoZSBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZWFzaW5nPSdlYXNlTGluZWFyJ10gLSBUaGUgYmVoYXZpb3VyJ3MgZGVjYXlpbmcgdHJlbmQsIGZvciBleGFtcGxlIGVhc2UuZWFzZU91dFF1YXJ0XG4gICAqL1xuICBjb25zdHJ1Y3RvcihsaWZlLCBlYXNpbmcpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYmVoYXZpb3VyJ3MgbGlmZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5saWZlID0gVXRpbC5pbml0VmFsdWUobGlmZSwgSW5maW5pdHkpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJlaGF2aW91cidzIGVhc2luZyBmdW5jdGlvblxuICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cbiAgICAgKi9cbiAgICB0aGlzLmVhc2luZyA9IGVhc2UuZ2V0RWFzaW5nKGVhc2luZyk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmVoYXZpb3VyJ3MgY3VycmVudCBhZ2VcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuYWdlID0gMDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiZWhhdmlvdXIncyBjdXJyZW50IGVuZXJneVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5lbmVyZ3kgPSAxO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgYmVoYXZpb3VyIGlzIGRlYWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLmRlYWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiZWhhdmlvdXIncyBwYXJlbnQgZW1pdHRlcnNcbiAgICAgKiBAdHlwZSB7QXJyYXl9XG4gICAgICovXG4gICAgdGhpcy5wYXJlbnRzID0gW107XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmVoYXZpb3VyJ3MgdW5pcXVlIGlkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLmlkID0gYEJlaGF2aW91cl8ke0JlaGF2aW91ci5pZCsrfWA7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmVoYXZpb3VyJ3MgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5uYW1lID0gXCJCZWhhdmlvdXJcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtsaWZlPUluZmluaXR5XSAtIFRoaXMgYmVoYXZpb3VyJ3MgbmV3IGxpZmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtlYXNpbmc9J2Vhc2VMaW5lYXInXSAtIFRoaXMgYmVoYXZpb3VyJ3MgbmV3IGVhc2luZ1xuICAgKi9cbiAgcmVzZXQobGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy5saWZlID0gVXRpbC5pbml0VmFsdWUobGlmZSwgSW5maW5pdHkpO1xuICAgIHRoaXMuZWFzaW5nID0gZWFzZS5nZXRFYXNpbmcoZWFzaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgYSBmb3JjZSBieSAxOjEwMFxuICAgKiBAcGFyYW0ge1Byb3Rvbi5WZWN0b3IyRH0gZm9yY2UgLSBUaGUgZm9yY2UgdG8gbm9ybWFsaXplXG4gICAqIEByZXR1cm5zIHtQcm90b24uVmVjdG9yMkR9IFRoZSBub3JtYWxpemVkIGZvcmNlXG4gICAqL1xuICBub3JtYWxpemVGb3JjZShmb3JjZSkge1xuICAgIHJldHVybiBmb3JjZS5tdWx0aXBseVNjYWxhcihQcm90b24uTUVBU1VSRSk7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplIGEgdmFsdWUgYnkgMToxMDBcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIG5vcm1hbGl6ZVxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbm9ybWFsaXplZCB2YWx1ZVxuICAgKi9cbiAgbm9ybWFsaXplVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgKiBQcm90b24uTUVBU1VSRTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzIGZvciBhIHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZSAtIFRoZSBwYXJ0aWNsZSB0byBpbml0aWFsaXplXG4gICAqL1xuICBpbml0aWFsaXplKHBhcnRpY2xlKSB7fVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIHRoZSBiZWhhdmlvdXIncyBsaWZlIGN5Y2xlXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZSAtIFRoZSBwYXJ0aWNsZSB0byBjYWxjdWxhdGUgZm9yXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gVGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBjYWxjdWxhdGUocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgdGhpcy5hZ2UgKz0gdGltZTtcblxuICAgIGlmICh0aGlzLmFnZSA+PSB0aGlzLmxpZmUgfHwgdGhpcy5kZWFkKSB7XG4gICAgICB0aGlzLmVuZXJneSA9IDA7XG4gICAgICB0aGlzLmRlYWQgPSB0cnVlO1xuICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy5lYXNpbmcocGFydGljbGUuYWdlIC8gcGFydGljbGUubGlmZSk7XG4gICAgICB0aGlzLmVuZXJneSA9IE1hdGgubWF4KDEgLSBzY2FsZSwgMCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoaXMgYmVoYXZpb3VyIHRvIGEgcGFydGljbGVcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlIC0gVGhlIHBhcnRpY2xlIHRvIGFwcGx5IHRoZSBiZWhhdmlvdXIgdG9cbiAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgLSBUaGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIGFwcGx5QmVoYXZpb3VyKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIHRoaXMuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBpbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveSB0aGlzIGJlaGF2aW91clxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBsZXQgaSA9IHRoaXMucGFyZW50cy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgdGhpcy5wYXJlbnRzW2ldLnJlbW92ZUJlaGF2aW91cih0aGlzKTtcbiAgICB9XG5cbiAgICB0aGlzLnBhcmVudHMubGVuZ3RoID0gMDtcbiAgfVxufVxuIiwiaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjJEXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGb3JjZSBleHRlbmRzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBQcm90b24uRm9yY2VcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGZ4XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBmeVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIEJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihmeCwgZnksIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZyk7XG5cbiAgICB0aGlzLmZvcmNlID0gdGhpcy5ub3JtYWxpemVGb3JjZShuZXcgVmVjdG9yMkQoZngsIGZ5KSk7XG4gICAgdGhpcy5uYW1lID0gXCJGb3JjZVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkZvcmNlXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gZnhcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGZ5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKi9cbiAgcmVzZXQoZngsIGZ5LCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLmZvcmNlID0gdGhpcy5ub3JtYWxpemVGb3JjZShuZXcgVmVjdG9yMkQoZngsIGZ5KSk7XG5cbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGhpcyBiZWhhdmlvdXIgZm9yIGFsbCBwYXJ0aWNsZXMgZXZlcnkgdGltZVxuICAgKlxuICAgKiBAbWV0aG9kIGFwcGx5QmVoYXZpb3VyXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkZvcmNlXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7SW50fSB0aGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIGFwcGx5QmVoYXZpb3VyKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIHRoaXMuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBpbmRleCk7XG4gICAgcGFydGljbGUuYS5hZGQodGhpcy5mb3JjZSk7XG4gIH1cbn1cbiIsImltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgVmVjdG9yMkQgZnJvbSBcIi4uL21hdGgvVmVjdG9yMkRcIjtcbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vQmVoYXZpb3VyXCI7XG5cbi8qKlxuICogQXR0cmFjdGlvbiBiZWhhdmlvciBmb3IgcGFydGljbGVzLlxuICogVGhpcyBiZWhhdmlvdXIgbWFrZXMgcGFydGljbGVzIGZvbGxvdyBhIHNwZWNpZmljIHRhcmdldCBwb3NpdGlvbi5cbiAqIEBleHRlbmRzIEJlaGF2aW91clxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBdHRyYWN0aW9uIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQXR0cmFjdGlvbi5cbiAgICogQHBhcmFtIHtWZWN0b3IyRH0gdGFyZ2V0UG9zaXRpb24gLSBUaGUgYXR0cmFjdGlvbiBwb2ludCBjb29yZGluYXRlcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtmb3JjZT0xMDBdIC0gVGhlIHN0cmVuZ3RoIG9mIHRoZSBhdHRyYWN0aW9uIGZvcmNlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1cz0xMDAwXSAtIFRoZSByYWRpdXMgb2YgaW5mbHVlbmNlIGZvciB0aGUgYXR0cmFjdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtsaWZlPUluZmluaXR5XSAtIFRoZSBsaWZlIHNwYW4gb2YgdGhpcyBiZWhhdmlvdXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZWFzaW5nPSdlYXNlLmVhc2VMaW5lYXInXSAtIFRoZSBlYXNpbmcgZnVuY3Rpb24gZm9yIHRoaXMgYmVoYXZpb3VyLlxuICAgKi9cbiAgY29uc3RydWN0b3IodGFyZ2V0UG9zaXRpb24sIGZvcmNlLCByYWRpdXMsIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZyk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGFyZ2V0IHBvc2l0aW9uIGZvciBhdHRyYWN0aW9uLlxuICAgICAqIEB0eXBlIHtWZWN0b3IyRH1cbiAgICAgKi9cbiAgICB0aGlzLnRhcmdldFBvc2l0aW9uID0gVXRpbC5pbml0VmFsdWUodGFyZ2V0UG9zaXRpb24sIG5ldyBWZWN0b3IyRCgpKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSByYWRpdXMgb2YgaW5mbHVlbmNlIGZvciB0aGUgYXR0cmFjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMucmFkaXVzID0gVXRpbC5pbml0VmFsdWUocmFkaXVzLCAxMDAwKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzdHJlbmd0aCBvZiB0aGUgYXR0cmFjdGlvbiBmb3JjZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuZm9yY2UgPSBVdGlsLmluaXRWYWx1ZSh0aGlzLm5vcm1hbGl6ZVZhbHVlKGZvcmNlKSwgMTAwKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzcXVhcmVkIHJhZGl1cyAoZm9yIG9wdGltaXphdGlvbikuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnJhZGl1c1NxID0gdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cztcblxuICAgIC8qKlxuICAgICAqIFRoZSBhdHRyYWN0aW9uIGZvcmNlIHZlY3Rvci5cbiAgICAgKiBAdHlwZSB7VmVjdG9yMkR9XG4gICAgICovXG4gICAgdGhpcy5hdHRyYWN0aW9uRm9yY2UgPSBuZXcgVmVjdG9yMkQoKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzcXVhcmVkIGxlbmd0aCBvZiB0aGUgYXR0cmFjdGlvbiBmb3JjZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMubGVuZ3RoU3EgPSAwO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJlaGF2aW91ci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMubmFtZSA9IFwiQXR0cmFjdGlvblwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgYmVoYXZpb3VyJ3MgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtWZWN0b3IyRH0gdGFyZ2V0UG9zaXRpb24gLSBUaGUgbmV3IGF0dHJhY3Rpb24gcG9pbnQgY29vcmRpbmF0ZXMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZm9yY2U9MTAwXSAtIFRoZSBuZXcgc3RyZW5ndGggb2YgdGhlIGF0dHJhY3Rpb24gZm9yY2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPTEwMDBdIC0gVGhlIG5ldyByYWRpdXMgb2YgaW5mbHVlbmNlIGZvciB0aGUgYXR0cmFjdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtsaWZlPUluZmluaXR5XSAtIFRoZSBuZXcgbGlmZSBzcGFuIG9mIHRoaXMgYmVoYXZpb3VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Vhc2luZz0nZWFzZS5lYXNlTGluZWFyJ10gLSBUaGUgbmV3IGVhc2luZyBmdW5jdGlvbiBmb3IgdGhpcyBiZWhhdmlvdXIuXG4gICAqL1xuICByZXNldCh0YXJnZXRQb3NpdGlvbiwgZm9yY2UsIHJhZGl1cywgbGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy50YXJnZXRQb3NpdGlvbiA9IFV0aWwuaW5pdFZhbHVlKHRhcmdldFBvc2l0aW9uLCBuZXcgVmVjdG9yMkQoKSk7XG4gICAgdGhpcy5yYWRpdXMgPSBVdGlsLmluaXRWYWx1ZShyYWRpdXMsIDEwMDApO1xuICAgIHRoaXMuZm9yY2UgPSBVdGlsLmluaXRWYWx1ZSh0aGlzLm5vcm1hbGl6ZVZhbHVlKGZvcmNlKSwgMTAwKTtcbiAgICB0aGlzLnJhZGl1c1NxID0gdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cztcbiAgICB0aGlzLmF0dHJhY3Rpb25Gb3JjZSA9IG5ldyBWZWN0b3IyRCgpO1xuICAgIHRoaXMubGVuZ3RoU3EgPSAwO1xuXG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhpcyBiZWhhdmlvdXIgdG8gYSBwYXJ0aWNsZS5cbiAgICogQHBhcmFtIHtQYXJ0aWNsZX0gcGFydGljbGUgLSBUaGUgcGFydGljbGUgdG8gYXBwbHkgdGhlIGJlaGF2aW91ciB0by5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgLSBUaGUgY3VycmVudCBzaW11bGF0aW9uIHRpbWUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgcGFydGljbGUuXG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuXG4gICAgdGhpcy5hdHRyYWN0aW9uRm9yY2UuY29weSh0aGlzLnRhcmdldFBvc2l0aW9uKTtcbiAgICB0aGlzLmF0dHJhY3Rpb25Gb3JjZS5zdWIocGFydGljbGUucCk7XG4gICAgdGhpcy5sZW5ndGhTcSA9IHRoaXMuYXR0cmFjdGlvbkZvcmNlLmxlbmd0aFNxKCk7XG5cbiAgICBpZiAodGhpcy5sZW5ndGhTcSA+IDAuMDAwMDQgJiYgdGhpcy5sZW5ndGhTcSA8IHRoaXMucmFkaXVzU3EpIHtcbiAgICAgIHRoaXMuYXR0cmFjdGlvbkZvcmNlLm5vcm1hbGl6ZSgpO1xuICAgICAgdGhpcy5hdHRyYWN0aW9uRm9yY2UubXVsdGlwbHlTY2FsYXIoMSAtIHRoaXMubGVuZ3RoU3EgLyB0aGlzLnJhZGl1c1NxKTtcbiAgICAgIHRoaXMuYXR0cmFjdGlvbkZvcmNlLm11bHRpcGx5U2NhbGFyKHRoaXMuZm9yY2UpO1xuXG4gICAgICBwYXJ0aWNsZS5hLmFkZCh0aGlzLmF0dHJhY3Rpb25Gb3JjZSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgVmVjdG9yMkQgZnJvbSBcIi4uL21hdGgvVmVjdG9yMkRcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuaW1wb3J0IEJlaGF2aW91ciBmcm9tIFwiLi9CZWhhdmlvdXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmFuZG9tRHJpZnQgZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBCZWhhdmlvdXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBSYW5kb21EcmlmdFxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gZHJpZnRYIFx0XHRcdFx0WCB2YWx1ZSBvZiB0aGUgbmV3IFZlY3RvcjJEXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkcmlmdFkgIFx0XHRcdFx0WSB2YWx1ZSBvZiB0aGUgbmV3IFZlY3RvcjJEXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWxheSBcdFx0XHRcdEhvdyBtdWNoIGRlbGF5IHRoZSBkcmlmdCBzaG91bGQgaGF2ZVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge051bWJlcn0gdGltZSBUaGUgdGltZSBvZiB0aGUgZHJpZnRcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIEJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihkcmlmdFgsIGRyaWZ0WSwgZGVsYXksIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZyk7XG5cbiAgICB0aGlzLnJlc2V0KGRyaWZ0WCwgZHJpZnRZLCBkZWxheSk7XG4gICAgdGhpcy50aW1lID0gMDtcbiAgICB0aGlzLm5hbWUgPSBcIlJhbmRvbURyaWZ0XCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNSYW5kb21EcmlmdFxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRyaWZ0WCBcdFx0XHRcdFggdmFsdWUgb2YgdGhlIG5ldyBWZWN0b3IyRFxuICAgKiBAcGFyYW0ge051bWJlcn0gZHJpZnRZICBcdFx0XHRcdFkgdmFsdWUgb2YgdGhlIG5ldyBWZWN0b3IyRFxuICAgKiBAcGFyYW0ge051bWJlcn0gZGVsYXkgXHRcdFx0XHRIb3cgbXVjaCBkZWxheSB0aGUgZHJpZnQgc2hvdWxkIGhhdmVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KGRyaWZ0WCwgZHJpZnRZLCBkZWxheSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy5wYW5Gb2NlID0gbmV3IFZlY3RvcjJEKGRyaWZ0WCwgZHJpZnRZKTtcbiAgICB0aGlzLnBhbkZvY2UgPSB0aGlzLm5vcm1hbGl6ZUZvcmNlKHRoaXMucGFuRm9jZSk7XG4gICAgdGhpcy5kZWxheSA9IGRlbGF5O1xuXG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLmRhdGEudGltZSA9IDA7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGhpcyBiZWhhdmlvdXIgZm9yIGFsbCBwYXJ0aWNsZXMgZXZlcnkgdGltZVxuICAgKlxuICAgKiBAbWV0aG9kIGFwcGx5QmVoYXZpb3VyXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUmFuZG9tRHJpZnRcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBcdFx0XHR0aW1lIHRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7SW50fSBcdFx0XHRpbmRleCB0aGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIGFwcGx5QmVoYXZpb3VyKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIHRoaXMuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBpbmRleCk7XG4gICAgcGFydGljbGUuZGF0YS50aW1lICs9IHRpbWU7XG5cbiAgICBpZiAocGFydGljbGUuZGF0YS50aW1lID49IHRoaXMuZGVsYXkpIHtcbiAgICAgIHBhcnRpY2xlLmEuYWRkWFkoXG4gICAgICAgIE1hdGhVdGlsLnJhbmRvbUFUb0IoLXRoaXMucGFuRm9jZS54LCB0aGlzLnBhbkZvY2UueCksXG4gICAgICAgIE1hdGhVdGlsLnJhbmRvbUFUb0IoLXRoaXMucGFuRm9jZS55LCB0aGlzLnBhbkZvY2UueSlcbiAgICAgICk7XG5cbiAgICAgIHBhcnRpY2xlLmRhdGEudGltZSA9IDA7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgRm9yY2UgZnJvbSBcIi4vRm9yY2VcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR3Jhdml0eSBleHRlbmRzIEZvcmNlIHtcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAYXVnbWVudHMgUHJvdG9uI1Byb3Rvbi5Gb3JjZVxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIFByb3Rvbi5HcmF2aXR5XG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBnIFx0XHRcdFx0XHRcdFx0R3Jhdml0eVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGcsIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKDAsIGcsIGxpZmUsIGVhc2luZyk7XG4gICAgdGhpcy5uYW1lID0gXCJHcmF2aXR5XCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uR3Jhdml0eVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGcgXHRcdFx0XHRcdFx0XHRHcmF2aXR5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChnLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlci5yZXNldCgwLCBnLCBsaWZlLCBlYXNpbmcpO1xuICB9XG59XG4iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjJEXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb2xsaXNpb24gZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogVGhlIGNhbGxiYWNrIGFmdGVyIGNvbGxpc2lvblxuICAgKlxuICAgKiBAY2FsbGJhY2sgQ2FsbGJhY2tcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcml0Y2xlfSBvdGhlclBhcnRpY2xlXG4gICAqL1xuICAvKipcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUHJvdG9uLkNvbGxpc2lvblxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gdG8gbWFzc1xuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5FbWl0dGVyfSBcdFtlbWl0dGVyPW51bGxdIFx0XHR0aGUgYXR0cmFjdGlvbiBwb2ludCBjb29yZGluYXRlc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFx0XHRbbWFzcz10cnVlXVxuICAgKiBAcGFyYW0ge0NhbGxiYWNrfVx0IFx0W2NhbGxiYWNrPW51bGxdXHRcdHRoZSBjYWxsYmFjayBhZnRlciB0aGUgY29sbGlzaW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IoZW1pdHRlciwgbWFzcywgY2FsbGJhY2ssIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZyk7XG4gICAgdGhpcy5yZXNldChlbWl0dGVyLCBtYXNzLCBjYWxsYmFjayk7XG4gICAgdGhpcy5uZXdQb29sID0gW107XG4gICAgdGhpcy5wb29sID0gW107XG4gICAgdGhpcy5uYW1lID0gXCJDb2xsaXNpb25cIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQ29sbGlzaW9uXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiB0byBtYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLkVtaXR0ZXJ9IFx0W2VtaXR0ZXI9bnVsbF0gXHRcdHRoZSBhdHRyYWN0aW9uIHBvaW50IGNvb3JkaW5hdGVzXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gXHRcdFttYXNzPXRydWVdXG4gICAqIEBwYXJhbSB7Q2FsbGJhY2t9XHQgXHRbY2FsbGJhY2s9bnVsbF1cdFx0dGhlIGNhbGxiYWNrIGFmdGVyIHRoZSBjb2xsaXNpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFx0XHRcdFtsaWZlPUluZmluaXR5XSBcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KGVtaXR0ZXIsIG1hc3MsIGNhbGxiYWNrLCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLmVtaXR0ZXIgPSBVdGlsLmluaXRWYWx1ZShlbWl0dGVyLCBudWxsKTtcbiAgICB0aGlzLm1hc3MgPSBVdGlsLmluaXRWYWx1ZShtYXNzLCB0cnVlKTtcbiAgICB0aGlzLmNhbGxiYWNrID0gVXRpbC5pbml0VmFsdWUoY2FsbGJhY2ssIG51bGwpO1xuXG4gICAgdGhpcy5jb2xsaXNpb25Qb29sID0gW107XG4gICAgdGhpcy5kZWx0YSA9IG5ldyBWZWN0b3IyRCgpO1xuXG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoaXMgYmVoYXZpb3VyIGZvciBhbGwgcGFydGljbGVzIGV2ZXJ5IHRpbWVcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQ29sbGlzaW9uXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gXHRcdFx0dGltZSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gXHRcdFx0aW5kZXggdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICBpZiAodGhpcy5lbWl0dGVyKSB7XG4gICAgICBVdGlsLnNsaWNlQXJyYXkodGhpcy5lbWl0dGVyLnBhcnRpY2xlcywgaW5kZXgsIHRoaXMubmV3UG9vbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFV0aWwuc2xpY2VBcnJheSh0aGlzLnBvb2wsIGluZGV4LCB0aGlzLm5ld1Bvb2wpO1xuICAgIH1cblxuICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMubmV3UG9vbC5sZW5ndGg7XG4gICAgbGV0IG90aGVyUGFydGljbGU7XG4gICAgbGV0IGxlbmd0aFNxO1xuICAgIGxldCBvdmVybGFwO1xuICAgIGxldCB0b3RhbE1hc3M7XG4gICAgbGV0IGF2ZXJhZ2VNYXNzMSwgYXZlcmFnZU1hc3MyO1xuICAgIGxldCBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBvdGhlclBhcnRpY2xlID0gdGhpcy5uZXdQb29sW2ldO1xuXG4gICAgICBpZiAob3RoZXJQYXJ0aWNsZSAhPT0gcGFydGljbGUpIHtcbiAgICAgICAgdGhpcy5kZWx0YS5jb3B5KG90aGVyUGFydGljbGUucCk7XG4gICAgICAgIHRoaXMuZGVsdGEuc3ViKHBhcnRpY2xlLnApO1xuXG4gICAgICAgIGxlbmd0aFNxID0gdGhpcy5kZWx0YS5sZW5ndGhTcSgpO1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IHBhcnRpY2xlLnJhZGl1cyArIG90aGVyUGFydGljbGUucmFkaXVzO1xuXG4gICAgICAgIGlmIChsZW5ndGhTcSA8PSBkaXN0YW5jZSAqIGRpc3RhbmNlKSB7XG4gICAgICAgICAgb3ZlcmxhcCA9IGRpc3RhbmNlIC0gTWF0aC5zcXJ0KGxlbmd0aFNxKTtcbiAgICAgICAgICBvdmVybGFwICs9IDAuNTtcblxuICAgICAgICAgIHRvdGFsTWFzcyA9IHBhcnRpY2xlLm1hc3MgKyBvdGhlclBhcnRpY2xlLm1hc3M7XG4gICAgICAgICAgYXZlcmFnZU1hc3MxID0gdGhpcy5tYXNzID8gb3RoZXJQYXJ0aWNsZS5tYXNzIC8gdG90YWxNYXNzIDogMC41O1xuICAgICAgICAgIGF2ZXJhZ2VNYXNzMiA9IHRoaXMubWFzcyA/IHBhcnRpY2xlLm1hc3MgLyB0b3RhbE1hc3MgOiAwLjU7XG5cbiAgICAgICAgICBwYXJ0aWNsZS5wLmFkZChcbiAgICAgICAgICAgIHRoaXMuZGVsdGFcbiAgICAgICAgICAgICAgLmNsb25lKClcbiAgICAgICAgICAgICAgLm5vcm1hbGl6ZSgpXG4gICAgICAgICAgICAgIC5tdWx0aXBseVNjYWxhcihvdmVybGFwICogLWF2ZXJhZ2VNYXNzMSlcbiAgICAgICAgICApO1xuICAgICAgICAgIG90aGVyUGFydGljbGUucC5hZGQodGhpcy5kZWx0YS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcihvdmVybGFwICogYXZlcmFnZU1hc3MyKSk7XG5cbiAgICAgICAgICB0aGlzLmNhbGxiYWNrICYmIHRoaXMuY2FsbGJhY2socGFydGljbGUsIG90aGVyUGFydGljbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IEJlaGF2aW91ciBmcm9tIFwiLi9CZWhhdmlvdXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3Jvc3Nab25lIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIERlZmluZXMgd2hhdCBoYXBwZW5zIGlmIHRoZSBwYXJ0aWNsZXMgY29tZSB0byB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgem9uZVxuICAgKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBQcm90b24uQ3Jvc3Nab25lXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlpvbmV9IHpvbmUgXHRcdFx0XHRcdFx0Y2FuIGJlIGFueSBQcm90b24uWm9uZSAtIGUuZy4gUHJvdG9uLlJlY3Rab25lKClcbiAgICogQHBhcmFtIHtTdHJpbmd9IFx0XHRbY3Jvc3NUeXBlPWRlYWRdIFx0XHRcdHdoYXQgaGFwcGVucyBpZiB0aGUgcGFydGljbGVzIHBhc3MgdGhlIHpvbmUgLSBhbGxvd2VkIHN0cmluZ3M6IGRlYWQgfCBib3VuZCB8IGNyb3NzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBcdFx0W2xpZmU9SW5maW5pdHldIFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gXHRcdFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3Ioem9uZSwgY3Jvc3NUeXBlLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcpO1xuXG4gICAgdGhpcy5yZXNldCh6b25lLCBjcm9zc1R5cGUpO1xuICAgIHRoaXMubmFtZSA9IFwiQ3Jvc3Nab25lXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQ3Jvc3Nab25lXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5ab25lfSB6b25lIFx0XHRcdFx0Y2FuIGJlIGFueSBQcm90b24uWm9uZSAtIGUuZy4gUHJvdG9uLlJlY3Rab25lKClcbiAgICogQHBhcmFtIHtTdHJpbmd9IFx0XHRbY3Jvc3NUeXBlPWRlYWRdIFx0d2hhdCBoYXBwZW5zIGlmIHRoZSBwYXJ0aWNsZXMgcGFzcyB0aGUgem9uZSAtIGFsbG93ZWQgc3RyaW5nczogZGVhZCB8IGJvdW5kIHwgY3Jvc3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFx0XHRbbGlmZT1JbmZpbml0eV0gXHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFx0XHRbZWFzaW5nPWVhc2VMaW5lYXJdXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKi9cbiAgcmVzZXQoem9uZSwgY3Jvc3NUeXBlLCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLnpvbmUgPSB6b25lO1xuICAgIHRoaXMuem9uZS5jcm9zc1R5cGUgPSBVdGlsLmluaXRWYWx1ZShjcm9zc1R5cGUsIFwiZGVhZFwiKTtcblxuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGlzIGJlaGF2aW91ciBmb3IgYWxsIHBhcnRpY2xlcyBldmVyeSB0aW1lXG4gICAqXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQ3Jvc3Nab25lXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7SW50fSB0aGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIGFwcGx5QmVoYXZpb3VyKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIHRoaXMuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBpbmRleCk7XG4gICAgdGhpcy56b25lLmNyb3NzaW5nKHBhcnRpY2xlKTtcbiAgfVxufVxuIiwiaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBTcGFuIGZyb20gXCIuLi9tYXRoL1NwYW5cIjtcbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vQmVoYXZpb3VyXCI7XG5cbi8qKlxuICogQWxwaGEgYmVoYXZpb3VyIGZvciBjb250cm9sbGluZyBwYXJ0aWNsZSBvcGFjaXR5IG92ZXIgdGltZS5cbiAqIEBleHRlbmRzIEJlaGF2aW91clxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBbHBoYSBleHRlbmRzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNhbWU7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTcGFufVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYTtcblxuICAvKipcbiAgICogQHR5cGUge1NwYW59XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBiO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgbmFtZTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBBbHBoYSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtudW1iZXJ8U3Bhbn0gW2E9MV0gLSBUaGUgaW5pdGlhbCBhbHBoYSB2YWx1ZSBvciByYW5nZS5cbiAgICogQHBhcmFtIHtudW1iZXJ8U3Bhbn0gW2JdIC0gVGhlIGZpbmFsIGFscGhhIHZhbHVlIG9yIHJhbmdlLiBJZiBub3QgcHJvdmlkZWQsIGl0IHdpbGwgYmUgdGhlIHNhbWUgYXMgJ2EnLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2xpZmU9SW5maW5pdHldIC0gVGhpcyBiZWhhdmlvdXIncyBsaWZlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Vhc2luZz0nZWFzZUxpbmVhciddIC0gVGhpcyBiZWhhdmlvdXIncyBlYXNpbmcgZnVuY3Rpb24uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhLCBiLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcpO1xuXG4gICAgdGhpcy5yZXNldChhLCBiKTtcbiAgICB0aGlzLm5hbWUgPSBcIkFscGhhXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtudW1iZXJ8U3Bhbn0gW2E9MV0gLSBUaGUgaW5pdGlhbCBhbHBoYSB2YWx1ZSBvciByYW5nZS5cbiAgICogQHBhcmFtIHtudW1iZXJ8U3Bhbn0gW2JdIC0gVGhlIGZpbmFsIGFscGhhIHZhbHVlIG9yIHJhbmdlLiBJZiBub3QgcHJvdmlkZWQsIGl0IHdpbGwgYmUgdGhlIHNhbWUgYXMgJ2EnLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2xpZmVdIC0gVGhpcyBiZWhhdmlvdXIncyBsaWZlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Vhc2luZ10gLSBUaGlzIGJlaGF2aW91cidzIGVhc2luZyBmdW5jdGlvbi5cbiAgICovXG4gIHJlc2V0KGEsIGIsIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMuc2FtZSA9IGIgPT09IG51bGwgfHwgYiA9PT0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYSA9IFNwYW4uc2V0U3BhblZhbHVlKFV0aWwuaW5pdFZhbHVlKGEsIDEpKTtcbiAgICB0aGlzLmIgPSBTcGFuLnNldFNwYW5WYWx1ZShiKTtcblxuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGFydGljbGUncyBhbHBoYSB2YWx1ZXMuXG4gICAqIEBwYXJhbSB7UGFydGljbGV9IHBhcnRpY2xlIC0gVGhlIHBhcnRpY2xlIHRvIGluaXRpYWxpemUuXG4gICAqL1xuICBpbml0aWFsaXplKHBhcnRpY2xlKSB7XG4gICAgcGFydGljbGUuZGF0YS5hbHBoYUEgPSB0aGlzLmEuZ2V0VmFsdWUoKTtcblxuICAgIGlmICh0aGlzLnNhbWUpIHBhcnRpY2xlLmRhdGEuYWxwaGFCID0gcGFydGljbGUuZGF0YS5hbHBoYUE7XG4gICAgZWxzZSBwYXJ0aWNsZS5kYXRhLmFscGhhQiA9IHRoaXMuYi5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIGFscGhhIGJlaGF2aW91ciB0byB0aGUgcGFydGljbGUuXG4gICAqIEBwYXJhbSB7UGFydGljbGV9IHBhcnRpY2xlIC0gVGhlIHBhcnRpY2xlIHRvIGFwcGx5IHRoZSBiZWhhdmlvdXIgdG8uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gVGhlIGN1cnJlbnQgc2ltdWxhdGlvbiB0aW1lLlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIHBhcnRpY2xlLlxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgdGhpcy5jYWxjdWxhdGUocGFydGljbGUsIHRpbWUsIGluZGV4KTtcblxuICAgIHBhcnRpY2xlLmFscGhhID0gcGFydGljbGUuZGF0YS5hbHBoYUIgKyAocGFydGljbGUuZGF0YS5hbHBoYUEgLSBwYXJ0aWNsZS5kYXRhLmFscGhhQikgKiB0aGlzLmVuZXJneTtcblxuICAgIGlmIChwYXJ0aWNsZS5hbHBoYSA8IDAuMDAxKSBwYXJ0aWNsZS5hbHBoYSA9IDA7XG4gIH1cbn1cbiIsImltcG9ydCBTcGFuIGZyb20gXCIuLi9tYXRoL1NwYW5cIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG4vKipcbiAqIFNjYWxlIGJlaGF2aW91ciBmb3IgY29udHJvbGxpbmcgcGFydGljbGUgc2l6ZSBvdmVyIHRpbWUuXG4gKiBAZXh0ZW5kcyBCZWhhdmlvdXJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2NhbGUgZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzYW1lO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgbmFtZTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBTY2FsZSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtudW1iZXJ8U3Bhbn0gW2E9MV0gLSBUaGUgaW5pdGlhbCBzY2FsZSB2YWx1ZSBvciByYW5nZS5cbiAgICogQHBhcmFtIHtudW1iZXJ8U3Bhbn0gW2JdIC0gVGhlIGZpbmFsIHNjYWxlIHZhbHVlIG9yIHJhbmdlLiBJZiBub3QgcHJvdmlkZWQsIGl0IHdpbGwgYmUgdGhlIHNhbWUgYXMgJ2EnLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2xpZmU9SW5maW5pdHldIC0gVGhpcyBiZWhhdmlvdXIncyBsaWZlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Vhc2luZz0nZWFzZUxpbmVhciddIC0gVGhpcyBiZWhhdmlvdXIncyBlYXNpbmcgZnVuY3Rpb24uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhLCBiLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcpO1xuXG4gICAgdGhpcy5yZXNldChhLCBiKTtcbiAgICB0aGlzLm5hbWUgPSBcIlNjYWxlXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtudW1iZXJ8U3Bhbn0gYSAtIFRoZSBpbml0aWFsIHNjYWxlIHZhbHVlIG9yIHJhbmdlLlxuICAgKiBAcGFyYW0ge251bWJlcnxTcGFufSBbYl0gLSBUaGUgZmluYWwgc2NhbGUgdmFsdWUgb3IgcmFuZ2UuIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBiZSB0aGUgc2FtZSBhcyAnYScuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGlmZV0gLSBUaGlzIGJlaGF2aW91cidzIGxpZmUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZWFzaW5nXSAtIFRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVzZXQoYSwgYiwgbGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy5zYW1lID0gYiA9PT0gbnVsbCB8fCBiID09PSB1bmRlZmluZWQ7XG4gICAgdGhpcy5hID0gU3Bhbi5zZXRTcGFuVmFsdWUoVXRpbC5pbml0VmFsdWUoYSwgMSkpO1xuICAgIHRoaXMuYiA9IFNwYW4uc2V0U3BhblZhbHVlKGIpO1xuXG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBwYXJ0aWNsZSdzIHNjYWxlIHZhbHVlcy5cbiAgICogQHBhcmFtIHtQYXJ0aWNsZX0gcGFydGljbGUgLSBUaGUgcGFydGljbGUgdG8gaW5pdGlhbGl6ZS5cbiAgICovXG4gIGluaXRpYWxpemUocGFydGljbGUpIHtcbiAgICBwYXJ0aWNsZS5kYXRhLnNjYWxlQSA9IHRoaXMuYS5nZXRWYWx1ZSgpO1xuICAgIHBhcnRpY2xlLmRhdGEub2xkUmFkaXVzID0gcGFydGljbGUucmFkaXVzO1xuICAgIHBhcnRpY2xlLmRhdGEuc2NhbGVCID0gdGhpcy5zYW1lID8gcGFydGljbGUuZGF0YS5zY2FsZUEgOiB0aGlzLmIuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSBzY2FsZSBiZWhhdmlvdXIgdG8gdGhlIHBhcnRpY2xlLlxuICAgKiBAcGFyYW0ge1BhcnRpY2xlfSBwYXJ0aWNsZSAtIFRoZSBwYXJ0aWNsZSB0byBhcHBseSB0aGUgYmVoYXZpb3VyIHRvLlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRoZSBjdXJyZW50IHNpbXVsYXRpb24gdGltZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBwYXJ0aWNsZS5cbiAgICovXG4gIGFwcGx5QmVoYXZpb3VyKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIHRoaXMuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBpbmRleCk7XG4gICAgcGFydGljbGUuc2NhbGUgPSBwYXJ0aWNsZS5kYXRhLnNjYWxlQiArIChwYXJ0aWNsZS5kYXRhLnNjYWxlQSAtIHBhcnRpY2xlLmRhdGEuc2NhbGVCKSAqIHRoaXMuZW5lcmd5O1xuXG4gICAgaWYgKHBhcnRpY2xlLnNjYWxlIDwgMC4wMDAxKSBwYXJ0aWNsZS5zY2FsZSA9IDA7XG4gICAgcGFydGljbGUucmFkaXVzID0gcGFydGljbGUuZGF0YS5vbGRSYWRpdXMgKiBwYXJ0aWNsZS5zY2FsZTtcbiAgfVxufVxuIiwiaW1wb3J0IFNwYW4gZnJvbSBcIi4uL21hdGgvU3BhblwiO1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vQmVoYXZpb3VyXCI7XG5cbi8qKlxuICogUm90YXRlIGJlaGF2aW91ciBmb3IgY29udHJvbGxpbmcgcGFydGljbGUgcm90YXRpb24uXG4gKiBAZXh0ZW5kcyBCZWhhdmlvdXJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm90YXRlIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2FtZTtcblxuICAvKipcbiAgICogQHR5cGUge1NwYW59XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBhO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7U3Bhbn1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGI7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzdHlsZTtcblxuICAvKipcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIG5hbWU7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgUm90YXRlIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8U3Bhbn0gW2luZmx1ZW5jZT0nVmVsb2NpdHknXSAtIFRoZSByb3RhdGlvbidzIGluZmx1ZW5jZSBvciBpbml0aWFsIHJvdGF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8U3Bhbn0gW2JdIC0gVGhlIGZpbmFsIHJvdGF0aW9uIHZhbHVlIG9yIHJhbmdlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0eWxlPSd0byddIC0gVGhlIHN0eWxlIG9mIHJvdGF0aW9uICgndG8nIG9yICdhZGQnKS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtsaWZlPUluZmluaXR5XSAtIFRoaXMgYmVoYXZpb3VyJ3MgbGlmZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtlYXNpbmc9J2Vhc2VMaW5lYXInXSAtIFRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nIGZ1bmN0aW9uLlxuICAgKi9cbiAgY29uc3RydWN0b3IoaW5mbHVlbmNlLCBiLCBzdHlsZSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcblxuICAgIHRoaXMucmVzZXQoaW5mbHVlbmNlLCBiLCBzdHlsZSk7XG4gICAgdGhpcy5uYW1lID0gXCJSb3RhdGVcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8U3Bhbn0gW2E9J1ZlbG9jaXR5J10gLSBUaGUgcm90YXRpb24ncyBpbmZsdWVuY2Ugb3IgaW5pdGlhbCByb3RhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfFNwYW59IFtiXSAtIFRoZSBmaW5hbCByb3RhdGlvbiB2YWx1ZSBvciByYW5nZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHlsZT0ndG8nXSAtIFRoZSBzdHlsZSBvZiByb3RhdGlvbiAoJ3RvJyBvciAnYWRkJykuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGlmZV0gLSBUaGlzIGJlaGF2aW91cidzIGxpZmUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZWFzaW5nXSAtIFRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVzZXQoYSwgYiwgc3R5bGUsIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMuc2FtZSA9IGIgPT09IG51bGwgfHwgYiA9PT0gdW5kZWZpbmVkO1xuXG4gICAgdGhpcy5hID0gU3Bhbi5zZXRTcGFuVmFsdWUoVXRpbC5pbml0VmFsdWUoYSwgXCJWZWxvY2l0eVwiKSk7XG4gICAgdGhpcy5iID0gU3Bhbi5zZXRTcGFuVmFsdWUoVXRpbC5pbml0VmFsdWUoYiwgMCkpO1xuICAgIHRoaXMuc3R5bGUgPSBVdGlsLmluaXRWYWx1ZShzdHlsZSwgXCJ0b1wiKTtcblxuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgYmVoYXZpb3VyJ3MgcGFyYW1ldGVycyBmb3IgYSBwYXJ0aWNsZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcnRpY2xlIC0gVGhlIHBhcnRpY2xlIHRvIGluaXRpYWxpemUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYXJ0aWNsZS5yb3RhdGlvbiAtIFRoZSBwYXJ0aWNsZSdzIHJvdGF0aW9uLlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGljbGUuZGF0YSAtIFRoZSBwYXJ0aWNsZSdzIGRhdGEgb2JqZWN0LlxuICAgKi9cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLnJvdGF0aW9uID0gdGhpcy5hLmdldFZhbHVlKCk7XG4gICAgcGFydGljbGUuZGF0YS5yb3RhdGlvbkEgPSB0aGlzLmEuZ2V0VmFsdWUoKTtcblxuICAgIGlmICghdGhpcy5zYW1lKSBwYXJ0aWNsZS5kYXRhLnJvdGF0aW9uQiA9IHRoaXMuYi5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhpcyBiZWhhdmlvdXIgdG8gYSBwYXJ0aWNsZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcnRpY2xlIC0gVGhlIHBhcnRpY2xlIHRvIGFwcGx5IHRoZSBiZWhhdmlvdXIgdG8uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gVGhlIGludGVncmF0ZSB0aW1lICgxL21zKS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIHBhcnRpY2xlIGluZGV4LlxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgdGhpcy5jYWxjdWxhdGUocGFydGljbGUsIHRpbWUsIGluZGV4KTtcblxuICAgIGlmICghdGhpcy5zYW1lKSB7XG4gICAgICBpZiAodGhpcy5zdHlsZSA9PT0gXCJ0b1wiIHx8IHRoaXMuc3R5bGUgPT09IFwiVE9cIiB8fCB0aGlzLnN0eWxlID09PSBcIl9cIikge1xuICAgICAgICBwYXJ0aWNsZS5yb3RhdGlvbiArPVxuICAgICAgICAgIHBhcnRpY2xlLmRhdGEucm90YXRpb25CICsgKHBhcnRpY2xlLmRhdGEucm90YXRpb25BIC0gcGFydGljbGUuZGF0YS5yb3RhdGlvbkIpICogdGhpcy5lbmVyZ3k7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0aWNsZS5yb3RhdGlvbiArPSBwYXJ0aWNsZS5kYXRhLnJvdGF0aW9uQjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuYS5hID09PSBcIlZcIiB8fCB0aGlzLmEuYSA9PT0gXCJWZWxvY2l0eVwiIHx8IHRoaXMuYS5hID09PSBcInZcIikge1xuICAgICAgLy8gYmV0YS4uLlxuICAgICAgcGFydGljbGUucm90YXRpb24gPSBwYXJ0aWNsZS5nZXREaXJlY3Rpb24oKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBDb2xvclV0aWwgZnJvbSBcIi4uL3V0aWxzL0NvbG9yVXRpbFwiO1xuaW1wb3J0IEFycmF5U3BhbiBmcm9tIFwiLi4vbWF0aC9BcnJheVNwYW5cIjtcbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vQmVoYXZpb3VyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbG9yIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAYXVnbWVudHMgUHJvdG9uLkJlaGF2aW91clxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIFByb3Rvbi5Db2xvclxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5BcnJheVNwYW4gfCBTdHJpbmd9IFthXSB0aGUgc3RyaW5nIHNob3VsZCBiZSBhIGhleCBlLmcuICMwMDAwMDAgZm9yIGJsYWNrXG4gICAqIEBwYXJhbSB7UHJvdG9uLkFycmF5U3BhbiB8IFN0cmluZ30gW2JdIHRoZSBzdHJpbmcgc2hvdWxkIGJlIGEgaGV4IGUuZy4gIzAwMDAwMCBmb3IgYmxhY2tcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IoYSwgYiwgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcblxuICAgIHRoaXMucmVzZXQoYSwgYik7XG4gICAgdGhpcy5uYW1lID0gXCJDb2xvclwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkNvbG9yXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5BcnJheVNwYW4gfCBTdHJpbmd9IGEgdGhlIHN0cmluZyBzaG91bGQgYmUgYSBoZXggZS5nLiAjMDAwMDAwIGZvciBibGFja1xuICAgKiBAcGFyYW0ge1Byb3Rvbi5BcnJheVNwYW4gfCBTdHJpbmd9IGIgdGhlIHN0cmluZyBzaG91bGQgYmUgYSBoZXggZS5nLiAjMDAwMDAwIGZvciBibGFja1xuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KGEsIGIsIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMuYSA9IEFycmF5U3Bhbi5jcmVhdGVBcnJheVNwYW4oYSk7XG4gICAgdGhpcy5iID0gQXJyYXlTcGFuLmNyZWF0ZUFycmF5U3BhbihiKTtcbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgYmVoYXZpb3VyJ3MgcGFyYW1ldGVycyBmb3IgYWxsIHBhcnRpY2xlc1xuICAgKlxuICAgKiBAbWV0aG9kIGluaXRpYWxpemVcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQ29sb3JcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKi9cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLmNvbG9yID0gdGhpcy5hLmdldFZhbHVlKCk7XG4gICAgcGFydGljbGUuZGF0YS5jb2xvckEgPSBDb2xvclV0aWwuaGV4VG9SZ2IocGFydGljbGUuY29sb3IpO1xuXG4gICAgaWYgKHRoaXMuYikgcGFydGljbGUuZGF0YS5jb2xvckIgPSBDb2xvclV0aWwuaGV4VG9SZ2IodGhpcy5iLmdldFZhbHVlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoaXMgYmVoYXZpb3VyIGZvciBhbGwgcGFydGljbGVzIGV2ZXJ5IHRpbWVcbiAgICpcbiAgICogQG1ldGhvZCBhcHBseUJlaGF2aW91clxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Db2xvclxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICBpZiAodGhpcy5iKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuXG4gICAgICBwYXJ0aWNsZS5yZ2IuciA9IHBhcnRpY2xlLmRhdGEuY29sb3JCLnIgKyAocGFydGljbGUuZGF0YS5jb2xvckEuciAtIHBhcnRpY2xlLmRhdGEuY29sb3JCLnIpICogdGhpcy5lbmVyZ3k7XG4gICAgICBwYXJ0aWNsZS5yZ2IuZyA9IHBhcnRpY2xlLmRhdGEuY29sb3JCLmcgKyAocGFydGljbGUuZGF0YS5jb2xvckEuZyAtIHBhcnRpY2xlLmRhdGEuY29sb3JCLmcpICogdGhpcy5lbmVyZ3k7XG4gICAgICBwYXJ0aWNsZS5yZ2IuYiA9IHBhcnRpY2xlLmRhdGEuY29sb3JCLmIgKyAocGFydGljbGUuZGF0YS5jb2xvckEuYiAtIHBhcnRpY2xlLmRhdGEuY29sb3JCLmIpICogdGhpcy5lbmVyZ3k7XG5cbiAgICAgIHBhcnRpY2xlLnJnYi5yID0gcGFydGljbGUucmdiLnIgPDwgMDtcbiAgICAgIHBhcnRpY2xlLnJnYi5nID0gcGFydGljbGUucmdiLmcgPDwgMDtcbiAgICAgIHBhcnRpY2xlLnJnYi5iID0gcGFydGljbGUucmdiLmIgPDwgMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFydGljbGUucmdiLnIgPSBwYXJ0aWNsZS5kYXRhLmNvbG9yQS5yO1xuICAgICAgcGFydGljbGUucmdiLmcgPSBwYXJ0aWNsZS5kYXRhLmNvbG9yQS5nO1xuICAgICAgcGFydGljbGUucmdiLmIgPSBwYXJ0aWNsZS5kYXRhLmNvbG9yQS5iO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuLi9tYXRoL01hdGhVdGlsXCI7XG5pbXBvcnQgVmVjdG9yMkQgZnJvbSBcIi4uL21hdGgvVmVjdG9yMkRcIjtcbmltcG9ydCBTcGFuIGZyb20gXCIuLi9tYXRoL1NwYW5cIjtcbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vQmVoYXZpb3VyXCI7XG5cbmNvbnN0IENIQU5HSU5HID0gXCJjaGFuZ2luZ1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDeWNsb25lIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAYXVnbWVudHMgUHJvdG9uLkJlaGF2aW91clxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIFByb3Rvbi5DeWNsb25lXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBhbmdsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gZm9yY2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IoYW5nbGUsIGZvcmNlLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcpO1xuICAgIHRoaXMuc2V0QW5nbGVBbmRGb3JjZShhbmdsZSwgZm9yY2UpO1xuICAgIHRoaXMubmFtZSA9IFwiQ3ljbG9uZVwiO1xuICB9XG5cbiAgc2V0QW5nbGVBbmRGb3JjZShhbmdsZSwgZm9yY2UpIHtcbiAgICB0aGlzLmZvcmNlID0gQ0hBTkdJTkc7XG4gICAgdGhpcy5hbmdsZSA9IE1hdGhVdGlsLlBJIC8gMjtcblxuICAgIGlmIChhbmdsZSA9PT0gXCJyaWdodFwiKSB7XG4gICAgICB0aGlzLmFuZ2xlID0gTWF0aFV0aWwuUEkgLyAyO1xuICAgIH0gZWxzZSBpZiAoYW5nbGUgPT09IFwibGVmdFwiKSB7XG4gICAgICB0aGlzLmFuZ2xlID0gLU1hdGhVdGlsLlBJIC8gMjtcbiAgICB9IGVsc2UgaWYgKGFuZ2xlID09PSBcInJhbmRvbVwiKSB7XG4gICAgICB0aGlzLmFuZ2xlID0gXCJyYW5kb21cIjtcbiAgICB9IGVsc2UgaWYgKGFuZ2xlIGluc3RhbmNlb2YgU3Bhbikge1xuICAgICAgdGhpcy5hbmdsZSA9IFwic3BhblwiO1xuICAgICAgdGhpcy5zcGFuID0gYW5nbGU7XG4gICAgfSBlbHNlIGlmIChhbmdsZSkge1xuICAgICAgdGhpcy5hbmdsZSA9IGFuZ2xlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIFN0cmluZyhmb3JjZSkudG9Mb3dlckNhc2UoKSA9PT0gXCJjaGFuZ2luZ1wiIHx8XG4gICAgICBTdHJpbmcoZm9yY2UpLnRvTG93ZXJDYXNlKCkgPT09IFwiY2hhbmdcIiB8fFxuICAgICAgU3RyaW5nKGZvcmNlKS50b0xvd2VyQ2FzZSgpID09PSBcImF1dG9cIlxuICAgICkge1xuICAgICAgdGhpcy5mb3JjZSA9IENIQU5HSU5HO1xuICAgIH0gZWxzZSBpZiAoZm9yY2UpIHtcbiAgICAgIHRoaXMuZm9yY2UgPSBmb3JjZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQ3ljbG9uZVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGFuZ2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBmb3JjZVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KGFuZ2xlLCBmb3JjZSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy5hbmdsZSA9IE1hdGhVdGlsLlBJIC8gMjtcbiAgICB0aGlzLnNldEFuZ2xlQW5kRm9yY2UoYW5nbGUsIGZvcmNlKTtcbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICBpbml0aWFsaXplKHBhcnRpY2xlKSB7XG4gICAgaWYgKHRoaXMuYW5nbGUgPT09IFwicmFuZG9tXCIpIHtcbiAgICAgIHBhcnRpY2xlLmRhdGEuY2FuZ2xlID0gTWF0aFV0aWwucmFuZG9tQVRvQigtTWF0aFV0aWwuUEksIE1hdGhVdGlsLlBJKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYW5nbGUgPT09IFwic3BhblwiKSB7XG4gICAgICBwYXJ0aWNsZS5kYXRhLmNhbmdsZSA9IHRoaXMuc3Bhbi5nZXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIHBhcnRpY2xlLmRhdGEuY3ljbG9uZSA9IG5ldyBWZWN0b3IyRCgwLCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGlzIGJlaGF2aW91ciBmb3IgYWxsIHBhcnRpY2xlcyBldmVyeSB0aW1lXG4gICAqXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQ3ljbG9uZVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuXG4gICAgbGV0IGxlbmd0aDtcbiAgICBsZXQgZ3JhZGllbnQgPSBwYXJ0aWNsZS52LmdldEdyYWRpZW50KCk7XG4gICAgaWYgKHRoaXMuYW5nbGUgPT09IFwicmFuZG9tXCIgfHwgdGhpcy5hbmdsZSA9PT0gXCJzcGFuXCIpIHtcbiAgICAgIGdyYWRpZW50ICs9IHBhcnRpY2xlLmRhdGEuY2FuZ2xlO1xuICAgIH0gZWxzZSB7XG4gICAgICBncmFkaWVudCArPSB0aGlzLmFuZ2xlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZvcmNlID09PSBDSEFOR0lORykge1xuICAgICAgbGVuZ3RoID0gcGFydGljbGUudi5sZW5ndGgoKSAvIDEwMDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGVuZ3RoID0gdGhpcy5mb3JjZTtcbiAgICB9XG5cbiAgICBwYXJ0aWNsZS5kYXRhLmN5Y2xvbmUueCA9IGxlbmd0aCAqIE1hdGguY29zKGdyYWRpZW50KTtcbiAgICBwYXJ0aWNsZS5kYXRhLmN5Y2xvbmUueSA9IGxlbmd0aCAqIE1hdGguc2luKGdyYWRpZW50KTtcbiAgICBwYXJ0aWNsZS5kYXRhLmN5Y2xvbmUgPSB0aGlzLm5vcm1hbGl6ZUZvcmNlKHBhcnRpY2xlLmRhdGEuY3ljbG9uZSk7XG4gICAgcGFydGljbGUuYS5hZGQocGFydGljbGUuZGF0YS5jeWNsb25lKTtcbiAgfVxufVxuIiwiaW1wb3J0IEF0dHJhY3Rpb24gZnJvbSBcIi4vQXR0cmFjdGlvblwiO1xuXG4vKipcbiAqIFRoZSBvcHBvc2l0ZSBvZiBBdHRyYWN0aW9uIC0gdHVybnMgdGhlIGZvcmNlXG4gKlxuICogQGNsYXNzXG4gKiBAZXh0ZW5kcyBQcm90b24uQXR0cmFjdGlvblxuICogQG1lbWJlcm9mISBQcm90b24jXG4gKiBAYWxpYXMgUHJvdG9uLlJlcHVsc2lvblxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXB1bHNpb24gZXh0ZW5kcyBBdHRyYWN0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgUmVwdWxzaW9uIGJlaGF2aW91ciBpbnN0YW5jZVxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtQcm90b24uVmVjdG9yMkR9IHRhcmdldFBvc2l0aW9uIC0gVGhlIHJlcHVsc2lvbiBwb2ludCBjb29yZGluYXRlc1xuICAgKiBAcGFyYW0ge251bWJlcn0gW2ZvcmNlPTEwMF0gLSBUaGUgc3RyZW5ndGggb2YgdGhlIHJlcHVsc2lvbiBmb3JjZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1cz0xMDAwXSAtIFRoZSByYWRpdXMgb2YgaW5mbHVlbmNlIGZvciB0aGUgcmVwdWxzaW9uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gLSBUaGUgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Vhc2luZz0nZWFzZUxpbmVhciddIC0gVGhlIGJlaGF2aW91cidzIGVhc2luZyBmdW5jdGlvblxuICAgKi9cbiAgY29uc3RydWN0b3IodGFyZ2V0UG9zaXRpb24sIGZvcmNlLCByYWRpdXMsIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKHRhcmdldFBvc2l0aW9uLCBmb3JjZSwgcmFkaXVzLCBsaWZlLCBlYXNpbmcpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVuZ3RoIG9mIHRoZSByZXB1bHNpb24gZm9yY2VcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuZm9yY2UgKj0gLTE7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmVoYXZpb3VyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLm5hbWUgPSBcIlJlcHVsc2lvblwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5WZWN0b3IyRH0gdGFyZ2V0UG9zaXRpb24gLSBUaGUgbmV3IHJlcHVsc2lvbiBwb2ludCBjb29yZGluYXRlc1xuICAgKiBAcGFyYW0ge251bWJlcn0gW2ZvcmNlPTEwMF0gLSBUaGUgbmV3IHN0cmVuZ3RoIG9mIHRoZSByZXB1bHNpb24gZm9yY2VcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MTAwMF0gLSBUaGUgbmV3IHJhZGl1cyBvZiBpbmZsdWVuY2UgZm9yIHRoZSByZXB1bHNpb25cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtsaWZlPUluZmluaXR5XSAtIFRoZSBuZXcgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Vhc2luZz0nZWFzZUxpbmVhciddIC0gVGhlIG5ldyBiZWhhdmlvdXIncyBlYXNpbmcgZnVuY3Rpb25cbiAgICovXG4gIHJlc2V0KHRhcmdldFBvc2l0aW9uLCBmb3JjZSwgcmFkaXVzLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlci5yZXNldCh0YXJnZXRQb3NpdGlvbiwgZm9yY2UsIHJhZGl1cywgbGlmZSwgZWFzaW5nKTtcbiAgICB0aGlzLmZvcmNlICo9IC0xO1xuICB9XG59XG4iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjJEXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHcmF2aXR5V2VsbCBleHRlbmRzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIEJlaGF2aW91clxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIEdyYXZpdHlXZWxsXG4gICAqXG4gICAqIEBwYXJhbSB7VmVjdG9yMkR9IFtjZW50ZXJQb2ludD1uZXcgVmVjdG9yMkRdIFRoZSBwb2ludCBpbiB0aGUgY2VudGVyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbZm9yY2U9MTAwXVx0XHRcdFx0XHRUaGUgZm9yY2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XVx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2VMaW5lYXJdXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNlbnRlclBvaW50LCBmb3JjZSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcblxuICAgIHRoaXMuZGlzdGFuY2VWZWMgPSBuZXcgVmVjdG9yMkQoKTtcbiAgICB0aGlzLmNlbnRlclBvaW50ID0gVXRpbC5pbml0VmFsdWUoY2VudGVyUG9pbnQsIG5ldyBWZWN0b3IyRCgpKTtcbiAgICB0aGlzLmZvcmNlID0gVXRpbC5pbml0VmFsdWUodGhpcy5ub3JtYWxpemVWYWx1ZShmb3JjZSksIDEwMCk7XG5cbiAgICB0aGlzLm5hbWUgPSBcIkdyYXZpdHlXZWxsXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNHcmF2aXR5V2VsbFxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtWZWN0b3IyRH0gW2NlbnRlclBvaW50PW5ldyBWZWN0b3IyRF0gVGhlIHBvaW50IGluIHRoZSBjZW50ZXJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtmb3JjZT0xMDBdXHRcdFx0XHRcdFRoZSBmb3JjZVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZUxpbmVhcl1cdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChjZW50ZXJQb2ludCwgZm9yY2UsIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMuZGlzdGFuY2VWZWMgPSBuZXcgVmVjdG9yMkQoKTtcbiAgICB0aGlzLmNlbnRlclBvaW50ID0gVXRpbC5pbml0VmFsdWUoY2VudGVyUG9pbnQsIG5ldyBWZWN0b3IyRCgpKTtcbiAgICB0aGlzLmZvcmNlID0gVXRpbC5pbml0VmFsdWUodGhpcy5ub3JtYWxpemVWYWx1ZShmb3JjZSksIDEwMCk7XG5cbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGluaXRpYWxpemUocGFydGljbGUpIHt9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoaXMgYmVoYXZpb3VyIGZvciBhbGwgcGFydGljbGVzIGV2ZXJ5IHRpbWVcbiAgICpcbiAgICogQG1ldGhvZCBhcHBseUJlaGF2aW91clxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI0dyYXZpdHlXZWxsXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gdGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtJbnR9IHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgdGhpcy5kaXN0YW5jZVZlYy5zZXQodGhpcy5jZW50ZXJQb2ludC54IC0gcGFydGljbGUucC54LCB0aGlzLmNlbnRlclBvaW50LnkgLSBwYXJ0aWNsZS5wLnkpO1xuICAgIGNvbnN0IGRpc3RhbmNlU3EgPSB0aGlzLmRpc3RhbmNlVmVjLmxlbmd0aFNxKCk7XG5cbiAgICBpZiAoZGlzdGFuY2VTcSAhPT0gMCkge1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSB0aGlzLmRpc3RhbmNlVmVjLmxlbmd0aCgpO1xuICAgICAgY29uc3QgZmFjdG9yID0gKHRoaXMuZm9yY2UgKiB0aW1lKSAvIChkaXN0YW5jZVNxICogZGlzdGFuY2UpO1xuXG4gICAgICBwYXJ0aWNsZS52LnggKz0gZmFjdG9yICogdGhpcy5kaXN0YW5jZVZlYy54O1xuICAgICAgcGFydGljbGUudi55ICs9IGZhY3RvciAqIHRoaXMuZGlzdGFuY2VWZWMueTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBQcm9wVXRpbCBmcm9tIFwiLi4vdXRpbHMvUHJvcFV0aWxcIjtcbmltcG9ydCBJbml0aWFsaXplIGZyb20gXCIuL0luaXRpYWxpemVcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXRpYWxpemUoZW1pdHRlciwgcGFydGljbGUsIGluaXRpYWxpemVzKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gaW5pdGlhbGl6ZXMubGVuZ3RoO1xuICAgIGxldCBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaW5pdGlhbGl6ZXNbaV0gaW5zdGFuY2VvZiBJbml0aWFsaXplKSB7XG4gICAgICAgIGluaXRpYWxpemVzW2ldLmluaXQoZW1pdHRlciwgcGFydGljbGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbml0KGVtaXR0ZXIsIHBhcnRpY2xlLCBpbml0aWFsaXplc1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5iaW5kRW1pdHRlcihlbWl0dGVyLCBwYXJ0aWNsZSk7XG4gIH0sXG5cbiAgLy8gaW5pdFxuICBpbml0KGVtaXR0ZXIsIHBhcnRpY2xlLCBpbml0aWFsaXplKSB7XG4gICAgUHJvcFV0aWwuc2V0UHJvcChwYXJ0aWNsZSwgaW5pdGlhbGl6ZSk7XG4gICAgUHJvcFV0aWwuc2V0VmVjdG9yVmFsKHBhcnRpY2xlLCBpbml0aWFsaXplKTtcbiAgfSxcblxuICBiaW5kRW1pdHRlcihlbWl0dGVyLCBwYXJ0aWNsZSkge1xuICAgIGlmIChlbWl0dGVyLmJpbmRFbWl0dGVyKSB7XG4gICAgICBwYXJ0aWNsZS5wLmFkZChlbWl0dGVyLnApO1xuICAgICAgcGFydGljbGUudi5hZGQoZW1pdHRlci52KTtcbiAgICAgIHBhcnRpY2xlLmEuYWRkKGVtaXR0ZXIuYSk7XG4gICAgICBwYXJ0aWNsZS52LnJvdGF0ZShNYXRoVXRpbC5kZWdyZWVUcmFuc2Zvcm0oZW1pdHRlci5yb3RhdGlvbikpO1xuICAgIH1cbiAgfVxufTtcbiIsImltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgUHVpZCBmcm9tIFwiLi4vdXRpbHMvUHVpZFwiO1xuaW1wb3J0IFBhcnRpY2xlIGZyb20gXCIuLi9jb3JlL1BhcnRpY2xlXCI7XG5pbXBvcnQgRXZlbnREaXNwYXRjaGVyIGZyb20gXCIuLi9ldmVudHMvRXZlbnREaXNwYXRjaGVyXCI7XG5cbmltcG9ydCBSYXRlIGZyb20gXCIuLi9pbml0aWFsaXplL1JhdGVcIjtcbmltcG9ydCBJbml0aWFsaXplVXRpbCBmcm9tIFwiLi4vaW5pdGlhbGl6ZS9Jbml0aWFsaXplVXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbWl0dGVyIGV4dGVuZHMgUGFydGljbGUge1xuICAvKipcbiAgICogWW91IGNhbiB1c2UgdGhpcyBlbWl0IHBhcnRpY2xlcy5cbiAgICpcbiAgICogSXQgd2lsbCBkaXNwYXRjaCBmb2xsb3cgZXZlbnRzOlxuICAgKiBQQVJUSUNMRV9DUkVBVEVEXG4gICAqIFBBUlRJQ0xFX1VQREFUQVxuICAgKiBQQVJUSUNMRV9ERUFEXG4gICAqXG4gICAqIEBjbGFzcyBFbWl0dGVyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge09iamVjdH0gY29uZiB0aGUgcGFyYW1ldGVycyBvYmplY3Q7XG4gICAqIGZvciBleGFtcGxlIHtkYW1waW5nOjAuMDEsYmluZEVtaXR0ZXI6ZmFsc2V9XG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25mID0ge30pIHtcbiAgICBzdXBlcihjb25mKTtcblxuICAgIHRoaXMucGFydGljbGVzID0gW107XG4gICAgdGhpcy5iZWhhdmlvdXJzID0gW107XG4gICAgdGhpcy5pbml0aWFsaXplcyA9IFtdO1xuXG4gICAgdGhpcy5lbWl0VGltZSA9IDA7XG4gICAgdGhpcy5lbWl0U3BlZWQgPSAwO1xuICAgIHRoaXMudG90YWxUaW1lID0gLTE7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnJpY3Rpb24gY29lZmZpY2llbnQgZm9yIGFsbCBwYXJ0aWNsZSBlbWl0IGJ5IFRoaXM7XG4gICAgICogQHByb3BlcnR5IGRhbXBpbmdcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAqIEBkZWZhdWx0IDAuMDA2XG4gICAgICovXG4gICAgdGhpcy5kYW1waW5nID0gMC4wMDY7XG5cbiAgICAvKipcbiAgICAgKiBJZiBiaW5kRW1pdHRlciB0aGUgcGFydGljbGVzIGNhbiBiaW5kIHRoaXMgZW1pdHRlcidzIHByb3BlcnR5O1xuICAgICAqIEBwcm9wZXJ0eSBiaW5kRW1pdHRlclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKi9cbiAgICB0aGlzLmJpbmRFbWl0dGVyID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcGFydGljbGVzIHBlciBzZWNvbmQgZW1pdCAoYSBbcGFydGljbGVdL2IgW3NdKTtcbiAgICAgKiBAcHJvcGVydHkgcmF0ZVxuICAgICAqIEB0eXBlIHtSYXRlfVxuICAgICAqIEBkZWZhdWx0IFJhdGUoMSwgLjEpXG4gICAgICovXG4gICAgdGhpcy5yYXRlID0gbmV3IFJhdGUoMSwgMC4xKTtcblxuICAgIHRoaXMubmFtZSA9IFwiRW1pdHRlclwiO1xuICAgIHRoaXMuaWQgPSBQdWlkLmlkKHRoaXMubmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogc3RhcnQgZW1pdCBwYXJ0aWNsZVxuICAgKiBAbWV0aG9kIGVtaXRcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IFt0b3RhbFRpbWVdIGJlZ2luIGVtaXQgdGltZTtcbiAgICogQHBhcmFtIHtTdHJpbmcgfCBib29sZWFufSBbbGlmZV0gdGhlIGxpZmUgb2YgdGhpcyBlbWl0dGVyXG4gICAqL1xuICBlbWl0KHRvdGFsVGltZSwgbGlmZSkge1xuICAgIHRoaXMuc3RvcGVkID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0VGltZSA9IDA7XG4gICAgdGhpcy50b3RhbFRpbWUgPSBVdGlsLmluaXRWYWx1ZSh0b3RhbFRpbWUsIEluZmluaXR5KTtcblxuICAgIGlmIChsaWZlID09PSB0cnVlIHx8IGxpZmUgPT09IFwibGlmZVwiIHx8IGxpZmUgPT09IFwiZGVzdHJveVwiKSB7XG4gICAgICB0aGlzLmxpZmUgPSB0b3RhbFRpbWUgPT09IFwib25jZVwiID8gMSA6IHRoaXMudG90YWxUaW1lO1xuICAgIH0gZWxzZSBpZiAoIWlzTmFOKGxpZmUpKSB7XG4gICAgICB0aGlzLmxpZmUgPSBsaWZlO1xuICAgIH1cbiAgICB0aGlzLnJhdGUuaW5pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHN0b3AgZW1pdGluZ1xuICAgKiBAbWV0aG9kIHN0b3BcbiAgICovXG4gIHN0b3AoKSB7XG4gICAgdGhpcy50b3RhbFRpbWUgPSAtMTtcbiAgICB0aGlzLmVtaXRUaW1lID0gMDtcbiAgICB0aGlzLnN0b3BlZCA9IHRydWU7XG4gIH1cblxuICBwcmVFbWl0KHRpbWUpIHtcbiAgICBsZXQgb2xkU3RvcGVkID0gdGhpcy5zdG9wZWQ7XG4gICAgbGV0IG9sZEVtaXRUaW1lID0gdGhpcy5lbWl0VGltZTtcbiAgICBsZXQgb2xkVG90YWxUaW1lID0gdGhpcy50b3RhbFRpbWU7XG5cbiAgICB0aGlzLnN0b3BlZCA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdFRpbWUgPSAwO1xuICAgIHRoaXMudG90YWxUaW1lID0gdGltZTtcbiAgICB0aGlzLnJhdGUuaW5pdCgpO1xuXG4gICAgY29uc3Qgc3RlcCA9IDAuMDE2NztcbiAgICB3aGlsZSAodGltZSA+IHN0ZXApIHtcbiAgICAgIHRpbWUgLT0gc3RlcDtcbiAgICAgIHRoaXMudXBkYXRlKHN0ZXApO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcGVkID0gb2xkU3RvcGVkO1xuICAgIHRoaXMuZW1pdFRpbWUgPSBvbGRFbWl0VGltZSArIE1hdGgubWF4KHRpbWUsIDApO1xuICAgIHRoaXMudG90YWxUaW1lID0gb2xkVG90YWxUaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZSBjdXJyZW50IGFsbCBwYXJ0aWNsZXNcbiAgICogQG1ldGhvZCByZW1vdmVBbGxQYXJ0aWNsZXNcbiAgICovXG4gIHJlbW92ZUFsbFBhcnRpY2xlcygpIHtcbiAgICBsZXQgaSA9IHRoaXMucGFydGljbGVzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB0aGlzLnBhcnRpY2xlc1tpXS5kZWFkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhZGQgaW5pdGlhbGl6ZSB0byB0aGlzIGVtaXR0ZXJcbiAgICogQG1ldGhvZCBhZGRTZWxmSW5pdGlhbGl6ZVxuICAgKi9cbiAgYWRkU2VsZkluaXRpYWxpemUoaW5pdGlhbGl6ZSkge1xuICAgIGlmIChpbml0aWFsaXplW1wiaW5pdFwiXSkge1xuICAgICAgaW5pdGlhbGl6ZS5pbml0KHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGlzLmluaXRBbGwoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYWRkIHRoZSBJbml0aWFsaXplIHRvIHBhcnRpY2xlcztcbiAgICpcbiAgICogeW91IGNhbiB1c2UgaW5pdGlhbGl6ZXMgYXJyYXk6Zm9yIGV4YW1wbGUgZW1pdHRlci5hZGRJbml0aWFsaXplKGluaXRpYWxpemUxLGluaXRpYWxpemUyLGluaXRpYWxpemUzKTtcbiAgICogQG1ldGhvZCBhZGRJbml0aWFsaXplXG4gICAqIEBwYXJhbSB7SW5pdGlhbGl6ZX0gaW5pdGlhbGl6ZSBsaWtlIHRoaXMgbmV3IFJhZGl1cygxLCAxMilcbiAgICovXG4gIGFkZEluaXRpYWxpemUoLi4ucmVzdCkge1xuICAgIGxldCBpID0gcmVzdC5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkgdGhpcy5pbml0aWFsaXplcy5wdXNoKHJlc3RbaV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZSB0aGUgSW5pdGlhbGl6ZVxuICAgKiBAbWV0aG9kIHJlbW92ZUluaXRpYWxpemVcbiAgICogQHBhcmFtIHtJbml0aWFsaXplfSBpbml0aWFsaXplIGEgaW5pdGlhbGl6ZVxuICAgKi9cbiAgcmVtb3ZlSW5pdGlhbGl6ZShpbml0aWFsaXplcikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbml0aWFsaXplcy5pbmRleE9mKGluaXRpYWxpemVyKTtcbiAgICBpZiAoaW5kZXggPiAtMSkgdGhpcy5pbml0aWFsaXplcy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZSBhbGwgSW5pdGlhbGl6ZXNcbiAgICogQG1ldGhvZCByZW1vdmVJbml0aWFsaXplcnNcbiAgICovXG4gIHJlbW92ZUFsbEluaXRpYWxpemVycygpIHtcbiAgICBVdGlsLmVtcHR5QXJyYXkodGhpcy5pbml0aWFsaXplcyk7XG4gIH1cblxuICAvKipcbiAgICogYWRkIHRoZSBCZWhhdmlvdXIgdG8gcGFydGljbGVzO1xuICAgKlxuICAgKiB5b3UgY2FuIHVzZSBCZWhhdmlvdXJzIGFycmF5OmVtaXR0ZXIuYWRkQmVoYXZpb3VyKEJlaGF2aW91cjEsQmVoYXZpb3VyMixCZWhhdmlvdXIzKTtcbiAgICogQG1ldGhvZCBhZGRCZWhhdmlvdXJcbiAgICogQHBhcmFtIHtCZWhhdmlvdXJ9IGJlaGF2aW91ciBsaWtlIHRoaXMgbmV3IENvbG9yKCdyYW5kb20nKVxuICAgKi9cbiAgYWRkQmVoYXZpb3VyKC4uLnJlc3QpIHtcbiAgICBsZXQgaSA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgbGV0IGJlaGF2aW91ciA9IHJlc3RbaV07XG4gICAgICB0aGlzLmJlaGF2aW91cnMucHVzaChiZWhhdmlvdXIpO1xuICAgICAgaWYgKGJlaGF2aW91ci5wYXJlbnRzKSBiZWhhdmlvdXIucGFyZW50cy5wdXNoKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmUgdGhlIEJlaGF2aW91clxuICAgKiBAbWV0aG9kIHJlbW92ZUJlaGF2aW91clxuICAgKiBAcGFyYW0ge0JlaGF2aW91cn0gYmVoYXZpb3VyIGEgYmVoYXZpb3VyXG4gICAqL1xuICByZW1vdmVCZWhhdmlvdXIoYmVoYXZpb3VyKSB7XG4gICAgbGV0IGluZGV4ID0gdGhpcy5iZWhhdmlvdXJzLmluZGV4T2YoYmVoYXZpb3VyKTtcbiAgICB0aGlzLmJlaGF2aW91cnMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIGlmIChiZWhhdmlvdXIucGFyZW50cykge1xuICAgICAgaW5kZXggPSBiZWhhdmlvdXIucGFyZW50cy5pbmRleE9mKGJlaGF2aW91cik7XG4gICAgICBiZWhhdmlvdXIucGFyZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmUgYWxsIGJlaGF2aW91cnNcbiAgICogQG1ldGhvZCByZW1vdmVBbGxCZWhhdmlvdXJzXG4gICAqL1xuICByZW1vdmVBbGxCZWhhdmlvdXJzKCkge1xuICAgIFV0aWwuZW1wdHlBcnJheSh0aGlzLmJlaGF2aW91cnMpO1xuICB9XG5cbiAgLy8gZW1pdHRlciB1cGRhdGVcbiAgdXBkYXRlKHRpbWUpIHtcbiAgICB0aGlzLmFnZSArPSB0aW1lO1xuICAgIGlmICh0aGlzLmFnZSA+PSB0aGlzLmxpZmUgfHwgdGhpcy5kZWFkKSB0aGlzLmRlc3Ryb3koKTtcblxuICAgIHRoaXMuZW1pdHRpbmcodGltZSk7XG4gICAgdGhpcy5pbnRlZ3JhdGUodGltZSk7XG4gIH1cblxuICBpbnRlZ3JhdGUodGltZSkge1xuICAgIGlmICghdGhpcy5wYXJlbnQpIHJldHVybjtcblxuICAgIGNvbnN0IGRhbXBpbmcgPSAxIC0gdGhpcy5kYW1waW5nO1xuICAgIHRoaXMucGFyZW50LmludGVncmF0b3IuY2FsY3VsYXRlKHRoaXMsIHRpbWUsIGRhbXBpbmcpO1xuXG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy5wYXJ0aWNsZXMubGVuZ3RoO1xuICAgIGxldCBpLCBwYXJ0aWNsZTtcblxuICAgIGZvciAoaSA9IGxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBwYXJ0aWNsZSA9IHRoaXMucGFydGljbGVzW2ldO1xuXG4gICAgICAvLyBwYXJ0aWNsZSB1cGRhdGVcbiAgICAgIHBhcnRpY2xlLnVwZGF0ZSh0aW1lLCBpKTtcbiAgICAgIHRoaXMucGFyZW50LmludGVncmF0b3IuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBkYW1waW5nKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2goXCJQQVJUSUNMRV9VUERBVEVcIiwgcGFydGljbGUpO1xuXG4gICAgICAvLyBjaGVjayBkZWFkXG4gICAgICBpZiAocGFydGljbGUuZGVhZCkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoKFwiUEFSVElDTEVfREVBRFwiLCBwYXJ0aWNsZSk7XG5cbiAgICAgICAgdGhpcy5wYXJlbnQucG9vbC5leHBpcmUocGFydGljbGUpO1xuICAgICAgICB0aGlzLnBhcnRpY2xlcy5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGlzcGF0Y2goZXZlbnQsIHRhcmdldCkge1xuICAgIHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQsIHRhcmdldCk7XG4gICAgdGhpcy5iaW5kRXZlbnQgJiYgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50LCB0YXJnZXQpO1xuICB9XG5cbiAgZW1pdHRpbmcodGltZSkge1xuICAgIGlmICh0aGlzLnN0b3BlZCkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMudG90YWxUaW1lID09PSBcIm5vbmVcIikge1xuICAgICAgdGhpcy5lbWl0VGltZSArPSB0aW1lO1xuICAgIH0gZWxzZSBpZiAodGhpcy50b3RhbFRpbWUgPT09IFwib25jZVwiKSB7XG4gICAgICBsZXQgaTtcbiAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMucmF0ZS5nZXRWYWx1ZSg5OTk5OSk7XG5cbiAgICAgIGlmIChsZW5ndGggPiAwKSB0aGlzLmVtaXRTcGVlZCA9IGxlbmd0aDtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgdGhpcy5jcmVhdGVQYXJ0aWNsZSgpO1xuICAgICAgdGhpcy50b3RhbFRpbWUgPSBcIm5vbmVcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0VGltZSArPSB0aW1lO1xuXG4gICAgICBpZiAodGhpcy5lbWl0VGltZSA8IHRoaXMudG90YWxUaW1lKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMucmF0ZS5nZXRWYWx1ZSh0aW1lKTtcbiAgICAgICAgbGV0IGk7XG5cbiAgICAgICAgaWYgKGxlbmd0aCA+IDApIHRoaXMuZW1pdFNwZWVkID0gbGVuZ3RoO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHRoaXMuY3JlYXRlUGFydGljbGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlIHNpbmdsZSBwYXJ0aWNsZTtcbiAgICpcbiAgICogY2FuIHVzZSBlbWl0KHt4OjEwfSxuZXcgR3Jhdml0eSgxMCkseydwYXJ0aWNsZVVwZGF0ZScsZnVufSkgb3IgZW1pdChbe3g6MTB9LG5ldyBJbml0aWFsaXplXSxuZXcgR3Jhdml0eSgxMCkseydwYXJ0aWNsZVVwZGF0ZScsZnVufSlcbiAgICogQG1ldGhvZCByZW1vdmVBbGxQYXJ0aWNsZXNcbiAgICovXG4gIGNyZWF0ZVBhcnRpY2xlKGluaXRpYWxpemUsIGJlaGF2aW91cikge1xuICAgIGNvbnN0IHBhcnRpY2xlID0gdGhpcy5wYXJlbnQucG9vbC5nZXQoUGFydGljbGUpO1xuICAgIHRoaXMuc2V0dXBQYXJ0aWNsZShwYXJ0aWNsZSwgaW5pdGlhbGl6ZSwgYmVoYXZpb3VyKTtcbiAgICB0aGlzLmRpc3BhdGNoKFwiUEFSVElDTEVfQ1JFQVRFRFwiLCBwYXJ0aWNsZSk7XG5cbiAgICByZXR1cm4gcGFydGljbGU7XG4gIH1cblxuICBzZXR1cFBhcnRpY2xlKHBhcnRpY2xlLCBpbml0aWFsaXplLCBiZWhhdmlvdXIpIHtcbiAgICBsZXQgaW5pdGlhbGl6ZXMgPSB0aGlzLmluaXRpYWxpemVzO1xuICAgIGxldCBiZWhhdmlvdXJzID0gdGhpcy5iZWhhdmlvdXJzO1xuXG4gICAgaWYgKGluaXRpYWxpemUpIGluaXRpYWxpemVzID0gVXRpbC50b0FycmF5KGluaXRpYWxpemUpO1xuICAgIGlmIChiZWhhdmlvdXIpIGJlaGF2aW91cnMgPSBVdGlsLnRvQXJyYXkoYmVoYXZpb3VyKTtcblxuICAgIHBhcnRpY2xlLnJlc2V0KCk7XG4gICAgSW5pdGlhbGl6ZVV0aWwuaW5pdGlhbGl6ZSh0aGlzLCBwYXJ0aWNsZSwgaW5pdGlhbGl6ZXMpO1xuICAgIHBhcnRpY2xlLmFkZEJlaGF2aW91cnMoYmVoYXZpb3Vycyk7XG4gICAgcGFydGljbGUucGFyZW50ID0gdGhpcztcblxuICAgIHRoaXMucGFydGljbGVzLnB1c2gocGFydGljbGUpO1xuICB9XG5cbiAgcmVtb3ZlKCkge1xuICAgIHRoaXMuc3RvcCgpO1xuICAgIFV0aWwuZGVzdHJveUFsbCh0aGlzLnBhcnRpY2xlcyk7XG4gIH1cblxuICAvKipcbiAgICogRGVzdG9yeSB0aGlzIEVtaXR0ZXJcbiAgICogQG1ldGhvZCBkZXN0cm95XG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHRoaXMuZGVhZCA9IHRydWU7XG4gICAgdGhpcy5yZW1vdmUoKTtcbiAgICB0aGlzLnJlbW92ZUFsbEluaXRpYWxpemVycygpO1xuICAgIHRoaXMucmVtb3ZlQWxsQmVoYXZpb3VycygpO1xuICAgIHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LnJlbW92ZUVtaXR0ZXIodGhpcyk7XG5cbiAgICB0aGlzLnJhdGUgPSBudWxsO1xuICAgIHRoaXMub2xkID0gbnVsbDtcbiAgICB0aGlzLnJnYiA9IG51bGw7XG4gICAgdGhpcy52ID0gbnVsbDtcbiAgICB0aGlzLmEgPSBudWxsO1xuICAgIHRoaXMucCA9IG51bGw7XG4gIH1cbn1cblxuRXZlbnREaXNwYXRjaGVyLmJpbmQoRW1pdHRlcik7XG4iLCJpbXBvcnQgRW1pdHRlciBmcm9tIFwiLi9FbWl0dGVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJlaGF2aW91ckVtaXR0ZXIgZXh0ZW5kcyBFbWl0dGVyIHtcbiAgLyoqXG4gICAqIFRoZSBCZWhhdmlvdXJFbWl0dGVyIGNsYXNzIGluaGVyaXRzIGZyb20gUHJvdG9uLkVtaXR0ZXJcbiAgICpcbiAgICogdXNlIHRoZSBCZWhhdmlvdXJFbWl0dGVyIHlvdSBjYW4gYWRkIGJlaGF2aW91cnMgdG8gc2VsZjtcbiAgICogQGNsYXNzIFByb3Rvbi5CZWhhdmlvdXJFbWl0dGVyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge09iamVjdH0gY29uZiB0aGUgcGFyYW1ldGVycyBvYmplY3Q7XG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25mKSB7XG4gICAgc3VwZXIoY29uZik7XG5cbiAgICB0aGlzLnNlbGZCZWhhdmlvdXJzID0gW107XG4gIH1cblxuICAvKipcbiAgICogYWRkIHRoZSBCZWhhdmlvdXIgdG8gZW1pdHRlcjtcbiAgICpcbiAgICogeW91IGNhbiB1c2UgQmVoYXZpb3VycyBhcnJheTplbWl0dGVyLmFkZFNlbGZCZWhhdmlvdXIoQmVoYXZpb3VyMSxCZWhhdmlvdXIyLEJlaGF2aW91cjMpO1xuICAgKiBAbWV0aG9kIGFkZFNlbGZCZWhhdmlvdXJcbiAgICogQHBhcmFtIHtQcm90b24uQmVoYXZpb3VyfSBiZWhhdmlvdXIgbGlrZSB0aGlzIG5ldyBQcm90b24uQ29sb3IoJ3JhbmRvbScpXG4gICAqL1xuICBhZGRTZWxmQmVoYXZpb3VyKC4uLnJlc3QpIHtcbiAgICBsZXQgaSxcbiAgICAgIGxlbmd0aCA9IHJlc3QubGVuZ3RoO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgYmVoYXZpb3VyID0gcmVzdFtpXTtcbiAgICAgIHRoaXMuc2VsZkJlaGF2aW91cnMucHVzaChiZWhhdmlvdXIpO1xuICAgICAgYmVoYXZpb3VyLmluaXRpYWxpemUodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZSB0aGUgQmVoYXZpb3VyIGZvciBzZWxmXG4gICAqIEBtZXRob2QgcmVtb3ZlU2VsZkJlaGF2aW91clxuICAgKiBAcGFyYW0ge1Byb3Rvbi5CZWhhdmlvdXJ9IGJlaGF2aW91ciBhIGJlaGF2aW91clxuICAgKi9cbiAgcmVtb3ZlU2VsZkJlaGF2aW91cihiZWhhdmlvdXIpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZkJlaGF2aW91cnMuaW5kZXhPZihiZWhhdmlvdXIpO1xuICAgIGlmIChpbmRleCA+IC0xKSB0aGlzLnNlbGZCZWhhdmlvdXJzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICB1cGRhdGUodGltZSkge1xuICAgIHN1cGVyLnVwZGF0ZSh0aW1lKTtcblxuICAgIGlmICghdGhpcy5zbGVlcCkge1xuICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5zZWxmQmVoYXZpb3Vycy5sZW5ndGg7XG4gICAgICBsZXQgaTtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuc2VsZkJlaGF2aW91cnNbaV0uYXBwbHlCZWhhdmlvdXIodGhpcywgdGltZSwgaSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IEVtaXR0ZXIgZnJvbSBcIi4vRW1pdHRlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGb2xsb3dFbWl0dGVyIGV4dGVuZHMgRW1pdHRlciB7XG4gIC8qKlxuICAgKiBUaGUgRm9sbG93RW1pdHRlciBjbGFzcyBpbmhlcml0cyBmcm9tIFByb3Rvbi5FbWl0dGVyXG4gICAqXG4gICAqIHVzZSB0aGUgRm9sbG93RW1pdHRlciB3aWxsIGVtaXQgcGFydGljbGUgd2hlbiBtb3VzZW1vdmluZ1xuICAgKlxuICAgKiBAY2xhc3MgUHJvdG9uLkZvbGxvd0VtaXR0ZXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbW91c2VUYXJnZXQgbW91c2VldmVudCdzIHRhcmdldDtcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGVhc2UgdGhlIGVhc2luZyBvZiBmb2xsb3dpbmcgc3BlZWQ7XG4gICAqIEBkZWZhdWx0IDAuN1xuICAgKiBAcGFyYW0ge09iamVjdH0gY29uZiB0aGUgcGFyYW1ldGVycyBvYmplY3Q7XG4gICAqL1xuICBjb25zdHJ1Y3Rvcihtb3VzZVRhcmdldCwgZWFzZSwgY29uZikge1xuICAgIHN1cGVyKGNvbmYpO1xuXG4gICAgdGhpcy5tb3VzZVRhcmdldCA9IFV0aWwuaW5pdFZhbHVlKG1vdXNlVGFyZ2V0LCB3aW5kb3cpO1xuICAgIHRoaXMuZWFzZSA9IFV0aWwuaW5pdFZhbHVlKGVhc2UsIDAuNyk7XG5cbiAgICB0aGlzLl9hbGxvd0VtaXR0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5pbml0RXZlbnRIYW5kbGVyKCk7XG4gIH1cblxuICBpbml0RXZlbnRIYW5kbGVyKCkge1xuICAgIHRoaXMubW91c2Vtb3ZlSGFuZGxlciA9IGUgPT4gdGhpcy5tb3VzZW1vdmUuY2FsbCh0aGlzLCBlKTtcbiAgICB0aGlzLm1vdXNlZG93bkhhbmRsZXIgPSBlID0+IHRoaXMubW91c2Vkb3duLmNhbGwodGhpcywgZSk7XG4gICAgdGhpcy5tb3VzZXVwSGFuZGxlciA9IGUgPT4gdGhpcy5tb3VzZXVwLmNhbGwodGhpcywgZSk7XG4gICAgdGhpcy5tb3VzZVRhcmdldC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMubW91c2Vtb3ZlSGFuZGxlciwgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIHN0YXJ0IGVtaXQgcGFydGljbGVcbiAgICogQG1ldGhvZCBlbWl0XG4gICAqL1xuICBlbWl0KCkge1xuICAgIHRoaXMuX2FsbG93RW1pdHRpbmcgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIHN0b3AgZW1pdGluZ1xuICAgKiBAbWV0aG9kIHN0b3BcbiAgICovXG4gIHN0b3AoKSB7XG4gICAgdGhpcy5fYWxsb3dFbWl0dGluZyA9IGZhbHNlO1xuICB9XG5cbiAgbW91c2Vtb3ZlKGUpIHtcbiAgICBpZiAoZS5sYXllclggfHwgZS5sYXllclggPT09IDApIHtcbiAgICAgIHRoaXMucC54ICs9IChlLmxheWVyWCAtIHRoaXMucC54KSAqIHRoaXMuZWFzZTtcbiAgICAgIHRoaXMucC55ICs9IChlLmxheWVyWSAtIHRoaXMucC55KSAqIHRoaXMuZWFzZTtcbiAgICB9IGVsc2UgaWYgKGUub2Zmc2V0WCB8fCBlLm9mZnNldFggPT09IDApIHtcbiAgICAgIHRoaXMucC54ICs9IChlLm9mZnNldFggLSB0aGlzLnAueCkgKiB0aGlzLmVhc2U7XG4gICAgICB0aGlzLnAueSArPSAoZS5vZmZzZXRZIC0gdGhpcy5wLnkpICogdGhpcy5lYXNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9hbGxvd0VtaXR0aW5nKSBzdXBlci5lbWl0KFwib25jZVwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0b3J5IHRoaXMgRW1pdHRlclxuICAgKiBAbWV0aG9kIGRlc3Ryb3lcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMubW91c2VUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm1vdXNlbW92ZUhhbmRsZXIsIGZhbHNlKTtcbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogRGV0ZXJtaW5lIHdoZXRoZXIgaXQgaXMgYSBwaWN0dXJlIG9iamVjdFxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBpcyBvciBub1xuICAgKi9cbiAgaXNJbWFnZShvYmopIHtcbiAgICBpZiAoIW9iaikgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChvYmouX19pc0ltYWdlKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IHRhZ05hbWUgPSBgJHtvYmoudGFnTmFtZX1gLnRvVXBwZXJDYXNlKCk7XG4gICAgY29uc3Qgbm9kZU5hbWUgPSBgJHtvYmoubm9kZU5hbWV9YC50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChub2RlTmFtZSA9PT0gXCJJTUdcIiB8fCB0YWdOYW1lID09PSBcIklNR1wiKSB7XG4gICAgICBvYmouX19pc0ltYWdlID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAvKipcbiAgICogRGV0ZXJtaW5lIHdoZXRoZXIgaXQgaXMgYSBzdHJpbmcgb2JqZWN0XG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IGlzIG9yIG5vXG4gICAqL1xuICBpc1N0cmluZyhvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJzdHJpbmdcIjtcbiAgfVxufTtcbiIsImltcG9ydCBQb29sIGZyb20gXCIuLi9jb3JlL1Bvb2xcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZVJlbmRlcmVyIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgc3Ryb2tlKSB7XG4gICAgdGhpcy5wb29sID0gbmV3IFBvb2woKTtcbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuc3Ryb2tlID0gc3Ryb2tlO1xuICAgIHRoaXMuY2lyY2xlQ29uZiA9IHsgaXNDaXJjbGU6IHRydWUgfTtcblxuICAgIHRoaXMuaW5pdEV2ZW50SGFuZGxlcigpO1xuICAgIHRoaXMubmFtZSA9IFwiQmFzZVJlbmRlcmVyXCI7XG4gIH1cblxuICBzZXRTdHJva2UoY29sb3IgPSBcIiMwMDAwMDBcIiwgdGhpbmtuZXNzID0gMSkge1xuICAgIHRoaXMuc3Ryb2tlID0geyBjb2xvciwgdGhpbmtuZXNzIH07XG4gIH1cblxuICBpbml0RXZlbnRIYW5kbGVyKCkge1xuICAgIHRoaXMuX3Byb3RvblVwZGF0ZUhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLm9uUHJvdG9uVXBkYXRlLmNhbGwodGhpcyk7XG4gICAgfTtcblxuICAgIHRoaXMuX3Byb3RvblVwZGF0ZUFmdGVySGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHRoaXMub25Qcm90b25VcGRhdGVBZnRlci5jYWxsKHRoaXMpO1xuICAgIH07XG5cbiAgICB0aGlzLl9lbWl0dGVyQWRkZWRIYW5kbGVyID0gZW1pdHRlciA9PiB7XG4gICAgICB0aGlzLm9uRW1pdHRlckFkZGVkLmNhbGwodGhpcywgZW1pdHRlcik7XG4gICAgfTtcblxuICAgIHRoaXMuX2VtaXR0ZXJSZW1vdmVkSGFuZGxlciA9IGVtaXR0ZXIgPT4ge1xuICAgICAgdGhpcy5vbkVtaXR0ZXJSZW1vdmVkLmNhbGwodGhpcywgZW1pdHRlcik7XG4gICAgfTtcblxuICAgIHRoaXMuX3BhcnRpY2xlQ3JlYXRlZEhhbmRsZXIgPSBwYXJ0aWNsZSA9PiB7XG4gICAgICB0aGlzLm9uUGFydGljbGVDcmVhdGVkLmNhbGwodGhpcywgcGFydGljbGUpO1xuICAgIH07XG5cbiAgICB0aGlzLl9wYXJ0aWNsZVVwZGF0ZUhhbmRsZXIgPSBwYXJ0aWNsZSA9PiB7XG4gICAgICB0aGlzLm9uUGFydGljbGVVcGRhdGUuY2FsbCh0aGlzLCBwYXJ0aWNsZSk7XG4gICAgfTtcblxuICAgIHRoaXMuX3BhcnRpY2xlRGVhZEhhbmRsZXIgPSBwYXJ0aWNsZSA9PiB7XG4gICAgICB0aGlzLm9uUGFydGljbGVEZWFkLmNhbGwodGhpcywgcGFydGljbGUpO1xuICAgIH07XG4gIH1cblxuICBpbml0KHByb3Rvbikge1xuICAgIHRoaXMucGFyZW50ID0gcHJvdG9uO1xuXG4gICAgcHJvdG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJQUk9UT05fVVBEQVRFXCIsIHRoaXMuX3Byb3RvblVwZGF0ZUhhbmRsZXIpO1xuICAgIHByb3Rvbi5hZGRFdmVudExpc3RlbmVyKFwiUFJPVE9OX1VQREFURV9BRlRFUlwiLCB0aGlzLl9wcm90b25VcGRhdGVBZnRlckhhbmRsZXIpO1xuXG4gICAgcHJvdG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJFTUlUVEVSX0FEREVEXCIsIHRoaXMuX2VtaXR0ZXJBZGRlZEhhbmRsZXIpO1xuICAgIHByb3Rvbi5hZGRFdmVudExpc3RlbmVyKFwiRU1JVFRFUl9SRU1PVkVEXCIsIHRoaXMuX2VtaXR0ZXJSZW1vdmVkSGFuZGxlcik7XG5cbiAgICBwcm90b24uYWRkRXZlbnRMaXN0ZW5lcihcIlBBUlRJQ0xFX0NSRUFURURcIiwgdGhpcy5fcGFydGljbGVDcmVhdGVkSGFuZGxlcik7XG4gICAgcHJvdG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJQQVJUSUNMRV9VUERBVEVcIiwgdGhpcy5fcGFydGljbGVVcGRhdGVIYW5kbGVyKTtcbiAgICBwcm90b24uYWRkRXZlbnRMaXN0ZW5lcihcIlBBUlRJQ0xFX0RFQURcIiwgdGhpcy5fcGFydGljbGVEZWFkSGFuZGxlcik7XG4gIH1cblxuICByZXNpemUod2lkdGgsIGhlaWdodCkge31cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgdGhpcy5wb29sLmRlc3Ryb3koKTtcbiAgICB0aGlzLnBvb2wgPSBudWxsO1xuICAgIHRoaXMuZWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5zdHJva2UgPSBudWxsO1xuICB9XG5cbiAgcmVtb3ZlKHByb3Rvbikge1xuICAgIHRoaXMucGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJQUk9UT05fVVBEQVRFXCIsIHRoaXMuX3Byb3RvblVwZGF0ZUhhbmRsZXIpO1xuICAgIHRoaXMucGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJQUk9UT05fVVBEQVRFX0FGVEVSXCIsIHRoaXMuX3Byb3RvblVwZGF0ZUFmdGVySGFuZGxlcik7XG5cbiAgICB0aGlzLnBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiRU1JVFRFUl9BRERFRFwiLCB0aGlzLl9lbWl0dGVyQWRkZWRIYW5kbGVyKTtcbiAgICB0aGlzLnBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiRU1JVFRFUl9SRU1PVkVEXCIsIHRoaXMuX2VtaXR0ZXJSZW1vdmVkSGFuZGxlcik7XG5cbiAgICB0aGlzLnBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiUEFSVElDTEVfQ1JFQVRFRFwiLCB0aGlzLl9wYXJ0aWNsZUNyZWF0ZWRIYW5kbGVyKTtcbiAgICB0aGlzLnBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiUEFSVElDTEVfVVBEQVRFXCIsIHRoaXMuX3BhcnRpY2xlVXBkYXRlSGFuZGxlcik7XG4gICAgdGhpcy5wYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIlBBUlRJQ0xFX0RFQURcIiwgdGhpcy5fcGFydGljbGVEZWFkSGFuZGxlcik7XG5cbiAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gIH1cblxuICBvblByb3RvblVwZGF0ZSgpIHt9XG4gIG9uUHJvdG9uVXBkYXRlQWZ0ZXIoKSB7fVxuXG4gIG9uRW1pdHRlckFkZGVkKGVtaXR0ZXIpIHt9XG4gIG9uRW1pdHRlclJlbW92ZWQoZW1pdHRlcikge31cblxuICBvblBhcnRpY2xlQ3JlYXRlZChwYXJ0aWNsZSkge31cbiAgb25QYXJ0aWNsZVVwZGF0ZShwYXJ0aWNsZSkge31cbiAgb25QYXJ0aWNsZURlYWQocGFydGljbGUpIHt9XG59XG4iLCJpbXBvcnQgVHlwZXMgZnJvbSBcIi4uL3V0aWxzL1R5cGVzXCI7XG5pbXBvcnQgSW1nVXRpbCBmcm9tIFwiLi4vdXRpbHMvSW1nVXRpbFwiO1xuaW1wb3J0IENvbG9yVXRpbCBmcm9tIFwiLi4vdXRpbHMvQ29sb3JVdGlsXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcbmltcG9ydCBCYXNlUmVuZGVyZXIgZnJvbSBcIi4vQmFzZVJlbmRlcmVyXCI7XG5cbi8qKlxuICogQ2FudmFzUmVuZGVyZXIgY2xhc3MgZm9yIHJlbmRlcmluZyBwYXJ0aWNsZXMgb24gYSBjYW52YXMgZWxlbWVudC5cbiAqIEBleHRlbmRzIEJhc2VSZW5kZXJlclxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYW52YXNSZW5kZXJlciBleHRlbmRzIEJhc2VSZW5kZXJlciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7b2JqZWN0fG51bGx9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzdHJva2U7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb250ZXh0O1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYnVmZmVyQ2FjaGU7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBuYW1lO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IENhbnZhc1JlbmRlcmVyIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBlbGVtZW50IC0gVGhlIGNhbnZhcyBlbGVtZW50IHRvIHJlbmRlciBvbi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQpIHtcbiAgICBzdXBlcihlbGVtZW50KTtcblxuICAgIHRoaXMuc3Ryb2tlID0gbnVsbDtcbiAgICB0aGlzLmNvbnRleHQgPSB0aGlzLmVsZW1lbnQuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgIHRoaXMuYnVmZmVyQ2FjaGUgPSB7fTtcbiAgICB0aGlzLm5hbWUgPSBcIkNhbnZhc1JlbmRlcmVyXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzaXplcyB0aGUgY2FudmFzIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSBuZXcgd2lkdGggb2YgdGhlIGNhbnZhcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBuZXcgaGVpZ2h0IG9mIHRoZSBjYW52YXMuXG4gICAqL1xuICByZXNpemUod2lkdGgsIGhlaWdodCkge1xuICAgIHRoaXMuZWxlbWVudC53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuZWxlbWVudC5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIHRoZSBjYW52YXMgb24gUHJvdG9uIHVwZGF0ZS5cbiAgICovXG4gIG9uUHJvdG9uVXBkYXRlKCkge1xuICAgIHRoaXMuY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdGhpcy5lbGVtZW50LndpZHRoLCB0aGlzLmVsZW1lbnQuaGVpZ2h0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHBhcnRpY2xlIGNyZWF0aW9uLlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGljbGUgLSBUaGUgY3JlYXRlZCBwYXJ0aWNsZS5cbiAgICovXG4gIG9uUGFydGljbGVDcmVhdGVkKHBhcnRpY2xlKSB7XG4gICAgaWYgKHBhcnRpY2xlLmJvZHkpIHtcbiAgICAgIEltZ1V0aWwuZ2V0SW1nRnJvbUNhY2hlKHBhcnRpY2xlLmJvZHksIHRoaXMuYWRkSW1nMkJvZHksIHBhcnRpY2xlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFydGljbGUuY29sb3IgPSBwYXJ0aWNsZS5jb2xvciB8fCBcIiNmZjAwMDBcIjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBwYXJ0aWNsZSB1cGRhdGVzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGljbGUgLSBUaGUgdXBkYXRlZCBwYXJ0aWNsZS5cbiAgICovXG4gIG9uUGFydGljbGVVcGRhdGUocGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUuYm9keSkge1xuICAgICAgaWYgKFR5cGVzLmlzSW1hZ2UocGFydGljbGUuYm9keSkpIHtcbiAgICAgICAgdGhpcy5kcmF3SW1hZ2UocGFydGljbGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRyYXdDaXJjbGUocGFydGljbGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHBhcnRpY2xlIGRlc3RydWN0aW9uLlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGljbGUgLSBUaGUgZGVzdHJveWVkIHBhcnRpY2xlLlxuICAgKi9cbiAgb25QYXJ0aWNsZURlYWQocGFydGljbGUpIHtcbiAgICBwYXJ0aWNsZS5ib2R5ID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGltYWdlIHRvIHRoZSBwYXJ0aWNsZSBib2R5LlxuICAgKiBAcGFyYW0ge0hUTUxJbWFnZUVsZW1lbnR9IGltZyAtIFRoZSBpbWFnZSB0byBhZGQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJ0aWNsZSAtIFRoZSBwYXJ0aWNsZSB0byBhZGQgdGhlIGltYWdlIHRvLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYWRkSW1nMkJvZHkoaW1nLCBwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLmJvZHkgPSBpbWc7XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgYW4gaW1hZ2UgcGFydGljbGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJ0aWNsZSAtIFRoZSBwYXJ0aWNsZSB0byBkcmF3LlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZHJhd0ltYWdlKHBhcnRpY2xlKSB7XG4gICAgY29uc3QgdyA9IChwYXJ0aWNsZS5ib2R5LndpZHRoICogcGFydGljbGUuc2NhbGUpIHwgMDtcbiAgICBjb25zdCBoID0gKHBhcnRpY2xlLmJvZHkuaGVpZ2h0ICogcGFydGljbGUuc2NhbGUpIHwgMDtcbiAgICBjb25zdCB4ID0gcGFydGljbGUucC54IC0gdyAvIDI7XG4gICAgY29uc3QgeSA9IHBhcnRpY2xlLnAueSAtIGggLyAyO1xuXG4gICAgaWYgKCEhcGFydGljbGUuY29sb3IpIHtcbiAgICAgIGlmICghcGFydGljbGUuZGF0YVtcImJ1ZmZlclwiXSkgcGFydGljbGUuZGF0YS5idWZmZXIgPSB0aGlzLmNyZWF0ZUJ1ZmZlcihwYXJ0aWNsZS5ib2R5KTtcblxuICAgICAgY29uc3QgYnVmQ29udGV4dCA9IHBhcnRpY2xlLmRhdGEuYnVmZmVyLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGJ1ZkNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHBhcnRpY2xlLmRhdGEuYnVmZmVyLndpZHRoLCBwYXJ0aWNsZS5kYXRhLmJ1ZmZlci5oZWlnaHQpO1xuICAgICAgYnVmQ29udGV4dC5nbG9iYWxBbHBoYSA9IHBhcnRpY2xlLmFscGhhO1xuICAgICAgYnVmQ29udGV4dC5kcmF3SW1hZ2UocGFydGljbGUuYm9keSwgMCwgMCk7XG5cbiAgICAgIGJ1ZkNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJzb3VyY2UtYXRvcFwiO1xuICAgICAgYnVmQ29udGV4dC5maWxsU3R5bGUgPSBDb2xvclV0aWwucmdiVG9IZXgocGFydGljbGUucmdiKTtcbiAgICAgIGJ1ZkNvbnRleHQuZmlsbFJlY3QoMCwgMCwgcGFydGljbGUuZGF0YS5idWZmZXIud2lkdGgsIHBhcnRpY2xlLmRhdGEuYnVmZmVyLmhlaWdodCk7XG4gICAgICBidWZDb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwic291cmNlLW92ZXJcIjtcbiAgICAgIGJ1ZkNvbnRleHQuZ2xvYmFsQWxwaGEgPSAxO1xuXG4gICAgICB0aGlzLmNvbnRleHQuZHJhd0ltYWdlKFxuICAgICAgICBwYXJ0aWNsZS5kYXRhLmJ1ZmZlcixcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgcGFydGljbGUuZGF0YS5idWZmZXIud2lkdGgsXG4gICAgICAgIHBhcnRpY2xlLmRhdGEuYnVmZmVyLmhlaWdodCxcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgdyxcbiAgICAgICAgaFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250ZXh0LnNhdmUoKTtcblxuICAgICAgdGhpcy5jb250ZXh0Lmdsb2JhbEFscGhhID0gcGFydGljbGUuYWxwaGE7XG4gICAgICB0aGlzLmNvbnRleHQudHJhbnNsYXRlKHBhcnRpY2xlLnAueCwgcGFydGljbGUucC55KTtcbiAgICAgIHRoaXMuY29udGV4dC5yb3RhdGUoTWF0aFV0aWwuZGVncmVlVHJhbnNmb3JtKHBhcnRpY2xlLnJvdGF0aW9uKSk7XG4gICAgICB0aGlzLmNvbnRleHQudHJhbnNsYXRlKC1wYXJ0aWNsZS5wLngsIC1wYXJ0aWNsZS5wLnkpO1xuICAgICAgdGhpcy5jb250ZXh0LmRyYXdJbWFnZShwYXJ0aWNsZS5ib2R5LCAwLCAwLCBwYXJ0aWNsZS5ib2R5LndpZHRoLCBwYXJ0aWNsZS5ib2R5LmhlaWdodCwgeCwgeSwgdywgaCk7XG5cbiAgICAgIHRoaXMuY29udGV4dC5nbG9iYWxBbHBoYSA9IDE7XG4gICAgICB0aGlzLmNvbnRleHQucmVzdG9yZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3cyBhIGNpcmN1bGFyIHBhcnRpY2xlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGljbGUgLSBUaGUgcGFydGljbGUgdG8gZHJhdy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRyYXdDaXJjbGUocGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUucmdiKSB7XG4gICAgICB0aGlzLmNvbnRleHQuZmlsbFN0eWxlID0gYHJnYmEoJHtwYXJ0aWNsZS5yZ2Iucn0sJHtwYXJ0aWNsZS5yZ2IuZ30sJHtwYXJ0aWNsZS5yZ2IuYn0sJHtwYXJ0aWNsZS5hbHBoYX0pYDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250ZXh0LmZpbGxTdHlsZSA9IHBhcnRpY2xlLmNvbG9yO1xuICAgIH1cblxuICAgIHRoaXMuY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICB0aGlzLmNvbnRleHQuYXJjKHBhcnRpY2xlLnAueCwgcGFydGljbGUucC55LCBwYXJ0aWNsZS5yYWRpdXMsIDAsIE1hdGguUEkgKiAyLCB0cnVlKTtcblxuICAgIGlmICh0aGlzLnN0cm9rZSkge1xuICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVN0eWxlID0gdGhpcy5zdHJva2UuY29sb3I7XG4gICAgICB0aGlzLmNvbnRleHQubGluZVdpZHRoID0gdGhpcy5zdHJva2UudGhpbmtuZXNzO1xuICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZSgpO1xuICAgIH1cblxuICAgIHRoaXMuY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICB0aGlzLmNvbnRleHQuZmlsbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBidWZmZXIgZm9yIGltYWdlIHBhcnRpY2xlcy5cbiAgICogQHBhcmFtIHtIVE1MSW1hZ2VFbGVtZW50fSBpbWFnZSAtIFRoZSBpbWFnZSB0byBjcmVhdGUgYSBidWZmZXIgZm9yLlxuICAgKiBAcmV0dXJucyB7SFRNTENhbnZhc0VsZW1lbnR8dW5kZWZpbmVkfSBUaGUgY3JlYXRlZCBidWZmZXIgY2FudmFzLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3JlYXRlQnVmZmVyKGltYWdlKSB7XG4gICAgaWYgKFR5cGVzLmlzSW1hZ2UoaW1hZ2UpKSB7XG4gICAgICBjb25zdCBzaXplID0gaW1hZ2Uud2lkdGggKyBcIl9cIiArIGltYWdlLmhlaWdodDtcbiAgICAgIGxldCBjYW52YXMgPSB0aGlzLmJ1ZmZlckNhY2hlW3NpemVdO1xuXG4gICAgICBpZiAoIWNhbnZhcykge1xuICAgICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgICBjYW52YXMud2lkdGggPSBpbWFnZS53aWR0aDtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGltYWdlLmhlaWdodDtcbiAgICAgICAgdGhpcy5idWZmZXJDYWNoZVtzaXplXSA9IGNhbnZhcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNhbnZhcztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveXMgdGhlIHJlbmRlcmVyIGFuZCBjbGVhbnMgdXAgcmVzb3VyY2VzLlxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5zdHJva2UgPSBudWxsO1xuICAgIHRoaXMuY29udGV4dCA9IG51bGw7XG4gICAgdGhpcy5idWZmZXJDYWNoZSA9IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCBEb21VdGlsIGZyb20gXCIuLi91dGlscy9Eb21VdGlsXCI7XG5pbXBvcnQgSW1nVXRpbCBmcm9tIFwiLi4vdXRpbHMvSW1nVXRpbFwiO1xuaW1wb3J0IEJhc2VSZW5kZXJlciBmcm9tIFwiLi9CYXNlUmVuZGVyZXJcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgRE9NLWJhc2VkIHJlbmRlcmVyIGZvciBwYXJ0aWNsZSBzeXN0ZW1zLlxuICogQGV4dGVuZHMgQmFzZVJlbmRlcmVyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvbVJlbmRlcmVyIGV4dGVuZHMgQmFzZVJlbmRlcmVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgRG9tUmVuZGVyZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgSFRNTCBlbGVtZW50IHRvIHJlbmRlciB0by5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQpIHtcbiAgICBzdXBlcihlbGVtZW50KTtcblxuICAgIHRoaXMuc3Ryb2tlID0gbnVsbDtcbiAgICB0aGlzLnRyYW5zZm9ybTNkID0gZmFsc2U7XG4gICAgdGhpcy5wb29sLmNyZWF0ZSA9IChib2R5LCBwYXJ0aWNsZSkgPT4gdGhpcy5jcmVhdGVCb2R5KGJvZHksIHBhcnRpY2xlKTtcbiAgICB0aGlzLmFkZEltZzJCb2R5ID0gdGhpcy5hZGRJbWcyQm9keS5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5uYW1lID0gXCJEb21SZW5kZXJlclwiO1xuICB9XG5cbiAgb25QYXJ0aWNsZUNyZWF0ZWQocGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUuYm9keSkge1xuICAgICAgSW1nVXRpbC5nZXRJbWdGcm9tQ2FjaGUocGFydGljbGUuYm9keSwgdGhpcy5hZGRJbWcyQm9keSwgcGFydGljbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5ID0gdGhpcy5wb29sLmdldCh0aGlzLmNpcmNsZUNvbmYsIHBhcnRpY2xlKTtcbiAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChwYXJ0aWNsZS5ib2R5KTtcbiAgICB9XG4gIH1cblxuICBvblBhcnRpY2xlVXBkYXRlKHBhcnRpY2xlKSB7XG4gICAgaWYgKHRoaXMuYm9keVJlYWR5KHBhcnRpY2xlKSkge1xuICAgICAgaWYgKHRoaXMudHJhbnNmb3JtM2QpIHtcbiAgICAgICAgRG9tVXRpbC50cmFuc2Zvcm0zZChwYXJ0aWNsZS5ib2R5LCBwYXJ0aWNsZS5wLngsIHBhcnRpY2xlLnAueSwgcGFydGljbGUuc2NhbGUsIHBhcnRpY2xlLnJvdGF0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIERvbVV0aWwudHJhbnNmb3JtKHBhcnRpY2xlLmJvZHksIHBhcnRpY2xlLnAueCwgcGFydGljbGUucC55LCBwYXJ0aWNsZS5zY2FsZSwgcGFydGljbGUucm90YXRpb24pO1xuICAgICAgfVxuXG4gICAgICBwYXJ0aWNsZS5ib2R5LnN0eWxlLm9wYWNpdHkgPSBwYXJ0aWNsZS5hbHBoYTtcblxuICAgICAgaWYgKHBhcnRpY2xlLmJvZHkuaXNDaXJjbGUpIHtcbiAgICAgICAgcGFydGljbGUuYm9keS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBwYXJ0aWNsZS5jb2xvciB8fCBcIiNmZjAwMDBcIjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblBhcnRpY2xlRGVhZChwYXJ0aWNsZSkge1xuICAgIGlmICh0aGlzLmJvZHlSZWFkeShwYXJ0aWNsZSkpIHtcbiAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVDaGlsZChwYXJ0aWNsZS5ib2R5KTtcbiAgICAgIHRoaXMucG9vbC5leHBpcmUocGFydGljbGUuYm9keSk7XG4gICAgICBwYXJ0aWNsZS5ib2R5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBib2R5UmVhZHkocGFydGljbGUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHBhcnRpY2xlLmJvZHkgPT09IFwib2JqZWN0XCIgJiYgcGFydGljbGUuYm9keSAmJiAhcGFydGljbGUuYm9keS5pc0lubmVyO1xuICB9XG5cbiAgLy8gcHJpdmF0ZSBtZXRob2RcbiAgYWRkSW1nMkJvZHkoaW1nLCBwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZS5kZWFkKSByZXR1cm47XG4gICAgcGFydGljbGUuYm9keSA9IHRoaXMucG9vbC5nZXQoaW1nLCBwYXJ0aWNsZSk7XG4gICAgRG9tVXRpbC5yZXNpemUocGFydGljbGUuYm9keSwgaW1nLndpZHRoLCBpbWcuaGVpZ2h0KTtcblxuICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChwYXJ0aWNsZS5ib2R5KTtcbiAgfVxuXG4gIGNyZWF0ZUJvZHkoYm9keSwgcGFydGljbGUpIHtcbiAgICBpZiAoYm9keS5pc0NpcmNsZSkgcmV0dXJuIHRoaXMuY3JlYXRlQ2lyY2xlKHBhcnRpY2xlKTtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTcHJpdGUoYm9keSwgcGFydGljbGUpO1xuICB9XG5cbiAgLy8gcHJpdmF0ZSBtZXRob2RzXG4gIGNyZWF0ZUNpcmNsZShwYXJ0aWNsZSkge1xuICAgIGNvbnN0IGRvbSA9IERvbVV0aWwuY3JlYXRlRGl2KGAke3BhcnRpY2xlLmlkfV9kb21gLCAyICogcGFydGljbGUucmFkaXVzLCAyICogcGFydGljbGUucmFkaXVzKTtcbiAgICBkb20uc3R5bGUuYm9yZGVyUmFkaXVzID0gYCR7cGFydGljbGUucmFkaXVzfXB4YDtcblxuICAgIGlmICh0aGlzLnN0cm9rZSkge1xuICAgICAgZG9tLnN0eWxlLmJvcmRlckNvbG9yID0gdGhpcy5zdHJva2UuY29sb3I7XG4gICAgICBkb20uc3R5bGUuYm9yZGVyV2lkdGggPSBgJHt0aGlzLnN0cm9rZS50aGlua25lc3N9cHhgO1xuICAgIH1cbiAgICBkb20uaXNDaXJjbGUgPSB0cnVlO1xuXG4gICAgcmV0dXJuIGRvbTtcbiAgfVxuXG4gIGNyZWF0ZVNwcml0ZShib2R5LCBwYXJ0aWNsZSkge1xuICAgIGNvbnN0IHVybCA9IHR5cGVvZiBib2R5ID09PSBcInN0cmluZ1wiID8gYm9keSA6IGJvZHkuc3JjO1xuICAgIGNvbnN0IGRvbSA9IERvbVV0aWwuY3JlYXRlRGl2KGAke3BhcnRpY2xlLmlkfV9kb21gLCBib2R5LndpZHRoLCBib2R5LmhlaWdodCk7XG4gICAgZG9tLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9IGB1cmwoJHt1cmx9KWA7XG5cbiAgICByZXR1cm4gZG9tO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSByZW5kZXJlciBhbmQgY2xlYW5zIHVwIHJlc291cmNlcy5cbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuc3Ryb2tlID0gbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0IFR5cGVzIGZyb20gXCIuLi91dGlscy9UeXBlc1wiO1xuaW1wb3J0IEJhc2VSZW5kZXJlciBmcm9tIFwiLi9CYXNlUmVuZGVyZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWFzZWxSZW5kZXJlciBleHRlbmRzIEJhc2VSZW5kZXJlciB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIHN0cm9rZSkge1xuICAgIHN1cGVyKGVsZW1lbnQpO1xuXG4gICAgdGhpcy5zdHJva2UgPSBzdHJva2U7XG4gICAgdGhpcy5uYW1lID0gXCJFYXNlbFJlbmRlcmVyXCI7XG4gIH1cblxuICBvblBhcnRpY2xlQ3JlYXRlZChwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZS5ib2R5KSB7XG4gICAgICB0aGlzLmNyZWF0ZVNwcml0ZShwYXJ0aWNsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3JlYXRlQ2lyY2xlKHBhcnRpY2xlKTtcbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnQuYWRkQ2hpbGQocGFydGljbGUuYm9keSk7XG4gIH1cblxuICBvblBhcnRpY2xlVXBkYXRlKHBhcnRpY2xlKSB7XG4gICAgaWYgKHBhcnRpY2xlLmJvZHkpIHtcbiAgICAgIHBhcnRpY2xlLmJvZHkueCA9IHBhcnRpY2xlLnAueDtcbiAgICAgIHBhcnRpY2xlLmJvZHkueSA9IHBhcnRpY2xlLnAueTtcblxuICAgICAgcGFydGljbGUuYm9keS5hbHBoYSA9IHBhcnRpY2xlLmFscGhhO1xuICAgICAgcGFydGljbGUuYm9keS5zY2FsZVggPSBwYXJ0aWNsZS5ib2R5LnNjYWxlWSA9IHBhcnRpY2xlLnNjYWxlO1xuICAgICAgcGFydGljbGUuYm9keS5yb3RhdGlvbiA9IHBhcnRpY2xlLnJvdGF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFydGljbGVEZWFkKHBhcnRpY2xlKSB7XG4gICAgaWYgKHBhcnRpY2xlLmJvZHkpIHtcbiAgICAgIHBhcnRpY2xlLmJvZHkucGFyZW50ICYmIHBhcnRpY2xlLmJvZHkucGFyZW50LnJlbW92ZUNoaWxkKHBhcnRpY2xlLmJvZHkpO1xuICAgICAgdGhpcy5wb29sLmV4cGlyZShwYXJ0aWNsZS5ib2R5KTtcbiAgICAgIHBhcnRpY2xlLmJvZHkgPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChwYXJ0aWNsZS5ncmFwaGljcykgdGhpcy5wb29sLmV4cGlyZShwYXJ0aWNsZS5ncmFwaGljcyk7XG4gIH1cblxuICAvLyBwcml2YXRlXG4gIGNyZWF0ZVNwcml0ZShwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLmJvZHkgPSB0aGlzLnBvb2wuZ2V0KHBhcnRpY2xlLmJvZHkpO1xuXG4gICAgaWYgKHBhcnRpY2xlLmJvZHkucGFyZW50KSByZXR1cm47XG4gICAgaWYgKHBhcnRpY2xlLmJvZHlbXCJpbWFnZVwiXSkge1xuICAgICAgcGFydGljbGUuYm9keS5yZWdYID0gcGFydGljbGUuYm9keS5pbWFnZS53aWR0aCAvIDI7XG4gICAgICBwYXJ0aWNsZS5ib2R5LnJlZ1kgPSBwYXJ0aWNsZS5ib2R5LmltYWdlLmhlaWdodCAvIDI7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlQ2lyY2xlKHBhcnRpY2xlKSB7XG4gICAgY29uc3QgZ3JhcGhpY3MgPSB0aGlzLnBvb2wuZ2V0KHdpbmRvdy5jcmVhdGVqcy5HcmFwaGljcyk7XG5cbiAgICBpZiAodGhpcy5zdHJva2UpIHtcbiAgICAgIGlmIChUeXBlcy5pc1N0cmluZyh0aGlzLnN0cm9rZSkpIHtcbiAgICAgICAgZ3JhcGhpY3MuYmVnaW5TdHJva2UodGhpcy5zdHJva2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ3JhcGhpY3MuYmVnaW5TdHJva2UoXCIjMDAwMDAwXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBncmFwaGljcy5iZWdpbkZpbGwocGFydGljbGUuY29sb3IgfHwgXCIjZmYwMDAwXCIpLmRyYXdDaXJjbGUoMCwgMCwgcGFydGljbGUucmFkaXVzKTtcbiAgICBjb25zdCBzaGFwZSA9IHRoaXMucG9vbC5nZXQod2luZG93LmNyZWF0ZWpzLlNoYXBlLCBbZ3JhcGhpY3NdKTtcblxuICAgIHBhcnRpY2xlLmJvZHkgPSBzaGFwZTtcbiAgICBwYXJ0aWNsZS5ncmFwaGljcyA9IGdyYXBoaWNzO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5zdHJva2UgPSBudWxsO1xuICB9XG59XG4iLCJpbXBvcnQgUmVjdGFuZ2xlIGZyb20gXCIuLi9tYXRoL1JlY3RhbmdsZVwiO1xuaW1wb3J0IEJhc2VSZW5kZXJlciBmcm9tIFwiLi9CYXNlUmVuZGVyZXJcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcGl4ZWwtYmFzZWQgcmVuZGVyZXIgZm9yIHBhcnRpY2xlIHN5c3RlbXMuXG4gKiBAZXh0ZW5kcyBCYXNlUmVuZGVyZXJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGl4ZWxSZW5kZXJlciBleHRlbmRzIEJhc2VSZW5kZXJlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFBpeGVsUmVuZGVyZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgY2FudmFzIGVsZW1lbnQgdG8gcmVuZGVyIHRvLlxuICAgKiBAcGFyYW0ge1JlY3RhbmdsZX0gW3JlY3RhbmdsZV0gLSBUaGUgcmVjdGFuZ2xlIGRlZmluaW5nIHRoZSByZW5kZXJpbmcgYXJlYS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIHJlY3RhbmdsZSkge1xuICAgIHN1cGVyKGVsZW1lbnQpO1xuXG4gICAgdGhpcy5jb250ZXh0ID0gdGhpcy5lbGVtZW50LmdldENvbnRleHQoXCIyZFwiKTtcbiAgICB0aGlzLmltYWdlRGF0YSA9IG51bGw7XG4gICAgdGhpcy5yZWN0YW5nbGUgPSByZWN0YW5nbGU7XG4gICAgdGhpcy5jcmVhdGVJbWFnZURhdGEocmVjdGFuZ2xlKTtcblxuICAgIHRoaXMubmFtZSA9IFwiUGl4ZWxSZW5kZXJlclwiO1xuICB9XG5cbiAgcmVzaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB0aGlzLmVsZW1lbnQud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmVsZW1lbnQuaGVpZ2h0ID0gaGVpZ2h0O1xuICB9XG5cbiAgY3JlYXRlSW1hZ2VEYXRhKHJlY3RhbmdsZSkge1xuICAgIHRoaXMucmVjdGFuZ2xlID0gcmVjdGFuZ2xlID8gcmVjdGFuZ2xlIDogbmV3IFJlY3RhbmdsZSgwLCAwLCB0aGlzLmVsZW1lbnQud2lkdGgsIHRoaXMuZWxlbWVudC5oZWlnaHQpO1xuICAgIHRoaXMuaW1hZ2VEYXRhID0gdGhpcy5jb250ZXh0LmNyZWF0ZUltYWdlRGF0YSh0aGlzLnJlY3RhbmdsZS53aWR0aCwgdGhpcy5yZWN0YW5nbGUuaGVpZ2h0KTtcbiAgICB0aGlzLmNvbnRleHQucHV0SW1hZ2VEYXRhKHRoaXMuaW1hZ2VEYXRhLCB0aGlzLnJlY3RhbmdsZS54LCB0aGlzLnJlY3RhbmdsZS55KTtcbiAgfVxuXG4gIG9uUHJvdG9uVXBkYXRlKCkge1xuICAgIHRoaXMuY29udGV4dC5jbGVhclJlY3QodGhpcy5yZWN0YW5nbGUueCwgdGhpcy5yZWN0YW5nbGUueSwgdGhpcy5yZWN0YW5nbGUud2lkdGgsIHRoaXMucmVjdGFuZ2xlLmhlaWdodCk7XG4gICAgdGhpcy5pbWFnZURhdGEgPSB0aGlzLmNvbnRleHQuZ2V0SW1hZ2VEYXRhKFxuICAgICAgdGhpcy5yZWN0YW5nbGUueCxcbiAgICAgIHRoaXMucmVjdGFuZ2xlLnksXG4gICAgICB0aGlzLnJlY3RhbmdsZS53aWR0aCxcbiAgICAgIHRoaXMucmVjdGFuZ2xlLmhlaWdodFxuICAgICk7XG4gIH1cblxuICBvblByb3RvblVwZGF0ZUFmdGVyKCkge1xuICAgIHRoaXMuY29udGV4dC5wdXRJbWFnZURhdGEodGhpcy5pbWFnZURhdGEsIHRoaXMucmVjdGFuZ2xlLngsIHRoaXMucmVjdGFuZ2xlLnkpO1xuICB9XG5cbiAgb25QYXJ0aWNsZUNyZWF0ZWQocGFydGljbGUpIHt9XG5cbiAgb25QYXJ0aWNsZVVwZGF0ZShwYXJ0aWNsZSkge1xuICAgIGlmICh0aGlzLmltYWdlRGF0YSkge1xuICAgICAgdGhpcy5zZXRQaXhlbChcbiAgICAgICAgdGhpcy5pbWFnZURhdGEsXG4gICAgICAgIChwYXJ0aWNsZS5wLnggLSB0aGlzLnJlY3RhbmdsZS54KSA+PiAwLFxuICAgICAgICAocGFydGljbGUucC55IC0gdGhpcy5yZWN0YW5nbGUueSkgPj4gMCxcbiAgICAgICAgcGFydGljbGVcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc2V0UGl4ZWwoaW1hZ2VkYXRhLCB4LCB5LCBwYXJ0aWNsZSkge1xuICAgIGNvbnN0IHJnYiA9IHBhcnRpY2xlLnJnYjtcbiAgICBpZiAoeCA8IDAgfHwgeCA+IHRoaXMuZWxlbWVudC53aWR0aCB8fCB5IDwgMCB8fCB5ID4gdGhpcy5lbGVtZW50LmhlaWdodCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaSA9ICgoeSA+PiAwKSAqIGltYWdlZGF0YS53aWR0aCArICh4ID4+IDApKSAqIDQ7XG4gICAgaW1hZ2VkYXRhLmRhdGFbaV0gPSByZ2IucjtcbiAgICBpbWFnZWRhdGEuZGF0YVtpICsgMV0gPSByZ2IuZztcbiAgICBpbWFnZWRhdGEuZGF0YVtpICsgMl0gPSByZ2IuYjtcbiAgICBpbWFnZWRhdGEuZGF0YVtpICsgM10gPSBwYXJ0aWNsZS5hbHBoYSAqIDI1NTtcbiAgfVxuXG4gIG9uUGFydGljbGVEZWFkKHBhcnRpY2xlKSB7fVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGUgcmVuZGVyZXIgYW5kIGNsZWFucyB1cCByZXNvdXJjZXMuXG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLnN0cm9rZSA9IG51bGw7XG4gICAgdGhpcy5jb250ZXh0ID0gbnVsbDtcbiAgICB0aGlzLmltYWdlRGF0YSA9IG51bGw7XG4gICAgdGhpcy5yZWN0YW5nbGUgPSBudWxsO1xuICB9XG59XG4iLCJpbXBvcnQgVHlwZXMgZnJvbSBcIi4uL3V0aWxzL1R5cGVzXCI7XG5pbXBvcnQgQ29sb3JVdGlsIGZyb20gXCIuLi91dGlscy9Db2xvclV0aWxcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuaW1wb3J0IEJhc2VSZW5kZXJlciBmcm9tIFwiLi9CYXNlUmVuZGVyZXJcIjtcblxubGV0IFBJWElDbGFzcztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgUElYSS1iYXNlZCByZW5kZXJlciBmb3IgcGFydGljbGUgc3lzdGVtcy5cbiAqIEBleHRlbmRzIEJhc2VSZW5kZXJlclxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQaXhpUmVuZGVyZXIgZXh0ZW5kcyBCYXNlUmVuZGVyZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBQaXhpUmVuZGVyZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7UElYSS5Db250YWluZXJ9IGVsZW1lbnQgLSBUaGUgUElYSSBjb250YWluZXIgdG8gcmVuZGVyIHRvLlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtzdHJva2VdIC0gVGhlIHN0cm9rZSBjb2xvciBmb3IgcGFydGljbGVzLlxuICAgKi9cbiAgY29uc3RydWN0b3IoZWxlbWVudCwgc3Ryb2tlKSB7XG4gICAgc3VwZXIoZWxlbWVudCk7XG5cbiAgICB0aGlzLnN0cm9rZSA9IHN0cm9rZTtcbiAgICB0aGlzLmNvbG9yID0gZmFsc2U7XG4gICAgdGhpcy5zZXRDb2xvciA9IGZhbHNlO1xuICAgIHRoaXMuYmxlbmRNb2RlID0gbnVsbDtcbiAgICB0aGlzLnBvb2wuY3JlYXRlID0gKGJvZHksIHBhcnRpY2xlKSA9PiB0aGlzLmNyZWF0ZUJvZHkoYm9keSwgcGFydGljbGUpO1xuICAgIHRoaXMuc2V0UElYSSh3aW5kb3cuUElYSSk7XG5cbiAgICB0aGlzLm5hbWUgPSBcIlBpeGlSZW5kZXJlclwiO1xuICB9XG5cbiAgc2V0UElYSShQSVhJKSB7XG4gICAgdHJ5IHtcbiAgICAgIFBJWElDbGFzcyA9IFBJWEkgfHwgeyBTcHJpdGU6IHt9IH07XG4gICAgICB0aGlzLmNyZWF0ZUZyb21JbWFnZSA9IFBJWElDbGFzcy5TcHJpdGUuZnJvbSB8fCBQSVhJQ2xhc3MuU3ByaXRlLmZyb21JbWFnZTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9XG5cbiAgb25Qcm90b25VcGRhdGUoKSB7fVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gcGFydGljbGVcbiAgICovXG4gIG9uUGFydGljbGVDcmVhdGVkKHBhcnRpY2xlKSB7XG4gICAgaWYgKHBhcnRpY2xlLmJvZHkpIHtcbiAgICAgIHBhcnRpY2xlLmJvZHkgPSB0aGlzLnBvb2wuZ2V0KHBhcnRpY2xlLmJvZHksIHBhcnRpY2xlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFydGljbGUuYm9keSA9IHRoaXMucG9vbC5nZXQodGhpcy5jaXJjbGVDb25mLCBwYXJ0aWNsZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYmxlbmRNb2RlKSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5LmJsZW5kTW9kZSA9IHRoaXMuYmxlbmRNb2RlO1xuICAgIH1cblxuICAgIHRoaXMuZWxlbWVudC5hZGRDaGlsZChwYXJ0aWNsZS5ib2R5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gcGFydGljbGVcbiAgICovXG4gIG9uUGFydGljbGVVcGRhdGUocGFydGljbGUpIHtcbiAgICB0aGlzLnRyYW5zZm9ybShwYXJ0aWNsZSwgcGFydGljbGUuYm9keSk7XG5cbiAgICBpZiAodGhpcy5zZXRDb2xvciA9PT0gdHJ1ZSB8fCB0aGlzLmNvbG9yID09PSB0cnVlKSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5LnRpbnQgPSBDb2xvclV0aWwuZ2V0SGV4MTZGcm9tUGFydGljbGUocGFydGljbGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gcGFydGljbGVcbiAgICovXG4gIG9uUGFydGljbGVEZWFkKHBhcnRpY2xlKSB7XG4gICAgdGhpcy5lbGVtZW50LnJlbW92ZUNoaWxkKHBhcnRpY2xlLmJvZHkpO1xuICAgIHRoaXMucG9vbC5leHBpcmUocGFydGljbGUuYm9keSk7XG4gICAgcGFydGljbGUuYm9keSA9IG51bGw7XG4gIH1cblxuICB0cmFuc2Zvcm0ocGFydGljbGUsIHRhcmdldCkge1xuICAgIHRhcmdldC54ID0gcGFydGljbGUucC54O1xuICAgIHRhcmdldC55ID0gcGFydGljbGUucC55O1xuXG4gICAgdGFyZ2V0LmFscGhhID0gcGFydGljbGUuYWxwaGE7XG5cbiAgICB0YXJnZXQuc2NhbGUueCA9IHBhcnRpY2xlLnNjYWxlO1xuICAgIHRhcmdldC5zY2FsZS55ID0gcGFydGljbGUuc2NhbGU7XG5cbiAgICAvLyB1c2luZyBjYWNoZWQgdmVyc2lvbiBvZiBNYXRoVXRpbC5QSV8xODAgZm9yIHNsaWdodCBwZXJmb3JtYW5jZSBpbmNyZWFzZS5cbiAgICB0YXJnZXQucm90YXRpb24gPSBwYXJ0aWNsZS5yb3RhdGlvbiAqIE1hdGhVdGlsLlBJXzE4MDsgLy8gTWF0aFV0aWwuUElfMTgwO1xuICB9XG5cbiAgY3JlYXRlQm9keShib2R5LCBwYXJ0aWNsZSkge1xuICAgIGlmIChib2R5LmlzQ2lyY2xlKSByZXR1cm4gdGhpcy5jcmVhdGVDaXJjbGUocGFydGljbGUpO1xuICAgIGVsc2UgcmV0dXJuIHRoaXMuY3JlYXRlU3ByaXRlKGJvZHkpO1xuICB9XG5cbiAgY3JlYXRlU3ByaXRlKGJvZHkpIHtcbiAgICBjb25zdCBzcHJpdGUgPSBib2R5LmlzSW5uZXIgPyB0aGlzLmNyZWF0ZUZyb21JbWFnZShib2R5LnNyYykgOiBuZXcgUElYSUNsYXNzLlNwcml0ZShib2R5KTtcblxuICAgIHNwcml0ZS5hbmNob3IueCA9IDAuNTtcbiAgICBzcHJpdGUuYW5jaG9yLnkgPSAwLjU7XG5cbiAgICByZXR1cm4gc3ByaXRlO1xuICB9XG5cbiAgY3JlYXRlQ2lyY2xlKHBhcnRpY2xlKSB7XG4gICAgY29uc3QgZ3JhcGhpY3MgPSBuZXcgUElYSUNsYXNzLkdyYXBoaWNzKCk7XG5cbiAgICBpZiAodGhpcy5zdHJva2UpIHtcbiAgICAgIGNvbnN0IHN0cm9rZSA9IFR5cGVzLmlzU3RyaW5nKHRoaXMuc3Ryb2tlKSA/IHRoaXMuc3Ryb2tlIDogMHgwMDAwMDA7XG4gICAgICBncmFwaGljcy5iZWdpblN0cm9rZShzdHJva2UpO1xuICAgIH1cblxuICAgIGdyYXBoaWNzLmJlZ2luRmlsbChwYXJ0aWNsZS5jb2xvciB8fCAweDAwOGNlZCk7XG4gICAgZ3JhcGhpY3MuZHJhd0NpcmNsZSgwLCAwLCBwYXJ0aWNsZS5yYWRpdXMpO1xuICAgIGdyYXBoaWNzLmVuZEZpbGwoKTtcblxuICAgIHJldHVybiBncmFwaGljcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGUgcmVuZGVyZXIgYW5kIGNsZWFucyB1cCByZXNvdXJjZXMuXG4gICAqIEBwYXJhbSB7QXJyYXk8UGFydGljbGU+fSBwYXJ0aWNsZXMgLSBUaGUgcGFydGljbGVzIHRvIGNsZWFuIHVwLlxuICAgKi9cbiAgZGVzdHJveShwYXJ0aWNsZXMpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG5cbiAgICBsZXQgaSA9IHBhcnRpY2xlcy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgbGV0IHBhcnRpY2xlID0gcGFydGljbGVzW2ldO1xuICAgICAgaWYgKHBhcnRpY2xlLmJvZHkpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUNoaWxkKHBhcnRpY2xlLmJvZHkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IE1hdDMgZnJvbSBcIi4uL21hdGgvTWF0M1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNU3RhY2sge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm1hdHMgPSBbXTtcbiAgICB0aGlzLnNpemUgPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyMDsgaSsrKSB0aGlzLm1hdHMucHVzaChNYXQzLmNyZWF0ZShbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF0pKTtcbiAgfVxuXG4gIHNldChtLCBpKSB7XG4gICAgaWYgKGkgPT09IDApIE1hdDMuc2V0KG0sIHRoaXMubWF0c1swXSk7XG4gICAgZWxzZSBNYXQzLm11bHRpcGx5KHRoaXMubWF0c1tpIC0gMV0sIG0sIHRoaXMubWF0c1tpXSk7XG5cbiAgICB0aGlzLnNpemUgPSBNYXRoLm1heCh0aGlzLnNpemUsIGkgKyAxKTtcbiAgfVxuXG4gIHB1c2gobSkge1xuICAgIGlmICh0aGlzLnNpemUgPT09IDApIE1hdDMuc2V0KG0sIHRoaXMubWF0c1swXSk7XG4gICAgZWxzZSBNYXQzLm11bHRpcGx5KHRoaXMubWF0c1t0aGlzLnNpemUgLSAxXSwgbSwgdGhpcy5tYXRzW3RoaXMuc2l6ZV0pO1xuXG4gICAgdGhpcy5zaXplKys7XG4gIH1cblxuICBwb3AoKSB7XG4gICAgaWYgKHRoaXMuc2l6ZSA+IDApIHRoaXMuc2l6ZS0tO1xuICB9XG5cbiAgdG9wKCkge1xuICAgIHJldHVybiB0aGlzLm1hdHNbdGhpcy5zaXplIC0gMV07XG4gIH1cbn1cbiIsImltcG9ydCBNYXQzIGZyb20gXCIuLi9tYXRoL01hdDNcIjtcbmltcG9ydCBCYXNlUmVuZGVyZXIgZnJvbSBcIi4vQmFzZVJlbmRlcmVyXCI7XG5cbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgSW1nVXRpbCBmcm9tIFwiLi4vdXRpbHMvSW1nVXRpbFwiO1xuaW1wb3J0IE1TdGFjayBmcm9tIFwiLi4vdXRpbHMvTVN0YWNrXCI7XG5pbXBvcnQgRG9tVXRpbCBmcm9tIFwiLi4vdXRpbHMvRG9tVXRpbFwiO1xuaW1wb3J0IFdlYkdMVXRpbCBmcm9tIFwiLi4vdXRpbHMvV2ViR0xVdGlsXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgV2ViR0wtYmFzZWQgcmVuZGVyZXIgZm9yIHBhcnRpY2xlIHN5c3RlbXMuXG4gKiBAZXh0ZW5kcyBCYXNlUmVuZGVyZXJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2ViR0xSZW5kZXJlciBleHRlbmRzIEJhc2VSZW5kZXJlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFdlYkdMUmVuZGVyZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgY2FudmFzIGVsZW1lbnQgdG8gcmVuZGVyIHRvLlxuICAgKi9cbiAgY29uc3RydWN0b3IoZWxlbWVudCkge1xuICAgIHN1cGVyKGVsZW1lbnQpO1xuXG4gICAgdGhpcy5nbCA9IHRoaXMuZWxlbWVudC5nZXRDb250ZXh0KFwiZXhwZXJpbWVudGFsLXdlYmdsXCIsIHsgYW50aWFsaWFzOiB0cnVlLCBzdGVuY2lsOiBmYWxzZSwgZGVwdGg6IGZhbHNlIH0pO1xuICAgIGlmICghdGhpcy5nbCkgYWxlcnQoXCJTb3JyeSB5b3VyIGJyb3dzZXIgZG8gbm90IHN1cHBlc3QgV2ViR0whXCIpO1xuXG4gICAgdGhpcy5pbml0VmFyKCk7XG4gICAgdGhpcy5zZXRNYXhSYWRpdXMoKTtcbiAgICB0aGlzLmluaXRTaGFkZXJzKCk7XG4gICAgdGhpcy5pbml0QnVmZmVycygpO1xuXG4gICAgdGhpcy5nbC5ibGVuZEVxdWF0aW9uKHRoaXMuZ2wuRlVOQ19BREQpO1xuICAgIHRoaXMuZ2wuYmxlbmRGdW5jKHRoaXMuZ2wuU1JDX0FMUEhBLCB0aGlzLmdsLk9ORV9NSU5VU19TUkNfQUxQSEEpO1xuICAgIHRoaXMuZ2wuZW5hYmxlKHRoaXMuZ2wuQkxFTkQpO1xuICAgIHRoaXMuYWRkSW1nMkJvZHkgPSB0aGlzLmFkZEltZzJCb2R5LmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLm5hbWUgPSBcIldlYkdMUmVuZGVyZXJcIjtcbiAgfVxuXG4gIGluaXQocHJvdG9uKSB7XG4gICAgc3VwZXIuaW5pdChwcm90b24pO1xuICAgIHRoaXMucmVzaXplKHRoaXMuZWxlbWVudC53aWR0aCwgdGhpcy5lbGVtZW50LmhlaWdodCk7XG4gIH1cblxuICByZXNpemUod2lkdGgsIGhlaWdodCkge1xuICAgIHRoaXMudW1hdFs0XSA9IC0yO1xuICAgIHRoaXMudW1hdFs3XSA9IDE7XG5cbiAgICB0aGlzLnNtYXRbMF0gPSAxIC8gd2lkdGg7XG4gICAgdGhpcy5zbWF0WzRdID0gMSAvIGhlaWdodDtcblxuICAgIHRoaXMubXN0YWNrLnNldCh0aGlzLnVtYXQsIDApO1xuICAgIHRoaXMubXN0YWNrLnNldCh0aGlzLnNtYXQsIDEpO1xuXG4gICAgdGhpcy5nbC52aWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB0aGlzLmVsZW1lbnQud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmVsZW1lbnQuaGVpZ2h0ID0gaGVpZ2h0O1xuICB9XG5cbiAgc2V0TWF4UmFkaXVzKHJhZGl1cykge1xuICAgIHRoaXMuY2lyY2xlQ2FudmFzVVJMID0gdGhpcy5jcmVhdGVDaXJjbGUocmFkaXVzKTtcbiAgfVxuXG4gIGdldFZlcnRleFNoYWRlcigpIHtcbiAgICBjb25zdCB2c1NvdXJjZSA9IFtcbiAgICAgIFwidW5pZm9ybSB2ZWMyIHZpZXdwb3J0O1wiLFxuICAgICAgXCJhdHRyaWJ1dGUgdmVjMiBhVmVydGV4UG9zaXRpb247XCIsXG4gICAgICBcImF0dHJpYnV0ZSB2ZWMyIGFUZXh0dXJlQ29vcmQ7XCIsXG4gICAgICBcInVuaWZvcm0gbWF0MyB0TWF0O1wiLFxuICAgICAgXCJ2YXJ5aW5nIHZlYzIgdlRleHR1cmVDb29yZDtcIixcbiAgICAgIFwidmFyeWluZyBmbG9hdCBhbHBoYTtcIixcbiAgICAgIFwidm9pZCBtYWluKCkge1wiLFxuICAgICAgXCJ2ZWMzIHYgPSB0TWF0ICogdmVjMyhhVmVydGV4UG9zaXRpb24sIDEuMCk7XCIsXG4gICAgICBcImdsX1Bvc2l0aW9uID0gdmVjNCh2LngsIHYueSwgMCwgMSk7XCIsXG4gICAgICBcInZUZXh0dXJlQ29vcmQgPSBhVGV4dHVyZUNvb3JkO1wiLFxuICAgICAgXCJhbHBoYSA9IHRNYXRbMF1bMl07XCIsXG4gICAgICBcIn1cIlxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgICByZXR1cm4gdnNTb3VyY2U7XG4gIH1cblxuICBnZXRGcmFnbWVudFNoYWRlcigpIHtcbiAgICBjb25zdCBmc1NvdXJjZSA9IFtcbiAgICAgIFwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XCIsXG4gICAgICBcInZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1wiLFxuICAgICAgXCJ2YXJ5aW5nIGZsb2F0IGFscGhhO1wiLFxuICAgICAgXCJ1bmlmb3JtIHNhbXBsZXIyRCB1U2FtcGxlcjtcIixcbiAgICAgIFwidW5pZm9ybSB2ZWM0IGNvbG9yO1wiLFxuICAgICAgXCJ1bmlmb3JtIGJvb2wgdXNlVGV4dHVyZTtcIixcbiAgICAgIFwidW5pZm9ybSB2ZWMzIHVDb2xvcjtcIixcbiAgICAgIFwidm9pZCBtYWluKCkge1wiLFxuICAgICAgXCJ2ZWM0IHRleHR1cmVDb2xvciA9IHRleHR1cmUyRCh1U2FtcGxlciwgdlRleHR1cmVDb29yZCk7XCIsXG4gICAgICBcImdsX0ZyYWdDb2xvciA9IHRleHR1cmVDb2xvciAqIHZlYzQodUNvbG9yLCAxLjApO1wiLFxuICAgICAgXCJnbF9GcmFnQ29sb3IudyAqPSBhbHBoYTtcIixcbiAgICAgIFwifVwiXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIHJldHVybiBmc1NvdXJjZTtcbiAgfVxuXG4gIGluaXRWYXIoKSB7XG4gICAgdGhpcy5tc3RhY2sgPSBuZXcgTVN0YWNrKCk7XG4gICAgdGhpcy51bWF0ID0gTWF0My5jcmVhdGUoWzIsIDAsIDEsIDAsIC0yLCAwLCAtMSwgMSwgMV0pO1xuICAgIHRoaXMuc21hdCA9IE1hdDMuY3JlYXRlKFsxIC8gMTAwLCAwLCAxLCAwLCAxIC8gMTAwLCAwLCAwLCAwLCAxXSk7XG4gICAgdGhpcy50ZXh0dXJlYnVmZmVycyA9IHt9O1xuICB9XG5cbiAgYmxlbmRFcXVhdGlvbihBKSB7XG4gICAgdGhpcy5nbC5ibGVuZEVxdWF0aW9uKHRoaXMuZ2xbQV0pO1xuICB9XG5cbiAgYmxlbmRGdW5jKEEsIEIpIHtcbiAgICB0aGlzLmdsLmJsZW5kRnVuYyh0aGlzLmdsW0FdLCB0aGlzLmdsW0JdKTtcbiAgfVxuXG4gIGdldFNoYWRlcihnbCwgc3RyLCBmcykge1xuICAgIGNvbnN0IHNoYWRlciA9IGZzID8gZ2wuY3JlYXRlU2hhZGVyKGdsLkZSQUdNRU5UX1NIQURFUikgOiBnbC5jcmVhdGVTaGFkZXIoZ2wuVkVSVEVYX1NIQURFUik7XG5cbiAgICBnbC5zaGFkZXJTb3VyY2Uoc2hhZGVyLCBzdHIpO1xuICAgIGdsLmNvbXBpbGVTaGFkZXIoc2hhZGVyKTtcblxuICAgIGlmICghZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpKSB7XG4gICAgICBhbGVydChnbC5nZXRTaGFkZXJJbmZvTG9nKHNoYWRlcikpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNoYWRlcjtcbiAgfVxuXG4gIGluaXRTaGFkZXJzKCkge1xuICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyID0gdGhpcy5nZXRTaGFkZXIodGhpcy5nbCwgdGhpcy5nZXRGcmFnbWVudFNoYWRlcigpLCB0cnVlKTtcbiAgICBjb25zdCB2ZXJ0ZXhTaGFkZXIgPSB0aGlzLmdldFNoYWRlcih0aGlzLmdsLCB0aGlzLmdldFZlcnRleFNoYWRlcigpLCBmYWxzZSk7XG5cbiAgICB0aGlzLnNwcm9ncmFtID0gdGhpcy5nbC5jcmVhdGVQcm9ncmFtKCk7XG4gICAgdGhpcy5nbC5hdHRhY2hTaGFkZXIodGhpcy5zcHJvZ3JhbSwgdmVydGV4U2hhZGVyKTtcbiAgICB0aGlzLmdsLmF0dGFjaFNoYWRlcih0aGlzLnNwcm9ncmFtLCBmcmFnbWVudFNoYWRlcik7XG4gICAgdGhpcy5nbC5saW5rUHJvZ3JhbSh0aGlzLnNwcm9ncmFtKTtcblxuICAgIGlmICghdGhpcy5nbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHRoaXMuc3Byb2dyYW0sIHRoaXMuZ2wuTElOS19TVEFUVVMpKSBhbGVydChcIkNvdWxkIG5vdCBpbml0aWFsaXNlIHNoYWRlcnNcIik7XG5cbiAgICB0aGlzLmdsLnVzZVByb2dyYW0odGhpcy5zcHJvZ3JhbSk7XG4gICAgdGhpcy5zcHJvZ3JhbS52cGEgPSB0aGlzLmdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMuc3Byb2dyYW0sIFwiYVZlcnRleFBvc2l0aW9uXCIpO1xuICAgIHRoaXMuc3Byb2dyYW0udGNhID0gdGhpcy5nbC5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLnNwcm9ncmFtLCBcImFUZXh0dXJlQ29vcmRcIik7XG4gICAgdGhpcy5nbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0aGlzLnNwcm9ncmFtLnRjYSk7XG4gICAgdGhpcy5nbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0aGlzLnNwcm9ncmFtLnZwYSk7XG5cbiAgICB0aGlzLnNwcm9ncmFtLnRNYXRVbmlmb3JtID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5zcHJvZ3JhbSwgXCJ0TWF0XCIpO1xuICAgIHRoaXMuc3Byb2dyYW0uc2FtcGxlclVuaWZvcm0gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnNwcm9ncmFtLCBcInVTYW1wbGVyXCIpO1xuICAgIHRoaXMuc3Byb2dyYW0udXNlVGV4ID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5zcHJvZ3JhbSwgXCJ1c2VUZXh0dXJlXCIpO1xuICAgIHRoaXMuc3Byb2dyYW0uY29sb3IgPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnNwcm9ncmFtLCBcInVDb2xvclwiKTtcbiAgICB0aGlzLmdsLnVuaWZvcm0xaSh0aGlzLnNwcm9ncmFtLnVzZVRleCwgMSk7XG4gIH1cblxuICBpbml0QnVmZmVycygpIHtcbiAgICBjb25zdCB2cyA9IFswLCAzLCAxLCAwLCAyLCAzXTtcbiAgICBsZXQgaWR4O1xuXG4gICAgdGhpcy51bml0SUJ1ZmZlciA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMudW5pdElCdWZmZXIpO1xuICAgIHRoaXMuZ2wuYnVmZmVyRGF0YSh0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBuZXcgVWludDE2QXJyYXkodnMpLCB0aGlzLmdsLlNUQVRJQ19EUkFXKTtcblxuICAgIGxldCBpO1xuICAgIGxldCBpZHMgPSBbXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIGlkcy5wdXNoKGkpO1xuICAgIGlkeCA9IG5ldyBVaW50MTZBcnJheShpZHMpO1xuXG4gICAgdGhpcy51bml0STMzID0gdGhpcy5nbC5jcmVhdGVCdWZmZXIoKTtcbiAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy51bml0STMzKTtcbiAgICB0aGlzLmdsLmJ1ZmZlckRhdGEodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgaWR4LCB0aGlzLmdsLlNUQVRJQ19EUkFXKTtcblxuICAgIGlkcyA9IFtdO1xuICAgIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgaWRzLnB1c2goaSwgaSArIDEsIGkgKyAyKTtcbiAgICBpZHggPSBuZXcgVWludDE2QXJyYXkoaWRzKTtcblxuICAgIHRoaXMuc3RyaXBCdWZmZXIgPSB0aGlzLmdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLnN0cmlwQnVmZmVyKTtcbiAgICB0aGlzLmdsLmJ1ZmZlckRhdGEodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgaWR4LCB0aGlzLmdsLlNUQVRJQ19EUkFXKTtcbiAgfVxuXG4gIGNyZWF0ZUNpcmNsZShyYWlkdXMpIHtcbiAgICB0aGlzLmNpcmNsZUNhbnZhc1JhZGl1cyA9IFdlYkdMVXRpbC5uaHBvdChVdGlsLmluaXRWYWx1ZShyYWlkdXMsIDMyKSk7XG4gICAgY29uc3QgY2FudmFzID0gRG9tVXRpbC5jcmVhdGVDYW52YXMoXCJjaXJjbGVfY2FudmFzXCIsIHRoaXMuY2lyY2xlQ2FudmFzUmFkaXVzICogMiwgdGhpcy5jaXJjbGVDYW52YXNSYWRpdXMgKiAyKTtcbiAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcblxuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgY29udGV4dC5hcmModGhpcy5jaXJjbGVDYW52YXNSYWRpdXMsIHRoaXMuY2lyY2xlQ2FudmFzUmFkaXVzLCB0aGlzLmNpcmNsZUNhbnZhc1JhZGl1cywgMCwgTWF0aC5QSSAqIDIsIHRydWUpO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBcIiNGRkZcIjtcbiAgICBjb250ZXh0LmZpbGwoKTtcblxuICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKCk7XG4gIH1cblxuICBkcmF3SW1nMkNhbnZhcyhwYXJ0aWNsZSkge1xuICAgIGNvbnN0IF93ID0gcGFydGljbGUuYm9keS53aWR0aDtcbiAgICBjb25zdCBfaCA9IHBhcnRpY2xlLmJvZHkuaGVpZ2h0O1xuXG4gICAgY29uc3QgX3dpZHRoID0gV2ViR0xVdGlsLm5ocG90KHBhcnRpY2xlLmJvZHkud2lkdGgpO1xuICAgIGNvbnN0IF9oZWlnaHQgPSBXZWJHTFV0aWwubmhwb3QocGFydGljbGUuYm9keS5oZWlnaHQpO1xuXG4gICAgY29uc3QgX3NjYWxlWCA9IHBhcnRpY2xlLmJvZHkud2lkdGggLyBfd2lkdGg7XG4gICAgY29uc3QgX3NjYWxlWSA9IHBhcnRpY2xlLmJvZHkuaGVpZ2h0IC8gX2hlaWdodDtcblxuICAgIGlmICghdGhpcy50ZXh0dXJlYnVmZmVyc1twYXJ0aWNsZS5kYXRhLnNyY10pXG4gICAgICB0aGlzLnRleHR1cmVidWZmZXJzW3BhcnRpY2xlLmRhdGEuc3JjXSA9IFtcbiAgICAgICAgdGhpcy5nbC5jcmVhdGVUZXh0dXJlKCksXG4gICAgICAgIHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCksXG4gICAgICAgIHRoaXMuZ2wuY3JlYXRlQnVmZmVyKClcbiAgICAgIF07XG5cbiAgICBwYXJ0aWNsZS5kYXRhLnRleHR1cmUgPSB0aGlzLnRleHR1cmVidWZmZXJzW3BhcnRpY2xlLmRhdGEuc3JjXVswXTtcbiAgICBwYXJ0aWNsZS5kYXRhLnZjQnVmZmVyID0gdGhpcy50ZXh0dXJlYnVmZmVyc1twYXJ0aWNsZS5kYXRhLnNyY11bMV07XG4gICAgcGFydGljbGUuZGF0YS50Y0J1ZmZlciA9IHRoaXMudGV4dHVyZWJ1ZmZlcnNbcGFydGljbGUuZGF0YS5zcmNdWzJdO1xuXG4gICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCBwYXJ0aWNsZS5kYXRhLnRjQnVmZmVyKTtcbiAgICB0aGlzLmdsLmJ1ZmZlckRhdGEoXG4gICAgICB0aGlzLmdsLkFSUkFZX0JVRkZFUixcbiAgICAgIG5ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMC4wLCBfc2NhbGVYLCAwLjAsIDAuMCwgX3NjYWxlWSwgX3NjYWxlWSwgX3NjYWxlWV0pLFxuICAgICAgdGhpcy5nbC5TVEFUSUNfRFJBV1xuICAgICk7XG4gICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCBwYXJ0aWNsZS5kYXRhLnZjQnVmZmVyKTtcbiAgICB0aGlzLmdsLmJ1ZmZlckRhdGEoXG4gICAgICB0aGlzLmdsLkFSUkFZX0JVRkZFUixcbiAgICAgIG5ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMC4wLCBfdywgMC4wLCAwLjAsIF9oLCBfdywgX2hdKSxcbiAgICAgIHRoaXMuZ2wuU1RBVElDX0RSQVdcbiAgICApO1xuXG4gICAgY29uc3QgY29udGV4dCA9IHBhcnRpY2xlLmRhdGEuY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICBjb25zdCBkYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgX3dpZHRoLCBfaGVpZ2h0KTtcblxuICAgIHRoaXMuZ2wuYmluZFRleHR1cmUodGhpcy5nbC5URVhUVVJFXzJELCBwYXJ0aWNsZS5kYXRhLnRleHR1cmUpO1xuICAgIHRoaXMuZ2wudGV4SW1hZ2UyRCh0aGlzLmdsLlRFWFRVUkVfMkQsIDAsIHRoaXMuZ2wuUkdCQSwgdGhpcy5nbC5SR0JBLCB0aGlzLmdsLlVOU0lHTkVEX0JZVEUsIGRhdGEpO1xuICAgIHRoaXMuZ2wudGV4UGFyYW1ldGVyaSh0aGlzLmdsLlRFWFRVUkVfMkQsIHRoaXMuZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCB0aGlzLmdsLkxJTkVBUik7XG4gICAgdGhpcy5nbC50ZXhQYXJhbWV0ZXJpKHRoaXMuZ2wuVEVYVFVSRV8yRCwgdGhpcy5nbC5URVhUVVJFX01JTl9GSUxURVIsIHRoaXMuZ2wuTElORUFSX01JUE1BUF9ORUFSRVNUKTtcbiAgICB0aGlzLmdsLmdlbmVyYXRlTWlwbWFwKHRoaXMuZ2wuVEVYVFVSRV8yRCk7XG5cbiAgICBwYXJ0aWNsZS5kYXRhLnRleHR1cmVMb2FkZWQgPSB0cnVlO1xuICAgIHBhcnRpY2xlLmRhdGEudGV4dHVyZVdpZHRoID0gX3c7XG4gICAgcGFydGljbGUuZGF0YS50ZXh0dXJlSGVpZ2h0ID0gX2g7XG4gIH1cblxuICBvblByb3RvblVwZGF0ZSgpIHtcbiAgICAvLyB0aGlzLmdsLmNsZWFyQ29sb3IoMCwgMCwgMCwgMSk7XG4gICAgLy8gdGhpcy5nbC5jbGVhcih0aGlzLmdsLkNPTE9SX0JVRkZFUl9CSVQgfCB0aGlzLmdsLkRFUFRIX0JVRkZFUl9CSVQpO1xuICB9XG5cbiAgb25QYXJ0aWNsZUNyZWF0ZWQocGFydGljbGUpIHtcbiAgICBwYXJ0aWNsZS5kYXRhLnRleHR1cmVMb2FkZWQgPSBmYWxzZTtcbiAgICBwYXJ0aWNsZS5kYXRhLnRtYXQgPSBNYXQzLmNyZWF0ZSgpO1xuICAgIHBhcnRpY2xlLmRhdGEudG1hdFs4XSA9IDE7XG4gICAgcGFydGljbGUuZGF0YS5pbWF0ID0gTWF0My5jcmVhdGUoKTtcbiAgICBwYXJ0aWNsZS5kYXRhLmltYXRbOF0gPSAxO1xuXG4gICAgaWYgKHBhcnRpY2xlLmJvZHkpIHtcbiAgICAgIEltZ1V0aWwuZ2V0SW1nRnJvbUNhY2hlKHBhcnRpY2xlLmJvZHksIHRoaXMuYWRkSW1nMkJvZHksIHBhcnRpY2xlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgSW1nVXRpbC5nZXRJbWdGcm9tQ2FjaGUodGhpcy5jaXJjbGVDYW52YXNVUkwsIHRoaXMuYWRkSW1nMkJvZHksIHBhcnRpY2xlKTtcbiAgICAgIHBhcnRpY2xlLmRhdGEub2xkU2NhbGUgPSBwYXJ0aWNsZS5yYWRpdXMgLyB0aGlzLmNpcmNsZUNhbnZhc1JhZGl1cztcbiAgICB9XG4gIH1cblxuICAvLyBwcml2YXRlXG4gIGFkZEltZzJCb2R5KGltZywgcGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUuZGVhZCkgcmV0dXJuO1xuICAgIHBhcnRpY2xlLmJvZHkgPSBpbWc7XG4gICAgcGFydGljbGUuZGF0YS5zcmMgPSBpbWcuc3JjO1xuICAgIHBhcnRpY2xlLmRhdGEuY2FudmFzID0gSW1nVXRpbC5nZXRDYW52YXNGcm9tQ2FjaGUoaW1nKTtcbiAgICBwYXJ0aWNsZS5kYXRhLm9sZFNjYWxlID0gMTtcblxuICAgIHRoaXMuZHJhd0ltZzJDYW52YXMocGFydGljbGUpO1xuICB9XG5cbiAgb25QYXJ0aWNsZVVwZGF0ZShwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZS5kYXRhLnRleHR1cmVMb2FkZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlTWF0cml4KHBhcnRpY2xlKTtcblxuICAgICAgdGhpcy5nbC51bmlmb3JtM2YodGhpcy5zcHJvZ3JhbS5jb2xvciwgcGFydGljbGUucmdiLnIgLyAyNTUsIHBhcnRpY2xlLnJnYi5nIC8gMjU1LCBwYXJ0aWNsZS5yZ2IuYiAvIDI1NSk7XG4gICAgICB0aGlzLmdsLnVuaWZvcm1NYXRyaXgzZnYodGhpcy5zcHJvZ3JhbS50TWF0VW5pZm9ybSwgZmFsc2UsIHRoaXMubXN0YWNrLnRvcCgpKTtcblxuICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCBwYXJ0aWNsZS5kYXRhLnZjQnVmZmVyKTtcbiAgICAgIHRoaXMuZ2wudmVydGV4QXR0cmliUG9pbnRlcih0aGlzLnNwcm9ncmFtLnZwYSwgMiwgdGhpcy5nbC5GTE9BVCwgZmFsc2UsIDAsIDApO1xuICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCBwYXJ0aWNsZS5kYXRhLnRjQnVmZmVyKTtcbiAgICAgIHRoaXMuZ2wudmVydGV4QXR0cmliUG9pbnRlcih0aGlzLnNwcm9ncmFtLnRjYSwgMiwgdGhpcy5nbC5GTE9BVCwgZmFsc2UsIDAsIDApO1xuICAgICAgdGhpcy5nbC5iaW5kVGV4dHVyZSh0aGlzLmdsLlRFWFRVUkVfMkQsIHBhcnRpY2xlLmRhdGEudGV4dHVyZSk7XG4gICAgICB0aGlzLmdsLnVuaWZvcm0xaSh0aGlzLnNwcm9ncmFtLnNhbXBsZXJVbmlmb3JtLCAwKTtcbiAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLnVuaXRJQnVmZmVyKTtcblxuICAgICAgdGhpcy5nbC5kcmF3RWxlbWVudHModGhpcy5nbC5UUklBTkdMRVMsIDYsIHRoaXMuZ2wuVU5TSUdORURfU0hPUlQsIDApO1xuICAgICAgdGhpcy5tc3RhY2sucG9wKCk7XG4gICAgfVxuICB9XG5cbiAgb25QYXJ0aWNsZURlYWQocGFydGljbGUpIHt9XG5cbiAgdXBkYXRlTWF0cml4KHBhcnRpY2xlKSB7XG4gICAgY29uc3QgbW92ZU9yaWdpbk1hdHJpeCA9IFdlYkdMVXRpbC5tYWtlVHJhbnNsYXRpb24oXG4gICAgICAtcGFydGljbGUuZGF0YS50ZXh0dXJlV2lkdGggLyAyLFxuICAgICAgLXBhcnRpY2xlLmRhdGEudGV4dHVyZUhlaWdodCAvIDJcbiAgICApO1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uTWF0cml4ID0gV2ViR0xVdGlsLm1ha2VUcmFuc2xhdGlvbihwYXJ0aWNsZS5wLngsIHBhcnRpY2xlLnAueSk7XG5cbiAgICBjb25zdCBhbmdlbCA9IHBhcnRpY2xlLnJvdGF0aW9uICogTWF0aFV0aWwuUElfMTgwO1xuICAgIGNvbnN0IHJvdGF0aW9uTWF0cml4ID0gV2ViR0xVdGlsLm1ha2VSb3RhdGlvbihhbmdlbCk7XG5cbiAgICBjb25zdCBzY2FsZSA9IHBhcnRpY2xlLnNjYWxlICogcGFydGljbGUuZGF0YS5vbGRTY2FsZTtcbiAgICBjb25zdCBzY2FsZU1hdHJpeCA9IFdlYkdMVXRpbC5tYWtlU2NhbGUoc2NhbGUsIHNjYWxlKTtcbiAgICBsZXQgbWF0cml4ID0gV2ViR0xVdGlsLm1hdHJpeE11bHRpcGx5KG1vdmVPcmlnaW5NYXRyaXgsIHNjYWxlTWF0cml4KTtcblxuICAgIG1hdHJpeCA9IFdlYkdMVXRpbC5tYXRyaXhNdWx0aXBseShtYXRyaXgsIHJvdGF0aW9uTWF0cml4KTtcbiAgICBtYXRyaXggPSBXZWJHTFV0aWwubWF0cml4TXVsdGlwbHkobWF0cml4LCB0cmFuc2xhdGlvbk1hdHJpeCk7XG5cbiAgICBNYXQzLmludmVyc2UobWF0cml4LCBwYXJ0aWNsZS5kYXRhLmltYXQpO1xuICAgIG1hdHJpeFsyXSA9IHBhcnRpY2xlLmFscGhhO1xuXG4gICAgdGhpcy5tc3RhY2sucHVzaChtYXRyaXgpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5nbCA9IG51bGw7XG4gICAgdGhpcy5tc3RhY2sgPSBudWxsO1xuICAgIHRoaXMudW1hdCA9IG51bGw7XG4gICAgdGhpcy5zbWF0ID0gbnVsbDtcbiAgICB0aGlzLnRleHR1cmVidWZmZXJzID0gbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0IEJhc2VSZW5kZXJlciBmcm9tIFwiLi9CYXNlUmVuZGVyZXJcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY3VzdG9tIHJlbmRlcmVyIHRoYXQgZXh0ZW5kcyB0aGUgQmFzZVJlbmRlcmVyLlxuICogQGV4dGVuZHMgQmFzZVJlbmRlcmVyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN1c3RvbVJlbmRlcmVyIGV4dGVuZHMgQmFzZVJlbmRlcmVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQ3VzdG9tUmVuZGVyZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgSFRNTCBlbGVtZW50IHRvIHJlbmRlciB0by5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQpIHtcbiAgICBzdXBlcihlbGVtZW50KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSByZW5kZXJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMubmFtZSA9IFwiQ3VzdG9tUmVuZGVyZXJcIjtcbiAgfVxufVxuIiwiaW1wb3J0IFpvbmUgZnJvbSBcIi4vWm9uZVwiO1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjJEXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGxpbmUgem9uZSBmb3IgcGFydGljbGUgc3lzdGVtcy5cbiAqIEBleHRlbmRzIFpvbmVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGluZVpvbmUgZXh0ZW5kcyBab25lIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgTGluZVpvbmUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB4MSAtIFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50LlxuICAgKiBAcGFyYW0ge251bWJlcn0geTEgLSBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFt4Ml0gLSBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbeTJdIC0gVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RpcmVjdGlvbj1cIj5cIl0gLSBUaGUgZGlyZWN0aW9uIG9mIHRoZSBsaW5lLlxuICAgKi9cbiAgY29uc3RydWN0b3IoeDEsIHkxLCB4MiwgeTIsIGRpcmVjdGlvbiA9IFwiPlwiKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGlmICh4MiAtIHgxID49IDApIHtcbiAgICAgIHRoaXMueDEgPSB4MTtcbiAgICAgIHRoaXMueTEgPSB5MTtcbiAgICAgIHRoaXMueDIgPSB4MjtcbiAgICAgIHRoaXMueTIgPSB5MjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy54MSA9IHgyO1xuICAgICAgdGhpcy55MSA9IHkyO1xuICAgICAgdGhpcy54MiA9IHgxO1xuICAgICAgdGhpcy55MiA9IHkxO1xuICAgIH1cblxuICAgIHRoaXMuZHggPSB0aGlzLngyIC0gdGhpcy54MTtcbiAgICB0aGlzLmR5ID0gdGhpcy55MiAtIHRoaXMueTE7XG5cbiAgICB0aGlzLm1pbnggPSBNYXRoLm1pbih0aGlzLngxLCB0aGlzLngyKTtcbiAgICB0aGlzLm1pbnkgPSBNYXRoLm1pbih0aGlzLnkxLCB0aGlzLnkyKTtcbiAgICB0aGlzLm1heHggPSBNYXRoLm1heCh0aGlzLngxLCB0aGlzLngyKTtcbiAgICB0aGlzLm1heHkgPSBNYXRoLm1heCh0aGlzLnkxLCB0aGlzLnkyKTtcblxuICAgIHRoaXMuZG90ID0gdGhpcy54MiAqIHRoaXMueTEgLSB0aGlzLngxICogdGhpcy55MjtcbiAgICB0aGlzLnh4eXkgPSB0aGlzLmR4ICogdGhpcy5keCArIHRoaXMuZHkgKiB0aGlzLmR5O1xuXG4gICAgdGhpcy5ncmFkaWVudCA9IHRoaXMuZ2V0R3JhZGllbnQoKTtcbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuZ2V0TGVuZ3RoKCk7XG4gICAgdGhpcy5kaXJlY3Rpb24gPSBVdGlsLmluaXRWYWx1ZShkaXJlY3Rpb24sIFwiPlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmFuZG9tIHBvc2l0aW9uIG9uIHRoZSBsaW5lLlxuICAgKiBAcmV0dXJucyB7VmVjdG9yMkR9IEEgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgcmFuZG9tIHBvc2l0aW9uLlxuICAgKi9cbiAgZ2V0UG9zaXRpb24oKSB7XG4gICAgdGhpcy5yYW5kb20gPSBNYXRoLnJhbmRvbSgpO1xuICAgIHRoaXMudmVjdG9yLnggPSB0aGlzLngxICsgdGhpcy5yYW5kb20gKiB0aGlzLmxlbmd0aCAqIE1hdGguY29zKHRoaXMuZ3JhZGllbnQpO1xuICAgIHRoaXMudmVjdG9yLnkgPSB0aGlzLnkxICsgdGhpcy5yYW5kb20gKiB0aGlzLmxlbmd0aCAqIE1hdGguc2luKHRoaXMuZ3JhZGllbnQpO1xuXG4gICAgcmV0dXJuIHRoaXMudmVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hpY2ggc2lkZSBvZiB0aGUgbGluZSBhIHBvaW50IGlzIG9uLlxuICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LlxuICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcG9pbnQgaXMgb24gdGhlIHBvc2l0aXZlIHNpZGUgb2YgdGhlIGxpbmUsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIGdldERpcmVjdGlvbih4LCB5KSB7XG4gICAgY29uc3QgQSA9IHRoaXMuZHk7XG4gICAgY29uc3QgQiA9IC10aGlzLmR4O1xuICAgIGNvbnN0IEMgPSB0aGlzLmRvdDtcbiAgICBjb25zdCBEID0gQiA9PT0gMCA/IDEgOiBCO1xuXG4gICAgaWYgKChBICogeCArIEIgKiB5ICsgQykgKiBEID4gMCkgcmV0dXJuIHRydWU7XG4gICAgZWxzZSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgZGlzdGFuY2Ugb2YgYSBwb2ludCBmcm9tIHRoZSBsaW5lLlxuICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LlxuICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgcG9pbnQgdG8gdGhlIGxpbmUuXG4gICAqL1xuICBnZXREaXN0YW5jZSh4LCB5KSB7XG4gICAgY29uc3QgQSA9IHRoaXMuZHk7XG4gICAgY29uc3QgQiA9IC10aGlzLmR4O1xuICAgIGNvbnN0IEMgPSB0aGlzLmRvdDtcbiAgICBjb25zdCBEID0gQSAqIHggKyBCICogeSArIEM7XG5cbiAgICByZXR1cm4gRCAvIE1hdGguc3FydCh0aGlzLnh4eXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIHN5bW1ldHJpYyB2ZWN0b3Igb2YgYSBnaXZlbiB2ZWN0b3Igd2l0aCByZXNwZWN0IHRvIHRoZSBsaW5lLlxuICAgKiBAcGFyYW0ge1ZlY3RvcjJEfSB2IC0gVGhlIHZlY3RvciB0byByZWZsZWN0LlxuICAgKiBAcmV0dXJucyB7VmVjdG9yMkR9IFRoZSByZWZsZWN0ZWQgdmVjdG9yLlxuICAgKi9cbiAgZ2V0U3ltbWV0cmljKHYpIHtcbiAgICBjb25zdCB0aGEyID0gdi5nZXRHcmFkaWVudCgpO1xuICAgIGNvbnN0IHRoYTEgPSB0aGlzLmdldEdyYWRpZW50KCk7XG4gICAgY29uc3QgdGhhID0gMiAqICh0aGExIC0gdGhhMik7XG5cbiAgICBjb25zdCBvbGR4ID0gdi54O1xuICAgIGNvbnN0IG9sZHkgPSB2Lnk7XG5cbiAgICB2LnggPSBvbGR4ICogTWF0aC5jb3ModGhhKSAtIG9sZHkgKiBNYXRoLnNpbih0aGEpO1xuICAgIHYueSA9IG9sZHggKiBNYXRoLnNpbih0aGEpICsgb2xkeSAqIE1hdGguY29zKHRoYSk7XG5cbiAgICByZXR1cm4gdjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBncmFkaWVudCAoYW5nbGUpIG9mIHRoZSBsaW5lLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgZ3JhZGllbnQgb2YgdGhlIGxpbmUgaW4gcmFkaWFucy5cbiAgICovXG4gIGdldEdyYWRpZW50KCkge1xuICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMuZHksIHRoaXMuZHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHBhcnRpY2xlIGlzIG91dHNpZGUgdGhlIHJhbmdlIG9mIHRoZSBsaW5lLlxuICAgKiBAcGFyYW0ge1BhcnRpY2xlfSBwYXJ0aWNsZSAtIFRoZSBwYXJ0aWNsZSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBhcnRpY2xlIGlzIHdpdGhpbiByYW5nZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcmFuZ2VPdXQocGFydGljbGUpIHtcbiAgICBjb25zdCBhbmdsZSA9IE1hdGguYWJzKHRoaXMuZ2V0R3JhZGllbnQoKSk7XG5cbiAgICBpZiAoYW5nbGUgPD0gTWF0aFV0aWwuUEkgLyA0KSB7XG4gICAgICBpZiAocGFydGljbGUucC54IDw9IHRoaXMubWF4eCAmJiBwYXJ0aWNsZS5wLnggPj0gdGhpcy5taW54KSByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHBhcnRpY2xlLnAueSA8PSB0aGlzLm1heHkgJiYgcGFydGljbGUucC55ID49IHRoaXMubWlueSkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxlbmd0aCBvZiB0aGUgbGluZS5cbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIGxlbmd0aCBvZiB0aGUgbGluZS5cbiAgICovXG4gIGdldExlbmd0aCgpIHtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZHggKiB0aGlzLmR4ICsgdGhpcy5keSAqIHRoaXMuZHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgcGFydGljbGUgY3Jvc3NpbmcgYmVoYXZpb3IgYmFzZWQgb24gdGhlIGNyb3NzVHlwZS5cbiAgICogQHBhcmFtIHtQYXJ0aWNsZX0gcGFydGljbGUgLSBUaGUgcGFydGljbGUgdG8gY2hlY2sgZm9yIGNyb3NzaW5nLlxuICAgKi9cbiAgY3Jvc3NpbmcocGFydGljbGUpIHtcbiAgICBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiZGVhZFwiKSB7XG4gICAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09IFwiPlwiIHx8IHRoaXMuZGlyZWN0aW9uID09PSBcIlJcIiB8fCB0aGlzLmRpcmVjdGlvbiA9PT0gXCJyaWdodFwiIHx8IHRoaXMuZGlyZWN0aW9uID09PSBcImRvd25cIikge1xuICAgICAgICBpZiAoIXRoaXMucmFuZ2VPdXQocGFydGljbGUpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmdldERpcmVjdGlvbihwYXJ0aWNsZS5wLngsIHBhcnRpY2xlLnAueSkpIHBhcnRpY2xlLmRlYWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCF0aGlzLnJhbmdlT3V0KHBhcnRpY2xlKSkgcmV0dXJuO1xuICAgICAgICBpZiAoIXRoaXMuZ2V0RGlyZWN0aW9uKHBhcnRpY2xlLnAueCwgcGFydGljbGUucC55KSkgcGFydGljbGUuZGVhZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmNyb3NzVHlwZSA9PT0gXCJib3VuZFwiKSB7XG4gICAgICBpZiAoIXRoaXMucmFuZ2VPdXQocGFydGljbGUpKSByZXR1cm47XG5cbiAgICAgIGlmICh0aGlzLmdldERpc3RhbmNlKHBhcnRpY2xlLnAueCwgcGFydGljbGUucC55KSA8PSBwYXJ0aWNsZS5yYWRpdXMpIHtcbiAgICAgICAgaWYgKHRoaXMuZHggPT09IDApIHtcbiAgICAgICAgICBwYXJ0aWNsZS52LnggKj0gLTE7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5keSA9PT0gMCkge1xuICAgICAgICAgIHBhcnRpY2xlLnYueSAqPSAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmdldFN5bW1ldHJpYyhwYXJ0aWNsZS52KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiY3Jvc3NcIikge1xuICAgICAgaWYgKHRoaXMuYWxlcnQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlNvcnJ5LCBMaW5lWm9uZSBkb2VzIG5vdCBzdXBwb3J0IGNyb3NzIG1ldGhvZCFcIik7XG4gICAgICAgIHRoaXMuYWxlcnQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBab25lIGZyb20gXCIuL1pvbmVcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjaXJjdWxhciB6b25lIGluIGEgMkQgc3BhY2UuXG4gKiBAZXh0ZW5kcyBab25lXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENpcmNsZVpvbmUgZXh0ZW5kcyBab25lIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQ2lyY2xlWm9uZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBjaXJjbGUncyBjZW50ZXIuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgY2lyY2xlJ3MgY2VudGVyLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1c10gLSBUaGUgcmFkaXVzIG9mIHRoZSBjaXJjbGUuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih4LCB5LCByYWRpdXMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICAgIHRoaXMucmFkaXVzID0gcmFkaXVzO1xuICAgIHRoaXMuYW5nbGUgPSAwO1xuICAgIHRoaXMuY2VudGVyID0geyB4LCB5IH07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJhbmRvbSBwb3NpdGlvbiB3aXRoaW4gdGhlIGNpcmNsZS5cbiAgICogQHJldHVybnMge09iamVjdH0gQW4gb2JqZWN0IHdpdGggeCBhbmQgeSBjb29yZGluYXRlcy5cbiAgICovXG4gIGdldFBvc2l0aW9uKCkge1xuICAgIHRoaXMuYW5nbGUgPSBNYXRoVXRpbC5QSXgyICogTWF0aC5yYW5kb20oKTtcbiAgICB0aGlzLnJhbmRvbVJhZGl1cyA9IE1hdGgucmFuZG9tKCkgKiB0aGlzLnJhZGl1cztcbiAgICB0aGlzLnZlY3Rvci54ID0gdGhpcy54ICsgdGhpcy5yYW5kb21SYWRpdXMgKiBNYXRoLmNvcyh0aGlzLmFuZ2xlKTtcbiAgICB0aGlzLnZlY3Rvci55ID0gdGhpcy55ICsgdGhpcy5yYW5kb21SYWRpdXMgKiBNYXRoLnNpbih0aGlzLmFuZ2xlKTtcblxuICAgIHJldHVybiB0aGlzLnZlY3RvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgbmV3IHgtY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyLlxuICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBuZXcgeS1jb29yZGluYXRlIG9mIHRoZSBjZW50ZXIuXG4gICAqL1xuICBzZXRDZW50ZXIoeCwgeSkge1xuICAgIHRoaXMuY2VudGVyLnggPSB4O1xuICAgIHRoaXMuY2VudGVyLnkgPSB5O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgcGFydGljbGUgY3Jvc3NpbmcgYmVoYXZpb3IuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJ0aWNsZSAtIFRoZSBwYXJ0aWNsZSB0byBjaGVjayBmb3IgY3Jvc3NpbmcuXG4gICAqL1xuICBjcm9zc2luZyhwYXJ0aWNsZSkge1xuICAgIGNvbnN0IGQgPSBwYXJ0aWNsZS5wLmRpc3RhbmNlVG8odGhpcy5jZW50ZXIpO1xuXG4gICAgaWYgKHRoaXMuY3Jvc3NUeXBlID09PSBcImRlYWRcIikge1xuICAgICAgaWYgKGQgLSBwYXJ0aWNsZS5yYWRpdXMgPiB0aGlzLnJhZGl1cykgcGFydGljbGUuZGVhZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNyb3NzVHlwZSA9PT0gXCJib3VuZFwiKSB7XG4gICAgICBpZiAoZCArIHBhcnRpY2xlLnJhZGl1cyA+PSB0aGlzLnJhZGl1cykgdGhpcy5nZXRTeW1tZXRyaWMocGFydGljbGUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiY3Jvc3NcIikge1xuICAgICAgaWYgKHRoaXMuYWxlcnQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlNvcnJ5LCBDaXJjbGVab25lIGRvZXMgbm90IHN1cHBvcnQgY3Jvc3MgbWV0aG9kIVwiKTtcbiAgICAgICAgdGhpcy5hbGVydCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBzeW1tZXRyaWMgcG9zaXRpb24gb2YgYSBwYXJ0aWNsZS5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcnRpY2xlIC0gVGhlIHBhcnRpY2xlIHRvIGNhbGN1bGF0ZSBzeW1tZXRyeSBmb3IuXG4gICAqL1xuICBnZXRTeW1tZXRyaWMocGFydGljbGUpIHtcbiAgICBjb25zdCB0aGEyID0gcGFydGljbGUudi5nZXRHcmFkaWVudCgpO1xuICAgIGNvbnN0IHRoYTEgPSB0aGlzLmdldEdyYWRpZW50KHBhcnRpY2xlKTtcblxuICAgIGNvbnN0IHRoYSA9IDIgKiAodGhhMSAtIHRoYTIpO1xuICAgIGNvbnN0IG9sZHggPSBwYXJ0aWNsZS52Lng7XG4gICAgY29uc3Qgb2xkeSA9IHBhcnRpY2xlLnYueTtcblxuICAgIHBhcnRpY2xlLnYueCA9IG9sZHggKiBNYXRoLmNvcyh0aGEpIC0gb2xkeSAqIE1hdGguc2luKHRoYSk7XG4gICAgcGFydGljbGUudi55ID0gb2xkeCAqIE1hdGguc2luKHRoYSkgKyBvbGR5ICogTWF0aC5jb3ModGhhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBncmFkaWVudCBmb3IgYSBwYXJ0aWNsZS5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcnRpY2xlIC0gVGhlIHBhcnRpY2xlIHRvIGNhbGN1bGF0ZSB0aGUgZ3JhZGllbnQgZm9yLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgY2FsY3VsYXRlZCBncmFkaWVudC5cbiAgICovXG4gIGdldEdyYWRpZW50KHBhcnRpY2xlKSB7XG4gICAgcmV0dXJuIC1NYXRoVXRpbC5QSV8yICsgTWF0aC5hdGFuMihwYXJ0aWNsZS5wLnkgLSB0aGlzLmNlbnRlci55LCBwYXJ0aWNsZS5wLnggLSB0aGlzLmNlbnRlci54KTtcbiAgfVxufVxuIiwiaW1wb3J0IFpvbmUgZnJvbSBcIi4vWm9uZVwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWN0YW5ndWxhciB6b25lIGZvciBwYXJ0aWNsZSBzeXN0ZW1zLlxuICogQGV4dGVuZHMgWm9uZVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWN0Wm9uZSBleHRlbmRzIFpvbmUge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBSZWN0Wm9uZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aF0gLSBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHRdIC0gVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLlxuICAgKi9cbiAgY29uc3RydWN0b3IoeCwgeSwgd2lkdGggPSAyMDAsIGhlaWdodCA9IDIwMCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSByYW5kb20gcG9zaXRpb24gd2l0aGluIHRoZSByZWN0YW5ndWxhciB6b25lLlxuICAgKiBAcmV0dXJucyB7VmVjdG9yMkR9IEEgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgcmFuZG9tIHBvc2l0aW9uLlxuICAgKi9cbiAgZ2V0UG9zaXRpb24oKSB7XG4gICAgdGhpcy52ZWN0b3IueCA9IHRoaXMueCArIE1hdGgucmFuZG9tKCkgKiB0aGlzLndpZHRoO1xuICAgIHRoaXMudmVjdG9yLnkgPSB0aGlzLnkgKyBNYXRoLnJhbmRvbSgpICogdGhpcy5oZWlnaHQ7XG4gICAgcmV0dXJuIHRoaXMudmVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgcGFydGljbGUgY3Jvc3NpbmcgYmVoYXZpb3IgYmFzZWQgb24gdGhlIGNyb3NzVHlwZS5cbiAgICogQHBhcmFtIHtQYXJ0aWNsZX0gcGFydGljbGUgLSBUaGUgcGFydGljbGUgdG8gY2hlY2sgZm9yIGNyb3NzaW5nLlxuICAgKi9cbiAgY3Jvc3NpbmcocGFydGljbGUpIHtcbiAgICAvLyBwYXJ0aWNsZSBkZWFkIHpvbmVcbiAgICBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiZGVhZFwiKSB7XG4gICAgICBpZiAocGFydGljbGUucC54ICsgcGFydGljbGUucmFkaXVzIDwgdGhpcy54KSBwYXJ0aWNsZS5kZWFkID0gdHJ1ZTtcbiAgICAgIGVsc2UgaWYgKHBhcnRpY2xlLnAueCAtIHBhcnRpY2xlLnJhZGl1cyA+IHRoaXMueCArIHRoaXMud2lkdGgpIHBhcnRpY2xlLmRlYWQgPSB0cnVlO1xuXG4gICAgICBpZiAocGFydGljbGUucC55ICsgcGFydGljbGUucmFkaXVzIDwgdGhpcy55KSBwYXJ0aWNsZS5kZWFkID0gdHJ1ZTtcbiAgICAgIGVsc2UgaWYgKHBhcnRpY2xlLnAueSAtIHBhcnRpY2xlLnJhZGl1cyA+IHRoaXMueSArIHRoaXMuaGVpZ2h0KSBwYXJ0aWNsZS5kZWFkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBwYXJ0aWNsZSBib3VuZCB6b25lXG4gICAgZWxzZSBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiYm91bmRcIikge1xuICAgICAgaWYgKHBhcnRpY2xlLnAueCAtIHBhcnRpY2xlLnJhZGl1cyA8IHRoaXMueCkge1xuICAgICAgICBwYXJ0aWNsZS5wLnggPSB0aGlzLnggKyBwYXJ0aWNsZS5yYWRpdXM7XG4gICAgICAgIHBhcnRpY2xlLnYueCAqPSAtMTtcbiAgICAgIH0gZWxzZSBpZiAocGFydGljbGUucC54ICsgcGFydGljbGUucmFkaXVzID4gdGhpcy54ICsgdGhpcy53aWR0aCkge1xuICAgICAgICBwYXJ0aWNsZS5wLnggPSB0aGlzLnggKyB0aGlzLndpZHRoIC0gcGFydGljbGUucmFkaXVzO1xuICAgICAgICBwYXJ0aWNsZS52LnggKj0gLTE7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJ0aWNsZS5wLnkgLSBwYXJ0aWNsZS5yYWRpdXMgPCB0aGlzLnkpIHtcbiAgICAgICAgcGFydGljbGUucC55ID0gdGhpcy55ICsgcGFydGljbGUucmFkaXVzO1xuICAgICAgICBwYXJ0aWNsZS52LnkgKj0gLTE7XG4gICAgICB9IGVsc2UgaWYgKHBhcnRpY2xlLnAueSArIHBhcnRpY2xlLnJhZGl1cyA+IHRoaXMueSArIHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgIHBhcnRpY2xlLnAueSA9IHRoaXMueSArIHRoaXMuaGVpZ2h0IC0gcGFydGljbGUucmFkaXVzO1xuICAgICAgICBwYXJ0aWNsZS52LnkgKj0gLTE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcGFydGljbGUgY3Jvc3Mgem9uZVxuICAgIGVsc2UgaWYgKHRoaXMuY3Jvc3NUeXBlID09PSBcImNyb3NzXCIpIHtcbiAgICAgIGlmIChwYXJ0aWNsZS5wLnggKyBwYXJ0aWNsZS5yYWRpdXMgPCB0aGlzLnggJiYgcGFydGljbGUudi54IDw9IDApIHtcbiAgICAgICAgcGFydGljbGUucC54ID0gdGhpcy54ICsgdGhpcy53aWR0aCArIHBhcnRpY2xlLnJhZGl1cztcbiAgICAgIH0gZWxzZSBpZiAocGFydGljbGUucC54IC0gcGFydGljbGUucmFkaXVzID4gdGhpcy54ICsgdGhpcy53aWR0aCAmJiBwYXJ0aWNsZS52LnggPj0gMCkge1xuICAgICAgICBwYXJ0aWNsZS5wLnggPSB0aGlzLnggLSBwYXJ0aWNsZS5yYWRpdXM7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJ0aWNsZS5wLnkgKyBwYXJ0aWNsZS5yYWRpdXMgPCB0aGlzLnkgJiYgcGFydGljbGUudi55IDw9IDApIHtcbiAgICAgICAgcGFydGljbGUucC55ID0gdGhpcy55ICsgdGhpcy5oZWlnaHQgKyBwYXJ0aWNsZS5yYWRpdXM7XG4gICAgICB9IGVsc2UgaWYgKHBhcnRpY2xlLnAueSAtIHBhcnRpY2xlLnJhZGl1cyA+IHRoaXMueSArIHRoaXMuaGVpZ2h0ICYmIHBhcnRpY2xlLnYueSA+PSAwKSB7XG4gICAgICAgIHBhcnRpY2xlLnAueSA9IHRoaXMueSAtIHBhcnRpY2xlLnJhZGl1cztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBab25lIGZyb20gXCIuL1pvbmVcIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHpvbmUgYmFzZWQgb24gaW1hZ2UgZGF0YS5cbiAqIEBleHRlbmRzIFpvbmVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW1hZ2Vab25lIGV4dGVuZHMgWm9uZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIEltYWdlWm9uZS5cbiAgICogQHBhcmFtIHtJbWFnZURhdGF9IGltYWdlRGF0YSAtIFRoZSBpbWFnZSBkYXRhIHRvIHVzZSBmb3IgdGhlIHpvbmUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSB4LWNvb3JkaW5hdGUgb2Zmc2V0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBUaGUgeS1jb29yZGluYXRlIG9mZnNldC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkPTJdIC0gVGhlIHNhbXBsaW5nIGRlbnNpdHkuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihpbWFnZURhdGEsIHgsIHksIGQpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVzZXQoaW1hZ2VEYXRhLCB4LCB5LCBkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIEltYWdlWm9uZSB3aXRoIG5ldyBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge0ltYWdlRGF0YX0gaW1hZ2VEYXRhIC0gVGhlIGltYWdlIGRhdGEgdG8gdXNlIGZvciB0aGUgem9uZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIHgtY29vcmRpbmF0ZSBvZmZzZXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB5LWNvb3JkaW5hdGUgb2Zmc2V0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2Q9Ml0gLSBUaGUgc2FtcGxpbmcgZGVuc2l0eS5cbiAgICovXG4gIHJlc2V0KGltYWdlRGF0YSwgeCwgeSwgZCkge1xuICAgIHRoaXMuaW1hZ2VEYXRhID0gaW1hZ2VEYXRhO1xuICAgIHRoaXMueCA9IFV0aWwuaW5pdFZhbHVlKHgsIDApO1xuICAgIHRoaXMueSA9IFV0aWwuaW5pdFZhbHVlKHksIDApO1xuICAgIHRoaXMuZCA9IFV0aWwuaW5pdFZhbHVlKGQsIDIpO1xuXG4gICAgdGhpcy52ZWN0b3JzID0gW107XG4gICAgdGhpcy5zZXRWZWN0b3JzKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCB2ZWN0b3JzIGJhc2VkIG9uIHRoZSBpbWFnZSBkYXRhLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgdmVjdG9yIG9iamVjdC5cbiAgICovXG4gIHNldFZlY3RvcnMoKSB7XG4gICAgbGV0IGksIGo7XG4gICAgY29uc3QgbGVuZ3RoMSA9IHRoaXMuaW1hZ2VEYXRhLndpZHRoO1xuICAgIGNvbnN0IGxlbmd0aDIgPSB0aGlzLmltYWdlRGF0YS5oZWlnaHQ7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoMTsgaSArPSB0aGlzLmQpIHtcbiAgICAgIGZvciAoaiA9IDA7IGogPCBsZW5ndGgyOyBqICs9IHRoaXMuZCkge1xuICAgICAgICBsZXQgaW5kZXggPSAoKGogPj4gMCkgKiBsZW5ndGgxICsgKGkgPj4gMCkpICogNDtcblxuICAgICAgICBpZiAodGhpcy5pbWFnZURhdGEuZGF0YVtpbmRleCArIDNdID4gMCkge1xuICAgICAgICAgIHRoaXMudmVjdG9ycy5wdXNoKHsgeDogaSArIHRoaXMueCwgeTogaiArIHRoaXMueSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnZlY3RvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBwb2ludCBpcyB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUgaW1hZ2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHgtY29vcmRpbmF0ZSB0byBjaGVjay5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeS1jb29yZGluYXRlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcG9pbnQgaXMgd2l0aGluIGJvdW5kcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgZ2V0Qm91bmQoeCwgeSkge1xuICAgIGNvbnN0IGluZGV4ID0gKCh5ID4+IDApICogdGhpcy5pbWFnZURhdGEud2lkdGggKyAoeCA+PiAwKSkgKiA0O1xuICAgIHJldHVybiB0aGlzLmltYWdlRGF0YS5kYXRhW2luZGV4ICsgM10gPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSByYW5kb20gcG9zaXRpb24gd2l0aGluIHRoZSBpbWFnZSB6b25lLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIHBvc2l0aW9uLlxuICAgKi9cbiAgZ2V0UG9zaXRpb24oKSB7XG4gICAgY29uc3QgdmVjdG9yID0gVXRpbC5nZXRSYW5kRnJvbUFycmF5KHRoaXMudmVjdG9ycyk7XG4gICAgcmV0dXJuIHRoaXMudmVjdG9yLmNvcHkodmVjdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb2xvciBhdCBhIHNwZWNpZmljIHBvaW50IGluIHRoZSBpbWFnZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeC1jb29yZGluYXRlLlxuICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5LWNvb3JkaW5hdGUuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEFuIG9iamVjdCBjb250YWluaW5nIHIsIGcsIGIsIGFuZCBhIHZhbHVlcy5cbiAgICovXG4gIGdldENvbG9yKHgsIHkpIHtcbiAgICB4IC09IHRoaXMueDtcbiAgICB5IC09IHRoaXMueTtcbiAgICBjb25zdCBpID0gKCh5ID4+IDApICogdGhpcy5pbWFnZURhdGEud2lkdGggKyAoeCA+PiAwKSkgKiA0O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHI6IHRoaXMuaW1hZ2VEYXRhLmRhdGFbaV0sXG4gICAgICBnOiB0aGlzLmltYWdlRGF0YS5kYXRhW2kgKyAxXSxcbiAgICAgIGI6IHRoaXMuaW1hZ2VEYXRhLmRhdGFbaSArIDJdLFxuICAgICAgYTogdGhpcy5pbWFnZURhdGEuZGF0YVtpICsgM11cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgcGFydGljbGUgY3Jvc3NpbmcgYmVoYXZpb3IuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJ0aWNsZSAtIFRoZSBwYXJ0aWNsZSB0byBjaGVjayBmb3IgY3Jvc3NpbmcuXG4gICAqL1xuICBjcm9zc2luZyhwYXJ0aWNsZSkge1xuICAgIGlmICh0aGlzLmNyb3NzVHlwZSA9PT0gXCJkZWFkXCIpIHtcbiAgICAgIHBhcnRpY2xlLmRlYWQgPSB0aGlzLmdldEJvdW5kKHBhcnRpY2xlLnAueCAtIHRoaXMueCwgcGFydGljbGUucC55IC0gdGhpcy55KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3Jvc3NUeXBlID09PSBcImJvdW5kXCIpIHtcbiAgICAgIGlmICghdGhpcy5nZXRCb3VuZChwYXJ0aWNsZS5wLnggLSB0aGlzLngsIHBhcnRpY2xlLnAueSAtIHRoaXMueSkpIHBhcnRpY2xlLnYubmVnYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBJbWFnZVpvbmUgYW5kIGNsZWFucyB1cCByZXNvdXJjZXMuXG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLmltYWdlRGF0YSA9IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCBDb2xvclV0aWwgZnJvbSBcIi4uL3V0aWxzL0NvbG9yVXRpbFwiO1xuaW1wb3J0IENpcmNsZVpvbmUgZnJvbSBcIi4uL3pvbmUvQ2lyY2xlWm9uZVwiO1xuaW1wb3J0IFBvaW50Wm9uZSBmcm9tIFwiLi4vem9uZS9Qb2ludFpvbmVcIjtcbmltcG9ydCBMaW5lWm9uZSBmcm9tIFwiLi4vem9uZS9MaW5lWm9uZVwiO1xuaW1wb3J0IFJlY3Rab25lIGZyb20gXCIuLi96b25lL1JlY3Rab25lXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgYWRkRXZlbnRMaXN0ZW5lcihwcm90b24sIGZ1bmMpIHtcbiAgICBwcm90b24uYWRkRXZlbnRMaXN0ZW5lcihcIlBST1RPTl9VUERBVEVfQUZURVJcIiwgKCkgPT4gZnVuYygpKTtcbiAgfSxcblxuICBnZXRTdHlsZShjb2xvciA9IFwiI2ZmMDAwMFwiKSB7XG4gICAgY29uc3QgcmdiID0gQ29sb3JVdGlsLmhleFRvUmdiKGNvbG9yKTtcbiAgICByZXR1cm4gYHJnYmEoJHtyZ2Iucn0sICR7cmdiLmd9LCAke3JnYi5ifSwgMC41KWA7XG4gIH0sXG5cbiAgZHJhd1pvbmUocHJvdG9uLCBjYW52YXMsIHpvbmUsIGNsZWFyKSB7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLmdldFN0eWxlKCk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIocHJvdG9uLCAoKSA9PiB7XG4gICAgICBpZiAoY2xlYXIpIGNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG5cbiAgICAgIGlmICh6b25lIGluc3RhbmNlb2YgUG9pbnRab25lKSB7XG4gICAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gc3R5bGU7XG4gICAgICAgIGNvbnRleHQuYXJjKHpvbmUueCwgem9uZS55LCAxMCwgMCwgTWF0aC5QSSAqIDIsIHRydWUpO1xuICAgICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICAgIH0gZWxzZSBpZiAoem9uZSBpbnN0YW5jZW9mIExpbmVab25lKSB7XG4gICAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBzdHlsZTtcbiAgICAgICAgY29udGV4dC5tb3ZlVG8oem9uZS54MSwgem9uZS55MSk7XG4gICAgICAgIGNvbnRleHQubGluZVRvKHpvbmUueDIsIHpvbmUueTIpO1xuICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgfSBlbHNlIGlmICh6b25lIGluc3RhbmNlb2YgUmVjdFpvbmUpIHtcbiAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IHN0eWxlO1xuICAgICAgICBjb250ZXh0LmRyYXdSZWN0KHpvbmUueCwgem9uZS55LCB6b25lLndpZHRoLCB6b25lLmhlaWdodCk7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgICB9IGVsc2UgaWYgKHpvbmUgaW5zdGFuY2VvZiBDaXJjbGVab25lKSB7XG4gICAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBzdHlsZTtcbiAgICAgICAgY29udGV4dC5hcmMoem9uZS54LCB6b25lLnksIHpvbmUucmFkaXVzLCAwLCBNYXRoLlBJICogMiwgdHJ1ZSk7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG5cbiAgZHJhd0VtaXR0ZXIocHJvdG9uLCBjYW52YXMsIGVtaXR0ZXIsIGNsZWFyKSB7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLmdldFN0eWxlKCk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIocHJvdG9uLCAoKSA9PiB7XG4gICAgICBpZiAoY2xlYXIpIGNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG5cbiAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IHN0eWxlO1xuICAgICAgY29udGV4dC5hcmMoZW1pdHRlci5wLngsIGVtaXR0ZXIucC55LCAxMCwgMCwgTWF0aC5QSSAqIDIsIHRydWUpO1xuICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIH0pO1xuICB9XG59O1xuIiwiaW1wb3J0IFByb3RvbiBmcm9tIFwiLi9jb3JlL1Byb3RvblwiO1xuaW1wb3J0IFBhcnRpY2xlIGZyb20gXCIuL2NvcmUvUGFydGljbGVcIjtcbmltcG9ydCBQb29sIGZyb20gXCIuL2NvcmUvUG9vbFwiO1xuXG5pbXBvcnQgVXRpbCBmcm9tIFwiLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgQ29sb3JVdGlsIGZyb20gXCIuL3V0aWxzL0NvbG9yVXRpbFwiO1xuaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuL21hdGgvTWF0aFV0aWxcIjtcbmltcG9ydCBWZWN0b3IyRCBmcm9tIFwiLi9tYXRoL1ZlY3RvcjJEXCI7XG5pbXBvcnQgUG9sYXIyRCBmcm9tIFwiLi9tYXRoL1BvbGFyMkRcIjtcbmltcG9ydCBNYXQzIGZyb20gXCIuL21hdGgvTWF0M1wiO1xuaW1wb3J0IFNwYW4gZnJvbSBcIi4vbWF0aC9TcGFuXCI7XG5pbXBvcnQgQXJyYXlTcGFuIGZyb20gXCIuL21hdGgvQXJyYXlTcGFuXCI7XG5pbXBvcnQgUmVjdGFuZ2xlIGZyb20gXCIuL21hdGgvUmVjdGFuZ2xlXCI7XG5pbXBvcnQgZWFzZSBmcm9tIFwiLi9tYXRoL2Vhc2VcIjtcblxuaW1wb3J0IFJhdGUgZnJvbSBcIi4vaW5pdGlhbGl6ZS9SYXRlXCI7XG5pbXBvcnQgSW5pdGlhbGl6ZSBmcm9tIFwiLi9pbml0aWFsaXplL0luaXRpYWxpemVcIjtcbmltcG9ydCBMaWZlIGZyb20gXCIuL2luaXRpYWxpemUvTGlmZVwiO1xuaW1wb3J0IFBvc2l0aW9uIGZyb20gXCIuL2luaXRpYWxpemUvUG9zaXRpb25cIjtcbmltcG9ydCBWZWxvY2l0eSBmcm9tIFwiLi9pbml0aWFsaXplL1ZlbG9jaXR5XCI7XG5pbXBvcnQgTWFzcyBmcm9tIFwiLi9pbml0aWFsaXplL01hc3NcIjtcbmltcG9ydCBSYWRpdXMgZnJvbSBcIi4vaW5pdGlhbGl6ZS9SYWRpdXNcIjtcbmltcG9ydCBCb2R5IGZyb20gXCIuL2luaXRpYWxpemUvQm9keVwiO1xuXG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL2JlaGF2aW91ci9CZWhhdmlvdXJcIjtcbmltcG9ydCBGb3JjZSBmcm9tIFwiLi9iZWhhdmlvdXIvRm9yY2VcIjtcbmltcG9ydCBBdHRyYWN0aW9uIGZyb20gXCIuL2JlaGF2aW91ci9BdHRyYWN0aW9uXCI7XG5pbXBvcnQgUmFuZG9tRHJpZnQgZnJvbSBcIi4vYmVoYXZpb3VyL1JhbmRvbURyaWZ0XCI7XG5pbXBvcnQgR3Jhdml0eSBmcm9tIFwiLi9iZWhhdmlvdXIvR3Jhdml0eVwiO1xuaW1wb3J0IENvbGxpc2lvbiBmcm9tIFwiLi9iZWhhdmlvdXIvQ29sbGlzaW9uXCI7XG5pbXBvcnQgQ3Jvc3Nab25lIGZyb20gXCIuL2JlaGF2aW91ci9Dcm9zc1pvbmVcIjtcbmltcG9ydCBBbHBoYSBmcm9tIFwiLi9iZWhhdmlvdXIvQWxwaGFcIjtcbmltcG9ydCBTY2FsZSBmcm9tIFwiLi9iZWhhdmlvdXIvU2NhbGVcIjtcbmltcG9ydCBSb3RhdGUgZnJvbSBcIi4vYmVoYXZpb3VyL1JvdGF0ZVwiO1xuaW1wb3J0IENvbG9yIGZyb20gXCIuL2JlaGF2aW91ci9Db2xvclwiO1xuaW1wb3J0IEN5Y2xvbmUgZnJvbSBcIi4vYmVoYXZpb3VyL0N5Y2xvbmVcIjtcbmltcG9ydCBSZXB1bHNpb24gZnJvbSBcIi4vYmVoYXZpb3VyL1JlcHVsc2lvblwiO1xuaW1wb3J0IEdyYXZpdHlXZWxsIGZyb20gXCIuL2JlaGF2aW91ci9HcmF2aXR5V2VsbFwiO1xuXG5pbXBvcnQgRW1pdHRlciBmcm9tIFwiLi9lbWl0dGVyL0VtaXR0ZXJcIjtcbmltcG9ydCBCZWhhdmlvdXJFbWl0dGVyIGZyb20gXCIuL2VtaXR0ZXIvQmVoYXZpb3VyRW1pdHRlclwiO1xuaW1wb3J0IEZvbGxvd0VtaXR0ZXIgZnJvbSBcIi4vZW1pdHRlci9Gb2xsb3dFbWl0dGVyXCI7XG5cbmltcG9ydCBDYW52YXNSZW5kZXJlciBmcm9tIFwiLi9yZW5kZXIvQ2FudmFzUmVuZGVyZXJcIjtcbmltcG9ydCBEb21SZW5kZXJlciBmcm9tIFwiLi9yZW5kZXIvRG9tUmVuZGVyZXJcIjtcbmltcG9ydCBFYXNlbFJlbmRlcmVyIGZyb20gXCIuL3JlbmRlci9FYXNlbFJlbmRlcmVyXCI7XG5pbXBvcnQgUGl4ZWxSZW5kZXJlciBmcm9tIFwiLi9yZW5kZXIvUGl4ZWxSZW5kZXJlclwiO1xuaW1wb3J0IFBpeGlSZW5kZXJlciBmcm9tIFwiLi9yZW5kZXIvUGl4aVJlbmRlcmVyXCI7XG5pbXBvcnQgV2ViR0xSZW5kZXJlciBmcm9tIFwiLi9yZW5kZXIvV2ViR0xSZW5kZXJlclwiO1xuaW1wb3J0IEN1c3RvbVJlbmRlcmVyIGZyb20gXCIuL3JlbmRlci9DdXN0b21SZW5kZXJlclwiO1xuXG5pbXBvcnQgWm9uZSBmcm9tIFwiLi96b25lL1pvbmVcIjtcbmltcG9ydCBMaW5lWm9uZSBmcm9tIFwiLi96b25lL0xpbmVab25lXCI7XG5pbXBvcnQgQ2lyY2xlWm9uZSBmcm9tIFwiLi96b25lL0NpcmNsZVpvbmVcIjtcbmltcG9ydCBQb2ludFpvbmUgZnJvbSBcIi4vem9uZS9Qb2ludFpvbmVcIjtcbmltcG9ydCBSZWN0Wm9uZSBmcm9tIFwiLi96b25lL1JlY3Rab25lXCI7XG5pbXBvcnQgSW1hZ2Vab25lIGZyb20gXCIuL3pvbmUvSW1hZ2Vab25lXCI7XG5cbmltcG9ydCBEZWJ1ZyBmcm9tIFwiLi9kZWJ1Zy9EZWJ1Z1wiO1xuXG4vLyBuYW1lc3BhY2VcblByb3Rvbi5QYXJ0aWNsZSA9IFBhcnRpY2xlO1xuUHJvdG9uLlBvb2wgPSBQb29sO1xuXG5Qcm90b24uVXRpbCA9IFV0aWw7XG5Qcm90b24uQ29sb3JVdGlsID0gQ29sb3JVdGlsO1xuUHJvdG9uLk1hdGhVdGlsID0gTWF0aFV0aWw7XG5Qcm90b24uVmVjdG9yMkQgPSBQcm90b24uVmVjdG9yID0gVmVjdG9yMkQ7XG5Qcm90b24uUG9sYXIyRCA9IFByb3Rvbi5Qb2xhciA9IFBvbGFyMkQ7XG5Qcm90b24uQXJyYXlTcGFuID0gQXJyYXlTcGFuO1xuUHJvdG9uLlJlY3RhbmdsZSA9IFJlY3RhbmdsZTtcblByb3Rvbi5SYXRlID0gUmF0ZTtcblByb3Rvbi5lYXNlID0gZWFzZTtcblByb3Rvbi5TcGFuID0gU3BhbjtcblByb3Rvbi5NYXQzID0gTWF0MztcblByb3Rvbi5nZXRTcGFuID0gKGEsIGIsIGNlbnRlcikgPT4gbmV3IFNwYW4oYSwgYiwgY2VudGVyKTtcblByb3Rvbi5jcmVhdGVBcnJheVNwYW4gPSBBcnJheVNwYW4uY3JlYXRlQXJyYXlTcGFuO1xuXG5Qcm90b24uSW5pdGlhbGl6ZSA9IFByb3Rvbi5Jbml0ID0gSW5pdGlhbGl6ZTtcblByb3Rvbi5MaWZlID0gUHJvdG9uLkwgPSBMaWZlO1xuUHJvdG9uLlBvc2l0aW9uID0gUHJvdG9uLlAgPSBQb3NpdGlvbjtcblByb3Rvbi5WZWxvY2l0eSA9IFByb3Rvbi5WID0gVmVsb2NpdHk7XG5Qcm90b24uTWFzcyA9IFByb3Rvbi5NID0gTWFzcztcblByb3Rvbi5SYWRpdXMgPSBQcm90b24uUiA9IFJhZGl1cztcblByb3Rvbi5Cb2R5ID0gUHJvdG9uLkIgPSBCb2R5O1xuXG5Qcm90b24uQmVoYXZpb3VyID0gQmVoYXZpb3VyO1xuUHJvdG9uLkZvcmNlID0gUHJvdG9uLkYgPSBGb3JjZTtcblByb3Rvbi5BdHRyYWN0aW9uID0gUHJvdG9uLkEgPSBBdHRyYWN0aW9uO1xuUHJvdG9uLlJhbmRvbURyaWZ0ID0gUHJvdG9uLlJEID0gUmFuZG9tRHJpZnQ7XG5Qcm90b24uR3Jhdml0eSA9IFByb3Rvbi5HID0gR3Jhdml0eTtcblByb3Rvbi5Db2xsaXNpb24gPSBDb2xsaXNpb247XG5Qcm90b24uQ3Jvc3Nab25lID0gQ3Jvc3Nab25lO1xuUHJvdG9uLkFscGhhID0gQWxwaGE7XG5Qcm90b24uU2NhbGUgPSBQcm90b24uUyA9IFNjYWxlO1xuUHJvdG9uLlJvdGF0ZSA9IFJvdGF0ZTtcblByb3Rvbi5Db2xvciA9IENvbG9yO1xuUHJvdG9uLlJlcHVsc2lvbiA9IFJlcHVsc2lvbjtcblByb3Rvbi5DeWNsb25lID0gQ3ljbG9uZTtcblByb3Rvbi5HcmF2aXR5V2VsbCA9IEdyYXZpdHlXZWxsO1xuXG5Qcm90b24uRW1pdHRlciA9IEVtaXR0ZXI7XG5Qcm90b24uQmVoYXZpb3VyRW1pdHRlciA9IEJlaGF2aW91ckVtaXR0ZXI7XG5Qcm90b24uRm9sbG93RW1pdHRlciA9IEZvbGxvd0VtaXR0ZXI7XG5cblByb3Rvbi5ab25lID0gWm9uZTtcblByb3Rvbi5MaW5lWm9uZSA9IExpbmVab25lO1xuUHJvdG9uLkNpcmNsZVpvbmUgPSBDaXJjbGVab25lO1xuUHJvdG9uLlBvaW50Wm9uZSA9IFBvaW50Wm9uZTtcblByb3Rvbi5SZWN0Wm9uZSA9IFJlY3Rab25lO1xuUHJvdG9uLkltYWdlWm9uZSA9IEltYWdlWm9uZTtcblxuUHJvdG9uLkNhbnZhc1JlbmRlcmVyID0gQ2FudmFzUmVuZGVyZXI7XG5Qcm90b24uRG9tUmVuZGVyZXIgPSBEb21SZW5kZXJlcjtcblByb3Rvbi5FYXNlbFJlbmRlcmVyID0gRWFzZWxSZW5kZXJlcjtcblByb3Rvbi5QaXhpUmVuZGVyZXIgPSBQaXhpUmVuZGVyZXI7XG5Qcm90b24uUGl4ZWxSZW5kZXJlciA9IFBpeGVsUmVuZGVyZXI7XG5Qcm90b24uV2ViR0xSZW5kZXJlciA9IFByb3Rvbi5XZWJHbFJlbmRlcmVyID0gV2ViR0xSZW5kZXJlcjtcblByb3Rvbi5DdXN0b21SZW5kZXJlciA9IEN1c3RvbVJlbmRlcmVyO1xuXG5Qcm90b24uRGVidWcgPSBEZWJ1ZztcblV0aWwuYXNzaWduKFByb3RvbiwgZWFzZSk7XG5cbi8vIGV4cG9ydFxuZXhwb3J0IGRlZmF1bHQgUHJvdG9uO1xuZXhwb3J0IHtcbiAgUGFydGljbGUsXG4gIFBvb2wsXG4gIFV0aWwsXG4gIENvbG9yVXRpbCxcbiAgTWF0aFV0aWwsXG4gIFZlY3RvcjJELFxuICBQb2xhcjJELFxuICBNYXQzLFxuICBTcGFuLFxuICBBcnJheVNwYW4sXG4gIFJlY3RhbmdsZSxcbiAgZWFzZSxcbiAgUmF0ZSxcbiAgSW5pdGlhbGl6ZSxcbiAgTGlmZSxcbiAgUG9zaXRpb24sXG4gIFZlbG9jaXR5LFxuICBNYXNzLFxuICBSYWRpdXMsXG4gIEJvZHksXG4gIEJlaGF2aW91cixcbiAgRm9yY2UsXG4gIEF0dHJhY3Rpb24sXG4gIFJhbmRvbURyaWZ0LFxuICBHcmF2aXR5LFxuICBDb2xsaXNpb24sXG4gIENyb3NzWm9uZSxcbiAgQWxwaGEsXG4gIFNjYWxlLFxuICBSb3RhdGUsXG4gIENvbG9yLFxuICBDeWNsb25lLFxuICBSZXB1bHNpb24sXG4gIEdyYXZpdHlXZWxsLFxuICBFbWl0dGVyLFxuICBCZWhhdmlvdXJFbWl0dGVyLFxuICBGb2xsb3dFbWl0dGVyLFxuICBDYW52YXNSZW5kZXJlcixcbiAgRG9tUmVuZGVyZXIsXG4gIEVhc2VsUmVuZGVyZXIsXG4gIFBpeGVsUmVuZGVyZXIsXG4gIFBpeGlSZW5kZXJlcixcbiAgV2ViR0xSZW5kZXJlcixcbiAgQ3VzdG9tUmVuZGVyZXIsXG4gIFpvbmUsXG4gIExpbmVab25lLFxuICBDaXJjbGVab25lLFxuICBQb2ludFpvbmUsXG4gIFJlY3Rab25lLFxuICBJbWFnZVpvbmUsXG4gIERlYnVnXG59O1xuIl0sIm5hbWVzIjpbImlwb3QiLCJsZW5ndGgiLCJuaHBvdCIsImkiLCJtYWtlVHJhbnNsYXRpb24iLCJ0eCIsInR5IiwibWFrZVJvdGF0aW9uIiwiYW5nbGVJblJhZGlhbnMiLCJjIiwiTWF0aCIsImNvcyIsInMiLCJzaW4iLCJtYWtlU2NhbGUiLCJzeCIsInN5IiwibWF0cml4TXVsdGlwbHkiLCJhIiwiYiIsImEwMCIsImEwMSIsImEwMiIsImExMCIsImExMSIsImExMiIsImEyMCIsImEyMSIsImEyMiIsImIwMCIsImIwMSIsImIwMiIsImIxMCIsImIxMSIsImIxMiIsImIyMCIsImIyMSIsImIyMiIsImNyZWF0ZUNhbnZhcyIsImlkIiwid2lkdGgiLCJoZWlnaHQiLCJwb3NpdGlvbiIsImRvbSIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInN0eWxlIiwib3BhY2l0eSIsInRyYW5zZm9ybSIsImNyZWF0ZURpdiIsInJlc2l6ZSIsIm1hcmdpbkxlZnQiLCJtYXJnaW5Ub3AiLCJkaXYiLCJ4IiwieSIsInNjYWxlIiwicm90YXRlIiwid2lsbENoYW5nZSIsImNzczMiLCJ0cmFuc2Zvcm0zZCIsImtleSIsInZhbCIsImJrZXkiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInN1YnN0ciIsImltZ3NDYWNoZSIsImNhbnZhc0NhY2hlIiwiY2FudmFzSWQiLCJnZXRJbWFnZURhdGEiLCJjb250ZXh0IiwiaW1hZ2UiLCJyZWN0IiwiZHJhd0ltYWdlIiwiaW1hZ2VkYXRhIiwiY2xlYXJSZWN0IiwiZ2V0SW1nRnJvbUNhY2hlIiwiaW1nIiwiY2FsbGJhY2siLCJwYXJhbSIsInNyYyIsIkltYWdlIiwib25sb2FkIiwiZSIsInRhcmdldCIsImdldENhbnZhc0Zyb21DYWNoZSIsIldlYkdMVXRpbCIsImNhbnZhcyIsIkRvbVV0aWwiLCJnZXRDb250ZXh0IiwiaW5pdFZhbHVlIiwidmFsdWUiLCJkZWZhdWx0cyIsInVuZGVmaW5lZCIsImlzQXJyYXkiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsImNhbGwiLCJlbXB0eUFycmF5IiwiYXJyIiwidG9BcnJheSIsInNsaWNlQXJyYXkiLCJhcnIxIiwiaW5kZXgiLCJhcnIyIiwicHVzaCIsImdldFJhbmRGcm9tQXJyYXkiLCJmbG9vciIsInJhbmRvbSIsImVtcHR5T2JqZWN0Iiwib2JqIiwiaWdub3JlIiwiaW5kZXhPZiIsImNsYXNzQXBwbHkiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJGYWN0b3J5RnVuYyIsImJpbmQiLCJhcHBseSIsImNvbmNhdCIsIkltZ1V0aWwiLCJkZXN0cm95QWxsIiwiZGVzdHJveSIsImFzc2lnbiIsInNvdXJjZSIsImhhc093blByb3BlcnR5IiwiaWRzTWFwIiwiUHVpZCIsIl9pbmRleCIsIl9jYWNoZSIsInR5cGUiLCJnZXRJZCIsInVpZCIsImdldElkRnJvbUNhY2hlIiwiaXNCb2R5IiwiaXNJbm5lciIsImdldFRhcmdldCIsIlBvb2wiLCJudW0iLCJ0b3RhbCIsImNhY2hlIiwiX3Byb3RvIiwiZ2V0IiwicGFyYW1zIiwicCIsIl9fcHVpZCIsInBvcCIsImNyZWF0ZU9yQ2xvbmUiLCJleHBpcmUiLCJnZXRDYWNoZSIsImNyZWF0ZSIsIlV0aWwiLCJjbG9uZSIsImdldENvdW50IiwiY291bnQiLCJTdGF0cyIsInByb3RvbiIsImNvbnRhaW5lciIsImVtaXR0ZXJJbmRleCIsInJlbmRlcmVySW5kZXgiLCJ1cGRhdGUiLCJib2R5IiwiYWRkIiwiZW1pdHRlciIsImdldEVtaXR0ZXIiLCJyZW5kZXJlciIsImdldFJlbmRlcmVyIiwic3RyIiwiZW1pdHRlcnMiLCJlbWl0U3BlZWQiLCJnZXRFbWl0dGVyUG9zIiwiaW5pdGlhbGl6ZXMiLCJjb25jYXRBcnIiLCJiZWhhdmlvdXJzIiwibmFtZSIsImdldENyZWF0ZWROdW1iZXIiLCJwb29sIiwiaW5uZXJIVE1MIiwiX3RoaXMiLCJjc3NUZXh0Iiwiam9pbiIsImFkZEV2ZW50TGlzdGVuZXIiLCJiZyIsImNvbG9yIiwicGFyZW50Tm9kZSIsImFwcGVuZENoaWxkIiwicmVuZGVyZXJzIiwicmVzdWx0IiwiY3Bvb2wiLCJyb3VuZCIsInJlbW92ZUNoaWxkIiwiRXZlbnREaXNwYXRjaGVyIiwiX2xpc3RlbmVycyIsImRpc3BhdGNoRXZlbnQiLCJoYXNFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzIiwibGlzdGVuZXIiLCJzcGxpY2UiLCJsaXN0ZW5lcnMiLCJoYW5kbGVyIiwiUEkiLCJJTkZJTklUWSIsIkluZmluaXR5IiwiTWF0aFV0aWwiLCJQSXgyIiwiUElfMiIsIlBJXzE4MCIsIk4xODBfUEkiLCJpc0luZmluaXR5IiwicmFuZG9tQVRvQiIsImlzSW50IiwicmFuZG9tRmxvYXRpbmciLCJjZW50ZXIiLCJmIiwicmFuZG9tQ29sb3IiLCJzbGljZSIsInJhbmRvbVpvbmUiLCJkaXNwbGF5IiwiayIsImRpZ2l0cyIsInBvdyIsImRlZ3JlZVRyYW5zZm9ybSIsInRvQ29sb3IxNiIsIkludGVncmF0aW9uIiwiY2FsY3VsYXRlIiwicGFydGljbGVzIiwidGltZSIsImRhbXBpbmciLCJldWxlckludGVncmF0ZSIsInBhcnRpY2xlIiwic2xlZXAiLCJvbGQiLCJjb3B5IiwidiIsIm11bHRpcGx5U2NhbGFyIiwibWFzcyIsImNsZWFyIiwiUHJvdG9uIiwiaW50ZWdyYXRpb25UeXBlIiwibm93IiwidGhlbiIsImVsYXBzZWQiLCJzdGF0cyIsIkVVTEVSIiwiaW50ZWdyYXRvciIsIl9mcHMiLCJfaW50ZXJ2YWwiLCJERUZBVUxUX0lOVEVSVkFMIiwiYWRkUmVuZGVyZXIiLCJyZW5kZXIiLCJpbml0IiwicmVtb3ZlUmVuZGVyZXIiLCJyZW1vdmUiLCJhZGRFbWl0dGVyIiwicGFyZW50IiwiRU1JVFRFUl9BRERFRCIsInJlbW92ZUVtaXR0ZXIiLCJFTUlUVEVSX1JFTU9WRUQiLCJQUk9UT05fVVBEQVRFIiwiVVNFX0NMT0NLIiwiRGF0ZSIsImdldFRpbWUiLCJhbWVuZENoYW5nZVRhYnNCdWciLCJlbWl0dGVyc1VwZGF0ZSIsIlBST1RPTl9VUERBVEVfQUZURVIiLCJnZXRBbGxQYXJ0aWNsZXMiLCJkZXN0cm95QWxsRW1pdHRlcnMiLCJkZXN0cm95T3RoZXIiLCJzZXRUaW1lb3V0IiwiX2NyZWF0ZUNsYXNzIiwic2V0IiwiZnBzIiwiTUVBU1VSRSIsIlJLMiIsIlBBUlRJQ0xFX0NSRUFURUQiLCJQQVJUSUNMRV9VUERBVEUiLCJQQVJUSUNMRV9TTEVFUCIsIlBBUlRJQ0xFX0RFQUQiLCJSZ2IiLCJyIiwiZyIsInJlc2V0IiwiU3BhbiIsImdldFZhbHVlIiwic2V0U3BhblZhbHVlIiwiZ2V0U3BhblZhbHVlIiwicGFuIiwiaGFzUHJvcCIsInNldFByb3AiLCJwcm9wcyIsInByb3AiLCJzZXRWZWN0b3JWYWwiLCJjb25mIiwiZWFzZUxpbmVhciIsImVhc2VJblF1YWQiLCJlYXNlT3V0UXVhZCIsImVhc2VJbk91dFF1YWQiLCJlYXNlSW5DdWJpYyIsImVhc2VPdXRDdWJpYyIsImVhc2VJbk91dEN1YmljIiwiZWFzZUluUXVhcnQiLCJlYXNlT3V0UXVhcnQiLCJlYXNlSW5PdXRRdWFydCIsImVhc2VJblNpbmUiLCJlYXNlT3V0U2luZSIsImVhc2VJbk91dFNpbmUiLCJlYXNlSW5FeHBvIiwiZWFzZU91dEV4cG8iLCJlYXNlSW5PdXRFeHBvIiwiZWFzZUluQ2lyYyIsInNxcnQiLCJlYXNlT3V0Q2lyYyIsImVhc2VJbk91dENpcmMiLCJlYXNlSW5CYWNrIiwiZWFzZU91dEJhY2siLCJlYXNlSW5PdXRCYWNrIiwiZ2V0RWFzaW5nIiwiZWFzZSIsIlZlY3RvcjJEIiwic2V0WCIsInNldFkiLCJnZXRHcmFkaWVudCIsImF0YW4yIiwidyIsImFkZFZlY3RvcnMiLCJhZGRYWSIsInN1YiIsInN1YlZlY3RvcnMiLCJkaXZpZGVTY2FsYXIiLCJuZWdhdGUiLCJkb3QiLCJsZW5ndGhTcSIsIm5vcm1hbGl6ZSIsImRpc3RhbmNlVG8iLCJkaXN0YW5jZVRvU3F1YXJlZCIsInRoYSIsImR4IiwiZHkiLCJsZXJwIiwiYWxwaGEiLCJlcXVhbHMiLCJQYXJ0aWNsZSIsImRhdGEiLCJyZ2IiLCJQcm9wVXRpbCIsImdldERpcmVjdGlvbiIsImxpZmUiLCJhZ2UiLCJkZWFkIiwic3ByaXRlIiwiZW5lcmd5IiwicmFkaXVzIiwicm90YXRpb24iLCJlYXNpbmciLCJyZW1vdmVBbGxCZWhhdmlvdXJzIiwiYXBwbHlCZWhhdmlvdXJzIiwibWF4IiwiYXBwbHlCZWhhdmlvdXIiLCJhZGRCZWhhdmlvdXIiLCJiZWhhdmlvdXIiLCJwYXJlbnRzIiwiaW5pdGlhbGl6ZSIsImFkZEJlaGF2aW91cnMiLCJyZW1vdmVCZWhhdmlvdXIiLCJoZXhUb1JnYiIsImgiLCJoZXgxNiIsInN1YnN0cmluZyIsInBhcnNlSW50IiwicmdiVG9IZXgiLCJyYmciLCJnZXRIZXgxNkZyb21QYXJ0aWNsZSIsIk51bWJlciIsIlBvbGFyMkQiLCJhYnMiLCJzZXRSIiwic2V0VGhhIiwidG9WZWN0b3IiLCJnZXRYIiwiZ2V0WSIsIk1hdDMiLCJtYXQzIiwibWF0IiwiRmxvYXQzMkFycmF5IiwibWF0MSIsIm1hdDIiLCJtdWx0aXBseSIsImludmVyc2UiLCJkIiwibXVsdGlwbHlWZWMyIiwibSIsInZlYyIsIkFycmF5U3BhbiIsIl9TcGFuIiwiX2luaGVyaXRzTG9vc2UiLCJfYXJyIiwiY3JlYXRlQXJyYXlTcGFuIiwiUmVjdGFuZ2xlIiwiYm90dG9tIiwicmlnaHQiLCJjb250YWlucyIsIlJhdGUiLCJudW1wYW4iLCJ0aW1lcGFuIiwibnVtUGFuIiwidGltZVBhbiIsInN0YXJ0VGltZSIsIm5leHRUaW1lIiwiSW5pdGlhbGl6ZSIsIkxpZmUiLCJfSW5pdGlhbGl6ZSIsImxpZmVQYW4iLCJab25lIiwidmVjdG9yIiwiY3Jvc3NUeXBlIiwiYWxlcnQiLCJnZXRQb3NpdGlvbiIsImNyb3NzaW5nIiwiUG9pbnRab25lIiwiX1pvbmUiLCJjb25zb2xlIiwiZXJyb3IiLCJQb3NpdGlvbiIsInpvbmUiLCJWZWxvY2l0eSIsInJwYW4iLCJ0aGFwYW4iLCJyUGFuIiwidGhhUGFuIiwibm9ybWFsaXplVmVsb2NpdHkiLCJ2ciIsInBvbGFyMmQiLCJNYXNzIiwibWFzc1BhbiIsIlJhZGl1cyIsIm9sZFJhZGl1cyIsIkJvZHkiLCJpbWFnZVRhcmdldCIsImlubmVyIiwiQmVoYXZpb3VyIiwibm9ybWFsaXplRm9yY2UiLCJmb3JjZSIsIm5vcm1hbGl6ZVZhbHVlIiwiRm9yY2UiLCJfQmVoYXZpb3VyIiwiZngiLCJmeSIsIkF0dHJhY3Rpb24iLCJ0YXJnZXRQb3NpdGlvbiIsInJhZGl1c1NxIiwiYXR0cmFjdGlvbkZvcmNlIiwiUmFuZG9tRHJpZnQiLCJkcmlmdFgiLCJkcmlmdFkiLCJkZWxheSIsInBhbkZvY2UiLCJHcmF2aXR5IiwiX0ZvcmNlIiwiQ29sbGlzaW9uIiwibmV3UG9vbCIsImNvbGxpc2lvblBvb2wiLCJkZWx0YSIsIm90aGVyUGFydGljbGUiLCJvdmVybGFwIiwidG90YWxNYXNzIiwiYXZlcmFnZU1hc3MxIiwiYXZlcmFnZU1hc3MyIiwiZGlzdGFuY2UiLCJDcm9zc1pvbmUiLCJBbHBoYSIsInNhbWUiLCJhbHBoYUEiLCJhbHBoYUIiLCJTY2FsZSIsInNjYWxlQSIsInNjYWxlQiIsIlJvdGF0ZSIsImluZmx1ZW5jZSIsInJvdGF0aW9uQSIsInJvdGF0aW9uQiIsIkNvbG9yIiwiY29sb3JBIiwiQ29sb3JVdGlsIiwiY29sb3JCIiwiQ0hBTkdJTkciLCJDeWNsb25lIiwiYW5nbGUiLCJzZXRBbmdsZUFuZEZvcmNlIiwic3BhbiIsIlN0cmluZyIsInRvTG93ZXJDYXNlIiwiY2FuZ2xlIiwiY3ljbG9uZSIsImdyYWRpZW50IiwiUmVwdWxzaW9uIiwiX0F0dHJhY3Rpb24iLCJHcmF2aXR5V2VsbCIsImNlbnRlclBvaW50IiwiZGlzdGFuY2VWZWMiLCJkaXN0YW5jZVNxIiwiZmFjdG9yIiwiYmluZEVtaXR0ZXIiLCJFbWl0dGVyIiwiX1BhcnRpY2xlIiwiZW1pdFRpbWUiLCJ0b3RhbFRpbWUiLCJyYXRlIiwiZW1pdCIsInN0b3BlZCIsImlzTmFOIiwic3RvcCIsInByZUVtaXQiLCJvbGRTdG9wZWQiLCJvbGRFbWl0VGltZSIsIm9sZFRvdGFsVGltZSIsInN0ZXAiLCJyZW1vdmVBbGxQYXJ0aWNsZXMiLCJhZGRTZWxmSW5pdGlhbGl6ZSIsImFkZEluaXRpYWxpemUiLCJfbGVuIiwiYXJndW1lbnRzIiwicmVzdCIsIkFycmF5IiwiX2tleSIsInJlbW92ZUluaXRpYWxpemUiLCJpbml0aWFsaXplciIsInJlbW92ZUFsbEluaXRpYWxpemVycyIsIl9sZW4yIiwiX2tleTIiLCJlbWl0dGluZyIsImludGVncmF0ZSIsImRpc3BhdGNoIiwiZXZlbnQiLCJiaW5kRXZlbnQiLCJjcmVhdGVQYXJ0aWNsZSIsInNldHVwUGFydGljbGUiLCJJbml0aWFsaXplVXRpbCIsIkJlaGF2aW91ckVtaXR0ZXIiLCJfRW1pdHRlciIsInNlbGZCZWhhdmlvdXJzIiwiYWRkU2VsZkJlaGF2aW91ciIsInJlbW92ZVNlbGZCZWhhdmlvdXIiLCJGb2xsb3dFbWl0dGVyIiwibW91c2VUYXJnZXQiLCJ3aW5kb3ciLCJfYWxsb3dFbWl0dGluZyIsImluaXRFdmVudEhhbmRsZXIiLCJfdGhpczIiLCJtb3VzZW1vdmVIYW5kbGVyIiwibW91c2Vtb3ZlIiwibW91c2Vkb3duSGFuZGxlciIsIm1vdXNlZG93biIsIm1vdXNldXBIYW5kbGVyIiwibW91c2V1cCIsImxheWVyWCIsImxheWVyWSIsIm9mZnNldFgiLCJvZmZzZXRZIiwiaXNJbWFnZSIsIl9faXNJbWFnZSIsInRhZ05hbWUiLCJub2RlTmFtZSIsImlzU3RyaW5nIiwiQmFzZVJlbmRlcmVyIiwiZWxlbWVudCIsInN0cm9rZSIsImNpcmNsZUNvbmYiLCJpc0NpcmNsZSIsInNldFN0cm9rZSIsInRoaW5rbmVzcyIsIl9wcm90b25VcGRhdGVIYW5kbGVyIiwib25Qcm90b25VcGRhdGUiLCJfcHJvdG9uVXBkYXRlQWZ0ZXJIYW5kbGVyIiwib25Qcm90b25VcGRhdGVBZnRlciIsIl9lbWl0dGVyQWRkZWRIYW5kbGVyIiwib25FbWl0dGVyQWRkZWQiLCJfZW1pdHRlclJlbW92ZWRIYW5kbGVyIiwib25FbWl0dGVyUmVtb3ZlZCIsIl9wYXJ0aWNsZUNyZWF0ZWRIYW5kbGVyIiwib25QYXJ0aWNsZUNyZWF0ZWQiLCJfcGFydGljbGVVcGRhdGVIYW5kbGVyIiwib25QYXJ0aWNsZVVwZGF0ZSIsIl9wYXJ0aWNsZURlYWRIYW5kbGVyIiwib25QYXJ0aWNsZURlYWQiLCJDYW52YXNSZW5kZXJlciIsIl9CYXNlUmVuZGVyZXIiLCJidWZmZXJDYWNoZSIsImFkZEltZzJCb2R5IiwiVHlwZXMiLCJkcmF3Q2lyY2xlIiwiYnVmZmVyIiwiY3JlYXRlQnVmZmVyIiwiYnVmQ29udGV4dCIsImdsb2JhbEFscGhhIiwiZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uIiwiZmlsbFN0eWxlIiwiZmlsbFJlY3QiLCJzYXZlIiwidHJhbnNsYXRlIiwicmVzdG9yZSIsImJlZ2luUGF0aCIsImFyYyIsInN0cm9rZVN0eWxlIiwibGluZVdpZHRoIiwiY2xvc2VQYXRoIiwiZmlsbCIsInNpemUiLCJEb21SZW5kZXJlciIsImNyZWF0ZUJvZHkiLCJfYXNzZXJ0VGhpc0luaXRpYWxpemVkIiwiYm9keVJlYWR5IiwiYmFja2dyb3VuZENvbG9yIiwiY3JlYXRlQ2lyY2xlIiwiY3JlYXRlU3ByaXRlIiwiYm9yZGVyUmFkaXVzIiwiYm9yZGVyQ29sb3IiLCJib3JkZXJXaWR0aCIsInVybCIsImJhY2tncm91bmRJbWFnZSIsIkVhc2VsUmVuZGVyZXIiLCJhZGRDaGlsZCIsInNjYWxlWCIsInNjYWxlWSIsImdyYXBoaWNzIiwicmVnWCIsInJlZ1kiLCJjcmVhdGVqcyIsIkdyYXBoaWNzIiwiYmVnaW5TdHJva2UiLCJiZWdpbkZpbGwiLCJzaGFwZSIsIlNoYXBlIiwiUGl4ZWxSZW5kZXJlciIsInJlY3RhbmdsZSIsImltYWdlRGF0YSIsImNyZWF0ZUltYWdlRGF0YSIsInB1dEltYWdlRGF0YSIsInNldFBpeGVsIiwiUElYSUNsYXNzIiwiUGl4aVJlbmRlcmVyIiwic2V0Q29sb3IiLCJibGVuZE1vZGUiLCJzZXRQSVhJIiwiUElYSSIsIlNwcml0ZSIsImNyZWF0ZUZyb21JbWFnZSIsImZyb20iLCJmcm9tSW1hZ2UiLCJ0aW50IiwiYW5jaG9yIiwiZW5kRmlsbCIsIk1TdGFjayIsIm1hdHMiLCJ0b3AiLCJXZWJHTFJlbmRlcmVyIiwiZ2wiLCJhbnRpYWxpYXMiLCJzdGVuY2lsIiwiZGVwdGgiLCJpbml0VmFyIiwic2V0TWF4UmFkaXVzIiwiaW5pdFNoYWRlcnMiLCJpbml0QnVmZmVycyIsImJsZW5kRXF1YXRpb24iLCJGVU5DX0FERCIsImJsZW5kRnVuYyIsIlNSQ19BTFBIQSIsIk9ORV9NSU5VU19TUkNfQUxQSEEiLCJlbmFibGUiLCJCTEVORCIsInVtYXQiLCJzbWF0IiwibXN0YWNrIiwidmlld3BvcnQiLCJjaXJjbGVDYW52YXNVUkwiLCJnZXRWZXJ0ZXhTaGFkZXIiLCJ2c1NvdXJjZSIsImdldEZyYWdtZW50U2hhZGVyIiwiZnNTb3VyY2UiLCJ0ZXh0dXJlYnVmZmVycyIsIkEiLCJCIiwiZ2V0U2hhZGVyIiwiZnMiLCJzaGFkZXIiLCJjcmVhdGVTaGFkZXIiLCJGUkFHTUVOVF9TSEFERVIiLCJWRVJURVhfU0hBREVSIiwic2hhZGVyU291cmNlIiwiY29tcGlsZVNoYWRlciIsImdldFNoYWRlclBhcmFtZXRlciIsIkNPTVBJTEVfU1RBVFVTIiwiZ2V0U2hhZGVySW5mb0xvZyIsImZyYWdtZW50U2hhZGVyIiwidmVydGV4U2hhZGVyIiwic3Byb2dyYW0iLCJjcmVhdGVQcm9ncmFtIiwiYXR0YWNoU2hhZGVyIiwibGlua1Byb2dyYW0iLCJnZXRQcm9ncmFtUGFyYW1ldGVyIiwiTElOS19TVEFUVVMiLCJ1c2VQcm9ncmFtIiwidnBhIiwiZ2V0QXR0cmliTG9jYXRpb24iLCJ0Y2EiLCJlbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSIsInRNYXRVbmlmb3JtIiwiZ2V0VW5pZm9ybUxvY2F0aW9uIiwic2FtcGxlclVuaWZvcm0iLCJ1c2VUZXgiLCJ1bmlmb3JtMWkiLCJ2cyIsImlkeCIsInVuaXRJQnVmZmVyIiwiYmluZEJ1ZmZlciIsIkVMRU1FTlRfQVJSQVlfQlVGRkVSIiwiYnVmZmVyRGF0YSIsIlVpbnQxNkFycmF5IiwiU1RBVElDX0RSQVciLCJpZHMiLCJ1bml0STMzIiwic3RyaXBCdWZmZXIiLCJyYWlkdXMiLCJjaXJjbGVDYW52YXNSYWRpdXMiLCJ0b0RhdGFVUkwiLCJkcmF3SW1nMkNhbnZhcyIsIl93IiwiX2giLCJfd2lkdGgiLCJfaGVpZ2h0IiwiX3NjYWxlWCIsIl9zY2FsZVkiLCJjcmVhdGVUZXh0dXJlIiwidGV4dHVyZSIsInZjQnVmZmVyIiwidGNCdWZmZXIiLCJBUlJBWV9CVUZGRVIiLCJiaW5kVGV4dHVyZSIsIlRFWFRVUkVfMkQiLCJ0ZXhJbWFnZTJEIiwiUkdCQSIsIlVOU0lHTkVEX0JZVEUiLCJ0ZXhQYXJhbWV0ZXJpIiwiVEVYVFVSRV9NQUdfRklMVEVSIiwiTElORUFSIiwiVEVYVFVSRV9NSU5fRklMVEVSIiwiTElORUFSX01JUE1BUF9ORUFSRVNUIiwiZ2VuZXJhdGVNaXBtYXAiLCJ0ZXh0dXJlTG9hZGVkIiwidGV4dHVyZVdpZHRoIiwidGV4dHVyZUhlaWdodCIsInRtYXQiLCJpbWF0Iiwib2xkU2NhbGUiLCJ1cGRhdGVNYXRyaXgiLCJ1bmlmb3JtM2YiLCJ1bmlmb3JtTWF0cml4M2Z2IiwidmVydGV4QXR0cmliUG9pbnRlciIsIkZMT0FUIiwiZHJhd0VsZW1lbnRzIiwiVFJJQU5HTEVTIiwiVU5TSUdORURfU0hPUlQiLCJtb3ZlT3JpZ2luTWF0cml4IiwidHJhbnNsYXRpb25NYXRyaXgiLCJhbmdlbCIsInJvdGF0aW9uTWF0cml4Iiwic2NhbGVNYXRyaXgiLCJtYXRyaXgiLCJDdXN0b21SZW5kZXJlciIsIkxpbmVab25lIiwieDEiLCJ5MSIsIngyIiwieTIiLCJkaXJlY3Rpb24iLCJtaW54IiwibWluIiwibWlueSIsIm1heHgiLCJtYXh5IiwieHh5eSIsImdldExlbmd0aCIsIkMiLCJEIiwiZ2V0RGlzdGFuY2UiLCJnZXRTeW1tZXRyaWMiLCJ0aGEyIiwidGhhMSIsIm9sZHgiLCJvbGR5IiwicmFuZ2VPdXQiLCJDaXJjbGVab25lIiwicmFuZG9tUmFkaXVzIiwic2V0Q2VudGVyIiwiUmVjdFpvbmUiLCJJbWFnZVpvbmUiLCJ2ZWN0b3JzIiwic2V0VmVjdG9ycyIsImoiLCJsZW5ndGgxIiwibGVuZ3RoMiIsImdldEJvdW5kIiwiZ2V0Q29sb3IiLCJmdW5jIiwiZ2V0U3R5bGUiLCJkcmF3Wm9uZSIsIm1vdmVUbyIsImxpbmVUbyIsImRyYXdSZWN0IiwiZHJhd0VtaXR0ZXIiLCJWZWN0b3IiLCJQb2xhciIsImdldFNwYW4iLCJJbml0IiwiTCIsIlAiLCJWIiwiTSIsIlIiLCJGIiwiUkQiLCJHIiwiUyIsIldlYkdsUmVuZGVyZXIiLCJEZWJ1ZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsa0JBQWU7RUFDYjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0lBQ0VBLElBQUksRUFBQSxTQUFBQSxJQUFDQyxDQUFBQSxNQUFNLEVBQUU7RUFDWCxJQUFBLE9BQU8sQ0FBQ0EsTUFBTSxHQUFJQSxNQUFNLEdBQUcsQ0FBRSxNQUFNLENBQUMsQ0FBQTtLQUNyQztFQUVEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7SUFDRUMsS0FBSyxFQUFBLFNBQUFBLEtBQUNELENBQUFBLE1BQU0sRUFBRTtFQUNaLElBQUEsRUFBRUEsTUFBTSxDQUFBO0VBQ1IsSUFBQSxLQUFLLElBQUlFLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRyxFQUFFLEVBQUVBLENBQUMsS0FBSyxD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
diff --git a/build/proton.js.map b/build/proton.js.map
deleted file mode 100644
index a15789c..0000000
--- a/build/proton.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"proton.js","sources":["../src/math/MathUtils.js","../src/math/Vector2D.js","../src/math/Span.js","../src/utils/WebGLUtil.js","../src/utils/DomUtil.js","../src/utils/ImgUtil.js","../src/utils/Util.js","../src/utils/PUID.js","../src/core/Pool.js","../src/debug/Stats.js","../src/events/EventDispatcher.js","../src/math/Integration.js","../src/core/Proton.js","../src/math/ease.js","../src/core/Particle.js","../src/utils/ColorUtil.js","../src/math/Polar2D.js","../src/math/Mat3.js","../src/math/ArraySpan.js","../src/math/Rectangle.js","../src/initialize/Rate.js","../src/initialize/Initialize.js","../src/initialize/Life.js","../src/zone/Zone.js","../src/zone/PointZone.js","../src/initialize/Position.js","../src/initialize/Velocity.js","../src/initialize/Mass.js","../src/initialize/Radius.js","../src/initialize/Body.js","../src/behaviour/Behaviour.js","../src/behaviour/Force.js","../src/behaviour/Attraction.js","../src/behaviour/RandomDrift.js","../src/behaviour/Gravity.js","../src/behaviour/Collision.js","../src/behaviour/CrossZone.js","../src/behaviour/Alpha.js","../src/behaviour/Scale.js","../src/behaviour/Rotate.js","../src/behaviour/Color.js","../src/behaviour/Repulsion.js","../src/behaviour/GravityWell.js","../src/initialize/InitializeUtil.js","../src/emitter/Emitter.js","../src/emitter/BehaviourEmitter.js","../src/emitter/FollowEmitter.js","../src/render/BaseRenderer.js","../src/render/CanvasRenderer.js","../src/render/DomRenderer.js","../src/render/EaselRenderer.js","../src/render/PixelRenderer.js","../src/render/PixiRenderer.js","../src/utils/MStack.js","../src/render/WebGLRenderer.js","../src/render/CustomRenderer.js","../src/zone/LineZone.js","../src/zone/CircleZone.js","../src/zone/RectZone.js","../src/zone/ImageZone.js","../src/debug/Debug.js","../src/polyfill/requestAnimationFrame.js","../src/index.js"],"sourcesContent":["const PI = 3.1415926;\r\n\r\nconst MathUtils = {\r\n\r\n PI: PI,\r\n PIx2: PI * 2,\r\n PI_2: PI / 2,\r\n PI_180: PI / 180,\r\n N180_PI: 180 / PI,\r\n\r\n randomAToB(a, b, INT) {\r\n if (!INT)\r\n return a + Math.random() * (b - a);\r\n else\r\n return Math.floor(Math.random() * (b - a)) + a;\r\n },\r\n\r\n randomFloating(center, f, INT) {\r\n return this.randomAToB(center - f, center + f, INT);\r\n },\r\n\r\n randomZone(display) {},\r\n\r\n degreeTransform(a) {\r\n return a * PI / 180;\r\n },\r\n\r\n toColor16(num) {\r\n return \"#\" + num.toString(16);\r\n },\r\n\r\n randomColor() {\r\n return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).slice(-6);\r\n }\r\n}\r\n\r\nexport default MathUtils;","import MathUtils from '../math/MathUtils';\r\n\r\nexport default class Vector2D {\r\n\r\n constructor(x, y) {\r\n this.x = x || 0;\r\n this.y = y || 0;\r\n }\r\n\r\n set(x, y) {\r\n this.x = x;\r\n this.y = y;\r\n return this;\r\n }\r\n\r\n setX(x) {\r\n this.x = x;\r\n return this;\r\n }\r\n\r\n setY(y) {\r\n this.y = y;\r\n return this;\r\n }\r\n\r\n getGradient() {\r\n if (this.x != 0)\r\n return Math.atan2(this.y, this.x);\r\n else if (this.y > 0)\r\n return MathUtils.PI_2;\r\n else if (this.y < 0)\r\n return -MathUtils.PI_2;\r\n }\r\n\r\n copy(v) {\r\n this.x = v.x;\r\n this.y = v.y;\r\n\r\n return this;\r\n }\r\n\r\n add(v, w) {\r\n if (w !== undefined) {\r\n return this.addVectors(v, w);\r\n }\r\n\r\n this.x += v.x;\r\n this.y += v.y;\r\n\r\n return this;\r\n }\r\n\r\n addXY(a, b) {\r\n this.x += a;\r\n this.y += b;\r\n\r\n return this;\r\n }\r\n\r\n addVectors(a, b) {\r\n this.x = a.x + b.x;\r\n this.y = a.y + b.y;\r\n\r\n return this;\r\n }\r\n\r\n sub(v, w) {\r\n if (w !== undefined) {\r\n return this.subVectors(v, w);\r\n }\r\n\r\n this.x -= v.x;\r\n this.y -= v.y;\r\n\r\n return this;\r\n }\r\n\r\n subVectors(a, b) {\r\n this.x = a.x - b.x;\r\n this.y = a.y - b.y;\r\n\r\n return this;\r\n }\r\n\r\n divideScalar(s) {\r\n if (s !== 0) {\r\n this.x /= s;\r\n this.y /= s;\r\n } else {\r\n this.set(0, 0);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n multiplyScalar(s) {\r\n this.x *= s;\r\n this.y *= s;\r\n\r\n return this;\r\n }\r\n\r\n negate() {\r\n return this.multiplyScalar(-1);\r\n }\r\n\r\n dot(v) {\r\n return this.x * v.x + this.y * v.y;\r\n }\r\n\r\n lengthSq() {\r\n return this.x * this.x + this.y * this.y;\r\n }\r\n\r\n length() {\r\n return Math.sqrt(this.x * this.x + this.y * this.y);\r\n }\r\n\r\n normalize() {\r\n return this.divideScalar(this.length());\r\n }\r\n\r\n distanceTo(v) {\r\n return Math.sqrt(this.distanceToSquared(v));\r\n }\r\n\r\n rotate(tha) {\r\n const x = this.x;\r\n const y = this.y;\r\n\r\n this.x = x * Math.cos(tha) + y * Math.sin(tha);\r\n this.y = -x * Math.sin(tha) + y * Math.cos(tha);\r\n\r\n return this;\r\n }\r\n\r\n distanceToSquared(v) {\r\n const dx = this.x - v.x;\r\n const dy = this.y - v.y;\r\n\r\n return dx * dx + dy * dy;\r\n }\r\n\r\n lerp(v, alpha) {\r\n this.x += (v.x - this.x) * alpha;\r\n this.y += (v.y - this.y) * alpha;\r\n\r\n return this;\r\n }\r\n\r\n equals(v) {\r\n return ((v.x === this.x) && (v.y === this.y));\r\n }\r\n\r\n clear() {\r\n this.x = 0.0;\r\n this.y = 0.0;\r\n return this;\r\n }\r\n\r\n clone() {\r\n return new Vector2D(this.x, this.y);\r\n }\r\n}","import Util from '../utils/Util';\r\nimport MathUtils from '../math/MathUtils';\r\n\r\nexport default class Span {\r\n\r\n\tconstructor(a, b, center) {\r\n\t\tthis.isArray = false;\r\n\r\n\t\tif (Util.isArray(a)) {\r\n\t\t\tthis.isArray = true;\r\n\t\t\tthis.a = a;\r\n\t\t} else {\r\n\t\t\tthis.a = Util.initValue(a, 1);\r\n\t\t\tthis.b = Util.initValue(b, this.a);\r\n\t\t\tthis.center = Util.initValue(center, false);\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tgetValue(INT) {\r\n\t\tif (this.isArray) {\r\n\t\t\treturn this.a[Math.floor(this.a.length * Math.random())];\r\n\t\t} else {\r\n\t\t\tif (!this.center)\r\n\t\t\t\treturn MathUtils.randomAToB(this.a, this.b, INT);\r\n\t\t\telse\r\n\t\t\t\treturn MathUtils.randomFloating(this.a, this.b, INT);\r\n\t\t}\r\n\t}\r\n}","export default {\r\n\r\n /**\r\n * @memberof Proton#Proton.WebGLUtil\r\n * @method ipot\r\n *\r\n * @todo add description\r\n * @todo add length description\r\n *\r\n * @param {Number} length\r\n *\r\n * @return {Boolean}\r\n */\r\n ipot(length) {\r\n return (length & (length - 1)) == 0;\r\n },\r\n\r\n /**\r\n * @memberof Proton#Proton.WebGLUtil\r\n * @method nhpot\r\n *\r\n * @todo add description\r\n * @todo add length description\r\n *\r\n * @param {Number} length\r\n *\r\n * @return {Number}\r\n */\r\n nhpot(length) {\r\n --length;\r\n for (let i = 1; i < 32; i <<= 1) {\r\n length = length | length >> i;\r\n }\r\n\r\n return length + 1;\r\n },\r\n\r\n /**\r\n * @memberof Proton#Proton.WebGLUtil\r\n * @method makeTranslation\r\n *\r\n * @todo add description\r\n * @todo add tx, ty description\r\n * @todo add return description\r\n *\r\n * @param {Number} tx either 0 or 1\r\n * @param {Number} ty either 0 or 1\r\n *\r\n * @return {Object}\r\n */\r\n makeTranslation(tx, ty) {\r\n return [1, 0, 0, 0, 1, 0, tx, ty, 1];\r\n },\r\n\r\n /**\r\n * @memberof Proton#Proton.WebGLUtil\r\n * @method makeRotation\r\n *\r\n * @todo add description\r\n * @todo add return description\r\n *\r\n * @param {Number} angleInRadians\r\n *\r\n * @return {Object}\r\n */\r\n makeRotation(angleInRadians) {\r\n let c = Math.cos(angleInRadians);\r\n let s = Math.sin(angleInRadians);\r\n\r\n return [c, -s, 0, s, c, 0, 0, 0, 1];\r\n },\r\n\r\n /**\r\n * @memberof Proton#Proton.WebGLUtil\r\n * @method makeScale\r\n *\r\n * @todo add description\r\n * @todo add tx, ty description\r\n * @todo add return description\r\n *\r\n * @param {Number} sx either 0 or 1\r\n * @param {Number} sy either 0 or 1\r\n *\r\n * @return {Object}\r\n */\r\n makeScale(sx, sy) {\r\n return [sx, 0, 0, 0, sy, 0, 0, 0, 1];\r\n },\r\n\r\n /**\r\n * @memberof Proton#Proton.WebGLUtil\r\n * @method matrixMultiply\r\n *\r\n * @todo add description\r\n * @todo add a, b description\r\n * @todo add return description\r\n *\r\n * @param {Object} a\r\n * @param {Object} b\r\n *\r\n * @return {Object}\r\n */\r\n matrixMultiply(a, b) {\r\n let a00 = a[0 * 3 + 0];\r\n let a01 = a[0 * 3 + 1];\r\n let a02 = a[0 * 3 + 2];\r\n let a10 = a[1 * 3 + 0];\r\n let a11 = a[1 * 3 + 1];\r\n let a12 = a[1 * 3 + 2];\r\n let a20 = a[2 * 3 + 0];\r\n let a21 = a[2 * 3 + 1];\r\n let a22 = a[2 * 3 + 2];\r\n let b00 = b[0 * 3 + 0];\r\n let b01 = b[0 * 3 + 1];\r\n let b02 = b[0 * 3 + 2];\r\n let b10 = b[1 * 3 + 0];\r\n let b11 = b[1 * 3 + 1];\r\n let b12 = b[1 * 3 + 2];\r\n let b20 = b[2 * 3 + 0];\r\n let b21 = b[2 * 3 + 1];\r\n let b22 = b[2 * 3 + 2];\r\n\r\n return [\r\n a00 * b00 + a01 * b10 + a02 * b20,\r\n a00 * b01 + a01 * b11 + a02 * b21,\r\n a00 * b02 + a01 * b12 + a02 * b22,\r\n a10 * b00 + a11 * b10 + a12 * b20,\r\n a10 * b01 + a11 * b11 + a12 * b21,\r\n a10 * b02 + a11 * b12 + a12 * b22,\r\n a20 * b00 + a21 * b10 + a22 * b20,\r\n a20 * b01 + a21 * b11 + a22 * b21,\r\n a20 * b02 + a21 * b12 + a22 * b22\r\n ];\r\n }\r\n}","export default {\r\n\r\n /**\r\n * Creates and returns a new canvas. The opacity is by default set to 0\r\n *\r\n * @memberof Proton#Proton.DomUtil\r\n * @method createCanvas\r\n *\r\n * @param {String} $id the canvas' id\r\n * @param {Number} $width the canvas' width\r\n * @param {Number} $height the canvas' height\r\n * @param {String} [$position=absolute] the canvas' position, default is 'absolute' \r\n *\r\n * @return {Object}\r\n */\r\n createCanvas(id, width, height, position) {\r\n const dom = document.createElement(\"canvas\");\r\n position = position || 'absolute';\r\n\r\n dom.id = id;\r\n dom.width = width;\r\n dom.height = height;\r\n dom.style.opacity = 0;\r\n dom.style.position = position;\r\n\r\n this.transform(dom, -500, -500, 0, 0);\r\n\r\n return dom;\r\n },\r\n\r\n createDiv(id, width, height) {\r\n const dom = document.createElement(\"div\");\r\n\r\n dom.id = id;\r\n dom.style.position = 'absolute';\r\n this.resize(dom, width, height);\r\n\r\n return dom;\r\n },\r\n\r\n resize(dom, width, height) {\r\n dom.style.width = width + 'px';\r\n dom.style.height = height + 'px';\r\n dom.style.marginLeft = -width / 2 + 'px';\r\n dom.style.marginTop = -height / 2 + 'px';\r\n },\r\n\r\n /**\r\n * Adds a transform: translate(), scale(), rotate() to a given div dom for all browsers\r\n *\r\n * @memberof Proton#Proton.DomUtil\r\n * @method transform\r\n *\r\n * @param {HTMLDivElement} div \r\n * @param {Number} $x \r\n * @param {Number} $y \r\n * @param {Number} $scale \r\n * @param {Number} $rotate \r\n */\r\n transform(div, x, y, scale, rotate) {\r\n const transform = `translate(${x}px, ${y}px) scale(${scale}) rotate(${rotate}deg)`;\r\n\r\n div.style.willChange = 'transform';\r\n this.css3(div, 'transform', transform);\r\n },\r\n\r\n transform3d(div, x, y, scale, rotate) {\r\n const transform = `translate3d(${x}px, ${y}px, 0) scale(${scale}) rotate(${rotate}deg)`;\r\n\r\n div.style.willChange = 'transform';\r\n this.css3(div, 'backfaceVisibility', 'hidden');\r\n this.css3(div, 'transform', transform);\r\n },\r\n\r\n css3(div, key, val) {\r\n const bkey = key.charAt(0).toUpperCase() + key.substr(1);\r\n\r\n div.style[`Webkit${bkey}`] = val;\r\n div.style[`Moz${bkey}`] = val;\r\n div.style[`O${bkey}`] = val;\r\n div.style[`ms${bkey}`] = val;\r\n div.style[`${key}`] = val;\r\n }\r\n}","import WebGLUtil from './WebGLUtil';\r\nimport DomUtil from './DomUtil';\r\n\r\nconst IMG_CACHE = {};\r\nconst CANVAS_CACHE = {};\r\nlet canvasID = 0;\r\n\r\nexport default {\r\n\r\n /**\r\n * This will get the image data. It could be necessary to create a Proton.Zone.\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method getImageData\r\n *\r\n * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'\r\n * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');\r\n * @param {Proton.Rectangle} rect\r\n */\r\n getImageData(context, image, rect) {\r\n context.drawImage(image, rect.x, rect.y);\r\n const imagedata = context.getImageData(rect.x, rect.y, rect.width, rect.height);\r\n context.clearRect(rect.x, rect.y, rect.width, rect.height);\r\n\r\n return imagedata;\r\n },\r\n\r\n /**\r\n * @memberof Proton#Proton.Util\r\n * @method getImgFromCache\r\n *\r\n * @todo add description\r\n * @todo describe func\r\n *\r\n * @param {Mixed} img\r\n * @param {Proton.Particle} particle\r\n * @param {Boolean} drawCanvas set to true if a canvas should be saved into particle.transform.canvas\r\n * @param {Boolean} func\r\n */\r\n getImgFromCache(img, callback, param) {\r\n const src = typeof (img) == 'string' ? img : img.src;\r\n\r\n if (IMG_CACHE[src]) {\r\n callback(IMG_CACHE[src], param);\r\n } else {\r\n const image = new Image();\r\n image.onload = e => {\r\n IMG_CACHE[src] = e.target;\r\n callback(IMG_CACHE[src], param);\r\n }\r\n\r\n image.src = src;\r\n }\r\n },\r\n\r\n getCanvasFromCache(img, callback, param) {\r\n const src = img.src;\r\n\r\n if (!CANVAS_CACHE[src]) {\r\n const width = WebGLUtil.nhpot(img.width);\r\n const height = WebGLUtil.nhpot(img.height);\r\n\r\n const canvas = DomUtil.createCanvas(`canvas_cache_${canvasID}`, width, height);\r\n const context = canvas.getContext('2d');\r\n context.drawImage(img, 0, 0, img.width, img.height);\r\n\r\n CANVAS_CACHE[src] = canvas;\r\n }\r\n\r\n callback && callback(CANVAS_CACHE[src], param);\r\n\r\n return CANVAS_CACHE[src];\r\n }\r\n}","import Vector2D from '../math/Vector2D';\r\nimport Span from '../math/Span';\r\nimport ImgUtil from './ImgUtil';\r\nimport DomUtil from './DomUtil';\r\n\r\nexport default {\r\n\r\n /**\r\n * Returns the default if the value is null or undefined\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method initValue\r\n *\r\n * @param {Mixed} value a specific value, could be everything but null or undefined\r\n * @param {Mixed} defaults the default if the value is null or undefined\r\n */\r\n initValue(value, defaults) {\r\n value = (value !== null && value !== undefined) ? value : defaults;\r\n return value;\r\n },\r\n\r\n /**\r\n * Checks if the value is a valid array\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method isArray\r\n *\r\n * @param {Array} value Any array\r\n *\r\n * @returns {Boolean} \r\n */\r\n isArray(value) {\r\n return Object.prototype.toString.call(value) === '[object Array]';\r\n },\r\n\r\n /**\r\n * Destroyes the given array\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method destroyArray\r\n *\r\n * @param {Array} array Any array\r\n */\r\n destroyArray(array) {\r\n if (array) array.length = 0;\r\n },\r\n\r\n /**\r\n * Destroyes the given object\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method destroyObject\r\n *\r\n * @param {Object} obj Any object\r\n */\r\n destroyObject(obj, ignore) {\r\n for (let o in obj) {\r\n if (ignore && ignore.indexOf(o) > -1) continue;\r\n delete obj[o];\r\n }\r\n },\r\n\r\n /**\r\n * Makes an instance of a class and binds the given array\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method classApply\r\n *\r\n * @param {Function} constructor A class to make an instance from\r\n * @param {Array} [args] Any array to bind it to the constructor\r\n *\r\n * @return {Object} The instance of constructor, optionally bind with args\r\n */\r\n classApply(constructor, args) {\r\n if (!args) return new constructor;\r\n\r\n args = [null].concat(args);\r\n const factoryFunction = constructor.bind.apply(constructor, args);\r\n return new factoryFunction();\r\n },\r\n\r\n /**\r\n * @memberof Proton#Proton.Util\r\n * @method setVector2DByObject\r\n *\r\n * @todo add description for param `target`\r\n * @todo add description for param `pOBJ`\r\n * @todo add description for function\r\n *\r\n * @param {Object} target\r\n * @param {Object} pOBJ\r\n */\r\n setVector2DByObject(target, pOBJ) {\r\n if (this.hasProp(pOBJ, 'x')) target.p.x = pOBJ['x'];\r\n if (this.hasProp(pOBJ, 'y')) target.p.y = pOBJ['y'];\r\n\r\n if (this.hasProp(pOBJ, 'vx')) target.v.x = pOBJ['vx'];\r\n if (this.hasProp(pOBJ, 'vy')) target.v.y = pOBJ['vy'];\r\n\r\n if (this.hasProp(pOBJ, 'ax')) target.a.x = pOBJ['ax'];\r\n if (this.hasProp(pOBJ, 'ay')) target.a.y = pOBJ['ay'];\r\n\r\n if (this.hasProp(pOBJ, 'p')) particle.p.copy(pOBJ['p']);\r\n if (this.hasProp(pOBJ, 'v')) particle.v.copy(pOBJ['v']);\r\n if (this.hasProp(pOBJ, 'a')) particle.a.copy(pOBJ['a']);\r\n\r\n if (this.hasProp(pOBJ, 'position')) particle.p.copy(pOBJ['position']);\r\n if (this.hasProp(pOBJ, 'velocity')) particle.v.copy(pOBJ['velocity']);\r\n if (this.hasProp(pOBJ, 'accelerate')) particle.a.copy(pOBJ['accelerate']);\r\n },\r\n\r\n hasProp(obj, key) {\r\n if (!obj) return false;\r\n return obj[key] !== undefined;\r\n // return obj.hasOwnProperty(key);\r\n },\r\n\r\n /**\r\n * set the prototype in a given prototypeObject\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method setPrototypeByObject\r\n *\r\n * @todo add description for param `target`\r\n * @todo add description for param `filters`\r\n * @todo translate desription from chinese to english\r\n *\r\n * @param {Object} target\r\n * @param {Object} prototypeObject An object of single prototypes\r\n * @param {Object} filters\r\n *\r\n * @return {Object} target\r\n */\r\n setPrototypeByObject(target, prototypeObject, filters) {\r\n for (let singleProp in prototypeObject) {\r\n if (target.hasOwnProperty(singleProp)) {\r\n if (filters) {\r\n if (filters.indexOf(singleProp) < 0)\r\n target[singleProp] = this.getSpanValue(prototypeObject[singleProp]);\r\n } else {\r\n target[singleProp] = this.getSpanValue(prototypeObject[singleProp]);\r\n }\r\n }\r\n }\r\n\r\n return target;\r\n },\r\n\r\n /**\r\n * Returns a new Span object\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method setSpanValue\r\n *\r\n * @todo a, b and c should be 'Mixed' or 'Number'?\r\n *\r\n * @param {Mixed | Span} a\r\n * @param {Mixed} b\r\n * @param {Mixed} c\r\n *\r\n * @return {Span}\r\n */\r\n setSpanValue(a, b, c) {\r\n if (a instanceof Span) {\r\n return a;\r\n } else {\r\n if (!b) {\r\n return new Span(a);\r\n } else {\r\n if (!c)\r\n return new Span(a, b);\r\n else\r\n return new Span(a, b, c);\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * Returns the value from a Span, if the param is not a Span it will return the given parameter\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method getSpanValue\r\n *\r\n * @param {Mixed | Span} pan\r\n *\r\n * @return {Mixed} the value of Span OR the parameter if it is not a Span\r\n */\r\n getSpanValue(pan) {\r\n return pan instanceof Span ? pan.getValue() : pan;\r\n },\r\n\r\n /**\r\n * This will get the image data. It could be necessary to create a Proton.Zone.\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method getImageData\r\n *\r\n * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'\r\n * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');\r\n * @param {Proton.Rectangle} rect\r\n */\r\n getImageData(context, image, rect) {\r\n return ImgUtil.getImageData(context, image, rect);\r\n },\r\n\r\n destroy(arr, param) {\r\n let i = arr.length;\r\n\r\n while (i--) {\r\n try { arr[i].destroy(param); } catch (e) { }\r\n delete arr[i];\r\n }\r\n\r\n arr.length = 0;\r\n }\r\n\r\n}","export default {\r\n id: 0,\r\n cache: {},\r\n\r\n getID(target) {\r\n let uid = this.getCacheID(target);\r\n if (uid) return uid;\r\n\r\n uid = `PUID_${this.id++}`;\r\n this.cache[uid] = target;\r\n\r\n return uid;\r\n },\r\n\r\n getCacheID(target) {\r\n let obj;\r\n for (let id in this.cache) {\r\n obj = this.cache[id];\r\n\r\n if (obj === target) return id;\r\n \r\n if (typeof obj === 'object' && typeof target === 'object' && obj.isInner && target.isInner) {\r\n if (obj.src === target.src)\r\n return id;\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n getTarget(uid) {\r\n return this.cache[uid];\r\n }\r\n}","/**\r\n * get -> PUID :: uid-> Body\r\n * -> cache[abc]. -> cache[abc] .pop()\r\n * -> create [new Body| clone]\r\n * -> return p1: { __pid: abc }\r\n * \r\n * expire -> cache[abc]= [p0, p1];\r\n * \r\n */\r\nimport Util from '../utils/Util';\r\nimport PUID from '../utils/PUID';\r\n\r\nexport default class Pool {\r\n\r\n /**\r\n * @memberof! Proton#\r\n * @constructor\r\n * @alias Proton.Pool\r\n *\r\n * @todo add description\r\n * @todo add description of properties\r\n *\r\n * @property {Number} total\r\n * @property {Object} cache\r\n */\r\n constructor(num) {\r\n this.total = 0;\r\n this.cache = {};\r\n }\r\n\r\n /**\r\n * @todo add description\r\n *\r\n * @method get\r\n * @memberof Proton#Proton.Pool\r\n *\r\n * @param {Object|Function} target\r\n * @param {Object} [params] just add if `target` is a function\r\n *\r\n * @return {Object}\r\n */\r\n get(target, params, uid) {\r\n let p;\r\n uid = uid || target.__puid || PUID.getID(target);\r\n\r\n if (this.cache[uid] && this.cache[uid].length > 0)\r\n p = this.cache[uid].pop();\r\n else\r\n p = this.createOrClone(target, params);\r\n\r\n p.__puid = target.__puid || uid;\r\n return p;\r\n }\r\n\r\n /**\r\n * @todo add description\r\n *\r\n * @method set\r\n * @memberof Proton#Proton.Pool\r\n *\r\n * @param {Object} target\r\n *\r\n * @return {Object}\r\n */\r\n expire(target) {\r\n return this.getCache(target.__puid).push(target);\r\n }\r\n\r\n /**\r\n * Creates a new class instance\r\n *\r\n * @todo add more documentation \r\n *\r\n * @method create\r\n * @memberof Proton#Proton.Pool\r\n *\r\n * @param {Object|Function} target any Object or Function\r\n * @param {Object} [params] just add if `target` is a function\r\n *\r\n * @return {Object}\r\n */\r\n createOrClone(target, params) {\r\n this.total++;\r\n\r\n if (this.create) {\r\n return this.create(target, params);\r\n } else if (typeof target == \"function\") {\r\n return Util.classApply(target, params);\r\n } else {\r\n return target.clone();\r\n }\r\n }\r\n\r\n /**\r\n * @todo add description - what is in the cache?\r\n *\r\n * @method getCount\r\n * @memberof Proton#Proton.Pool\r\n *\r\n * @return {Number}\r\n */\r\n getCount() {\r\n let count = 0;\r\n\r\n for (let id in this.cache)\r\n count += this.cache[id].length;\r\n\r\n return count++;;\r\n }\r\n\r\n /**\r\n * Destroyes all items from Pool.cache\r\n *\r\n * @method destroy\r\n * @memberof Proton#Proton.Pool\r\n */\r\n destroy() {\r\n for (let id in this.cache) {\r\n this.cache[id].length = 0;\r\n delete this.cache[id];\r\n }\r\n }\r\n\r\n /**\r\n * Returns Pool.cache\r\n *\r\n * @method getCache\r\n * @memberof Proton#Proton.Pool\r\n * @private\r\n *\r\n * @param {Number} uid the unique id\r\n *\r\n * @return {Object}\r\n */\r\n getCache(uid) {\r\n uid = uid || \"default\";\r\n\r\n if (!this.cache[uid]) this.cache[uid] = [];\r\n return this.cache[uid];\r\n }\r\n}","export default class Stats {\r\n\r\n constructor(proton) {\r\n this.proton = proton;\r\n this.container = null;\r\n this.type = 1;\r\n\r\n this.emitterIndex = 0;\r\n this.rendererIndex = 0;\r\n }\r\n\r\n update(style, body) {\r\n this.add(style, body);\r\n\r\n const emitter = this.getEmitter();\r\n const renderer = this.getRenderer();\r\n let str = \"\";\r\n\r\n switch (this.type) {\r\n case 2:\r\n str += \"emitter:\" + this.proton.emitters.length + \"
\";\r\n if (emitter) str += \"em speed:\" + emitter.emitSpeed + \"
\";\r\n if (emitter) str += \"pos:\" + this.getEmitterPos(emitter);\r\n break;\r\n\r\n case 3:\r\n if (emitter) str += \"initializes:\" + emitter.initializes.length + \"
\";\r\n if (emitter) str += \"\" + this.concatArr(emitter.initializes) + \"
\";\r\n if (emitter) str += \"behaviours:\" + emitter.behaviours.length + \"
\";\r\n if (emitter) str += \"\" + this.concatArr(emitter.behaviours) + \"
\";\r\n break;\r\n\r\n case 4:\r\n if (renderer) str += renderer.name + \"
\";\r\n if (renderer) str += \"body:\" + this.getCreatedNumber(renderer) + \"
\";\r\n break;\r\n\r\n default:\r\n str += \"particles:\" + this.proton.getCount() + \"
\";\r\n str += \"pool:\" + this.proton.pool.getCount() + \"
\";\r\n str += \"total:\" + this.proton.pool.total;\r\n }\r\n\r\n this.container.innerHTML = str;\r\n }\r\n\r\n add(style, body) {\r\n if (!this.container) {\r\n this.type = 1;\r\n\r\n this.container = document.createElement('div');\r\n this.container.style.cssText = [\r\n 'position:absolute;bottom:0px;left:0;cursor:pointer;',\r\n 'opacity:0.9;z-index:10000;padding:10px;font-size:12px;font-family:Helvetica,Arial,sans-serif;',\r\n 'width:120px;height:50px;background-color:#002;color:#0ff;'\r\n ].join('');\r\n\r\n this.container.addEventListener('click', e => {\r\n this.type++;\r\n if (this.type > 4) this.type = 1;\r\n }, false);\r\n\r\n let bg, color;\r\n switch (style) {\r\n case 2:\r\n bg = \"#201\";\r\n color = \"#f08\";\r\n break;\r\n\r\n case 3:\r\n bg = \"#020\";\r\n color = \"#0f0\";\r\n break;\r\n\r\n default:\r\n bg = \"#002\";\r\n color = \"#0ff\";\r\n }\r\n\r\n this.container.style[\"background-color\"] = bg;\r\n this.container.style[\"color\"] = color;\r\n }\r\n\r\n if (!this.container.parentNode) {\r\n body = body || this.body || document.body;\r\n body.appendChild(this.container);\r\n }\r\n }\r\n\r\n getEmitter() {\r\n return this.proton.emitters[this.emitterIndex];\r\n }\r\n\r\n getRenderer() {\r\n return this.proton.renderers[this.rendererIndex];\r\n }\r\n\r\n concatArr(arr) {\r\n let result = '';\r\n if (!arr || !arr.length) return result;\r\n\r\n for (let i = 0; i < arr.length; i++) {\r\n result += (arr[i].name || '').substr(0, 1) + '.';\r\n }\r\n\r\n return result;\r\n }\r\n\r\n getCreatedNumber(renderer) {\r\n return renderer.pool.total || (renderer.cpool && renderer.cpool.total) || 0;\r\n }\r\n\r\n getEmitterPos(e) {\r\n return Math.round(e.p.x) + \",\" + Math.round(e.p.y);\r\n }\r\n}","/*\r\n * EventDispatcher\r\n * This code reference since http://createjs.com/.\r\n *\r\n **/\r\n\r\nexport default class EventDispatcher {\r\n\r\n constructor() {\r\n this._listeners = null;\r\n }\r\n\r\n static bind(TargetClass){\r\n TargetClass.prototype.dispatchEvent = EventDispatcher.prototype.dispatchEvent;\r\n TargetClass.prototype.hasEventListener = EventDispatcher.prototype.hasEventListener;\r\n TargetClass.prototype.addEventListener = EventDispatcher.prototype.addEventListener;\r\n TargetClass.prototype.removeEventListener = EventDispatcher.prototype.removeEventListener;\r\n TargetClass.prototype.removeAllEventListeners = EventDispatcher.prototype.removeAllEventListeners;\r\n }\r\n\r\n addEventListener(type, listener) {\r\n if (!this._listeners) {\r\n this._listeners = {};\r\n } else {\r\n this.removeEventListener(type, listener);\r\n }\r\n\r\n if (!this._listeners[type]) this._listeners[type] = [];\r\n this._listeners[type].push(listener);\r\n\r\n return listener;\r\n }\r\n\r\n removeEventListener(type, listener) {\r\n if (!this._listeners) return;\r\n if (!this._listeners[type]) return;\r\n\r\n const arr = this._listeners[type];\r\n const length = arr.length;\r\n\r\n for (let i = 0;i < length; i++) {\r\n if (arr[i] == listener) {\r\n if (length == 1) {\r\n delete (this._listeners[type]);\r\n }\r\n\r\n // allows for faster checks.\r\n else {\r\n arr.splice(i, 1);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n removeAllEventListeners(type) {\r\n if (!type)\r\n this._listeners = null;\r\n else if (this._listeners)\r\n delete (this._listeners[type]);\r\n }\r\n\r\n dispatchEvent(type, args) {\r\n let result = false;\r\n const listeners = this._listeners;\r\n\r\n if (type && listeners) {\r\n let arr = listeners[type];\r\n if (!arr) return result;\r\n\r\n //arr = arr.slice();\r\n // to avoid issues with items being removed or added during the dispatch\r\n\r\n let handler;\r\n let i = arr.length;\r\n while (i--) {\r\n handler = arr[i];\r\n result = result || handler(args);\r\n }\r\n\r\n }\r\n\r\n return !!result;\r\n }\r\n\r\n hasEventListener(type) {\r\n const listeners = this._listeners;\r\n return !!(listeners && listeners[type]);\r\n }\r\n\r\n}","import Util from '../utils/Util';\r\n\r\nexport default class Integration {\r\n\r\n\tconstructor(type) {\r\n\t\tthis.type = type;\r\n\t}\r\n\r\n\tcalculate(particles, time, damping) {\r\n\t\tthis.eulerIntegrate(particles, time, damping);\r\n\t}\r\n\r\n\t// Euler Integrate\r\n\teulerIntegrate(particle, time, damping) {\r\n\t\tif (!particle.sleep) {\r\n\t\t\tparticle.old.p.copy(particle.p);\r\n\t\t\tparticle.old.v.copy(particle.v);\r\n\r\n\t\t\tparticle.a.multiplyScalar(1 / particle.mass);\r\n\t\t\tparticle.v.add(particle.a.multiplyScalar(time));\r\n\t\t\tparticle.p.add(particle.old.v.multiplyScalar(time));\r\n\r\n\t\t\tif (damping) particle.v.multiplyScalar(damping);\r\n\r\n\t\t\tparticle.a.clear();\r\n\t\t}\r\n\t}\r\n}","import Pool from './Pool';\r\nimport Util from '../utils/Util';\r\nimport Stats from '../debug/Stats';\r\nimport EventDispatcher from '../events/EventDispatcher';\r\nimport Integration from '../math/Integration';\r\n\r\nexport default class Proton {\r\n\r\n static USE_CLOCK = false;\r\n\r\n //1:100\r\n static MEASURE = 100;\r\n static EULER = 'euler';\r\n static RK2 = 'runge-kutta2';\r\n\r\n static PARTICLE_CREATED = 'PARTICLE_CREATED';\r\n static PARTICLE_UPDATE = 'PARTICLE_UPDATE';\r\n static PARTICLE_SLEEP = 'PARTICLE_SLEEP';\r\n static PARTICLE_DEAD = 'PARTICLE_DEAD';\r\n static PROTON_UPDATE = 'PROTON_UPDATE';\r\n static PROTON_UPDATE_AFTER = 'PROTON_UPDATE_AFTER';\r\n static EMITTER_ADDED = 'EMITTER_ADDED';\r\n static EMITTER_REMOVED = 'EMITTER_REMOVED';\r\n\r\n static amendChangeTabsBug = true;\r\n\r\n /**\r\n * The constructor to add emitters\r\n *\r\n * @constructor Proton\r\n *\r\n * @todo proParticleCount is not in use\r\n * @todo add more documentation of the single properties and parameters\r\n *\r\n * @param {Number} [proParticleCount] not in use?\r\n * @param {Number} [integrationType=Proton.EULER]\r\n *\r\n * @property {String} [integrationType=Proton.EULER]\r\n * @property {Array} emitters All added emitter\r\n * @property {Array} renderers All added renderer\r\n * @property {Number} time The active time\r\n * @property {Number} oldtime The old time\r\n */\r\n constructor(integrationType) {\r\n\r\n this.emitters = [];\r\n this.renderers = [];\r\n\r\n this.time = 0;\r\n this.oldTime = 0;\r\n this.elapsed = 0;\r\n\r\n this.stats = new Stats(this);\r\n this.pool = new Pool(80);\r\n\r\n this.integrationType = Util.initValue(integrationType, Proton.EULER);\r\n this.integrator = new Integration(this.integrationType);\r\n }\r\n\r\n /**\r\n * add a type of Renderer\r\n *\r\n * @method addRenderer\r\n * @memberof Proton\r\n * @instance\r\n *\r\n * @param {Renderer} render\r\n */\r\n addRenderer(render) {\r\n render.init(this);\r\n this.renderers.push(render);\r\n }\r\n\r\n /**\r\n * @name add a type of Renderer\r\n *\r\n * @method addRenderer\r\n * @param {Renderer} render\r\n */\r\n removeRenderer(render) {\r\n const index = this.renderers.indexOf(render);\r\n this.renderers.splice(index, 1);\r\n render.remove(this);\r\n }\r\n\r\n /**\r\n * add the Emitter\r\n *\r\n * @method addEmitter\r\n * @memberof Proton\r\n * @instance\r\n *\r\n * @param {Emitter} emitter\r\n */\r\n addEmitter(emitter) {\r\n this.emitters.push(emitter);\r\n emitter.parent = this;\r\n\r\n this.dispatchEvent(Proton.EMITTER_ADDED, emitter);\r\n }\r\n\r\n /**\r\n * Removes an Emitter\r\n *\r\n * @method removeEmitter\r\n * @memberof Proton\r\n * @instance\r\n *\r\n * @param {Proton.Emitter} emitter\r\n */\r\n removeEmitter(emitter) {\r\n const index = this.emitters.indexOf(emitter);\r\n this.emitters.splice(index, 1);\r\n emitter.parent = null;\r\n\r\n this.dispatchEvent(Proton.EMITTER_REMOVED, emitter);\r\n }\r\n\r\n /**\r\n * Updates all added emitters\r\n *\r\n * @method update\r\n * @memberof Proton\r\n * @instance\r\n */\r\n update() {\r\n this.dispatchEvent(Proton.PROTON_UPDATE);\r\n\r\n if (Proton.USE_CLOCK) {\r\n if (!this.oldTime) this.oldTime = (new Date()).getTime();\r\n\r\n let time = new Date().getTime();\r\n this.elapsed = (time - this.oldTime) / 1000;\r\n Proton.amendChangeTabsBug && this.amendChangeTabsBug();\r\n\r\n this.oldTime = time;\r\n } else {\r\n this.elapsed = 0.0167;\r\n }\r\n\r\n // emitter update\r\n if (this.elapsed > 0) this.emittersUpdate(this.elapsed);\r\n\r\n this.dispatchEvent(Proton.PROTON_UPDATE_AFTER);\r\n }\r\n\r\n emittersUpdate(elapsed) {\r\n let i = this.emitters.length;\r\n while (i--) this.emitters[i].update(elapsed);\r\n }\r\n\r\n /**\r\n * @todo add description\r\n *\r\n * @method amendChangeTabsBug\r\n * @memberof Proton\r\n * @instance\r\n */\r\n amendChangeTabsBug() {\r\n if (this.elapsed > .5) {\r\n this.oldTime = (new Date()).getTime();\r\n this.elapsed = 0;\r\n }\r\n }\r\n\r\n /**\r\n * Counts all particles from all emitters\r\n *\r\n * @method getCount\r\n * @memberof Proton\r\n * @instance\r\n */\r\n getCount() {\r\n let total = 0;\r\n let i = this.emitters.length;\r\n\r\n while (i--) total += this.emitters[i].particles.length;\r\n return total;\r\n }\r\n\r\n getAllParticles() {\r\n let particles = [];\r\n let i = this.emitters.length;\r\n\r\n while (i--) particles = particles.concat(this.emitters[i].particles);\r\n return particles;\r\n }\r\n\r\n /**\r\n * Destroys everything related to this Proton instance. This includes all emitters, and all properties\r\n *\r\n * @method destroy\r\n * @memberof Proton\r\n * @instance\r\n */\r\n destroy() {\r\n Util.destroy(this.renderers, this.getAllParticles());\r\n Util.destroy(this.emitters);\r\n\r\n this.time = 0;\r\n this.oldTime = 0;\r\n\r\n this.pool.destroy();\r\n }\r\n}\r\n\r\nEventDispatcher.bind(Proton);","import MathUtils from './MathUtils';\r\n\r\nexport default {\r\n\r\n easeLinear(value) {\r\n return value;\r\n },\r\n\r\n easeInQuad(value) {\r\n return Math.pow(value, 2);\r\n },\r\n\r\n easeOutQuad(value) {\r\n return -(Math.pow((value - 1), 2) - 1);\r\n },\r\n\r\n easeInOutQuad(value) {\r\n if ((value /= 0.5) < 1)\r\n return 0.5 * Math.pow(value, 2);\r\n\r\n return -0.5 * ((value -= 2) * value - 2);\r\n },\r\n\r\n easeInCubic(value) {\r\n return Math.pow(value, 3);\r\n },\r\n\r\n easeOutCubic(value) {\r\n return (Math.pow((value - 1), 3) + 1);\r\n },\r\n\r\n easeInOutCubic(value) {\r\n if ((value /= 0.5) < 1)\r\n return 0.5 * Math.pow(value, 3);\r\n\r\n return 0.5 * (Math.pow((value - 2), 3) + 2);\r\n },\r\n\r\n easeInQuart(value) {\r\n return Math.pow(value, 4);\r\n },\r\n\r\n easeOutQuart(value) {\r\n return -(Math.pow((value - 1), 4) - 1);\r\n },\r\n\r\n easeInOutQuart(value) {\r\n if ((value /= 0.5) < 1)\r\n return 0.5 * Math.pow(value, 4);\r\n\r\n return -0.5 * ((value -= 2) * Math.pow(value, 3) - 2);\r\n },\r\n\r\n easeInSine(value) {\r\n return -Math.cos(value * (MathUtils.PI_2)) + 1;\r\n },\r\n\r\n easeOutSine(value) {\r\n return Math.sin(value * (MathUtils.PI_2));\r\n },\r\n\r\n easeInOutSine(value) {\r\n return (-0.5 * (Math.cos(MathUtils.PI * value) - 1));\r\n },\r\n\r\n easeInExpo(value) {\r\n return (value === 0) ? 0 : Math.pow(2, 10 * (value - 1));\r\n },\r\n\r\n easeOutExpo(value) {\r\n return (value === 1) ? 1 : -Math.pow(2, -10 * value) + 1;\r\n },\r\n\r\n easeInOutExpo(value) {\r\n if (value === 0)\r\n return 0;\r\n\r\n if (value === 1)\r\n return 1;\r\n\r\n if ((value /= 0.5) < 1)\r\n return 0.5 * Math.pow(2, 10 * (value - 1));\r\n\r\n return 0.5 * (-Math.pow(2, -10 * --value) + 2);\r\n },\r\n\r\n easeInCirc(value) {\r\n return -(Math.sqrt(1 - (value * value)) - 1);\r\n },\r\n\r\n easeOutCirc(value) {\r\n return Math.sqrt(1 - Math.pow((value - 1), 2));\r\n },\r\n\r\n easeInOutCirc(value) {\r\n if ((value /= 0.5) < 1)\r\n return -0.5 * (Math.sqrt(1 - value * value) - 1);\r\n return 0.5 * (Math.sqrt(1 - (value -= 2) * value) + 1);\r\n },\r\n\r\n easeInBack(value) {\r\n let s = 1.70158;\r\n return (value) * value * ((s + 1) * value - s);\r\n },\r\n\r\n easeOutBack(value) {\r\n let s = 1.70158;\r\n return (value = value - 1) * value * ((s + 1) * value + s) + 1;\r\n },\r\n\r\n easeInOutBack(value) {\r\n let s = 1.70158;\r\n if ((value /= 0.5) < 1)\r\n return 0.5 * (value * value * (((s *= (1.525)) + 1) * value - s));\r\n return 0.5 * ((value -= 2) * value * (((s *= (1.525)) + 1) * value + s) + 2);\r\n },\r\n\r\n getEasing(ease) {\r\n if (typeof ease === 'function')\r\n return ease;\r\n else\r\n return this[ease] || this.easeLinear;\r\n }\r\n};","import Util from '../utils/Util';\r\nimport ease from '../math/ease';\r\nimport Vector2D from '../math/Vector2D';\r\nimport MathUtils from '../math/MathUtils';\r\n\r\nexport default class Particle {\r\n\r\n static ID = 0;\r\n\r\n /**\r\n * the Particle class\r\n *\r\n * @class Proton.Particle\r\n * @constructor\r\n * @param {Object} pObj the parameters object;\r\n * for example {life:3,dead:false}\r\n */\r\n constructor(pOBJ) {\r\n /**\r\n * The particle's id;\r\n * @property id\r\n * @type {string}\r\n */\r\n this.id = `particle_${Particle.ID++}`;\r\n this.reset('init');\r\n\r\n pOBJ && Util.setPrototypeByObject(this, pOBJ);\r\n }\r\n\r\n getDirection() {\r\n return Math.atan2(this.v.x, -this.v.y) * MathUtils.N180_PI;\r\n }\r\n\r\n reset(init) {\r\n this.life = Infinity;\r\n this.age = 0;\r\n\r\n //Energy loss\r\n this.energy = 1;\r\n this.dead = false;\r\n this.sleep = false;\r\n this.body = null;\r\n this.sprite = null;\r\n this.parent = null;\r\n\r\n this.mass = 1;\r\n this.radius = 10;\r\n this.alpha = 1;\r\n this.scale = 1;\r\n this.rotation = 0;\r\n this.color = null;\r\n\r\n this.easing = ease.easeLinear;\r\n\r\n if (init == 'init') {\r\n this.transform = {};\r\n this.p = new Vector2D();\r\n this.v = new Vector2D();\r\n this.a = new Vector2D();\r\n\r\n this.old = {\r\n p: new Vector2D(),\r\n v: new Vector2D(),\r\n a: new Vector2D()\r\n };\r\n\r\n this.behaviours = [];\r\n } else {\r\n Util.destroyObject(this.transform, 'rgb');\r\n\r\n this.p.set(0, 0);\r\n this.v.set(0, 0);\r\n this.a.set(0, 0);\r\n\r\n this.old.p.set(0, 0);\r\n this.old.v.set(0, 0);\r\n this.old.a.set(0, 0);\r\n\r\n this.removeAllBehaviours();\r\n }\r\n\r\n if (!this.transform.rgb) {\r\n this.transform.rgb = { r: 255, g: 255, b: 255 };\r\n } else {\r\n this.transform.rgb.r = 255;\r\n this.transform.rgb.g = 255;\r\n this.transform.rgb.b = 255;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n update(time, index) {\r\n if (!this.sleep) {\r\n this.age += time;\r\n this.applyBehaviours(time, index);\r\n }\r\n\r\n if (this.age < this.life) {\r\n const scale = this.easing(this.age / this.life);\r\n this.energy = Math.max(1 - scale, 0);\r\n } else {\r\n this.destroy();\r\n }\r\n }\r\n\r\n applyBehaviours(time, index) {\r\n const length = this.behaviours.length;\r\n let i;\r\n\r\n for (i = 0; i < length; i++) {\r\n this.behaviours[i] && this.behaviours[i].applyBehaviour(this, time, index)\r\n }\r\n }\r\n\r\n addBehaviour(behaviour) {\r\n this.behaviours.push(behaviour);\r\n\r\n if (behaviour.hasOwnProperty('parents')) behaviour.parents.push(this);\r\n behaviour.initialize(this);\r\n }\r\n\r\n addBehaviours(behaviours) {\r\n const length = behaviours.length;\r\n let i;\r\n\r\n for (i = 0; i < length; i++) {\r\n this.addBehaviour(behaviours[i]);\r\n }\r\n }\r\n\r\n removeBehaviour(behaviour) {\r\n const index = this.behaviours.indexOf(behaviour);\r\n\r\n if (index > -1) {\r\n const behaviour = this.behaviours.splice(index, 1);\r\n behaviour.parents = null;\r\n }\r\n }\r\n\r\n removeAllBehaviours() {\r\n Util.destroyArray(this.behaviours);\r\n }\r\n\r\n /**\r\n * Destory this particle\r\n * @method destroy\r\n */\r\n destroy() {\r\n this.removeAllBehaviours();\r\n this.energy = 0;\r\n this.dead = true;\r\n this.parent = null;\r\n }\r\n\r\n}","export default {\r\n\r\n /**\r\n * @typedef {Object} rgbObject\r\n * @property {Number} r red value\r\n * @property {Number} g green value\r\n * @property {Number} b blue value\r\n */\r\n /**\r\n * converts a hex value to a rgb object\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method hexToRGB\r\n *\r\n * @param {String} h any hex value, e.g. #000000 or 000000 for black\r\n *\r\n * @return {rgbObject}\r\n */\r\n hexToRGB(h) {\r\n const hex16 = (h.charAt(0) == \"#\") ? h.substring(1, 7) : h;\r\n const r = parseInt(hex16.substring(0, 2), 16);\r\n const g = parseInt(hex16.substring(2, 4), 16);\r\n const b = parseInt(hex16.substring(4, 6), 16);\r\n\r\n return { r, g, b };\r\n },\r\n\r\n /**\r\n * converts a rgb value to a rgb string\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method rgbToHex\r\n *\r\n * @param {Object | Proton.hexToRGB} rgb a rgb object like in {@link Proton#Proton.}\r\n *\r\n * @return {String} rgb()\r\n */\r\n rgbToHex(rbg) {\r\n return `rgb(${rbg.r}, ${rbg.g}, ${rbg.b})`;\r\n },\r\n\r\n getHex16FromParticle(p) {\r\n return Number(p.transform.rgb.r) * 65536 + Number(p.transform.rgb.g) * 256 + Number(p.transform.rgb.b);\r\n }\r\n}","import Vector2D from './Vector2D';\r\n\r\nexport default class Polar2D {\r\n\r\n\tconstructor(r, tha) {\r\n\t\tthis.r = Math.abs(r) || 0;\r\n\t\tthis.tha = tha || 0;\r\n\t}\r\n\r\n\tset(r, tha) {\r\n\t\tthis.r = r;\r\n\t\tthis.tha = tha;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tsetR(r) {\r\n\t\tthis.r = r;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tsetTha(tha) {\r\n\t\tthis.tha = tha;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tcopy(p) {\r\n\t\tthis.r = p.r;\r\n\t\tthis.tha = p.tha;\r\n\t\treturn this;\r\n\t}\r\n\r\n\ttoVector() {\r\n\t\treturn new Vector2D(this.getX(), this.getY());\r\n\t}\r\n\r\n\tgetX() {\r\n\t\treturn this.r * Math.sin(this.tha);\r\n\t}\r\n\r\n\tgetY() {\r\n\t\treturn -this.r * Math.cos(this.tha);\r\n\t}\r\n\r\n\tnormalize() {\r\n\t\tthis.r = 1;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tequals(v) {\r\n\t\treturn ((v.r === this.r) && (v.tha === this.tha));\r\n\t}\r\n\r\n\tclear() {\r\n\t\tthis.r = 0.0;\r\n\t\tthis.tha = 0.0;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tclone() {\r\n\t\treturn new Polar2D(this.r, this.tha);\r\n\t}\r\n}","export default {\r\n\tcreate(mat3) {\r\n\t\tconst mat = new Float32Array(9);\r\n\t\tif (mat3) this.set(mat3, mat);\r\n\r\n\t\treturn mat;\r\n\t},\r\n\r\n\tset(mat1, mat2) {\r\n\t\tfor (let i = 0; i < 9; i++)\r\n\t\t\tmat2[i] = mat1[i];\r\n\r\n\t\treturn mat2;\r\n\t},\r\n\r\n\tmultiply(mat, mat2, mat3) {\r\n\t\tlet a00 = mat[0], a01 = mat[1], a02 = mat[2], a10 = mat[3], a11 = mat[4], a20 = mat[6], a21 = mat[7], b00 = mat2[0], b01 = mat2[1], b02 = mat2[2], b10 = mat2[3], b11 = mat2[4], b20 = mat2[6], b21 = mat2[7];\r\n\r\n\t\tmat3[0] = b00 * a00 + b01 * a10;\r\n\t\tmat3[1] = b00 * a01 + b01 * a11;\r\n\t\tmat3[2] = a02 * b02;\r\n\t\tmat3[3] = b10 * a00 + b11 * a10;\r\n\t\tmat3[4] = b10 * a01 + b11 * a11;\r\n\t\tmat3[6] = b20 * a00 + b21 * a10 + a20;\r\n\t\tmat3[7] = b20 * a01 + b21 * a11 + a21;\r\n\r\n\t\treturn mat3;\r\n\t},\r\n\r\n\tinverse(mat, mat3) {\r\n\t\tlet a00 = mat[0], a01 = mat[1], a10 = mat[3], a11 = mat[4], a20 = mat[6], a21 = mat[7], b01 = a11, b11 = -a10, b21 = a21 * a10 - a11 * a20, d = a00 * b01 + a01 * b11, id;\r\n\r\n\t\tid = 1 / d;\r\n\t\tmat3[0] = b01 * id;\r\n\t\tmat3[1] = (-a01) * id;\r\n\t\tmat3[3] = b11 * id;\r\n\t\tmat3[4] = a00 * id;\r\n\t\tmat3[6] = b21 * id;\r\n\t\tmat3[7] = (-a21 * a00 + a01 * a20) * id;\r\n\r\n\t\treturn mat3;\r\n\t},\r\n\r\n\tmultiplyVec2(m, vec, mat3) {\r\n\t\tlet x = vec[0], y = vec[1];\r\n\r\n\t\tmat3[0] = x * m[0] + y * m[3] + m[6];\r\n\t\tmat3[1] = x * m[1] + y * m[4] + m[7];\r\n\r\n\t\treturn mat3;\r\n\t}\r\n}","import Span from './Span';\r\nimport Util from '../utils/Util';\r\nimport MathUtils from './MathUtils';\r\n\r\nexport default class ArraySpan extends Span {\r\n\r\n constructor(color) {\r\n super();\r\n this._arr = Util.isArray(color) ? color : [color];\r\n }\r\n\r\n getValue() {\r\n const color = this._arr[Math.floor(this._arr.length * Math.random())];\r\n return color === 'random' || color === 'Random' ? MathUtils.randomColor() : color;\r\n }\r\n\r\n /**\r\n * Make sure that the color is an instance of Proton.ArraySpan, if not it makes a new instance\r\n *\r\n * @method setSpanValue\r\n * @memberof Proton#Proton.Color\r\n * @instance\r\n *\r\n * @param {Proton.Particle} particle\r\n * @param {Number} the integrate time 1/ms\r\n * @param {Int} the particle index\r\n */\r\n static createArraySpan(arr) {\r\n if (!arr) return null;\r\n\r\n if (arr instanceof ArraySpan)\r\n return arr;\r\n else\r\n return new ArraySpan(arr);\r\n }\r\n\r\n}","export default class Rectangle {\r\n\r\n\tconstructor(x, y, w, h) {\r\n\t\tthis.x = x;\r\n\t\tthis.y = y;\r\n\r\n\t\tthis.width = w;\r\n\t\tthis.height = h;\r\n\r\n\t\tthis.bottom = this.y + this.height;\r\n\t\tthis.right = this.x + this.width;\r\n\t}\r\n\r\n\tcontains(x, y) {\r\n\t\tif (x <= this.right && x >= this.x && y <= this.bottom && y >= this.y)\r\n\t\t\treturn true;\r\n\t\telse\r\n\t\t\treturn false;\r\n\t}\r\n}\r\n","import Util from '../utils/Util';\r\n\r\nexport default class Rate {\r\n\r\n\t/**\r\n\t * The number of particles per second emission (a [particle]/b [s]);\r\n\t * @namespace\r\n\t * @memberof! Proton#\r\n\t * @constructor\r\n\t * @alias Rate\r\n\t *\r\n\t * @param {Array | Number | Span} numpan the number of each emission;\r\n\t * @param {Array | Number | Span} timepan the time of each emission;\r\n\t * for example: new Rate(new Span(10, 20), new Span(.1, .25));\r\n\t */\r\n\tconstructor(numpan, timepan) {\r\n\t\tthis.numPan = Util.setSpanValue(Util.initValue(numpan, 1));\r\n\t\tthis.timePan = Util.setSpanValue(Util.initValue(timepan, 1));\r\n\r\n\t\tthis.startTime = 0;\r\n\t\tthis.nextTime = 0;\r\n\t\tthis.init();\r\n\t}\r\n\r\n\tinit() {\r\n\t\tthis.startTime = 0;\r\n\t\tthis.nextTime = this.timePan.getValue();\r\n\t}\r\n\r\n\tgetValue(time) {\r\n\t\tthis.startTime += time;\r\n\r\n\t\tif (this.startTime >= this.nextTime) {\r\n\t\t\tthis.startTime = 0;\r\n\t\t\tthis.nextTime = this.timePan.getValue();\r\n\r\n\t\t\tif (this.numPan.b == 1) {\r\n\t\t\t\tif (this.numPan.getValue(false) > 0.5)\r\n\t\t\t\t\treturn 1;\r\n\t\t\t\telse\r\n\t\t\t\t\treturn 0;\r\n\t\t\t} else {\r\n\t\t\t\treturn this.numPan.getValue(true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn 0;\r\n\t}\r\n}","export default class Initialize {\r\n\t\r\n\treset() {\r\n\t}\r\n\r\n\tinit(emitter, particle) {\r\n\t\tif (particle) {\r\n\t\t\tthis.initialize(particle);\r\n\t\t} else {\r\n\t\t\tthis.initialize(emitter);\r\n\t\t}\r\n\t};\r\n\r\n\t///sub class init\r\n\tinitialize(target) {\r\n\t};\r\n}","import Util from '../utils/Util';\r\nimport Initialize from './Initialize';\r\n\r\nexport default class Life extends Initialize {\r\n\r\n\tconstructor(a, b, c) {\r\n\t\tsuper();\r\n\r\n\t\tthis.lifePan = Util.setSpanValue(a, b, c);\r\n\t\tthis.name = 'Life';\r\n\t}\r\n\r\n\tinitialize(target) {\r\n\t\tif (this.lifePan.a == Infinity)\r\n\t\t\ttarget.life = Infinity;\r\n\t\telse\r\n\t\t\ttarget.life = this.lifePan.getValue();\r\n\t}\r\n}\r\n","import Vector2D from '../math/Vector2D';\r\n\r\nexport default class Zone {\r\n\tconstructor() {\r\n\t\tthis.vector = new Vector2D(0, 0);\r\n\t\tthis.random = 0;\r\n\t\tthis.crossType = \"dead\";\r\n\t\tthis.alert = true;\r\n\t}\r\n\r\n\tgetPosition() {\r\n\t}\r\n\r\n\tcrossing(particle) {\r\n\t}\r\n}","import Zone from './Zone';\r\n\r\nexport default class PointZone extends Zone {\r\n\r\n\tconstructor(x, y) {\r\n\t\tsuper();\r\n\t\tthis.x = x;\r\n\t\tthis.y = y;\r\n\t}\r\n\r\n\tgetPosition() {\r\n\t\tthis.vector.x = this.x;\r\n\t\tthis.vector.y = this.y;\r\n\r\n\t\treturn this.vector;\r\n\t}\r\n\r\n\tcrossing(particle) {\r\n\t\t\r\n\t\tif (this.alert) {\r\n\t\t\talert('Sorry PointZone does not support crossing method');\r\n\t\t\tthis.alert = false;\r\n\t\t}\r\n\t}\r\n}","import Util from '../utils/Util';\r\nimport PointZone from '../zone/PointZone';\r\nimport Initialize from './Initialize';\r\n\r\nexport default class Position extends Initialize {\r\n\r\n\tconstructor(zone) {\r\n\t\tsuper();\r\n\t\tthis.zone = Util.initValue(zone, new PointZone());\r\n\r\n\t\tthis.name = 'Position';\r\n\t}\r\n\r\n\treset(zone) {\r\n\t\tthis.zone = Util.initValue(zone, new PointZone());\r\n\t}\r\n\r\n\tinitialize(target) {\r\n\t\tthis.zone.getPosition();\r\n\r\n\t\ttarget.p.x = this.zone.vector.x;\r\n\t\ttarget.p.y = this.zone.vector.y;\r\n\t};\r\n\r\n}\r\n","import Proton from '../core/Proton';\r\nimport Util from '../utils/Util';\r\nimport Polar2D from '../math/Polar2D';\r\nimport MathUtils from '../math/MathUtils';\r\nimport Initialize from './Initialize';\r\n\r\nexport default class Velocity extends Initialize {\r\n\r\n constructor(rpan, thapan, type) {\r\n super();\r\n\r\n this.rPan = Util.setSpanValue(rpan);\r\n this.thaPan = Util.setSpanValue(thapan);\r\n this.type = Util.initValue(type, 'vector');\r\n\r\n this.name = 'Velocity';\r\n }\r\n\r\n reset(rpan, thapan, type) {\r\n this.rPan = Util.setSpanValue(rpan);\r\n this.thaPan = Util.setSpanValue(thapan);\r\n this.type = Util.initValue(type, 'vector');\r\n };\r\n\r\n normalizeVelocity(vr) {\r\n return vr * Proton.MEASURE;\r\n }\r\n\r\n initialize(target) {\r\n if (this.type == 'p' || this.type == 'P' || this.type == 'polar') {\r\n const polar2d = new Polar2D(this.normalizeVelocity(this.rPan.getValue()), this.thaPan.getValue() * MathUtils.PI_180);\r\n\r\n target.v.x = polar2d.getX();\r\n target.v.y = polar2d.getY();\r\n } else {\r\n target.v.x = this.normalizeVelocity(this.rPan.getValue());\r\n target.v.y = this.normalizeVelocity(this.thaPan.getValue());\r\n }\r\n };\r\n}","import Util from '../utils/Util';\r\nimport Initialize from './Initialize';\r\n\r\nexport default class Mass extends Initialize {\r\n\r\n\tconstructor(a, b, c) {\r\n\t\tsuper();\r\n\t\tthis.massPan = Util.setSpanValue(a, b, c);\r\n\t\tthis.name = 'Mass';\r\n\t}\r\n\r\n\tinitialize(target) {\r\n\t\ttarget.mass = this.massPan.getValue();\r\n\t}\r\n}","import Util from '../utils/Util';\r\nimport Initialize from './Initialize';\r\n\r\nexport default class Radius extends Initialize {\r\n\r\n\tconstructor(a, b, c) {\r\n\t\tsuper();\r\n\t\tthis.radius = Util.setSpanValue(a, b, c);\r\n\r\n\t\tthis.name = 'Radius';\r\n\t}\r\n\r\n\treset(a, b, c) {\r\n\t\tthis.radius = Util.setSpanValue(a, b, c);\r\n\t};\r\n\r\n\tinitialize(particle) {\r\n\t\tparticle.radius = this.radius.getValue();\r\n\t\tparticle.transform.oldRadius = particle.radius;\r\n\t};\r\n}","import Util from '../utils/Util';\r\nimport ArraySpan from '../math/ArraySpan';\r\nimport Initialize from './Initialize';\r\n\r\nexport default class Body extends Initialize {\r\n\r\n constructor(image, w, h) {\r\n super();\r\n\r\n this.image = this.setSpanValue(image);\r\n this.w = Util.initValue(w, 20);\r\n this.h = Util.initValue(h, this.w);\r\n this.name = 'Body';\r\n }\r\n\r\n initialize(particle) {\r\n const imagetarget = this.image.getValue();\r\n\r\n if (typeof(imagetarget) == 'string') {\r\n particle.body = { width: this.w, height: this.h, src: imagetarget , isInner: true, inner: true };\r\n } else {\r\n particle.body = imagetarget;\r\n }\r\n };\r\n\r\n setSpanValue(color) {\r\n return color instanceof ArraySpan ? color : new ArraySpan(color);\r\n }\r\n}","import Proton from '../core/Proton';\r\nimport Util from '../utils/Util';\r\nimport ease from '../math/ease';\r\n\r\nexport default class Behaviour {\r\n static id = 0;\r\n\r\n /**\r\n * The Behaviour class is the base for the other Behaviour\r\n *\r\n * @memberof! -\r\n * @interface\r\n * @alias Proton.Behaviour\r\n *\r\n * @param {Number} life \tthe behaviours life\r\n * @param {String} easing \tThe behaviour's decaying trend, for example ease.easeOutQuart\r\n *\r\n * @property {String} id \t\tThe behaviours id\r\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n * @property {Number} age=0 \tHow long the particle should be 'alife'\r\n * @property {Number} energy=1\r\n * @property {Boolean} dead=false The particle is dead at first\r\n * @property {Array} parents \tThe behaviour's parents array\r\n * @property {String} name \tThe behaviour name\r\n */\r\n constructor(life, easing) {\r\n\r\n this.life = Util.initValue(life, Infinity);\r\n this.easing = ease.getEasing(easing);\r\n\r\n this.age = 0;\r\n this.energy = 1;\r\n this.dead = false;\r\n this.parents = [];\r\n\r\n this.id = `Behaviour_${Behaviour.id++}`;\r\n this.name = 'Behaviour';\r\n }\r\n\r\n /**\r\n * Reset this behaviour's parameters\r\n *\r\n * @method reset\r\n * @memberof Proton.Behaviour\r\n * @instance\r\n *\r\n * @param {Number} [life=Infinity] \t\tthis behaviour's life\r\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\r\n */\r\n reset(life, easing) {\r\n this.life = Util.initValue(life, Infinity);\r\n this.easing = ease.getEasing(easing);\r\n }\r\n\r\n /**\r\n * Normalize a force by 1:100;\r\n *\r\n * @method normalizeForce\r\n * @memberof Proton.Behaviour\r\n * @instance\r\n *\r\n * @param {Proton.Vector2D} force \r\n */\r\n normalizeForce(force) {\r\n return force.multiplyScalar(Proton.MEASURE);\r\n }\r\n\r\n /**\r\n * Normalize a value by 1:100;\r\n *\r\n * @method normalizeValue\r\n * @memberof Proton.Behaviour\r\n * @instance\r\n *\r\n * @param {Number} value\r\n */\r\n normalizeValue(value) {\r\n return value * Proton.MEASURE;\r\n }\r\n\r\n /**\r\n * Initialize the behaviour's parameters for all particles\r\n *\r\n * @method initialize\r\n * @memberof Proton.Behaviour\r\n * @instance\r\n *\r\n * @param {Proton.Particle} particle\r\n */\r\n initialize(particle) {}\r\n\r\n /**\r\n * Apply this behaviour for all particles every time\r\n *\r\n * @method applyBehaviour\r\n * @memberof Proton.Behaviour\r\n * @instance\r\n *\r\n * @param {Proton.Particle} particle\r\n * @param {Number} \t\t\ttime the integrate time 1/ms\r\n * @param {Int} \t\t\tindex the particle index\r\n */\r\n calculate(particle, time, index) {\r\n this.age += time;\r\n\r\n if (this.age >= this.life || this.dead) {\r\n this.energy = 0;\r\n this.dead = true;\r\n this.destroy();\r\n } else {\r\n const scale = this.easing(particle.age / particle.life);\r\n this.energy = Math.max(1 - scale, 0);\r\n }\r\n }\r\n\r\n /**\r\n * Destory this behaviour\r\n *\r\n * @method destroy\r\n * @memberof Proton.Behaviour\r\n * @instance\r\n */\r\n destroy() {\r\n let i = this.parents.length;\r\n while (i--) {\r\n this.parents[i].removeBehaviour(this);\r\n }\r\n\r\n this.parents.length = 0;\r\n }\r\n}","import Util from '../utils/Util';\r\nimport Vector2D from '../math/Vector2D';\r\nimport Behaviour from './Behaviour';\r\n\r\nexport default class Force extends Behaviour {\r\n\r\n\t/**\r\n\t * @memberof! Proton#\r\n\t * @augments Proton.Behaviour\r\n\t * @constructor\r\n\t * @alias Proton.Force\r\n\t *\r\n\t * @param {Number} fx\r\n\t * @param {Number} fy\r\n\t * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t *\r\n\t * @property {String} name The Behaviour name\r\n\t */\r\n\tconstructor(fx, fy, life, easing) {\r\n\t\tsuper(life, easing);\r\n\r\n\t\tthis.force = this.normalizeForce(new Vector2D(fx, fy));\r\n\t\tthis.name = \"Force\";\r\n\t}\r\n\r\n\t/**\r\n\t * Reset this behaviour's parameters\r\n\t *\r\n\t * @method reset\r\n\t * @memberof Proton#Proton.Force\r\n\t * @instance\r\n\t *\r\n\t * @param {Number} fx\r\n\t * @param {Number} fy\r\n\t * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t */\r\n\treset(fx, fy, life, easing) {\r\n\t\tthis.force = this.normalizeForce(new Vector2D(fx, fy));\r\n\r\n\t\tlife && super.reset(life, easing);\r\n\t}\r\n\r\n\t/**\r\n\t * Apply this behaviour for all particles every time\r\n\t *\r\n\t * @method applyBehaviour\r\n\t * @memberof Proton#Proton.Force\r\n\t * @instance\r\n\t *\r\n\t * @param {Proton.Particle} particle\r\n\t * @param {Number} the integrate time 1/ms\r\n\t * @param {Int} the particle index\r\n\t */\r\n\tapplyBehaviour(particle, time, index) {\r\n\t\tthis.calculate(particle, time, index);\r\n\t\tparticle.a.add(this.force);\r\n\t}\r\n}","import Util from '../utils/Util';\r\nimport Vector2D from '../math/Vector2D';\r\nimport Behaviour from './Behaviour';\r\n\r\nexport default class Attraction extends Behaviour {\r\n\r\n\t/**\r\n\t * This behaviour let the particles follow one specific Proton.Vector2D\r\n\t *\r\n\t * @memberof! Proton#\r\n\t * @augments Proton.Behaviour\r\n\t * @constructor\r\n\t * @alias Proton.Attraction\r\n\t *\r\n\t * @todo add description for 'force' and 'radius'\r\n\t *\r\n\t * @param {Proton.Vector2D} targetPosition the attraction point coordinates\r\n\t * @param {Number} [force=100]\r\n\t * @param {Number} [radius=1000]\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t *\r\n\t * @property {Proton.Vector2D} targetPosition\r\n\t * @property {Number} radius\r\n\t * @property {Number} force\r\n\t * @property {Number} radiusSq\r\n\t * @property {Proton.Vector2D} attractionForce\r\n\t * @property {Number} lengthSq\r\n\t * @property {String} name The Behaviour name\r\n\t */\r\n\tconstructor(targetPosition, force, radius, life, easing) {\r\n\t\tsuper(life, easing);\r\n\r\n\t\tthis.targetPosition = Util.initValue(targetPosition, new Vector2D);\r\n\t\tthis.radius = Util.initValue(radius, 1000);\r\n\t\tthis.force = Util.initValue(this.normalizeValue(force), 100);\r\n\r\n\t\tthis.radiusSq = this.radius * this.radius\r\n\t\tthis.attractionForce = new Vector2D();\r\n\t\tthis.lengthSq = 0;\r\n\r\n\t\tthis.name = \"Attraction\";\r\n\t}\r\n\r\n\t/**\r\n\t * Reset this behaviour's parameters\r\n\t *\r\n\t * @method reset\r\n\t * @memberof Proton#Proton.Attraction\r\n\t * @instance\r\n\t *\r\n\t * @todo add description for 'force' and 'radius'\r\n\t *\r\n\t * @param {Proton.Vector2D} targetPosition the attraction point coordinates\r\n\t * @param {Number} [force=100]\r\n\t * @param {Number} [radius=1000]\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t */\r\n\treset(targetPosition, force, radius, life, easing) {\r\n\t\tthis.targetPosition = Util.initValue(targetPosition, new Vector2D);\r\n\t\tthis.radius = Util.initValue(radius, 1000);\r\n\t\tthis.force = Util.initValue(this.normalizeValue(force), 100);\r\n\r\n\t\tthis.radiusSq = this.radius * this.radius\r\n\t\tthis.attractionForce = new Vector2D();\r\n\t\tthis.lengthSq = 0;\r\n\r\n\t\tlife && super.reset(life, easing);\r\n\t}\r\n\r\n\t/**\r\n\t * Apply this behaviour for all particles every time\r\n\t *\r\n\t * @memberof Proton#Proton.Attraction\r\n\t * @method applyBehaviour\r\n\t * @instance\r\n\t *\r\n\t * @param {Proton.Particle} particle\r\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\r\n\t * @param {Int} \t\t\tindex the particle index\r\n\t */\r\n\tapplyBehaviour(particle, time, index) {\r\n\t\tthis.calculate(particle, time, index);\r\n\r\n\t\tthis.attractionForce.copy(this.targetPosition);\r\n\t\tthis.attractionForce.sub(particle.p);\r\n\t\tthis.lengthSq = this.attractionForce.lengthSq();\r\n\r\n\t\tif (this.lengthSq > 0.000004 && this.lengthSq < this.radiusSq) {\r\n\t\t\tthis.attractionForce.normalize();\r\n\t\t\tthis.attractionForce.multiplyScalar(1 - this.lengthSq / this.radiusSq);\r\n\t\t\tthis.attractionForce.multiplyScalar(this.force);\r\n\r\n\t\t\tparticle.a.add(this.attractionForce);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n","import Util from '../utils/Util';\r\nimport Vector2D from '../math/Vector2D';\r\nimport MathUtils from '../math/MathUtils';\r\nimport Behaviour from './Behaviour';\r\n\r\nexport default class RandomDrift extends Behaviour {\r\n\r\n\t/**\r\n\t * @memberof! Proton#\r\n\t * @augments Behaviour\r\n\t * @constructor\r\n\t * @alias RandomDrift\r\n\t *\r\n\t * @param {Number} driftX \t\t\t\tX value of the new Vector2D\r\n\t * @param {Number} driftY \t\t\t\tY value of the new Vector2D\r\n\t * @param {Number} delay \t\t\t\tHow much delay the drift should have\r\n\t * @param {Number} [life=Infinity] \t\tthis behaviour's life\r\n\t * @param {String} [easing=easeLinear] \tthis behaviour's easing\r\n\t *\r\n\t * @property {Number} time The time of the drift\r\n\t * @property {String} name The Behaviour name\r\n\t */\r\n\tconstructor(driftX, driftY, delay, life, easing) {\r\n\t\tsuper(life, easing);\r\n\r\n\t\tthis.reset(driftX, driftY, delay);\r\n\t\tthis.time = 0;\r\n\t\tthis.name = \"RandomDrift\";\r\n\t}\r\n\r\n\t/**\r\n\t * Reset this behaviour's parameters\r\n\t *\r\n\t * @method reset\r\n\t * @memberof Proton#RandomDrift\r\n\t * @instance\r\n\t *\r\n\t * @param {Number} driftX \t\t\t\tX value of the new Vector2D\r\n\t * @param {Number} driftY \t\t\t\tY value of the new Vector2D\r\n\t * @param {Number} delay \t\t\t\tHow much delay the drift should have\r\n\t * @param {Number} [life=Infinity] \t\tthis behaviour's life\r\n\t * @param {String} [easing=easeLinear] \tthis behaviour's easing\r\n\t */\r\n\treset(driftX, driftY, delay, life, easing) {\r\n\t\tthis.panFoce = new Vector2D(driftX, driftY);\r\n\t\tthis.panFoce = this.normalizeForce(this.panFoce);\r\n\t\tthis.delay = delay;\r\n\r\n\t\tlife && super.reset(life, easing);\r\n\t}\r\n\r\n\t/**\r\n\t * Apply this behaviour for all particles every time\r\n\t *\r\n\t * @method applyBehaviour\r\n\t * @memberof Proton#RandomDrift\r\n\t * @instance\r\n\t *\r\n\t * @param {Particle} particle\r\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\r\n\t * @param {Int} \t\t\tindex the particle index\r\n\t */\r\n\tapplyBehaviour(particle, time, index) {\r\n\t\tthis.calculate(particle, time, index);\r\n\t\tthis.time += time;\r\n\r\n\t\tif (this.time >= this.delay) {\r\n\t\t\tparticle.a.addXY(MathUtils.randomAToB(-this.panFoce.x, this.panFoce.x), MathUtils.randomAToB(-this.panFoce.y, this.panFoce.y));\r\n\t\t\tthis.time = 0;\r\n\t\t};\r\n\t}\r\n}\r\n","import Util from '../utils/Util';\r\nimport Vector2D from '../math/Vector2D';\r\nimport Force from './Force';\r\n\r\nexport default class Gravity extends Force {\r\n\r\n\t/**\r\n\t * @memberof! Proton#\r\n\t * @augments Proton#Proton.Force\r\n\t * @constructor\r\n\t * @alias Proton.Gravity\r\n\t *\r\n\t * @param {Number} g \t\t\t\t\t\t\tGravity\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t *\r\n\t * @property {String} name The Behaviour name\r\n\t */\r\n\tconstructor(g, life, easing) {\r\n\t\tsuper(0, g, life, easing);\r\n\t\tthis.name = \"Gravity\";\r\n\t}\r\n\r\n\t/**\r\n\t * Reset this behaviour's parameters\r\n\t *\r\n\t * @method reset\r\n\t * @memberof Proton#Proton.Gravity\r\n\t * @instance\r\n\t *\r\n\t * @param {Number} g \t\t\t\t\t\t\tGravity\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t */\r\n\treset(g, life, easing) {\r\n\t\tsuper.reset(0, g, life, easing);\r\n\t}\r\n}","import Util from '../utils/Util';\r\nimport Vector2D from '../math/Vector2D';\r\nimport Behaviour from './Behaviour';\r\n\r\n//can use Collision(emitter,true,function(){}) or Collision();\r\nexport default class Collision extends Behaviour {\r\n\r\n\t/**\r\n\t * The callback after collision\r\n\t *\r\n\t * @callback Callback\r\n\t *\r\n\t * @param {Proton.Particle} particle\r\n\t * @param {Proton.Paritcle} otherParticle\r\n\t */\r\n\t/**\r\n\t * @memberof! Proton#\r\n\t * @augments Proton.Behaviour\r\n\t * @constructor\r\n\t * @alias Proton.Collision\r\n\t *\r\n\t * @todo add description to mass\r\n\t *\r\n\t * @param {Proton.Emitter} \t[emitter=null] \t\tthe attraction point coordinates\r\n\t * @param {Boolean} \t\t[mass=true]\t\t\t\r\n\t * @param {Callback}\t \t[callback=null]\t\tthe callback after the collision\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t *\r\n\t * @property {String} name The Behaviour name\r\n\t */\r\n\tconstructor(emitter, mass, callback, life, easing) {\r\n\t\tsuper(life, easing);\r\n\r\n\t\tthis.reset(emitter, mass, callback);\r\n\t\tthis.name = \"Collision\";\r\n\t}\r\n\r\n\t/**\r\n\t * Reset this behaviour's parameters\r\n\t *\r\n\t * @memberof Proton#Proton.Collision\r\n\t * @method reset\r\n\t * @instance\r\n\t *\r\n\t * @todo add description to mass\r\n\t *\r\n\t * @param {Proton.Emitter} \t[emitter=null] \t\tthe attraction point coordinates\r\n\t * @param {Boolean} \t\t[mass=true]\t\t\t\r\n\t * @param {Callback}\t \t[callback=null]\t\tthe callback after the collision\r\n\t * @param {Number} \t\t\t[life=Infinity] \tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t */\r\n\treset(emitter, mass, callback, life, easing) {\r\n\t\tthis.emitter = Util.initValue(emitter, null);\r\n\t\tthis.mass = Util.initValue(mass, true);\r\n\t\tthis.callback = Util.initValue(callback, null);\r\n\r\n\t\tthis.collisionPool = [];\r\n\t\tthis.delta = new Vector2D();\r\n\r\n\t\tlife && super.reset(life, easing);\r\n\t}\r\n\r\n\t/**\r\n\t * Apply this behaviour for all particles every time\r\n\t *\r\n\t * @memberof Proton#Proton.Collision\r\n\t * @method applyBehaviour\r\n\t * @instance\r\n\t *\r\n\t * @param {Proton.Particle} particle\r\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\r\n\t * @param {Int} \t\t\tindex the particle index\r\n\t */\r\n\tapplyBehaviour(particle, time, index) {\r\n\t\tconst newPool = this.emitter ? this.emitter.particles.slice(index) : this.pool.slice(index);\r\n\t\tconst length = newPool.length;\r\n\r\n\t\tlet otherParticle;\r\n\t\tlet lengthSq;\r\n\t\tlet overlap;\r\n\t\tlet totalMass;\r\n\t\tlet averageMass1, averageMass2;\r\n\t\tlet i;\r\n\r\n\t\tfor (i = 0; i < length; i++) {\r\n\t\t\totherParticle = newPool[i];\r\n\r\n\t\t\tif (otherParticle !== particle) {\r\n\t\t\t\tthis.delta.copy(otherParticle.p);\r\n\t\t\t\tthis.delta.sub(particle.p);\r\n\r\n\t\t\t\tlengthSq = this.delta.lengthSq();\r\n\t\t\t\tconst distance = particle.radius + otherParticle.radius;\r\n\r\n\t\t\t\tif (lengthSq <= distance * distance) {\r\n\t\t\t\t\toverlap = distance - Math.sqrt(lengthSq);\r\n\t\t\t\t\toverlap += 0.5;\r\n\r\n\t\t\t\t\ttotalMass = particle.mass + otherParticle.mass;\r\n\t\t\t\t\taverageMass1 = this.mass ? otherParticle.mass / totalMass : 0.5;\r\n\t\t\t\t\taverageMass2 = this.mass ? particle.mass / totalMass : 0.5;\r\n\t\t\t\t\t\r\n\t\t\t\t\tparticle.p.add(this.delta.clone().normalize().multiplyScalar(overlap * -averageMass1));\r\n\t\t\t\t\totherParticle.p.add(this.delta.normalize().multiplyScalar(overlap * averageMass2));\r\n\r\n\t\t\t\t\tthis.callback && this.callback(particle, otherParticle);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n","import Util from '../utils/Util';\r\nimport Behaviour from './Behaviour';\r\n\r\nexport default class CrossZone extends Behaviour {\r\n\r\n /**\r\n * Defines what happens if the particles come to the end of the specified zone\r\n *\r\n * @memberof! Proton#\r\n * @augments Proton.Behaviour\r\n * @constructor\r\n * @alias Proton.CrossZone\r\n *\r\n * @param {Proton.Zone} zone \t\t\t\t\t\tcan be any Proton.Zone - e.g. Proton.RectZone()\r\n * @param {String} \t\t[crossType=dead] \t\t\twhat happens if the particles pass the zone - allowed strings: dead | bound | cross\r\n * @param {Number} \t\t[life=Infinity] \t\t\tthis behaviour's life\r\n * @param {String} \t\t[easing=ease.easeLinear] \tthis behaviour's easing\r\n *\r\n * @property {String} name The Behaviour name\r\n */\r\n constructor(zone, crossType, life, easing) {\r\n super(life, easing);\r\n\r\n this.reset(zone, crossType);\r\n this.name = \"CrossZone\";\r\n }\r\n\r\n /**\r\n * Reset this behaviour's parameters\r\n *\r\n * @method reset\r\n * @memberof Proton#Proton.CrossZone\r\n * @instance\r\n *\r\n * @param {Proton.Zone} zone \t\t\t\tcan be any Proton.Zone - e.g. Proton.RectZone()\r\n * @param {String} \t\t[crossType=dead] \twhat happens if the particles pass the zone - allowed strings: dead | bound | cross\r\n * @param {Number} \t\t[life=Infinity] \tthis behaviour's life\r\n * @param {String} \t\t[easing=easeLinear]\tthis behaviour's easing\r\n */\r\n reset(zone, crossType, life, easing) {\r\n this.zone = zone;\r\n this.zone.crossType = Util.initValue(crossType, \"dead\");\r\n\r\n life && super.reset(life, easing);\r\n }\r\n\r\n /**\r\n * Apply this behaviour for all particles every time\r\n *\r\n * @method applyBehaviour\r\n * @memberof Proton#Proton.CrossZone\r\n * @instance\r\n *\r\n * @param {Proton.Particle} particle\r\n * @param {Number} the integrate time 1/ms\r\n * @param {Int} the particle index\r\n */\r\n applyBehaviour(particle, time, index) {\r\n this.calculate(particle, time, index);\r\n this.zone.crossing(particle);\r\n };\r\n}","import Util from '../utils/Util';\r\nimport Behaviour from './Behaviour';\r\n\r\nexport default class Alpha extends Behaviour {\r\n\r\n\t/**\r\n\t * @memberof! Proton#\r\n\t * @augments Proton.Behaviour\r\n\t * @constructor\r\n\t * @alias Proton.Alpha\r\n\t *\r\n\t * @todo add description for 'a' and 'b'\r\n\t *\r\n\t * @param {Number} a\r\n\t * @param {String} b\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t *\r\n\t * @property {String} name The Behaviour name\r\n\t */\r\n\tconstructor(a, b, life, easing) {\r\n\t\tsuper(life, easing);\r\n\r\n\t\tthis.reset(a, b);\r\n\t\tthis.name = \"Alpha\";\r\n\t}\r\n\r\n\t/**\r\n\t * Reset this behaviour's parameters\r\n\t *\r\n\t * @method reset\r\n\t * @memberof Proton#Proton.Alpha\r\n\t * @instance\r\n\t *\r\n\t * @todo add description for 'a' and 'b'\r\n\t *\r\n\t * @param {Number} a\r\n\t * @param {String} b\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t */\r\n\treset(a, b, life, easing) {\r\n\t\tthis.same = b === null || b === undefined ? true : false;\r\n\t\tthis.a = Util.setSpanValue(Util.initValue(a, 1));\r\n\t\tthis.b = Util.setSpanValue(b);\r\n\r\n\t\tlife && super.reset(life, easing);\r\n\t}\r\n\t\r\n\t/**\r\n\t * Sets the new alpha value of the particle\r\n\t *\r\n\t * @method initialize\r\n\t * @memberof Proton#Proton.Alpha\r\n\t * @instance\r\n\t *\r\n\t * @param {Proton.Particle} particle A single Proton generated particle\r\n\t */\r\n\tinitialize(particle) {\r\n\t\tparticle.transform.alphaA = this.a.getValue();\r\n\r\n\t\tif (this.same)\r\n\t\t\tparticle.transform.alphaB = particle.transform.alphaA;\r\n\t\telse\r\n\t\t\tparticle.transform.alphaB = this.b.getValue();\r\n\t}\r\n\r\n\t/**\r\n\t * @method applyBehaviour\r\n\t * @memberof Proton#Proton.Alpha\r\n\t * @instance\r\n\t *\r\n\t * @param {Proton.Particle} particle\r\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\r\n\t * @param {Int} \t\t\tindex the particle index\r\n \t */\r\n\tapplyBehaviour(particle, time, index) {\r\n\t\tthis.calculate(particle, time, index);\r\n\t\t\r\n\t\tparticle.alpha = particle.transform.alphaB + (particle.transform.alphaA - particle.transform.alphaB) * this.energy;\r\n\t\tif (particle.alpha < 0.001) particle.alpha = 0;\r\n\t}\r\n}\r\n","import Util from '../utils/Util';\r\nimport Behaviour from './Behaviour';\r\n\r\nexport default class Scale extends Behaviour {\r\n\r\n\t/**\r\n\t * @memberof! Proton#\r\n\t * @augments Proton.Behaviour\r\n\t * @constructor\r\n\t * @alias Proton.Scale\r\n\t *\r\n\t * @todo add description for 'a' and 'b'\r\n\t *\r\n\t * @param {Number} a\r\n\t * @param {String} b\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t *\r\n\t * @property {String} name The Behaviour name\r\n\t */\r\n\tconstructor(a, b, life, easing) {\r\n\t\tsuper(life, easing);\r\n\r\n\t\tthis.reset(a, b);\r\n\t\tthis.name = \"Scale\";\r\n\t}\r\n\r\n\t/**\r\n\t * Reset this behaviour's parameters\r\n\t *\r\n\t * @method reset\r\n\t * @memberof Proton#Proton.Scale\r\n\t * @instance\r\n\t *\r\n\t * @param {Number} a\r\n\t * @param {String} b\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t */\r\n\treset(a, b, life, easing) {\r\n\t\tthis.same = b === null || b === undefined ? true : false;\r\n\t\tthis.a = Util.setSpanValue(Util.initValue(a, 1));\r\n\t\tthis.b = Util.setSpanValue(b);\r\n\r\n\t\tlife && super.reset(life, easing);\r\n\t}\r\n\r\n\t/**\r\n\t * Initialize the behaviour's parameters for all particles\r\n\t *\r\n\t * @method initialize\r\n\t * @memberof Proton#Proton.Scale\r\n\t * @instance\r\n\t *\r\n\t * @param {Proton.Particle} particle\r\n\t */\r\n\tinitialize(particle) {\r\n\t\tparticle.transform.scaleA = this.a.getValue();\r\n\t\tparticle.transform.oldRadius = particle.radius;\r\n\t\tparticle.transform.scaleB = this.same ? particle.transform.scaleA : this.b.getValue();\r\n\t};\r\n\r\n\t/**\r\n\t * Apply this behaviour for all particles every time\r\n\t *\r\n\t * @method applyBehaviour\r\n\t * @memberof Proton#Proton.Scale\r\n\t * @instance\r\n\t *\r\n\t * @param {Proton.Particle} particle\r\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\r\n\t * @param {Int} \t\t\tindex the particle index\r\n\t */\r\n\tapplyBehaviour(particle, time, index) {\r\n\t\tthis.calculate(particle, time, index);\r\n\t\tparticle.scale = particle.transform.scaleB + (particle.transform.scaleA - particle.transform.scaleB) * this.energy;\r\n\r\n\t\tif (particle.scale < 0.0001) particle.scale = 0;\r\n\t\tparticle.radius = particle.transform.oldRadius * particle.scale;\r\n\t}\r\n}","import Util from '../utils/Util';\r\nimport Behaviour from './Behaviour';\r\n\r\nexport default class Rotate extends Behaviour {\r\n\r\n\t/**\r\n\t * @memberof! Proton#\r\n\t * @augments Proton.Behaviour\r\n\t * @constructor\r\n\t * @alias Proton.Rotate\r\n\t *\r\n\t * @todo add description for 'a', 'b' and 'style'\r\n\t *\r\n\t * @param {String} [influence=Velocity] The rotation's influence\r\n\t * @param {String} b\r\n\t * @param {String} [style=to]\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t *\r\n\t * @property {String} name The Behaviour name\r\n\t */\r\n\tconstructor(influence, b, style, life, easing) {\r\n\t\tsuper(life, easing);\r\n\r\n\t\tthis.reset(influence, b, style);\r\n\t\tthis.name = \"Rotate\";\r\n\t}\r\n\r\n\t/**\r\n\t * Reset this behaviour's parameters\r\n\t *\r\n\t * @method reset\r\n\t * @memberof Proton#Proton.Rotate\r\n\t * @instance\r\n\t *\r\n\t * @todo add description for 'a', 'b' and 'style'\r\n\t *\r\n\t * @param {String} a\r\n\t * @param {String} b\r\n\t * @param {String} [style=to]\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t */\r\n\treset(a, b, style, life, easing) {\r\n\t\tthis.same = b === null || b === undefined ? true : false;\r\n\r\n\t\tthis.a = Util.setSpanValue(Util.initValue(a, \"Velocity\"));\r\n\t\tthis.b = Util.setSpanValue(Util.initValue(b, 0));\r\n\t\tthis.style = Util.initValue(style, 'to');\r\n\r\n\t\tlife && super.reset(life, easing);\r\n\t}\r\n\r\n\t/**\r\n\t * Initialize the behaviour's parameters for all particles\r\n\t *\r\n\t * @method initialize\r\n\t * @memberof Proton#Proton.Rotate\r\n\t * @instance\r\n\t *\r\n\t * @param {Proton.Particle} particle\r\n\t */\r\n\tinitialize(particle) {\r\n\t\tparticle.rotation = this.a.getValue();\r\n\t\tparticle.transform.rotationA = this.a.getValue();\r\n\r\n\t\tif (!this.same) particle.transform.rotationB = this.b.getValue();\r\n\t};\r\n\r\n\t/**\r\n\t * Apply this behaviour for all particles every time\r\n\t *\r\n\t * @method applyBehaviour\r\n\t * @memberof Proton#Proton.Rotate\r\n\t * @instance\r\n\t *\r\n\t * @param {Proton.Particle} particle\r\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\r\n\t * @param {Int} \t\t\tindex the particle index\r\n\t */\r\n\tapplyBehaviour(particle, time, index) {\r\n\t\tthis.calculate(particle, time, index);\r\n\r\n\t\tif (!this.same) {\r\n\t\t\tif (this.style == 'to' || this.style == 'TO' || this.style == '_') {\r\n\t\t\t\tparticle.rotation += particle.transform.rotationB + (particle.transform.rotationA - particle.transform.rotationB) * this.energy\r\n\t\t\t} else {\r\n\t\t\t\tparticle.rotation += particle.transform.rotationB;\r\n\t\t\t}\r\n\t\t} else if (this.a.a == \"V\" || this.a.a == \"Velocity\" || this.a.a == \"v\") {\r\n\t\t\t//beta...\r\n\t\t\tparticle.rotation = particle.getDirection();\r\n\t\t}\r\n\t}\r\n\r\n}\r\n","import Util from '../utils/Util';\r\nimport ColorUtil from '../utils/ColorUtil';\r\nimport ArraySpan from '../math/ArraySpan';\r\nimport Behaviour from './Behaviour';\r\n\r\nexport default class Color extends Behaviour {\r\n\r\n /**\r\n * @memberof! Proton#\r\n * @augments Proton.Behaviour\r\n * @constructor\r\n * @alias Proton.Color\r\n *\r\n * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black\r\n * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black\r\n * @param {Number} [life=Infinity] \tthis behaviour's life\r\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\r\n *\r\n * @property {String} name The Behaviour name\r\n */\r\n constructor(a, b, life, easing) {\r\n super(life, easing);\r\n\r\n this.reset(a, b);\r\n this.name = \"Color\";\r\n }\r\n\r\n /**\r\n * Reset this behaviour's parameters\r\n *\r\n * @method reset\r\n * @memberof Proton#Proton.Color\r\n * @instance\r\n *\r\n * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black\r\n * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black\r\n * @param {Number} [life=Infinity] \tthis behaviour's life\r\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\r\n */\r\n reset(a, b, life, easing) {\r\n this.a = ArraySpan.createArraySpan(a);\r\n this.b = ArraySpan.createArraySpan(b);\r\n\r\n life && super.reset(life, easing);\r\n }\r\n\r\n /**\r\n * Initialize the behaviour's parameters for all particles\r\n *\r\n * @method initialize\r\n * @memberof Proton#Proton.Color\r\n * @instance\r\n *\r\n * @param {Proton.Particle} particle\r\n */\r\n initialize(particle) {\r\n particle.color = this.a.getValue();\r\n particle.transform.colorA = ColorUtil.hexToRGB(particle.color);\r\n\r\n if (this.b)\r\n particle.transform.colorB = ColorUtil.hexToRGB(this.b.getValue());\r\n };\r\n\r\n /**\r\n * Apply this behaviour for all particles every time\r\n *\r\n * @method applyBehaviour\r\n * @memberof Proton#Proton.Color\r\n * @instance\r\n *\r\n * @param {Proton.Particle} particle\r\n * @param {Number} the integrate time 1/ms\r\n * @param {Int} the particle index\r\n */\r\n applyBehaviour(particle, time, index) {\r\n if (this.b) {\r\n this.calculate(particle, time, index);\r\n\r\n particle.transform.rgb.r = particle.transform.colorB.r + (particle.transform.colorA.r - particle.transform.colorB.r) * this.energy;\r\n particle.transform.rgb.g = particle.transform.colorB.g + (particle.transform.colorA.g - particle.transform.colorB.g) * this.energy;\r\n particle.transform.rgb.b = particle.transform.colorB.b + (particle.transform.colorA.b - particle.transform.colorB.b) * this.energy;\r\n\r\n particle.transform.rgb.r = Math.floor(particle.transform.rgb.r);\r\n particle.transform.rgb.g = Math.floor(particle.transform.rgb.g);\r\n particle.transform.rgb.b = Math.floor(particle.transform.rgb.b);\r\n\r\n } else {\r\n particle.transform.rgb.r = particle.transform.colorA.r;\r\n particle.transform.rgb.g = particle.transform.colorA.g;\r\n particle.transform.rgb.b = particle.transform.colorA.b;\r\n }\r\n };\r\n\r\n}","import Util from '../utils/Util';\r\nimport Attraction from './Attraction';\r\n\r\nexport default class Repulsion extends Attraction {\r\n\r\n\t/**\r\n\t * The oppisite of Proton.Attraction - turns the force\r\n\t *\r\n\t * @memberof! Proton#\r\n\t * @augments Proton#Proton.Attraction\r\n\t * @constructor\r\n\t * @alias Proton.Repulsion\r\n\t *\r\n\t * @todo add description for 'force' and 'radius'\r\n\t *\r\n\t * @param {Proton.Vector2D} targetPosition the attraction point coordinates\r\n\t * @param {Number} [force=100]\r\n\t * @param {Number} [radius=1000]\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t *\r\n\t * @property {Number} force\r\n\t * @property {String} name The Behaviour name\r\n\t */\r\n\tconstructor(targetPosition, force, radius, life, easing) {\r\n\t\tsuper(targetPosition, force, radius, life, easing);\r\n\r\n\t\tthis.force *= -1;\r\n\t\tthis.name = \"Repulsion\";\r\n\t}\r\n\r\n\t/**\r\n\t * Reset this behaviour's parameters\r\n\t *\r\n\t * @method reset\r\n\t * @memberof Proton#Proton.Repulsion\r\n\t * @instance\r\n\t *\r\n\t * @todo add description for 'force' and 'radius'\r\n\t *\r\n\t * @param {Proton.Vector2D} targetPosition the attraction point coordinates\r\n\t * @param {Number} [force=100]\r\n\t * @param {Number} [radius=1000]\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t */\r\n\treset(targetPosition, force, radius, life, easing) {\r\n\t\tsuper.reset(targetPosition, force, radius, life, easing);\r\n\t\tthis.force *= -1;\r\n\t}\r\n}\r\n","import Util from '../utils/Util';\r\nimport Vector2D from '../math/Vector2D';\r\nimport Behaviour from './Behaviour';\r\n\r\nexport default class GravityWell extends Behaviour {\r\n\r\n\t/**\r\n\t * @memberof! Proton#\r\n\t * @augments Behaviour\r\n\t * @constructor\r\n\t * @alias GravityWell\r\n\t *\r\n\t * @param {Vector2D} [centerPoint=new Vector2D] The point in the center\r\n\t * @param {Number} [force=100]\t\t\t\t\tThe force\t\r\n\t * @param {Number} [life=Infinity]\t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=easeLinear]\tthis behaviour's easing\r\n\t *\r\n\t * @property {String} name The Behaviour name\r\n\t */\r\n\tconstructor(centerPoint, force, life, easing) {\r\n\t\tsuper(life, easing);\r\n\r\n\t\tthis.distanceVec = new Vector2D();\r\n\t\tthis.centerPoint = Util.initValue(centerPoint, new Vector2D);\r\n\t\tthis.force = Util.initValue(this.normalizeValue(force), 100);\r\n\r\n\t\tthis.name = \"GravityWell\";\r\n\t}\r\n\r\n\t/**\r\n\t * Reset this behaviour's parameters\r\n\t *\r\n\t * @method reset\r\n\t * @memberof Proton#GravityWell\r\n\t * @instance\r\n\t *\r\n\t * @param {Vector2D} [centerPoint=new Vector2D] The point in the center\r\n\t * @param {Number} [force=100]\t\t\t\t\tThe force\t\r\n\t * @param {Number} [life=Infinity]\t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=easeLinear]\tthis behaviour's easing\r\n\t */\r\n\treset(centerPoint, force, life, easing) {\r\n\t\tthis.distanceVec = new Vector2D();\r\n\t\tthis.centerPoint = Util.initValue(centerPoint, new Vector2D);\r\n\t\tthis.force = Util.initValue(this.normalizeValue(force), 100);\r\n\t\t\r\n\t\tlife && super.reset(life, easing);\r\n\t};\r\n\r\n\t/**\r\n\t * @inheritdoc\r\n\t */\r\n\tinitialize(particle) {\r\n\t};\r\n\r\n\t/**\r\n\t * Apply this behaviour for all particles every time\r\n\t *\r\n\t * @method applyBehaviour\r\n\t * @memberof Proton#GravityWell\r\n\t * @instance\r\n\t *\r\n\t * @param {Particle} particle\r\n\t * @param {Number} the integrate time 1/ms\r\n\t * @param {Int} the particle index\r\n\t */\r\n\tapplyBehaviour(particle, time, index) {\r\n\t\tthis.distanceVec.set(this.centerPoint.x - particle.p.x, this.centerPoint.y - particle.p.y);\r\n\t\tconst distanceSq = this.distanceVec.lengthSq();\r\n\r\n\t\tif (distanceSq != 0) {\r\n\t\t\tconst distance = this.distanceVec.length();\r\n\t\t\tconst factor = (this.force * time) / (distanceSq * distance);\r\n\r\n\t\t\tparticle.v.x += factor * this.distanceVec.x;\r\n\t\t\tparticle.v.y += factor * this.distanceVec.y;\r\n\t\t}\r\n\t}\r\n}","import Util from '../utils/Util';\r\nimport Initialize from './Initialize';\r\nimport MathUtils from '../math/MathUtils';\r\n\r\nexport default {\r\n\r\n\tinitialize(emitter, particle, initializes) {\r\n\t\tconst length = initializes.length;\r\n\t\tlet i;\r\n\r\n\t\tfor (i = 0; i < length; i++) {\r\n\t\t\tif (initializes[i] instanceof Initialize)\r\n\t\t\t\tinitializes[i].init(emitter, particle);\r\n\t\t\telse\r\n\t\t\t\tthis.init(emitter, particle, initializes[i]);\r\n\t\t}\r\n\r\n\t\tthis.bindEmitter(emitter, particle);\r\n\t},\r\n\r\n\t//////////////////////init//////////////////////\r\n\tinit(emitter, particle, initialize) {\r\n\t\tUtil.setPrototypeByObject(particle, initialize);\r\n\t\tUtil.setVector2DByObject(particle, initialize);\r\n\t},\r\n\t\r\n\tbindEmitter(emitter, particle) {\r\n\t\tif (emitter.bindEmitter) {\r\n\t\t\tparticle.p.add(emitter.p);\r\n\t\t\tparticle.v.add(emitter.v);\r\n\t\t\tparticle.a.add(emitter.a);\r\n\r\n\t\t\tparticle.v.rotate(MathUtils.degreeTransform(emitter.rotation));\r\n\t\t}\r\n\t}\r\n}\r\n","import Util from '../utils/Util';\r\nimport Particle from '../core/Particle';\r\nimport EventDispatcher from '../events/EventDispatcher';\r\n\r\nimport Rate from '../initialize/Rate';\r\nimport InitializeUtil from '../initialize/InitializeUtil';\r\n\r\nexport default class Emitter extends Particle {\r\n\r\n\tstatic ID = 0;\r\n\r\n\t/**\r\n\t * You can use this emit particles.\r\n\t *\r\n\t * It will dispatch follow events:\r\n\t * PARTICLE_CREATED\r\n\t * PARTICLE_UPDATA\r\n\t * PARTICLE_DEAD\r\n\t *\r\n\t * @class Emitter\r\n\t * @constructor\r\n\t * @param {Object} pObj the parameters object;\r\n\t * for example {damping:0.01,bindEmitter:false}\r\n\t */\r\n\tconstructor(pObj) {\r\n\t\tsuper(pObj);\r\n\r\n\t\tthis.initializes = [];\r\n\t\tthis.particles = [];\r\n\t\tthis.behaviours = [];\r\n\r\n\t\tthis.emitSpeed = 0;\r\n\t\tthis.emitTime = 0;\r\n\t\tthis.totalTime = -1;\r\n\r\n\t\t/**\r\n\t\t * The friction coefficient for all particle emit by This;\r\n\t\t * @property damping\r\n\t\t * @type {Number}\r\n\t\t * @default 0.006\r\n\t\t */\r\n\t\tthis.damping = .006;\r\n\r\n\t\t/**\r\n\t\t * If bindEmitter the particles can bind this emitter's property;\r\n\t\t * @property bindEmitter\r\n\t\t * @type {Boolean}\r\n\t\t * @default true\r\n\t\t */\r\n\t\tthis.bindEmitter = true;\r\n\r\n\t\t/**\r\n\t\t * The number of particles per second emit (a [particle]/b [s]);\r\n\t\t * @property rate\r\n\t\t * @type {Rate}\r\n\t\t * @default Rate(1, .1)\r\n\t\t */\r\n\t\tthis.rate = new Rate(1, .1);\r\n\r\n\t\tthis.id = `emitter_${Emitter.ID++}`;\r\n\t\tthis.name = 'Emitter';\r\n\t}\r\n\r\n\t/**\r\n\t * start emit particle\r\n\t * @method emit\r\n\t * @param {Number} emitTime begin emit time;\r\n\t * @param {String} life the life of this emitter\r\n\t */\r\n\temit(totalTime, life) {\r\n\t\tthis.stoped = false;\r\n\t\tthis.emitTime = 0;\r\n\t\tthis.totalTime = Util.initValue(totalTime, Infinity);\r\n\r\n\t\tif (life == true || life == 'life' || life == 'destroy') {\r\n\t\t\tthis.life = totalTime == 'once' ? 1 : this.totalTime;\r\n\t\t} else if (!isNaN(life)) {\r\n\t\t\tthis.life = life;\r\n\t\t}\r\n\r\n\t\tthis.rate.init();\r\n\t}\r\n\r\n\t/**\r\n\t * stop emiting\r\n\t * @method stop\r\n\t */\r\n\tstop() {\r\n\t\tthis.totalTime = -1;\r\n\t\tthis.emitTime = 0;\r\n\t\tthis.stoped = true;\r\n\t}\r\n\r\n\tpreEmit(time) {\r\n\t\tlet oldStoped = this.stoped;\r\n\t\tlet oldEmitTime = this.emitTime;\r\n\t\tlet oldTotalTime = this.totalTime;\r\n\r\n\t\tthis.stoped = false;\r\n\t\tthis.emitTime = 0;\r\n\t\tthis.totalTime = time;\r\n\t\tthis.rate.init();\r\n\r\n\t\tconst step = 0.0167;\r\n\t\twhile (time > step) {\r\n\t\t\ttime -= step;\r\n\t\t\tthis.update(step);\r\n\t\t}\r\n\r\n\t\tthis.stoped = oldStoped;\r\n\t\tthis.emitTime = oldEmitTime + Math.max(time, 0);\r\n\t\tthis.totalTime = oldTotalTime;\r\n\t}\r\n\r\n\t/**\r\n\t * remove current all particles\r\n\t * @method removeAllParticles\r\n\t */\r\n\tremoveAllParticles() {\r\n\t\tlet i = this.particles.length;\r\n\t\twhile (i--) this.particles[i].dead = true;\r\n\t}\r\n\r\n\t/**\r\n\t * add initialize to this emitter\r\n\t * @method addSelfInitialize\r\n\t */\r\n\taddSelfInitialize(pObj) {\r\n\t\tif (pObj['init']) {\r\n\t\t\tpObj.init(this);\r\n\t\t} else {\r\n\t\t\tthis.initAll();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * add the Initialize to particles;\r\n\t * \r\n\t * you can use initializes array:for example emitter.addInitialize(initialize1,initialize2,initialize3);\r\n\t * @method addInitialize\r\n\t * @param {Initialize} initialize like this new Radius(1, 12)\r\n\t */\r\n\taddInitialize(...rest) {\r\n\t\tlet i = rest.length;\r\n\t\twhile (i--)\r\n\t\t\tthis.initializes.push(rest[i]);\r\n\t}\r\n\r\n\t/**\r\n\t * remove the Initialize\r\n\t * @method removeInitialize\r\n\t * @param {Initialize} initialize a initialize\r\n\t */\r\n\tremoveInitialize(initializer) {\r\n\t\tconst index = this.initializes.indexOf(initializer);\r\n\t\tif (index > -1) this.initializes.splice(index, 1);\r\n\t}\r\n\r\n\t/**\r\n\t * remove all Initializes\r\n\t * @method removeInitializers\r\n\t */\r\n\tremoveAllInitializers() {\r\n\t\tUtil.destroyArray(this.initializes);\r\n\t}\r\n\r\n\t/**\r\n\t * add the Behaviour to particles;\r\n\t * \r\n\t * you can use Behaviours array:emitter.addBehaviour(Behaviour1,Behaviour2,Behaviour3);\r\n\t * @method addBehaviour\r\n\t * @param {Behaviour} behaviour like this new Color('random')\r\n\t */\r\n\taddBehaviour(...rest) {\r\n\t\tlet i = arguments.length;\r\n\t\twhile (i--) {\r\n\t\t\tlet behaviour = rest[i];\r\n\t\t\tthis.behaviours.push(behaviour);\r\n\t\t\tif (behaviour.parents) behaviour.parents.push(this);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * remove the Behaviour\r\n\t * @method removeBehaviour\r\n\t * @param {Behaviour} behaviour a behaviour\r\n\t */\r\n\tremoveBehaviour(behaviour) {\r\n\t\tlet index = this.behaviours.indexOf(behaviour);\r\n\t\tthis.behaviours.splice(index, 1);\r\n\r\n\t\tif (behaviour.parents) {\r\n\t\t\tindex = behaviour.parents.indexOf(behaviour);\r\n\t\t\tbehaviour.parents.splice(index, 1);\r\n\t\t}\r\n\r\n\t\treturn index;\r\n\t}\r\n\r\n\t/**\r\n\t * remove all behaviours\r\n\t * @method removeAllBehaviours\r\n\t */\r\n\tremoveAllBehaviours() {\r\n\t\tUtil.destroyArray(this.behaviours);\r\n\t}\r\n\r\n\t// emitter update \r\n\tupdate(time) {\r\n\t\tthis.age += time;\r\n\t\tif (this.age >= this.life || this.dead) this.destroy();\r\n\r\n\t\tthis.emitting(time);\r\n\t\tthis.integrate(time);\r\n\t}\r\n\r\n\tintegrate(time) {\r\n\t\tif (!this.parent) return;\r\n\r\n\t\tconst damping = 1 - this.damping;\r\n\t\tthis.parent.integrator.calculate(this, time, damping);\r\n\r\n\t\tconst length = this.particles.length;\r\n\t\tlet i, particle;\r\n\r\n\t\tfor (i = length - 1; i >= 0; i--) {\r\n\t\t\tparticle = this.particles[i];\r\n\r\n\t\t\t// particle update\r\n\t\t\tparticle.update(time, i);\r\n\t\t\tthis.parent.integrator.calculate(particle, time, damping);\r\n\t\t\tthis.dispatch(\"PARTICLE_UPDATE\", particle);\r\n\r\n\t\t\t// check dead\r\n\t\t\tif (particle.dead) {\r\n\t\t\t\tthis.dispatch(\"PARTICLE_DEAD\", particle);\r\n\r\n\t\t\t\tthis.parent.pool.expire(particle);\r\n\t\t\t\tthis.particles.splice(i, 1);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tdispatch(event, target) {\r\n\t\tthis.parent && this.parent.dispatchEvent(event, target);\r\n\t\tthis.bindEvent && this.dispatchEvent(event, target);\r\n\t}\r\n\r\n\temitting(time) {\r\n\t\tif (this.totalTime == 'once') {\r\n\t\t\tlet i;\r\n\t\t\tconst length = this.rate.getValue(99999);\r\n\r\n\t\t\tif (length > 0) this.emitSpeed = length;\r\n\t\t\tfor (i = 0; i < length; i++) this.createParticle();\r\n\t\t\tthis.totalTime = 'none';\r\n\t\t}\r\n\r\n\t\telse {\r\n\t\t\tthis.emitTime += time;\r\n\r\n\t\t\tif (this.emitTime < this.totalTime) {\r\n\t\t\t\tconst length = this.rate.getValue(time)\r\n\t\t\t\tlet i;\r\n\r\n\t\t\t\tif (length > 0) this.emitSpeed = length;\r\n\t\t\t\tfor (i = 0; i < length; i++) this.createParticle();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * create single particle;\r\n\t * \r\n\t * can use emit({x:10},new Gravity(10),{'particleUpdate',fun}) or emit([{x:10},new Initialize],new Gravity(10),{'particleUpdate',fun})\r\n\t * @method removeAllParticles\r\n\t */\r\n\tcreateParticle(initialize, behaviour) {\r\n\t\tconst particle = this.parent.pool.get(Particle);\r\n\t\tthis.setupParticle(particle, initialize, behaviour);\r\n\t\tthis.dispatch(\"PARTICLE_CREATED\", particle);\r\n\r\n\t\treturn particle;\r\n\t}\r\n\r\n\tsetupParticle(particle, initialize, behaviour) {\r\n\t\tlet initializes = this.initializes;\r\n\t\tlet behaviours = this.behaviours;\r\n\r\n\t\tif (initialize) {\r\n\t\t\tinitializes = Util.isArray(initialize) ? initialize : [initialize];\r\n\t\t}\r\n\r\n\t\tif (behaviour) {\r\n\t\t\tbehaviour = Util.isArray(behaviour) ? behaviour : [behaviour];\r\n\t\t}\r\n\r\n\t\tparticle.reset();\r\n\t\tInitializeUtil.initialize(this, particle, initializes);\r\n\t\tparticle.addBehaviours(behaviours);\r\n\t\tparticle.parent = this;\r\n\r\n\t\tthis.particles.push(particle);\r\n\t}\r\n\r\n\tremove() {\r\n\t\tthis.stop();\r\n\t\tUtil.destroy(this.particles);\r\n\t}\r\n\r\n\t/**\r\n\t * Destory this Emitter\r\n\t * @method destroy\r\n\t */\r\n\tdestroy(slow) {\r\n\t\tthis.dead = true;\r\n\t\tthis.remove();\r\n\t\tthis.removeAllInitializers();\r\n\t\tthis.removeAllBehaviours();\r\n\t\tthis.parent && this.parent.removeEmitter(this);\r\n\t}\r\n\r\n}\r\n\r\nEventDispatcher.bind(Emitter);","import Util from '../utils/Util';\r\nimport Emitter from './Emitter';\r\n\r\nexport default class BehaviourEmitter extends Emitter {\r\n\r\n\t/**\r\n\t * The BehaviourEmitter class inherits from Proton.Emitter\r\n\t *\r\n\t * use the BehaviourEmitter you can add behaviours to self;\r\n\t * @class Proton.BehaviourEmitter\r\n\t * @constructor\r\n\t * @param {Object} pObj the parameters object;\r\n\t */\r\n\tconstructor(pObj) {\r\n\t\tsuper(pObj);\r\n\r\n\t\tthis.selfBehaviours = [];\r\n\t};\r\n\t\r\n\t/**\r\n\t * add the Behaviour to emitter;\r\n\t *\r\n\t * you can use Behaviours array:emitter.addSelfBehaviour(Behaviour1,Behaviour2,Behaviour3);\r\n\t * @method addSelfBehaviour\r\n\t * @param {Proton.Behaviour} behaviour like this new Proton.Color('random')\r\n\t */\r\n\taddSelfBehaviour(...rest) {\r\n\t\tconst length = rest.length;\r\n\t\tlet i;\r\n\r\n\t\tfor (i = 0; i < length; i++) {\r\n\t\t\tthis.selfBehaviours.push(rest[i]);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * remove the Behaviour for self\r\n\t * @method removeSelfBehaviour\r\n\t * @param {Proton.Behaviour} behaviour a behaviour\r\n\t */\r\n\tremoveSelfBehaviour(behaviour) {\r\n\t\tconst index = this.selfBehaviours.indexOf(behaviour);\r\n\t\tif (index > -1) this.selfBehaviours.splice(index, 1);\r\n\t};\r\n\r\n\tupdate(time) {\r\n\t\tsuper.update(time);\r\n\r\n\t\tif (!this.sleep) {\r\n\t\t\tconst length = this.selfBehaviours.length;\r\n\t\t\tlet i;\r\n\r\n\t\t\tfor (i = 0; i < length; i++) {\r\n\t\t\t\tthis.selfBehaviours[i].applyBehaviour(this, time, i);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}","import Util from '../utils/Util';\r\nimport Emitter from './Emitter';\r\n\r\nexport default class FollowEmitter extends Emitter {\r\n\r\n\t/**\r\n\t * The FollowEmitter class inherits from Proton.Emitter\r\n\t *\r\n\t * use the FollowEmitter will emit particle when mousemoving\r\n\t *\r\n\t * @class Proton.FollowEmitter\r\n\t * @constructor\r\n\t * @param {Element} mouseTarget mouseevent's target;\r\n\t * @param {Number} ease the easing of following speed;\r\n\t * @default 0.7\r\n\t * @param {Object} pObj the parameters object;\r\n\t */\r\n\tconstructor(mouseTarget, ease, pObj) {\r\n\t\tsuper(pObj);\r\n\r\n\t\tthis.mouseTarget = Util.initValue(mouseTarget, window);\r\n\t\tthis.ease = Util.initValue(ease, .7);\r\n\r\n\t\tthis._allowEmitting = false;\r\n\t\tthis.initEventHandler();\r\n\t};\r\n\r\n\tinitEventHandler() {\r\n\t\tthis.mousemoveHandler = e => this.mousemove.call(this, e);\r\n\t\tthis.mousedownHandler = e => this.mousedown.call(this, e);\r\n\t\tthis.mouseupHandler = e => this.mouseup.call(this, e);\r\n\r\n\t\tthis.mouseTarget.addEventListener('mousemove', this.mousemoveHandler, false);\r\n\t}\r\n\r\n\t/**\r\n\t * start emit particle\r\n\t * @method emit\r\n\t */\r\n\temit() {\r\n\t\tthis._allowEmitting = true;\r\n\t}\r\n\r\n\t/**\r\n\t * stop emiting\r\n\t * @method stop\r\n\t */\r\n\tstop() {\r\n\t\tthis._allowEmitting = false;\r\n\t}\r\n\r\n\tmousemove(e) {\r\n\t\tif (e.layerX || e.layerX === 0) {\r\n\t\t\tthis.p.x += (e.layerX - this.p.x) * this.ease;\r\n\t\t\tthis.p.y += (e.layerY - this.p.y) * this.ease;\r\n\t\t} else if (e.offsetX || e.offsetX === 0) {\r\n\t\t\tthis.p.x += (e.offsetX - this.p.x) * this.ease;\r\n\t\t\tthis.p.y += (e.offsetY - this.p.y) * this.ease;\r\n\t\t}\r\n\r\n\t\tif (this._allowEmitting) super.emit('once');\r\n\t};\r\n\r\n\t/**\r\n\t * Destory this Emitter\r\n\t * @method destroy\r\n\t */\r\n\tdestroy() {\r\n\t\tsuper.destroy();\r\n\t\tthis.mouseTarget.removeEventListener('mousemove', this.mousemoveHandler, false);\r\n\t}\r\n\r\n}\r\n","import Pool from '../core/Pool';\r\nimport Util from '../utils/Util';\r\n\r\nexport default class BaseRenderer {\r\n\r\n constructor(element, stroke) {\r\n this.element = element;\r\n this.stroke = stroke;\r\n\r\n this.initHandler();\r\n\r\n this.circleConf = { isCircle: true };\r\n this.pool = new Pool();\r\n this.name = 'BaseRenderer';\r\n }\r\n\r\n setStroke(color, thinkness) {\r\n color = Util.initValue(color, '#000000');\r\n thinkness = Util.initValue(thinkness, 1);\r\n\r\n this.stroke = { color, thinkness };\r\n }\r\n\r\n initHandler() {\r\n this._protonUpdateHandler = () => { this.onProtonUpdate.call(this) };\r\n this._protonUpdateAfterHandler = () => { this.onProtonUpdateAfter.call(this) };\r\n this._emitterAddedHandler = (emitter) => { this.onEmitterAdded.call(this, emitter) };\r\n this._emitterRemovedHandler = (emitter) => { this.onEmitterRemoved.call(this, emitter) };\r\n this._particleCreatedHandler = (particle) => { this.onParticleCreated.call(this, particle) };\r\n this._particleUpdateHandler = (particle) => { this.onParticleUpdate.call(this, particle) };\r\n this._particleDeadHandler = (particle) => { this.onParticleDead.call(this, particle) };\r\n }\r\n\r\n init(proton) {\r\n this.parent = proton;\r\n\r\n proton.addEventListener('PROTON_UPDATE', this._protonUpdateHandler);\r\n proton.addEventListener('PROTON_UPDATE_AFTER', this._protonUpdateAfterHandler);\r\n\r\n proton.addEventListener('EMITTER_ADDED', this._emitterAddedHandler);\r\n proton.addEventListener('EMITTER_REMOVED', this._emitterRemovedHandler);\r\n\r\n proton.addEventListener('PARTICLE_CREATED', this._particleCreatedHandler);\r\n proton.addEventListener('PARTICLE_UPDATE', this._particleUpdateHandler);\r\n proton.addEventListener('PARTICLE_DEAD', this._particleDeadHandler);\r\n }\r\n\r\n resize(width, height) {}\r\n\r\n remove(proton) {\r\n this.parent.removeEventListener('PROTON_UPDATE', this._protonUpdateHandler);\r\n this.parent.removeEventListener('PROTON_UPDATE_AFTER', this._protonUpdateAfterHandler);\r\n\r\n this.parent.removeEventListener('EMITTER_ADDED', this._emitterAddedHandler);\r\n this.parent.removeEventListener('EMITTER_REMOVED', this._emitterRemovedHandler);\r\n\r\n this.parent.removeEventListener('PARTICLE_CREATED', this._particleCreatedHandler);\r\n this.parent.removeEventListener('PARTICLE_UPDATE', this._particleUpdateHandler);\r\n this.parent.removeEventListener('PARTICLE_DEAD', this._particleDeadHandler);\r\n\r\n this.parent = null;\r\n }\r\n\r\n destroy(){\r\n this.remove();\r\n }\r\n \r\n onProtonUpdate() {}\r\n onProtonUpdateAfter() {}\r\n\r\n onEmitterAdded(emitter) {}\r\n onEmitterRemoved(emitter) {}\r\n\r\n onParticleCreated(particle) {}\r\n onParticleUpdate(particle) {}\r\n onParticleDead(particle) {}\r\n}","import Util from '../utils/Util';\r\nimport ImgUtil from '../utils/ImgUtil';\r\nimport ColorUtil from '../utils/ColorUtil';\r\nimport MathUtils from '../math/MathUtils';\r\nimport BaseRenderer from './BaseRenderer';\r\n\r\nexport default class CanvasRenderer extends BaseRenderer {\r\n\r\n constructor(element) {\r\n super(element);\r\n\r\n this.stroke = null;\r\n this.context = this.element.getContext(\"2d\");\r\n this.bufferCache = {};\r\n\r\n this.name = 'CanvasRenderer';\r\n }\r\n\r\n resize(width, height) {\r\n this.element.width = width;\r\n this.element.height = height;\r\n }\r\n\r\n onProtonUpdate() {\r\n this.context.clearRect(0, 0, this.element.width, this.element.height);\r\n }\r\n\r\n onParticleCreated(particle) {\r\n if (particle.body)\r\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\r\n else\r\n particle.color = particle.color || '#ff0000';\r\n }\r\n\r\n onParticleUpdate(particle) {\r\n if (particle.body) {\r\n if (particle.body instanceof Image) this.drawImage(particle);\r\n } else {\r\n this.drawCircle(particle);\r\n }\r\n }\r\n\r\n onParticleDead(particle) {\r\n particle.body = null;\r\n }\r\n\r\n\r\n // private \r\n addImg2Body(img, particle) {\r\n particle.body = img;\r\n }\r\n\r\n // private drawCircle --\r\n drawImage(particle) {\r\n const w = particle.body.width * particle.scale | 0;\r\n const h = particle.body.height * particle.scale | 0;\r\n const x = particle.p.x - w / 2;\r\n const y = particle.p.y - h / 2;\r\n\r\n if (!!particle.color) {\r\n if (!particle.transform[\"buffer\"]) particle.transform.buffer = this.createBuffer(particle.body);\r\n\r\n const bufferContext = particle.transform.buffer.getContext('2d');\r\n bufferContext.clearRect(0, 0, particle.transform.buffer.width, particle.transform.buffer.height);\r\n bufferContext.globalAlpha = particle.alpha;\r\n bufferContext.drawImage(particle.body, 0, 0);\r\n\r\n bufferContext.globalCompositeOperation = \"source-atop\";\r\n bufferContext.fillStyle = ColorUtil.rgbToHex(particle.transform.rgb);\r\n bufferContext.fillRect(0, 0, particle.transform.buffer.width, particle.transform.buffer.height);\r\n bufferContext.globalCompositeOperation = \"source-over\";\r\n bufferContext.globalAlpha = 1;\r\n\r\n this.context.drawImage(particle.transform.buffer, 0, 0, particle.transform.buffer.width, particle.transform.buffer.height, x, y, w, h);\r\n } else {\r\n this.context.save();\r\n\r\n this.context.globalAlpha = particle.alpha;\r\n this.context.translate(particle.p.x, particle.p.y);\r\n this.context.rotate(MathUtils.degreeTransform(particle.rotation));\r\n this.context.translate(-particle.p.x, -particle.p.y);\r\n this.context.drawImage(particle.body, 0, 0, particle.body.width, particle.body.height, x, y, w, h);\r\n\r\n this.context.globalAlpha = 1;\r\n this.context.restore();\r\n }\r\n }\r\n\r\n // private drawCircle --\r\n drawCircle(particle) {\r\n if (particle.transform[\"rgb\"])\r\n this.context.fillStyle = 'rgba(' + particle.transform.rgb.r + ',' + particle.transform.rgb.g + ',' + particle.transform.rgb.b + ',' + particle.alpha + ')';\r\n else\r\n this.context.fillStyle = particle.color;\r\n\r\n // draw circle\r\n this.context.beginPath();\r\n this.context.arc(particle.p.x, particle.p.y, particle.radius, 0, Math.PI * 2, true);\r\n\r\n if (this.stroke) {\r\n this.context.strokeStyle = this.stroke.color;\r\n this.context.lineWidth = this.stroke.thinkness;\r\n this.context.stroke();\r\n }\r\n\r\n this.context.closePath();\r\n this.context.fill();\r\n }\r\n\r\n // private createBuffer --\r\n createBuffer(image) {\r\n if (image instanceof Image) {\r\n const size = image.width + '_' + image.height;\r\n let canvas = this.bufferCache[size];\r\n\r\n if (!canvas) {\r\n canvas = document.createElement('canvas');\r\n canvas.width = image.width;\r\n canvas.height = image.height;\r\n this.bufferCache[size] = canvas;\r\n }\r\n\r\n return canvas;\r\n }\r\n }\r\n}","import Util from '../utils/Util';\r\nimport DomUtil from '../utils/DomUtil';\r\nimport ImgUtil from '../utils/ImgUtil';\r\nimport MathUtils from '../math/MathUtils';\r\nimport BaseRenderer from './BaseRenderer';\r\n\r\nexport default class DomRenderer extends BaseRenderer {\r\n\r\n constructor(element) {\r\n super(element);\r\n\r\n this.stroke = null;\r\n this.pool.create = (body, particle) => this.createBody(body, particle);\r\n this.addImg2Body = this.addImg2Body.bind(this);\r\n\r\n this.transform3d = false;\r\n\r\n this.name = 'DomRenderer';\r\n }\r\n\r\n onParticleCreated(particle) {\r\n if (particle.body) {\r\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\r\n } else {\r\n particle.body = this.pool.get(this.circleConf, particle);\r\n this.element.appendChild(particle.body);\r\n }\r\n }\r\n\r\n onParticleUpdate(particle) {\r\n if (this.bodyReady(particle)) {\r\n if (this.transform3d)\r\n DomUtil.transform3d(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);\r\n else\r\n DomUtil.transform(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);\r\n\r\n particle.body.style.opacity = particle.alpha;\r\n if (particle.body.isCircle) {\r\n particle.body.style.backgroundColor = particle.color || '#ff0000';\r\n }\r\n }\r\n }\r\n\r\n onParticleDead(particle) {\r\n if (this.bodyReady(particle)) {\r\n this.element.removeChild(particle.body);\r\n this.pool.expire(particle.body);\r\n particle.body = null;\r\n }\r\n }\r\n\r\n bodyReady(particle) {\r\n return typeof particle.body === 'object' && particle.body && !particle.body.isInner;\r\n }\r\n\r\n // private \r\n addImg2Body(img, particle) {\r\n if (particle.dead) return;\r\n particle.body = this.pool.get(img, particle);\r\n DomUtil.resize(particle.body, img.width, img.height);\r\n\r\n this.element.appendChild(particle.body);\r\n }\r\n\r\n createBody(body, particle) {\r\n if (body.isCircle)\r\n return this.createCircle(particle);\r\n else\r\n return this.createSprite(body, particle);\r\n }\r\n\r\n // private --\r\n createCircle(particle) {\r\n const dom = DomUtil.createDiv(`${particle.id}_dom`, 2 * particle.radius, 2 * particle.radius);\r\n dom.style.borderRadius = `${particle.radius}px`;\r\n\r\n if (this.stroke) {\r\n dom.style.borderColor = this.stroke.color;\r\n dom.style.borderWidth = `${this.stroke.thinkness}px`;\r\n }\r\n dom.isCircle = true;\r\n\r\n return dom;\r\n }\r\n\r\n createSprite(body, particle) {\r\n const url = typeof body === 'string' ? body : body.src;\r\n const dom = DomUtil.createDiv(`${particle.id}_dom`, body.width, body.height);\r\n dom.style.backgroundImage = `url(${url})`;\r\n\r\n return dom;\r\n }\r\n\r\n}","import Util from '../utils/Util';\r\nimport BaseRenderer from './BaseRenderer';\r\n\r\nexport default class EaselRenderer extends BaseRenderer {\r\n\r\n constructor(element, stroke) {\r\n super(element);\r\n\r\n this.stroke = stroke;\r\n this.name = 'EaselRenderer';\r\n }\r\n\r\n onParticleCreated(particle) {\r\n if (particle.body) {\r\n this.createSprite(particle);\r\n } else {\r\n this.createCircle(particle);\r\n }\r\n\r\n this.element.addChild(particle.body);\r\n }\r\n\r\n onParticleUpdate(particle) {\r\n if (particle.body) {\r\n particle.body.x = particle.p.x;\r\n particle.body.y = particle.p.y;\r\n\r\n particle.body.alpha = particle.alpha;\r\n particle.body.scaleX = particle.body.scaleY = particle.scale;\r\n particle.body.rotation = particle.rotation;\r\n }\r\n }\r\n\r\n onParticleDead(particle) {\r\n if (particle.body) {\r\n particle.body.parent && particle.body.parent.removeChild(particle.body);\r\n this.pool.expire(particle.body);\r\n particle.body = null;\r\n }\r\n\r\n if (particle.graphics) this.pool.expire(particle.graphics);\r\n }\r\n\r\n // private\r\n createSprite(particle) {\r\n particle.body = this.pool.get(particle.body);\r\n\r\n if (particle.body.parent) return;\r\n if (particle.body['image']) {\r\n particle.body.regX = particle.body.image.width / 2;\r\n particle.body.regY = particle.body.image.height / 2;\r\n }\r\n }\r\n\r\n createCircle(particle) {\r\n const graphics = this.pool.get(createjs.Graphics);\r\n\r\n if (this.stroke) {\r\n if (this.stroke instanceof String)\r\n graphics.beginStroke(this.stroke);\r\n else\r\n graphics.beginStroke('#000000');\r\n }\r\n graphics.beginFill(particle.color || '#ff0000').drawCircle(0, 0, particle.radius);\r\n\r\n const shape = this.pool.get(createjs.Shape, [graphics]);\r\n\r\n particle.body = shape;\r\n particle.graphics = graphics;\r\n }\r\n\r\n}","import Util from '../utils/Util';\r\nimport Rectangle from '../math/Rectangle';\r\nimport BaseRenderer from './BaseRenderer';\r\n\r\nexport default class PixelRenderer extends BaseRenderer {\r\n\r\n constructor(element, rectangle) {\r\n super(element);\r\n\r\n this.context = this.element.getContext('2d');\r\n this.imageData = null;\r\n this.rectangle = null;\r\n this.rectangle = rectangle;\r\n this.createImageData(rectangle);\r\n\r\n this.name = 'PixelRenderer';\r\n }\r\n\r\n resize(width, height) {\r\n this.element.width = width;\r\n this.element.height = height;\r\n }\r\n\r\n createImageData(rectangle) {\r\n this.rectangle = rectangle ? rectangle : new Rectangle(0, 0, this.element.width, this.element.height);\r\n this.imageData = this.context.createImageData(this.rectangle.width, this.rectangle.height);\r\n this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);\r\n }\r\n\r\n onProtonUpdate() {\r\n this.context.clearRect(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height);\r\n this.imageData = this.context.getImageData(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height);\r\n }\r\n\r\n onProtonUpdateAfter() {\r\n this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);\r\n }\r\n\r\n onParticleCreated(particle) {}\r\n\r\n onParticleUpdate(particle) {\r\n if (this.imageData) {\r\n this.setPixel(this.imageData, Math.floor(particle.p.x - this.rectangle.x), Math.floor(particle.p.y - this.rectangle.y), particle);\r\n }\r\n }\r\n\r\n setPixel(imagedata, x, y, particle) {\r\n const rgb = particle.transform.rgb;\r\n\r\n if ((x < 0) || (x > this.element.width) || (y < 0) || (y > this.elementwidth))\r\n return;\r\n\r\n const i = ((y >> 0) * imagedata.width + (x >> 0)) * 4;\r\n\r\n imagedata.data[i] = rgb.r;\r\n imagedata.data[i + 1] = rgb.g;\r\n imagedata.data[i + 2] = rgb.b;\r\n imagedata.data[i + 3] = particle.alpha * 255;\r\n }\r\n\r\n onParticleDead(particle) {\r\n\r\n }\r\n\r\n}","import Pool from '../core/Pool';\r\nimport Util from '../utils/Util';\r\nimport ColorUtil from '../utils/ColorUtil';\r\nimport MathUtils from '../math/MathUtils';\r\nimport BaseRenderer from './BaseRenderer';\r\n\r\nexport default class PixiRenderer extends BaseRenderer {\r\n\r\n constructor(element, stroke) {\r\n super(element);\r\n\r\n this.stroke = stroke;\r\n this.setColor = false;\r\n this.pool.create = (body, particle) => this.createBody(body, particle);\r\n this.name = 'PixiRenderer';\r\n }\r\n\r\n onProtonUpdate() { }\r\n\r\n /**\r\n * @param particle\r\n */\r\n onParticleCreated(particle) {\r\n if (particle.body) {\r\n particle.body = this.pool.get(particle.body, particle);\r\n } else {\r\n particle.body = this.pool.get(this.circleConf, particle);\r\n }\r\n\r\n this.element.addChild(particle.body);\r\n }\r\n\r\n /**\r\n * @param particle\r\n */\r\n onParticleUpdate(particle) {\r\n this.transform(particle, particle.body);\r\n if (this.setColor) particle.body.tint = ColorUtil.getHex16FromParticle(particle);\r\n }\r\n\r\n /**\r\n * @param particle\r\n */\r\n onParticleDead(particle) {\r\n this.element.removeChild(particle.body);\r\n this.pool.expire(particle.body);\r\n particle.body = null;\r\n }\r\n\r\n destroy(particles) {\r\n super.destroy();\r\n this.pool.destroy();\r\n\r\n let i = particles.length;\r\n while (i--) {\r\n let particle = particles[i];\r\n if (particle.body) {\r\n this.element.removeChild(particle.body);\r\n }\r\n }\r\n }\r\n\r\n transform(particle, target) {\r\n target.x = particle.p.x;\r\n target.y = particle.p.y;\r\n\r\n target.alpha = particle.alpha;\r\n\r\n target.scale.x = particle.scale;\r\n target.scale.y = particle.scale;\r\n\r\n // using cached version of MathUtils.PI_180 for slight performance increase.\r\n target.rotation = particle.rotation * MathUtils.PI_180; // MathUtils.PI_180;\r\n }\r\n\r\n createBody(body, particle) {\r\n if (body.isCircle)\r\n return this.createCircle(particle);\r\n else\r\n return this.createSprite(body);\r\n }\r\n\r\n createSprite(body) {\r\n const sprite = body.isInner ? PIXI.Sprite.fromImage(body.src) : new PIXI.Sprite(body);\r\n sprite.anchor.x = 0.5;\r\n sprite.anchor.y = 0.5;\r\n\r\n return sprite;\r\n }\r\n\r\n createCircle(particle) {\r\n const graphics = new PIXI.Graphics();\r\n\r\n if (this.stroke) {\r\n let stroke = this.stroke instanceof String ? this.stroke : 0x000000;\r\n graphics.beginStroke(this.stroke);\r\n }\r\n\r\n graphics.beginFill(particle.color || 0x008ced);\r\n graphics.drawCircle(0, 0, particle.radius);\r\n graphics.endFill();\r\n\r\n return graphics;\r\n }\r\n}","import Mat3 from '../math/Mat3';\r\n\r\nexport default class MStack {\r\n\r\n\tconstructor() {\r\n\t\tthis.mats = [];\r\n\t\tthis.size = 0;\r\n\r\n\t\tfor (let i = 0; i < 20; i++) this.mats.push(Mat3.create([0, 0, 0, 0, 0, 0, 0, 0, 0]));\r\n\t}\r\n\r\n\tset(m, i) {\r\n\t\tif (i == 0)\r\n\t\t\tMat3.set(m, this.mats[0]);\r\n\t\telse\r\n\t\t\tMat3.multiply(this.mats[i - 1], m, this.mats[i]);\r\n\r\n\t\tthis.size = Math.max(this.size, i + 1);\r\n\t}\r\n\r\n\tpush(m) {\r\n\t\tif (this.size == 0)\r\n\t\t\tMat3.set(m, this.mats[0]);\r\n\t\telse\r\n\t\t\tMat3.multiply(this.mats[this.size - 1], m, this.mats[this.size]);\r\n\r\n\t\tthis.size++;\r\n\t}\r\n\r\n\tpop() {\r\n\t\tif (this.size > 0)\r\n\t\t\tthis.size--;\r\n\t}\r\n\r\n\ttop() {\r\n\t\treturn (this.mats[this.size - 1]);\r\n\t}\r\n}","import Mat3 from '../math/Mat3';\r\nimport BaseRenderer from './BaseRenderer';\r\n\r\nimport Util from '../utils/Util';\r\nimport ImgUtil from '../utils/ImgUtil';\r\nimport MStack from '../utils/MStack';\r\nimport DomUtil from '../utils/DomUtil';\r\nimport WebGLUtil from '../utils/WebGLUtil';\r\nimport MathUtils from '../math/MathUtils';\r\n\r\nexport default class WebGLRenderer extends BaseRenderer {\r\n\r\n constructor(element) {\r\n super(element);\r\n\r\n this.gl = this.element.getContext('experimental-webgl', { antialias: true, stencil: false, depth: false });\r\n if (!this.gl) alert(\"Sorry your browser do not suppest WebGL!\");\r\n\r\n this.initVar();\r\n this.setMaxRadius();\r\n this.initShaders();\r\n this.initBuffers();\r\n\r\n this.gl.blendEquation(this.gl.FUNC_ADD);\r\n this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\r\n this.gl.enable(this.gl.BLEND);\r\n\r\n this.addImg2Body = this.addImg2Body.bind(this);\r\n\r\n this.name = 'WebGLRenderer';\r\n }\r\n\r\n init(proton) {\r\n super.init(proton);\r\n this.resize(this.element.width, this.element.height);\r\n }\r\n\r\n resize(width, height) {\r\n this.umat[4] = -2;\r\n this.umat[7] = 1;\r\n\r\n this.smat[0] = 1 / width;\r\n this.smat[4] = 1 / height;\r\n\r\n this.mstack.set(this.umat, 0);\r\n this.mstack.set(this.smat, 1);\r\n\r\n this.gl.viewport(0, 0, width, height);\r\n this.element.width = width;\r\n this.element.height = height;\r\n }\r\n\r\n setMaxRadius(radius) {\r\n this.circleCanvasURL = this.createCircle(radius);\r\n }\r\n\r\n getVertexShader() {\r\n const vsSource = [\"uniform vec2 viewport;\", \"attribute vec2 aVertexPosition;\", \"attribute vec2 aTextureCoord;\", \"uniform mat3 tMat;\", \"varying vec2 vTextureCoord;\", \"varying float alpha;\", \"void main() {\", \"vec3 v = tMat * vec3(aVertexPosition, 1.0);\", \"gl_Position = vec4(v.x, v.y, 0, 1);\", \"vTextureCoord = aTextureCoord;\", \"alpha = tMat[0][2];\", \"}\"].join(\"\\n\");\r\n return vsSource;\r\n }\r\n\r\n getFragmentShader() {\r\n const fsSource = [\"precision mediump float;\", \"varying vec2 vTextureCoord;\", \"varying float alpha;\", \"uniform sampler2D uSampler;\", \"uniform vec4 color;\", \"uniform bool useTexture;\", \"uniform vec3 uColor;\", \"void main() {\", \"vec4 textureColor = texture2D(uSampler, vTextureCoord);\", \"gl_FragColor = textureColor * vec4(uColor, 1.0);\", \"gl_FragColor.w *= alpha;\", \"}\"].join(\"\\n\");\r\n return fsSource;\r\n }\r\n\r\n initVar() {\r\n this.mstack = new MStack();\r\n this.umat = Mat3.create([2, 0, 1, 0, -2, 0, -1, 1, 1]);\r\n this.smat = Mat3.create([1 / 100, 0, 1, 0, 1 / 100, 0, 0, 0, 1]);\r\n this.texturebuffers = {};\r\n }\r\n\r\n blendEquation(A) {\r\n this.gl.blendEquation(this.gl[A]);\r\n }\r\n\r\n blendFunc(A, B) {\r\n this.gl.blendFunc(this.gl[A], this.gl[B]);\r\n }\r\n\r\n getShader(gl, str, fs) {\r\n const shader = fs ? gl.createShader(gl.FRAGMENT_SHADER) : gl.createShader(gl.VERTEX_SHADER);\r\n\r\n gl.shaderSource(shader, str);\r\n gl.compileShader(shader);\r\n\r\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\r\n alert(gl.getShaderInfoLog(shader));\r\n return null;\r\n }\r\n\r\n return shader;\r\n }\r\n\r\n initShaders() {\r\n const fragmentShader = this.getShader(this.gl, this.getFragmentShader(), true);\r\n const vertexShader = this.getShader(this.gl, this.getVertexShader(), false);\r\n\r\n this.sprogram = this.gl.createProgram();\r\n this.gl.attachShader(this.sprogram, vertexShader);\r\n this.gl.attachShader(this.sprogram, fragmentShader);\r\n this.gl.linkProgram(this.sprogram);\r\n\r\n if (!this.gl.getProgramParameter(this.sprogram, this.gl.LINK_STATUS))\r\n alert(\"Could not initialise shaders\");\r\n\r\n this.gl.useProgram(this.sprogram);\r\n this.sprogram.vpa = this.gl.getAttribLocation(this.sprogram, \"aVertexPosition\");\r\n this.sprogram.tca = this.gl.getAttribLocation(this.sprogram, \"aTextureCoord\");\r\n this.gl.enableVertexAttribArray(this.sprogram.tca);\r\n this.gl.enableVertexAttribArray(this.sprogram.vpa);\r\n\r\n this.sprogram.tMatUniform = this.gl.getUniformLocation(this.sprogram, \"tMat\");\r\n this.sprogram.samplerUniform = this.gl.getUniformLocation(this.sprogram, \"uSampler\");\r\n this.sprogram.useTex = this.gl.getUniformLocation(this.sprogram, \"useTexture\");\r\n this.sprogram.color = this.gl.getUniformLocation(this.sprogram, \"uColor\");\r\n this.gl.uniform1i(this.sprogram.useTex, 1);\r\n };\r\n\r\n initBuffers() {\r\n const vs = [0, 3, 1, 0, 2, 3];\r\n let idx;\r\n\r\n this.unitIBuffer = this.gl.createBuffer();\r\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);\r\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(vs), this.gl.STATIC_DRAW);\r\n\r\n let i;\r\n let ids = [];\r\n for (i = 0; i < 100; i++) ids.push(i);\r\n idx = new Uint16Array(ids);\r\n\r\n this.unitI33 = this.gl.createBuffer();\r\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitI33);\r\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);\r\n\r\n ids = [];\r\n for (i = 0; i < 100; i++) ids.push(i, i + 1, i + 2);\r\n idx = new Uint16Array(ids);\r\n\r\n this.stripBuffer = this.gl.createBuffer();\r\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.stripBuffer);\r\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);\r\n };\r\n\r\n createCircle(raidus) {\r\n this.circleCanvasRadius = WebGLUtil.nhpot(Util.initValue(raidus, 32));\r\n const canvas = DomUtil.createCanvas('circle_canvas', this.circleCanvasRadius * 2, this.circleCanvasRadius * 2);\r\n const context = canvas.getContext('2d');\r\n\r\n context.beginPath();\r\n context.arc(this.circleCanvasRadius, this.circleCanvasRadius, this.circleCanvasRadius, 0, Math.PI * 2, true);\r\n context.closePath();\r\n context.fillStyle = '#FFF';\r\n context.fill();\r\n\r\n return canvas.toDataURL();\r\n };\r\n\r\n drawImg2Canvas(particle) {\r\n const _w = particle.body.width;\r\n const _h = particle.body.height;\r\n\r\n const _width = WebGLUtil.nhpot(particle.body.width);\r\n const _height = WebGLUtil.nhpot(particle.body.height);\r\n\r\n const _scaleX = particle.body.width / _width;\r\n const _scaleY = particle.body.height / _height;\r\n\r\n if (!this.texturebuffers[particle.transform.src])\r\n this.texturebuffers[particle.transform.src] = [this.gl.createTexture(), this.gl.createBuffer(), this.gl.createBuffer()];\r\n\r\n particle.transform.texture = this.texturebuffers[particle.transform.src][0];\r\n particle.transform.vcBuffer = this.texturebuffers[particle.transform.src][1];\r\n particle.transform.tcBuffer = this.texturebuffers[particle.transform.src][2];\r\n\r\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.tcBuffer);\r\n this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, _scaleX, 0.0, 0.0, _scaleY, _scaleY, _scaleY]), this.gl.STATIC_DRAW);\r\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.vcBuffer);\r\n this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, _w, 0.0, 0.0, _h, _w, _h]), this.gl.STATIC_DRAW);\r\n\r\n const context = particle.transform.canvas.getContext('2d');\r\n const data = context.getImageData(0, 0, _width, _height);\r\n\r\n this.gl.bindTexture(this.gl.TEXTURE_2D, particle.transform.texture);\r\n this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, data);\r\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);\r\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_NEAREST);\r\n this.gl.generateMipmap(this.gl.TEXTURE_2D);\r\n\r\n particle.transform.textureLoaded = true;\r\n particle.transform.textureWidth = _w;\r\n particle.transform.textureHeight = _h;\r\n }\r\n\r\n onProtonUpdate() {\r\n //this.gl.clearColor(0, 0, 0, 1);\r\n //this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);\r\n }\r\n\r\n onParticleCreated(particle) {\r\n particle.transform.textureLoaded = false;\r\n particle.transform.tmat = Mat3.create();\r\n particle.transform.tmat[8] = 1;\r\n particle.transform.imat = Mat3.create();\r\n particle.transform.imat[8] = 1;\r\n\r\n if (particle.body) {\r\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\r\n } else {\r\n ImgUtil.getImgFromCache(this.circleCanvasURL, this.addImg2Body, particle);\r\n particle.transform.oldScale = particle.radius / this.circleCanvasRadius;\r\n }\r\n }\r\n\r\n // private \r\n addImg2Body(img, particle) {\r\n if (particle.dead) return;\r\n \r\n particle.body = img;\r\n particle.transform.src = img.src;\r\n particle.transform.canvas = ImgUtil.getCanvasFromCache(img);\r\n particle.transform.oldScale = 1;\r\n\r\n this.drawImg2Canvas(particle);\r\n }\r\n\r\n onParticleUpdate(particle) {\r\n if (particle.transform.textureLoaded) {\r\n this.updateMatrix(particle);\r\n\r\n this.gl.uniform3f(this.sprogram.color, particle.transform.rgb.r / 255, particle.transform.rgb.g / 255, particle.transform.rgb.b / 255);\r\n this.gl.uniformMatrix3fv(this.sprogram.tMatUniform, false, this.mstack.top());\r\n\r\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.vcBuffer);\r\n this.gl.vertexAttribPointer(this.sprogram.vpa, 2, this.gl.FLOAT, false, 0, 0);\r\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.tcBuffer);\r\n this.gl.vertexAttribPointer(this.sprogram.tca, 2, this.gl.FLOAT, false, 0, 0);\r\n this.gl.bindTexture(this.gl.TEXTURE_2D, particle.transform.texture);\r\n this.gl.uniform1i(this.sprogram.samplerUniform, 0);\r\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);\r\n\r\n this.gl.drawElements(this.gl.TRIANGLES, 6, this.gl.UNSIGNED_SHORT, 0);\r\n\r\n this.mstack.pop();\r\n }\r\n }\r\n\r\n onParticleDead(particle) { }\r\n\r\n updateMatrix(particle) {\r\n const moveOriginMatrix = WebGLUtil.makeTranslation(-particle.transform.textureWidth / 2, -particle.transform.textureHeight / 2);\r\n const translationMatrix = WebGLUtil.makeTranslation(particle.p.x, particle.p.y);\r\n\r\n const angel = particle.rotation * (MathUtils.PI_180);\r\n const rotationMatrix = WebGLUtil.makeRotation(angel);\r\n\r\n const scale = particle.scale * particle.transform.oldScale;\r\n const scaleMatrix = WebGLUtil.makeScale(scale, scale);\r\n let matrix = WebGLUtil.matrixMultiply(moveOriginMatrix, scaleMatrix);\r\n\r\n matrix = WebGLUtil.matrixMultiply(matrix, rotationMatrix);\r\n matrix = WebGLUtil.matrixMultiply(matrix, translationMatrix);\r\n\r\n Mat3.inverse(matrix, particle.transform.imat);\r\n matrix[2] = particle.alpha;\r\n\r\n this.mstack.push(matrix);\r\n }\r\n}","import Util from '../utils/Util';\r\nimport BaseRenderer from './BaseRenderer';\r\n\r\nexport default class CustomRenderer extends BaseRenderer {\r\n\r\n constructor(element) {\r\n super(element);\r\n\r\n this.name = 'CustomRenderer';\r\n }\r\n\r\n}","import Zone from './Zone';\r\nimport Util from '../utils/Util';\r\nimport MathUtils from '../math/MathUtils';\r\n\r\nexport default class LineZone extends Zone {\r\n\r\n\tconstructor(x1, y1, x2, y2, direction) {\r\n\t\tsuper();\r\n\r\n\t\tif (x2 - x1 >= 0) {\r\n\t\t\tthis.x1 = x1;\r\n\t\t\tthis.y1 = y1;\r\n\t\t\tthis.x2 = x2;\r\n\t\t\tthis.y2 = y2;\r\n\t\t} else {\r\n\t\t\tthis.x1 = x2;\r\n\t\t\tthis.y1 = y2;\r\n\t\t\tthis.x2 = x1;\r\n\t\t\tthis.y2 = y1;\r\n\t\t}\r\n\r\n\t\tthis.dx = this.x2 - this.x1;\r\n\t\tthis.dy = this.y2 - this.y1;\r\n\r\n\t\tthis.minx = Math.min(this.x1, this.x2);\r\n\t\tthis.miny = Math.min(this.y1, this.y2);\r\n\t\tthis.maxx = Math.max(this.x1, this.x2);\r\n\t\tthis.maxy = Math.max(this.y1, this.y2);\r\n\r\n\t\tthis.dot = this.x2 * this.y1 - this.x1 * this.y2;\r\n\t\tthis.xxyy = this.dx * this.dx + this.dy * this.dy;\r\n\r\n\t\tthis.gradient = this.getGradient();\r\n\t\tthis.length = this.getLength();\r\n\t\tthis.direction = Util.initValue(direction, '>');\r\n\t}\r\n\r\n\r\n\tgetPosition() {\r\n\t\tthis.random = Math.random();\r\n\t\tthis.vector.x = this.x1 + this.random * this.length * Math.cos(this.gradient);\r\n\t\tthis.vector.y = this.y1 + this.random * this.length * Math.sin(this.gradient);\r\n\r\n\t\treturn this.vector;\r\n\t}\r\n\r\n\tgetDirection(x, y) {\r\n\t\tconst A = this.dy;\r\n\t\tconst B = -this.dx;\r\n\t\tconst C = this.dot;\r\n\t\tconst D = B == 0 ? 1 : B;\r\n\r\n\t\tif ((A * x + B * y + C) * D > 0)\r\n\t\t\treturn true;\r\n\t\telse\r\n\t\t\treturn false;\r\n\t}\r\n\r\n\tgetDistance(x, y) {\r\n\t\tconst A = this.dy;\r\n\t\tconst B = -this.dx;\r\n\t\tconst C = this.dot;\r\n\t\tconst D = (A * x + B * y + C);\r\n\r\n\t\treturn D / Math.sqrt(this.xxyy);\r\n\t}\r\n\r\n\tgetSymmetric(v) {\r\n\t\tconst tha2 = v.getGradient();\r\n\t\tconst tha1 = this.getGradient();\r\n\t\tconst tha = 2 * (tha1 - tha2);\r\n\r\n\t\tconst oldx = v.x;\r\n\t\tconst oldy = v.y;\r\n\r\n\t\tv.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);\r\n\t\tv.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);\r\n\r\n\t\treturn v;\r\n\t}\r\n\r\n\tgetGradient() {\r\n\t\treturn Math.atan2(this.dy, this.dx);\r\n\t}\r\n\r\n\trangeOut(particle) {\r\n\t\tconst angle = Math.abs(this.getGradient());\r\n\r\n\t\tif (angle <= MathUtils.PI / 4) {\r\n\t\t\tif (particle.p.x <= this.maxx && particle.p.x >= this.minx) return true;\r\n\t\t} else {\r\n\t\t\tif (particle.p.y <= this.maxy && particle.p.y >= this.miny) return true;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\tgetLength() {\r\n\t\treturn Math.sqrt(this.dx * this.dx + this.dy * this.dy)\r\n\t}\r\n\r\n\tcrossing(particle) {\r\n\t\tif (this.crossType == \"dead\") {\r\n\t\t\tif (this.direction == \">\" || this.direction == \"R\" || this.direction == \"right\" || this.direction == \"down\") {\r\n\t\t\t\tif (!this.rangeOut(particle)) return;\r\n\t\t\t\tif (this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;\r\n\t\t\t} else {\r\n\t\t\t\tif (!this.rangeOut(particle)) return;\r\n\t\t\t\tif (!this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\telse if (this.crossType == \"bound\") {\r\n\t\t\tif (!this.rangeOut(particle)) return;\r\n\r\n\t\t\tif (this.getDistance(particle.p.x, particle.p.y) <= particle.radius) {\r\n\t\t\t\tif (this.dx == 0) {\r\n\t\t\t\t\tparticle.v.x *= -1;\r\n\t\t\t\t} else if (this.dy == 0) {\r\n\t\t\t\t\tparticle.v.y *= -1;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.getSymmetric(particle.v);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\telse if (this.crossType == \"cross\") {\r\n\t\t\tif (this.alert) {\r\n\t\t\t\tconsole.error('Sorry lineZone does not support cross method');\r\n\t\t\t\tthis.alert = false;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n}","import Zone from './Zone';\r\nimport MathUtils from '../math/MathUtils';\r\n\r\nexport default class CircleZone extends Zone {\r\n\r\n constructor(x, y, radius) {\r\n super();\r\n\r\n this.x = x;\r\n this.y = y;\r\n this.radius = radius;\r\n\r\n this.angle = 0;\r\n this.center = { x, y };\r\n }\r\n\r\n getPosition() {\r\n this.random = Math.random();\r\n this.angle = MathUtils.PIx2 * Math.random();\r\n\r\n this.vector.x = this.x + this.random * this.radius * Math.cos(this.angle);\r\n this.vector.y = this.y + this.random * this.radius * Math.sin(this.angle);\r\n\r\n return this.vector;\r\n }\r\n\r\n setCenter(x, y) {\r\n this.center.x = x;\r\n this.center.y = y;\r\n }\r\n\r\n crossing(particle) {\r\n const d = particle.p.distanceTo(this.center);\r\n\r\n if (this.crossType == \"dead\") {\r\n if (d - particle.radius > this.radius)\r\n particle.dead = true;\r\n } else if (this.crossType == \"bound\") {\r\n if (d + particle.radius >= this.radius)\r\n this.getSymmetric(particle);\r\n } else if (this.crossType == \"cross\") {\r\n if (this.alert) {\r\n alert('Sorry CircleZone does not support cross method');\r\n this.alert = false;\r\n }\r\n }\r\n }\r\n\r\n getSymmetric(particle) {\r\n let tha2 = particle.v.getGradient();\r\n let tha1 = this.getGradient(particle);\r\n\r\n let tha = 2 * (tha1 - tha2);\r\n let oldx = particle.v.x;\r\n let oldy = particle.v.y;\r\n\r\n particle.v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);\r\n particle.v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);\r\n }\r\n\r\n getGradient(particle) {\r\n return -MathUtils.PI_2 + Math.atan2(particle.p.y - this.center.y, particle.p.x - this.center.x);\r\n }\r\n}","import Zone from './Zone';\r\n\r\nexport default class RectZone extends Zone {\r\n\r\n\tconstructor(x, y, width, height) {\r\n\t\tsuper();\r\n\r\n\t\tthis.x = x;\r\n\t\tthis.y = y;\r\n\t\tthis.width = width;\r\n\t\tthis.height = height;\r\n\t}\r\n\r\n\tgetPosition() {\r\n\t\tthis.vector.x = this.x + Math.random() * this.width;\r\n\t\tthis.vector.y = this.y + Math.random() * this.height;\r\n\r\n\t\treturn this.vector;\r\n\t}\r\n\r\n\tcrossing(particle) {\r\n\t\tif (this.crossType == \"dead\") {\r\n\t\t\tif (particle.p.x + particle.radius < this.x)\r\n\t\t\t\tparticle.dead = true;\r\n\t\t\telse if (particle.p.x - particle.radius > this.x + this.width)\r\n\t\t\t\tparticle.dead = true;\r\n\r\n\t\t\tif (particle.p.y + particle.radius < this.y)\r\n\t\t\t\tparticle.dead = true;\r\n\t\t\telse if (particle.p.y - particle.radius > this.y + this.height)\r\n\t\t\t\tparticle.dead = true;\r\n\t\t}\r\n\r\n\t\telse if (this.crossType == \"bound\") {\r\n\t\t\tif (particle.p.x - particle.radius < this.x) {\r\n\t\t\t\tparticle.p.x = this.x + particle.radius;\r\n\t\t\t\tparticle.v.x *= -1;\r\n\t\t\t} else if (particle.p.x + particle.radius > this.x + this.width) {\r\n\t\t\t\tparticle.p.x = this.x + this.width - particle.radius;\r\n\t\t\t\tparticle.v.x *= -1;\r\n\t\t\t}\r\n\r\n\t\t\tif (particle.p.y - particle.radius < this.y) {\r\n\t\t\t\tparticle.p.y = this.y + particle.radius;\r\n\t\t\t\tparticle.v.y *= -1;\r\n\t\t\t} else if (particle.p.y + particle.radius > this.y + this.height) {\r\n\t\t\t\tparticle.p.y = this.y + this.height - particle.radius;\r\n\t\t\t\tparticle.v.y *= -1;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\telse if (this.crossType == \"cross\") {\r\n\t\t\tif (particle.p.x + particle.radius < this.x && particle.v.x <= 0)\r\n\t\t\t\tparticle.p.x = this.x + this.width + particle.radius;\r\n\t\t\telse if (particle.p.x - particle.radius > this.x + this.width && particle.v.x >= 0)\r\n\t\t\t\tparticle.p.x = this.x - particle.radius;\r\n\r\n\t\t\tif (particle.p.y + particle.radius < this.y && particle.v.y <= 0)\r\n\t\t\t\tparticle.p.y = this.y + this.height + particle.radius;\r\n\t\t\telse if (particle.p.y - particle.radius > this.y + this.height && particle.v.y >= 0)\r\n\t\t\t\tparticle.p.y = this.y - particle.radius;\r\n\t\t}\r\n\t}\r\n}","import Zone from './Zone';\r\nimport Util from '../utils/Util';\r\n\r\nexport default class ImageZone extends Zone {\r\n\r\n\tconstructor(imageData, x, y, d) {\r\n\t\tsuper();\r\n\r\n\t\tthis.reset(imageData, x, y, d);\r\n\t}\r\n\r\n\treset(imageData, x, y, d) {\r\n\t\tthis.imageData = imageData;\r\n\t\tthis.x = Util.initValue(x, 0);\r\n\t\tthis.y = Util.initValue(y, 0);\r\n\t\tthis.d = Util.initValue(d, 2);\r\n\r\n\t\tthis.vectors = [];\r\n\t\tthis.setVectors();\r\n\t}\r\n\r\n\tsetVectors() {\r\n\t\tlet i, j;\r\n\t\tconst length1 = this.imageData.width;\r\n\t\tconst length2 = this.imageData.height;\r\n\r\n\t\tfor (i = 0; i < length1; i += this.d) {\r\n\t\t\tfor (j = 0; j < length2; j += this.d) {\r\n\t\t\t\tlet index = ((j >> 0) * length1 + (i >> 0)) * 4;\r\n\r\n\t\t\t\tif (this.imageData.data[index + 3] > 0) {\r\n\t\t\t\t\tthis.vectors.push({ x: i + this.x, y: j + this.y });\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.vector;\r\n\t}\r\n\r\n\tgetBound(x, y) {\r\n\t\tvar index = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;\r\n\t\tif (this.imageData.data[index + 3] > 0)\r\n\t\t\treturn true;\r\n\t\telse\r\n\t\t\treturn false;\r\n\t}\r\n\r\n\tgetPosition() {\r\n\t\treturn this.vector.copy(this.vectors[Math.floor(Math.random() * this.vectors.length)]);\r\n\t}\r\n\r\n\tgetColor(x, y) {\r\n\t\tx -= this.x;\r\n\t\ty -= this.y;\r\n\t\tvar i = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;\r\n\r\n\t\treturn {\r\n\t\t\tr: this.imageData.data[i],\r\n\t\t\tg: this.imageData.data[i + 1],\r\n\t\t\tb: this.imageData.data[i + 2],\r\n\t\t\ta: this.imageData.data[i + 3]\r\n\t\t};\r\n\t}\r\n\r\n\tcrossing(particle) {\r\n\t\tif (this.crossType == \"dead\") {\r\n\t\t\tif (this.getBound(particle.p.x - this.x, particle.p.y - this.y))\r\n\t\t\t\tparticle.dead = true;\r\n\t\t\telse\r\n\t\t\t\tparticle.dead = false;\r\n\t\t} \r\n\t\t\r\n\t\telse if (this.crossType == \"bound\") {\r\n\t\t\tif (!this.getBound(particle.p.x - this.x, particle.p.y - this.y))\r\n\t\t\t\tparticle.v.negate();\r\n\t\t}\r\n\t}\r\n}","import Util from '../utils/Util';\r\nimport ColorUtil from '../utils/ColorUtil';\r\nimport MathUtils from '../math/MathUtils';\r\nimport CircleZone from '../zone/CircleZone';\r\nimport PointZone from '../zone/PointZone';\r\nimport LineZone from '../zone/LineZone';\r\nimport RectZone from '../zone/RectZone';\r\n\r\nexport default {\r\n\taddEventListener(proton, fun) {\r\n\t\tproton.addEventListener(\"PROTON_UPDATE_AFTER\", () => fun());\r\n\t},\r\n\r\n\tgetStyle(color) {\r\n\t\tconst rgb = ColorUtil.hexToRGB(color || '#ff0000');\r\n\t\treturn `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.5)`;\r\n\t},\r\n\t\r\n\tdrawZone(proton, canvas, zone, clear) {\r\n\t\tconst context = canvas.getContext('2d');\r\n\t\tconst style = this.getStyle();\r\n\r\n\t\tthis.addEventListener(proton, () => {\r\n\t\t\tif (clear)\r\n\t\t\t\tcontext.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n\t\t\tif (zone instanceof PointZone) {\r\n\t\t\t\tcontext.beginPath();\r\n\t\t\t\tcontext.fillStyle = style;\r\n\t\t\t\tcontext.arc(zone.x, zone.y, 10, 0, Math.PI * 2, true);\r\n\t\t\t\tcontext.fill();\r\n\t\t\t\tcontext.closePath();\r\n\t\t\t} else if (zone instanceof LineZone) {\r\n\t\t\t\tcontext.beginPath();\r\n\t\t\t\tcontext.strokeStyle = style;\r\n\t\t\t\tcontext.moveTo(zone.x1, zone.y1);\r\n\t\t\t\tcontext.lineTo(zone.x2, zone.y2);\r\n\t\t\t\tcontext.stroke();\r\n\t\t\t\tcontext.closePath();\r\n\t\t\t} else if (zone instanceof RectZone) {\r\n\t\t\t\tcontext.beginPath();\r\n\t\t\t\tcontext.strokeStyle = style;\r\n\t\t\t\tcontext.drawRect(zone.x, zone.y, zone.width, zone.height);\r\n\t\t\t\tcontext.stroke();\r\n\t\t\t\tcontext.closePath();\r\n\t\t\t} else if (zone instanceof CircleZone) {\r\n\t\t\t\tcontext.beginPath();\r\n\t\t\t\tcontext.strokeStyle = style;\r\n\t\t\t\tcontext.arc(zone.x, zone.y, zone.radius, 0, Math.PI * 2, true);\r\n\t\t\t\tcontext.stroke();\r\n\t\t\t\tcontext.closePath();\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\t\r\n\tdrawEmitter(proton, canvas, emitter, clear) {\r\n\t\tconst context = canvas.getContext('2d');\r\n\t\tconst style = this.getStyle();\r\n\r\n\t\tthis.addEventListener(proton, () => {\r\n\t\t\tif (clear) context.clearRect(0, 0, canvas.width, canvas.height);\r\n\t\t\t\r\n\t\t\tcontext.beginPath();\r\n\t\t\tcontext.fillStyle = style;\r\n\t\t\tcontext.arc(emitter.p.x, emitter.p.y, 10, 0, Math.PI * 2, true);\r\n\t\t\tcontext.fill();\r\n\t\t\tcontext.closePath();\r\n\t\t});\r\n\t},\r\n}\r\n\r\n","// http://paulirish.com/2011/requestanimationframe-for-smart-animating/\r\n// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating\r\n\r\n// requestAnimationFrame polyfill by Erik Möller\r\n// fixes from Paul Irish and Tino Zijdel\r\n( function() {\r\n\t\tvar lastTime = 0;\r\n\t\tvar vendors = ['ms', 'moz', 'webkit', 'o'];\r\n\t\tfor (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\r\n\t\t\twindow.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];\r\n\t\t\twindow.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\r\n\t\t}\r\n\r\n\t\tif (!window.requestAnimationFrame)\r\n\t\t\twindow.requestAnimationFrame = function(callback, element) {\r\n\t\t\t\tvar currTime = new Date().getTime();\r\n\t\t\t\tvar timeToCall = Math.max(0, 16 - (currTime - lastTime));\r\n\t\t\t\tvar id = window.setTimeout(function() {\r\n\t\t\t\t\tcallback(currTime + timeToCall);\r\n\t\t\t\t}, timeToCall);\r\n\t\t\t\tlastTime = currTime + timeToCall;\r\n\t\t\t\treturn id;\r\n\t\t\t};\r\n\r\n\t\tif (!window.cancelAnimationFrame)\r\n\t\t\twindow.cancelAnimationFrame = function(id) {\r\n\t\t\t\tclearTimeout(id);\r\n\t\t\t};\r\n\t}()); ","// import \r\nimport Proton from \"./core/Proton\";\r\nimport Particle from \"./core/Particle\";\r\nimport Pool from \"./core/Pool\";\r\n\r\nimport Util from \"./utils/Util\";\r\nimport ColorUtil from \"./utils/ColorUtil\";\r\nimport MathUtils from \"./math/MathUtils\";\r\nimport Vector2D from \"./math/Vector2D\";\r\nimport Polar2D from \"./math/Polar2D\";\r\nimport Mat3 from \"./math/Mat3\";\r\nimport Span from \"./math/Span\";\r\nimport ArraySpan from \"./math/ArraySpan\";\r\nimport Rectangle from \"./math/Rectangle\";\r\nimport ease from \"./math/ease\";\r\n\r\nimport Rate from \"./initialize/Rate\";\r\nimport Initialize from \"./initialize/Initialize\";\r\nimport Life from \"./initialize/Life\";\r\nimport Position from \"./initialize/Position\";\r\nimport Velocity from \"./initialize/Velocity\";\r\nimport Mass from \"./initialize/Mass\";\r\nimport Radius from \"./initialize/Radius\";\r\nimport Body from \"./initialize/Body\";\r\n\r\nimport Behaviour from \"./behaviour/Behaviour\";\r\nimport Force from \"./behaviour/Force\";\r\nimport Attraction from \"./behaviour/Attraction\";\r\nimport RandomDrift from \"./behaviour/RandomDrift\";\r\nimport Gravity from \"./behaviour/Gravity\";\r\nimport Collision from \"./behaviour/Collision\";\r\nimport CrossZone from \"./behaviour/CrossZone\";\r\nimport Alpha from \"./behaviour/Alpha\";\r\nimport Scale from \"./behaviour/Scale\";\r\nimport Rotate from \"./behaviour/Rotate\";\r\nimport Color from \"./behaviour/Color\";\r\nimport Repulsion from \"./behaviour/Repulsion\";\r\nimport GravityWell from \"./behaviour/GravityWell\";\r\n\r\nimport Emitter from \"./emitter/Emitter\";\r\nimport BehaviourEmitter from \"./emitter/BehaviourEmitter\";\r\nimport FollowEmitter from \"./emitter/FollowEmitter\";\r\n\r\nimport CanvasRenderer from \"./render/CanvasRenderer\";\r\nimport DomRenderer from \"./render/DomRenderer\";\r\nimport EaselRenderer from \"./render/EaselRenderer\";\r\nimport PixelRenderer from \"./render/PixelRenderer\";\r\nimport PixiRenderer from \"./render/PixiRenderer\";\r\nimport WebGLRenderer from \"./render/WebGLRenderer\";\r\nimport CustomRenderer from \"./render/CustomRenderer\";\r\n\r\nimport Zone from \"./zone/Zone\";\r\nimport LineZone from \"./zone/LineZone\";\r\nimport CircleZone from \"./zone/CircleZone\";\r\nimport PointZone from \"./zone/PointZone\";\r\nimport RectZone from \"./zone/RectZone\";\r\nimport ImageZone from \"./zone/ImageZone\";\r\n\r\nimport Debug from \"./debug/Debug\";\r\nimport \"./polyfill/requestAnimationFrame\";\r\n\r\n// namespace\r\nProton.Particle = Proton.P = Particle;\r\nProton.Pool = Pool;\r\n\r\nProton.Util = Util;\r\nProton.ColorUtil = ColorUtil;\r\nProton.MathUtils = MathUtils;\r\nProton.Vector2D = Proton.Vector = Vector2D;\r\nProton.Polar2D = Proton.Polar = Polar2D;\r\nProton.ArraySpan = ArraySpan;\r\nProton.Rectangle = Rectangle;\r\nProton.Rate = Rate;\r\nProton.ease = ease;\r\nProton.Span = Span;\r\nProton.Mat3 = Mat3;\r\nProton.getSpan = (a, b, center) => new Span(a, b, center);\r\nProton.createArraySpan = ArraySpan.createArraySpan;\r\n\r\nProton.Initialize = Proton.Init = Initialize;\r\nProton.Life = Proton.L = Life;\r\nProton.Position = Proton.P = Position;\r\nProton.Velocity = Proton.V = Velocity;\r\nProton.Mass = Proton.M = Mass;\r\nProton.Radius = Proton.R = Radius;\r\nProton.Body = Proton.B = Body;\r\n\r\nProton.Behaviour = Behaviour;\r\nProton.Force = Proton.F = Force;\r\nProton.Attraction = Proton.A = Attraction;\r\nProton.RandomDrift = Proton.RD = RandomDrift;\r\nProton.Gravity = Proton.G = Gravity;\r\nProton.Collision = Collision;\r\nProton.CrossZone = CrossZone;\r\nProton.Alpha = Proton.A = Alpha;\r\nProton.Scale = Proton.S = Scale;\r\nProton.Rotate = Rotate;\r\nProton.Color = Color;\r\nProton.Repulsion = Repulsion;\r\nProton.GravityWell = GravityWell;\r\n\r\nProton.Emitter = Emitter;\r\nProton.BehaviourEmitter = BehaviourEmitter;\r\nProton.FollowEmitter = FollowEmitter;\r\n\r\nProton.Zone = Zone;\r\nProton.LineZone = LineZone;\r\nProton.CircleZone = CircleZone;\r\nProton.PointZone = PointZone;\r\nProton.RectZone = RectZone;\r\nProton.ImageZone = ImageZone;\r\n\r\nProton.CanvasRenderer = CanvasRenderer;\r\nProton.DomRenderer = DomRenderer;\r\nProton.EaselRenderer = EaselRenderer;\r\nProton.PixiRenderer = PixiRenderer;\r\nProton.PixelRenderer = PixelRenderer;\r\nProton.WebGLRenderer = Proton.WebGlRenderer = WebGLRenderer;\r\nProton.CustomRenderer = CustomRenderer;\r\n\r\nProton.Debug = Debug;\r\n\r\nObject.assign(Proton, ease);\r\n\r\n// export\r\nexport default Proton;"],"names":["PI","MathUtils","a","b","INT","Math","random","floor","center","f","randomAToB","display","num","toString","slice","Vector2D","x","y","atan2","PI_2","v","w","undefined","addVectors","subVectors","s","set","multiplyScalar","sqrt","divideScalar","length","distanceToSquared","tha","cos","sin","dx","dy","alpha","Span","isArray","Util","initValue","randomFloating","i","tx","ty","angleInRadians","c","sx","sy","a00","a01","a02","a10","a11","a12","a20","a21","a22","b00","b01","b02","b10","b11","b12","b20","b21","b22","id","width","height","position","dom","document","createElement","style","opacity","transform","resize","marginLeft","marginTop","div","scale","rotate","willChange","css3","key","val","bkey","charAt","toUpperCase","substr","IMG_CACHE","CANVAS_CACHE","canvasID","context","image","rect","drawImage","imagedata","getImageData","clearRect","img","callback","param","src","Image","onload","e","target","WebGLUtil","nhpot","canvas","DomUtil","createCanvas","getContext","value","defaults","Object","prototype","call","array","obj","ignore","o","indexOf","constructor","args","concat","factoryFunction","bind","apply","pOBJ","hasProp","p","particle","copy","prototypeObject","filters","singleProp","hasOwnProperty","getSpanValue","pan","getValue","ImgUtil","arr","destroy","uid","getCacheID","cache","isInner","Pool","total","params","__puid","PUID","getID","pop","createOrClone","getCache","push","create","classApply","clone","count","Stats","proton","container","type","emitterIndex","rendererIndex","body","add","emitter","getEmitter","renderer","getRenderer","str","emitters","emitSpeed","getEmitterPos","initializes","concatArr","behaviours","name","getCreatedNumber","getCount","pool","innerHTML","cssText","join","addEventListener","bg","color","parentNode","appendChild","renderers","result","cpool","round","EventDispatcher","_listeners","listener","removeEventListener","splice","listeners","handler","TargetClass","dispatchEvent","hasEventListener","removeAllEventListeners","Integration","particles","time","damping","eulerIntegrate","sleep","old","mass","clear","Proton","integrationType","oldTime","elapsed","stats","EULER","integrator","render","init","index","remove","parent","EMITTER_ADDED","EMITTER_REMOVED","PROTON_UPDATE","USE_CLOCK","Date","getTime","amendChangeTabsBug","emittersUpdate","PROTON_UPDATE_AFTER","update","getAllParticles","MEASURE","RK2","PARTICLE_CREATED","PARTICLE_UPDATE","PARTICLE_SLEEP","PARTICLE_DEAD","pow","ease","easeLinear","Particle","ID","reset","setPrototypeByObject","N180_PI","life","Infinity","age","energy","dead","sprite","radius","rotation","easing","destroyObject","removeAllBehaviours","rgb","r","g","applyBehaviours","max","applyBehaviour","behaviour","parents","initialize","addBehaviour","destroyArray","h","hex16","substring","parseInt","rbg","Number","Polar2D","abs","getX","getY","mat3","mat","Float32Array","mat1","mat2","d","m","vec","ArraySpan","_arr","randomColor","Rectangle","bottom","right","Rate","numpan","timepan","numPan","setSpanValue","timePan","startTime","nextTime","Initialize","Life","lifePan","Zone","vector","crossType","alert","PointZone","Position","zone","getPosition","Velocity","rpan","thapan","rPan","thaPan","vr","polar2d","normalizeVelocity","PI_180","Mass","massPan","Radius","oldRadius","Body","imagetarget","inner","Behaviour","getEasing","force","removeBehaviour","Force","fx","fy","normalizeForce","calculate","Attraction","targetPosition","normalizeValue","radiusSq","attractionForce","lengthSq","sub","normalize","RandomDrift","driftX","driftY","delay","panFoce","addXY","Gravity","Collision","collisionPool","delta","newPool","otherParticle","overlap","totalMass","averageMass1","averageMass2","distance","CrossZone","crossing","Alpha","same","alphaA","alphaB","Scale","scaleA","scaleB","Rotate","influence","rotationA","rotationB","getDirection","Color","createArraySpan","colorA","ColorUtil","hexToRGB","colorB","Repulsion","GravityWell","centerPoint","distanceVec","distanceSq","factor","bindEmitter","setVector2DByObject","degreeTransform","Emitter","pObj","emitTime","totalTime","rate","stoped","isNaN","oldStoped","oldEmitTime","oldTotalTime","step","initAll","rest","initializer","arguments","emitting","integrate","dispatch","expire","event","bindEvent","createParticle","get","setupParticle","addBehaviours","stop","slow","removeAllInitializers","removeEmitter","BehaviourEmitter","selfBehaviours","FollowEmitter","mouseTarget","window","_allowEmitting","initEventHandler","mousemoveHandler","mousemove","mousedownHandler","mousedown","mouseupHandler","mouseup","layerX","layerY","offsetX","offsetY","babelHelpers.get","BaseRenderer","element","stroke","initHandler","circleConf","isCircle","thinkness","_protonUpdateHandler","onProtonUpdate","_protonUpdateAfterHandler","onProtonUpdateAfter","_emitterAddedHandler","onEmitterAdded","_emitterRemovedHandler","onEmitterRemoved","_particleCreatedHandler","onParticleCreated","_particleUpdateHandler","onParticleUpdate","_particleDeadHandler","onParticleDead","CanvasRenderer","bufferCache","getImgFromCache","addImg2Body","drawCircle","buffer","createBuffer","bufferContext","globalAlpha","globalCompositeOperation","fillStyle","rgbToHex","fillRect","save","translate","restore","beginPath","arc","strokeStyle","lineWidth","closePath","fill","size","DomRenderer","createBody","transform3d","bodyReady","backgroundColor","removeChild","babelHelpers.typeof","createCircle","createSprite","createDiv","borderRadius","borderColor","borderWidth","url","backgroundImage","EaselRenderer","addChild","scaleX","scaleY","graphics","regX","regY","createjs","Graphics","String","beginStroke","beginFill","shape","Shape","PixelRenderer","rectangle","imageData","createImageData","putImageData","setPixel","elementwidth","data","PixiRenderer","setColor","tint","getHex16FromParticle","PIXI","Sprite","fromImage","anchor","endFill","MStack","mats","Mat3","multiply","WebGLRenderer","gl","antialias","stencil","depth","initVar","setMaxRadius","initShaders","initBuffers","blendEquation","FUNC_ADD","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","enable","BLEND","umat","smat","mstack","viewport","circleCanvasURL","vsSource","fsSource","texturebuffers","A","B","fs","shader","createShader","FRAGMENT_SHADER","VERTEX_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","fragmentShader","getShader","getFragmentShader","vertexShader","getVertexShader","sprogram","createProgram","attachShader","linkProgram","getProgramParameter","LINK_STATUS","useProgram","vpa","getAttribLocation","tca","enableVertexAttribArray","tMatUniform","getUniformLocation","samplerUniform","useTex","uniform1i","vs","idx","unitIBuffer","bindBuffer","ELEMENT_ARRAY_BUFFER","bufferData","Uint16Array","STATIC_DRAW","ids","unitI33","stripBuffer","raidus","circleCanvasRadius","toDataURL","_w","_h","_width","_height","_scaleX","_scaleY","createTexture","texture","vcBuffer","tcBuffer","ARRAY_BUFFER","bindTexture","TEXTURE_2D","texImage2D","RGBA","UNSIGNED_BYTE","texParameteri","TEXTURE_MAG_FILTER","LINEAR","TEXTURE_MIN_FILTER","LINEAR_MIPMAP_NEAREST","generateMipmap","textureLoaded","textureWidth","textureHeight","tmat","imat","oldScale","getCanvasFromCache","drawImg2Canvas","updateMatrix","uniform3f","uniformMatrix3fv","top","vertexAttribPointer","FLOAT","drawElements","TRIANGLES","UNSIGNED_SHORT","moveOriginMatrix","makeTranslation","translationMatrix","angel","rotationMatrix","makeRotation","scaleMatrix","makeScale","matrix","matrixMultiply","inverse","CustomRenderer","LineZone","x1","y1","x2","y2","direction","minx","min","miny","maxx","maxy","dot","xxyy","gradient","getGradient","getLength","C","D","tha2","tha1","oldx","oldy","angle","rangeOut","getDistance","getSymmetric","error","CircleZone","PIx2","distanceTo","RectZone","ImageZone","vectors","setVectors","j","length1","length2","getBound","negate","fun","getStyle","moveTo","lineTo","drawRect","lastTime","vendors","requestAnimationFrame","cancelAnimationFrame","currTime","timeToCall","setTimeout","P","Vector","Polar","getSpan","Init","L","V","M","R","F","RD","G","S","WebGlRenderer","Debug","assign"],"mappings":"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"}
\ No newline at end of file
diff --git a/build/proton.min.js b/build/proton.min.js
index ea0c8ff..1664c3b 100644
--- a/build/proton.min.js
+++ b/build/proton.min.js
@@ -1,11 +1,11 @@
/*!
-* Proton v3.1.2
-* https://github.com/a-jie/Proton
+* Proton v7.1.5
+* https://github.com/drawcall/Proton
*
-* Copyright 2013-2018, A-JIE
+* Copyright 2013-2025, drawcall
* Licensed under the MIT license
* http://www.opensource.org/licenses/mit-license
*
*/
-!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.Proton=e()}(this,function(){"use strict";var e=3.1415926,h={PI:e,PIx2:2*e,PI_2:e/2,PI_180:e/180,N180_PI:180/e,randomAToB:function(t,e,i){return i?Math.floor(Math.random()*(e-t))+t:t+Math.random()*(e-t)},randomFloating:function(t,e,i){return this.randomAToB(t-e,t+e,i)},randomZone:function(t){},degreeTransform:function(t){return t*e/180},toColor16:function(t){return"#"+t.toString(16)},randomColor:function(){return"#"+("00000"+(16777216*Math.random()<<0).toString(16)).slice(-6)}},r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},l=function(){function r(t,e){for(var i=0;i>e;return t+1},p=function(t,e){return[1,0,0,0,1,0,t,e,1]},v=function(t){var e=Math.cos(t),i=Math.sin(t);return[e,-i,0,i,e,0,0,0,1]},g=function(t,e){return[t,0,0,0,e,0,0,0,1]},m=function(t,e){var i=t[0],r=t[1],n=t[2],a=t[3],s=t[4],o=t[5],h=t[6],l=t[7],u=t[8],c=e[0],f=e[1],d=e[2],y=e[3],p=e[4],v=e[5],g=e[6],m=e[7],b=e[8];return[i*c+r*y+n*g,i*f+r*p+n*m,i*d+r*v+n*b,a*c+s*y+o*g,a*f+s*p+o*m,a*d+s*v+o*b,h*c+l*y+u*g,h*f+l*p+u*m,h*d+l*v+u*b]},b={createCanvas:function(t,e,i,r){var n=document.createElement("canvas");return r=r||"absolute",n.id=t,n.width=e,n.height=i,n.style.opacity=0,n.style.position=r,this.transform(n,-500,-500,0,0),n},createDiv:function(t,e,i){var r=document.createElement("div");return r.id=t,r.style.position="absolute",this.resize(r,e,i),r},resize:function(t,e,i){t.style.width=e+"px",t.style.height=i+"px",t.style.marginLeft=-e/2+"px",t.style.marginTop=-i/2+"px"},transform:function(t,e,i,r,n){var a="translate("+e+"px, "+i+"px) scale("+r+") rotate("+n+"deg)";t.style.willChange="transform",this.css3(t,"transform",a)},transform3d:function(t,e,i,r,n){var a="translate3d("+e+"px, "+i+"px, 0) scale("+r+") rotate("+n+"deg)";t.style.willChange="transform",this.css3(t,"backfaceVisibility","hidden"),this.css3(t,"transform",a)},css3:function(t,e,i){var r=e.charAt(0).toUpperCase()+e.substr(1);t.style["Webkit"+r]=i,t.style["Moz"+r]=i,t.style["O"+r]=i,t.style["ms"+r]=i,t.style[""+e]=i}},a={},_={},s=function(t,e,i){t.drawImage(e,i.x,i.y);var r=t.getImageData(i.x,i.y,i.width,i.height);return t.clearRect(i.x,i.y,i.width,i.height),r},x=function(t,e,i){var r="string"==typeof t?t:t.src;if(a[r])e(a[r],i);else{var n=new Image;n.onload=function(t){a[r]=t.target,e(a[r],i)},n.src=r}},k=function(t,e,i){var r=t.src;if(!_[r]){var n=y(t.width),a=y(t.height),s=b.createCanvas("canvas_cache_0",n,a);s.getContext("2d").drawImage(t,0,0,t.width,t.height),_[r]=s}return e&&e(_[r],i),_[r]},P={initValue:function(t,e){return t=null!=t?t:e},isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},destroyArray:function(t){t&&(t.length=0)},destroyObject:function(t,e){for(var i in t)e&&-1",i&&(n+="em speed:"+i.emitSpeed+"
"),i&&(n+="pos:"+this.getEmitterPos(i));break;case 3:i&&(n+="initializes:"+i.initializes.length+"
"),i&&(n+=""+this.concatArr(i.initializes)+"
"),i&&(n+="behaviours:"+i.behaviours.length+"
"),i&&(n+=""+this.concatArr(i.behaviours)+"
");break;case 4:r&&(n+=r.name+"
"),r&&(n+="body:"+this.getCreatedNumber(r)+"
");break;default:n+="particles:"+this.proton.getCount()+"
",n+="pool:"+this.proton.pool.getCount()+"
",n+="total:"+this.proton.pool.total}this.container.innerHTML=n}},{key:"add",value:function(t,e){var i=this;if(!this.container){this.type=1,this.container=document.createElement("div"),this.container.style.cssText=["position:absolute;bottom:0px;left:0;cursor:pointer;","opacity:0.9;z-index:10000;padding:10px;font-size:12px;font-family:Helvetica,Arial,sans-serif;","width:120px;height:50px;background-color:#002;color:#0ff;"].join(""),this.container.addEventListener("click",function(t){i.type++,4=this.x&&e<=this.bottom&&e>=this.y}}]),n}(),V=function(){function i(t,e){o(this,i),this.numPan=P.setSpanValue(P.initValue(t,1)),this.timePan=P.setSpanValue(P.initValue(e,1)),this.startTime=0,this.nextTime=0,this.init()}return l(i,[{key:"init",value:function(){this.startTime=0,this.nextTime=this.timePan.getValue()}},{key:"getValue",value:function(t){return this.startTime+=t,this.startTime>=this.nextTime?(this.startTime=0,this.nextTime=this.timePan.getValue(),1==this.numPan.b?.5=this.life||this.dead)this.energy=0,this.dead=!0,this.destroy();else{var r=this.easing(t.age/t.life);this.energy=Math.max(1-r,0)}}},{key:"destroy",value:function(){for(var t=this.parents.length;t--;)this.parents[t].removeBehaviour(this);this.parents.length=0}}]),i}();G.id=0;var X=function(t){function a(t,e,i,r){o(this,a);var n=f(this,(a.__proto__||Object.getPrototypeOf(a)).call(this,i,r));return n.force=n.normalizeForce(new d(t,e)),n.name="Force",n}return c(a,G),l(a,[{key:"reset",value:function(t,e,i,r){this.force=this.normalizeForce(new d(t,e)),i&&u(a.prototype.__proto__||Object.getPrototypeOf(a.prototype),"reset",this).call(this,i,r)}},{key:"applyBehaviour",value:function(t,e,i){this.calculate(t,e,i),t.a.add(this.force)}}]),a}(),Y=function(t){function s(t,e,i,r,n){o(this,s);var a=f(this,(s.__proto__||Object.getPrototypeOf(s)).call(this,r,n));return a.targetPosition=P.initValue(t,new d),a.radius=P.initValue(i,1e3),a.force=P.initValue(a.normalizeValue(e),100),a.radiusSq=a.radius*a.radius,a.attractionForce=new d,a.lengthSq=0,a.name="Attraction",a}return c(s,G),l(s,[{key:"reset",value:function(t,e,i,r,n){this.targetPosition=P.initValue(t,new d),this.radius=P.initValue(i,1e3),this.force=P.initValue(this.normalizeValue(e),100),this.radiusSq=this.radius*this.radius,this.attractionForce=new d,this.lengthSq=0,r&&u(s.prototype.__proto__||Object.getPrototypeOf(s.prototype),"reset",this).call(this,r,n)}},{key:"applyBehaviour",value:function(t,e,i){this.calculate(t,e,i),this.attractionForce.copy(this.targetPosition),this.attractionForce.sub(t.p),this.lengthSq=this.attractionForce.lengthSq(),4e-6=this.delay&&(t.a.addXY(h.randomAToB(-this.panFoce.x,this.panFoce.x),h.randomAToB(-this.panFoce.y,this.panFoce.y)),this.time=0)}}]),s}(),Z=function(t){function n(t,e,i){o(this,n);var r=f(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,0,t,e,i));return r.name="Gravity",r}return c(n,X),l(n,[{key:"reset",value:function(t,e,i){u(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"reset",this).call(this,0,t,e,i)}}]),n}(),Q=function(t){function s(t,e,i,r,n){o(this,s);var a=f(this,(s.__proto__||Object.getPrototypeOf(s)).call(this,r,n));return a.reset(t,e,i),a.name="Collision",a}return c(s,G),l(s,[{key:"reset",value:function(t,e,i,r,n){this.emitter=P.initValue(t,null),this.mass=P.initValue(e,!0),this.callback=P.initValue(i,null),this.collisionPool=[],this.delta=new d,r&&u(s.prototype.__proto__||Object.getPrototypeOf(s.prototype),"reset",this).call(this,r,n)}},{key:"applyBehaviour",value:function(t,e,i){var r=this.emitter?this.emitter.particles.slice(i):this.pool.slice(i),n=r.length,a=void 0,s=void 0,o=void 0,h=void 0,l=void 0,u=void 0,c=void 0;for(c=0;c=this.life||this.dead)&&this.destroy(),this.emitting(t),this.integrate(t)}},{key:"integrate",value:function(t){if(this.parent){var e=1-this.damping;this.parent.integrator.calculate(this,t,e);var i=void 0,r=void 0;for(i=this.particles.length-1;0<=i;i--)(r=this.particles[i]).update(t,i),this.parent.integrator.calculate(r,t,e),this.dispatch("PARTICLE_UPDATE",r),r.dead&&(this.dispatch("PARTICLE_DEAD",r),this.parent.pool.expire(r),this.particles.splice(i,1))}}},{key:"dispatch",value:function(t,e){this.parent&&this.parent.dispatchEvent(t,e),this.bindEvent&&this.dispatchEvent(t,e)}},{key:"emitting",value:function(t){if("once"==this.totalTime){var e=void 0,i=this.rate.getValue(99999);for(0this.element.width||i<0||i>this.elementwidth)){var a=4*((i>>0)*t.width+(e>>0));t.data[a]=n.r,t.data[a+1]=n.g,t.data[a+2]=n.b,t.data[a+3]=255*r.alpha}}},{key:"onParticleDead",value:function(t){}}]),r}(),dt=function(t){function r(t,e){o(this,r);var i=f(this,(r.__proto__||Object.getPrototypeOf(r)).call(this,t));return i.stroke=e,i.setColor=!1,i.pool.create=function(t,e){return i.createBody(t,e)},i.name="PixiRenderer",i}return c(r,ht),l(r,[{key:"onProtonUpdate",value:function(){}},{key:"onParticleCreated",value:function(t){t.body?t.body=this.pool.get(t.body,t):t.body=this.pool.get(this.circleConf,t),this.element.addChild(t.body)}},{key:"onParticleUpdate",value:function(t){this.transform(t,t.body),this.setColor&&(t.body.tint=S.getHex16FromParticle(t))}},{key:"onParticleDead",value:function(t){this.element.removeChild(t.body),this.pool.expire(t.body),t.body=null}},{key:"destroy",value:function(t){u(r.prototype.__proto__||Object.getPrototypeOf(r.prototype),"destroy",this).call(this),this.pool.destroy();for(var e=t.length;e--;){var i=t[e];i.body&&this.element.removeChild(i.body)}}},{key:"transform",value:function(t,e){e.x=t.p.x,e.y=t.p.y,e.alpha=t.alpha,e.scale.x=t.scale,e.scale.y=t.scale,e.rotation=t.rotation*h.PI_180}},{key:"createBody",value:function(t,e){return t.isCircle?this.createCircle(e):this.createSprite(t)}},{key:"createSprite",value:function(t){var e=t.isInner?PIXI.Sprite.fromImage(t.src):new PIXI.Sprite(t);return e.anchor.x=.5,e.anchor.y=.5,e}},{key:"createCircle",value:function(t){var e=new PIXI.Graphics;if(this.stroke){this.stroke instanceof String&&this.stroke;e.beginStroke(this.stroke)}return e.beginFill(t.color||36077),e.drawCircle(0,0,t.radius),e.endFill(),e}}]),r}(),yt=function(){function e(){o(this,e),this.mats=[];for(var t=this.size=0;t<20;t++)this.mats.push(I.create([0,0,0,0,0,0,0,0,0]))}return l(e,[{key:"set",value:function(t,e){0==e?I.set(t,this.mats[0]):I.multiply(this.mats[e-1],t,this.mats[e]),this.size=Math.max(this.size,e+1)}},{key:"push",value:function(t){0==this.size?I.set(t,this.mats[0]):I.multiply(this.mats[this.size-1],t,this.mats[this.size]),this.size++}},{key:"pop",value:function(){0"),a}return c(s,U),l(s,[{key:"getPosition",value:function(){return this.random=Math.random(),this.vector.x=this.x1+this.random*this.length*Math.cos(this.gradient),this.vector.y=this.y1+this.random*this.length*Math.sin(this.gradient),this.vector}},{key:"getDirection",value:function(t,e){var i=this.dy,r=-this.dx;return 0<(i*t+r*e+this.dot)*(0==r?1:r)}},{key:"getDistance",value:function(t,e){return(this.dy*t+-this.dx*e+this.dot)/Math.sqrt(this.xxyy)}},{key:"getSymmetric",value:function(t){var e=t.getGradient(),i=2*(this.getGradient()-e),r=t.x,n=t.y;return t.x=r*Math.cos(i)-n*Math.sin(i),t.y=r*Math.sin(i)+n*Math.cos(i),t}},{key:"getGradient",value:function(){return Math.atan2(this.dy,this.dx)}},{key:"rangeOut",value:function(t){if(Math.abs(this.getGradient())<=h.PI/4){if(t.p.x<=this.maxx&&t.p.x>=this.minx)return!0}else if(t.p.y<=this.maxy&&t.p.y>=this.miny)return!0;return!1}},{key:"getLength",value:function(){return Math.sqrt(this.dx*this.dx+this.dy*this.dy)}},{key:"crossing",value:function(t){if("dead"==this.crossType)if(">"==this.direction||"R"==this.direction||"right"==this.direction||"down"==this.direction){if(!this.rangeOut(t))return;this.getDirection(t.p.x,t.p.y)&&(t.dead=!0)}else{if(!this.rangeOut(t))return;this.getDirection(t.p.x,t.p.y)||(t.dead=!0)}else if("bound"==this.crossType){if(!this.rangeOut(t))return;this.getDistance(t.p.x,t.p.y)<=t.radius&&(0==this.dx?t.v.x*=-1:0==this.dy?t.v.y*=-1:this.getSymmetric(t.v))}else"cross"==this.crossType&&this.alert&&(console.error("Sorry lineZone does not support cross method"),this.alert=!1)}}]),s}(),mt=function(t){function n(t,e,i){o(this,n);var r=f(this,(n.__proto__||Object.getPrototypeOf(n)).call(this));return r.x=t,r.y=e,r.radius=i,r.angle=0,r.center={x:t,y:e},r}return c(n,U),l(n,[{key:"getPosition",value:function(){return this.random=Math.random(),this.angle=h.PIx2*Math.random(),this.vector.x=this.x+this.random*this.radius*Math.cos(this.angle),this.vector.y=this.y+this.random*this.radius*Math.sin(this.angle),this.vector}},{key:"setCenter",value:function(t,e){this.center.x=t,this.center.y=e}},{key:"crossing",value:function(t){var e=t.p.distanceTo(this.center);"dead"==this.crossType?e-t.radius>this.radius&&(t.dead=!0):"bound"==this.crossType?e+t.radius>=this.radius&&this.getSymmetric(t):"cross"==this.crossType&&this.alert&&(alert("Sorry CircleZone does not support cross method"),this.alert=!1)}},{key:"getSymmetric",value:function(t){var e=t.v.getGradient(),i=2*(this.getGradient(t)-e),r=t.v.x,n=t.v.y;t.v.x=r*Math.cos(i)-n*Math.sin(i),t.v.y=r*Math.sin(i)+n*Math.cos(i)}},{key:"getGradient",value:function(t){return-h.PI_2+Math.atan2(t.p.y-this.center.y,t.p.x-this.center.x)}}]),n}(),bt=function(t){function a(t,e,i,r){o(this,a);var n=f(this,(a.__proto__||Object.getPrototypeOf(a)).call(this));return n.x=t,n.y=e,n.width=i,n.height=r,n}return c(a,U),l(a,[{key:"getPosition",value:function(){return this.vector.x=this.x+Math.random()*this.width,this.vector.y=this.y+Math.random()*this.height,this.vector}},{key:"crossing",value:function(t){"dead"==this.crossType?(t.p.x+t.radiusthis.x+this.width&&(t.dead=!0),t.p.y+t.radiusthis.y+this.height&&(t.dead=!0)):"bound"==this.crossType?(t.p.x-t.radiusthis.x+this.width&&(t.p.x=this.x+this.width-t.radius,t.v.x*=-1),t.p.y-t.radiusthis.y+this.height&&(t.p.y=this.y+this.height-t.radius,t.v.y*=-1)):"cross"==this.crossType&&(t.p.x+t.radiusthis.x+this.width&&0<=t.v.x&&(t.p.x=this.x-t.radius),t.p.y+t.radiusthis.y+this.height&&0<=t.v.y&&(t.p.y=this.y-t.radius))}}]),a}(),_t=function(t){function a(t,e,i,r){o(this,a);var n=f(this,(a.__proto__||Object.getPrototypeOf(a)).call(this));return n.reset(t,e,i,r),n}return c(a,U),l(a,[{key:"reset",value:function(t,e,i,r){this.imageData=t,this.x=P.initValue(e,0),this.y=P.initValue(i,0),this.d=P.initValue(r,2),this.vectors=[],this.setVectors()}},{key:"setVectors",value:function(){var t=void 0,e=void 0,i=this.imageData.width,r=this.imageData.height;for(t=0;t>0)*i+(t>>0));0>0)*this.imageData.width+(t>>0));return 0>0)*this.imageData.width+(t>>0));return{r:this.imageData.data[i],g:this.imageData.data[i+1],b:this.imageData.data[i+2],a:this.imageData.data[i+3]}}},{key:"crossing",value:function(t){"dead"==this.crossType?this.getBound(t.p.x-this.x,t.p.y-this.y)?t.dead=!0:t.dead=!1:"bound"==this.crossType&&(this.getBound(t.p.x-this.x,t.p.y-this.y)||t.v.negate())}}]),a}(),xt={addEventListener:function(t,e){t.addEventListener("PROTON_UPDATE_AFTER",function(){return e()})},getStyle:function(t){var e=S.hexToRGB(t||"#ff0000");return"rgba("+e.r+", "+e.g+", "+e.b+", 0.5)"},drawZone:function(t,e,i,r){var n=e.getContext("2d"),a=this.getStyle();this.addEventListener(t,function(){r&&n.clearRect(0,0,e.width,e.height),i instanceof F?(n.beginPath(),n.fillStyle=a,n.arc(i.x,i.y,10,0,2*Math.PI,!0),n.fill(),n.closePath()):i instanceof gt?(n.beginPath(),n.strokeStyle=a,n.moveTo(i.x1,i.y1),n.lineTo(i.x2,i.y2),n.stroke(),n.closePath()):i instanceof bt?(n.beginPath(),n.strokeStyle=a,n.drawRect(i.x,i.y,i.width,i.height),n.stroke(),n.closePath()):i instanceof mt&&(n.beginPath(),n.strokeStyle=a,n.arc(i.x,i.y,i.radius,0,2*Math.PI,!0),n.stroke(),n.closePath())})},drawEmitter:function(t,e,i,r){var n=e.getContext("2d"),a=this.getStyle();this.addEventListener(t,function(){r&&n.clearRect(0,0,e.width,e.height),n.beginPath(),n.fillStyle=a,n.arc(i.p.x,i.p.y,10,0,2*Math.PI,!0),n.fill(),n.closePath()})}};return function(){for(var a=0,t=["ms","moz","webkit","o"],e=0;e>e;return t+1},s=function(t,e){return[1,0,0,0,1,0,t,e,1]},o=function(t){var e=Math.cos(t),i=Math.sin(t);return[e,-i,0,i,e,0,0,0,1]},h=function(t,e){return[t,0,0,0,e,0,0,0,1]},l=function(t,e){var i=t[0],n=t[1],r=t[2],a=t[3],s=t[4],o=t[5],h=t[6],l=t[7],c=t[8],u=e[0],d=e[1],p=e[2],f=e[3],g=e[4],y=e[5],m=e[6],v=e[7],b=e[8];return[i*u+n*f+r*m,i*d+n*g+r*v,i*p+n*y+r*b,a*u+s*f+o*m,a*d+s*g+o*v,a*p+s*y+o*b,h*u+l*f+c*m,h*d+l*g+c*v,h*p+l*y+c*b]},c={createCanvas:function(t,e,i,n){void 0===n&&(n="absolute");var r=document.createElement("canvas");return r.id=t,r.width=e,r.height=i,r.style.opacity=0,r.style.position=n,this.transform(r,-500,-500,0,0),r},createDiv:function(t,e,i){var n=document.createElement("div");return n.id=t,n.style.position="absolute",this.resize(n,e,i),n},resize:function(t,e,i){t.style.width=e+"px",t.style.height=i+"px",t.style.marginLeft=-e/2+"px",t.style.marginTop=-i/2+"px"},transform:function(t,e,i,n,r){t.style.willChange="transform";var a="translate("+e+"px, "+i+"px) scale("+n+") rotate("+r+"deg)";this.css3(t,"transform",a)},transform3d:function(t,e,i,n,r){t.style.willChange="transform";var a="translate3d("+e+"px, "+i+"px, 0) scale("+n+") rotate("+r+"deg)";this.css3(t,"backfaceVisibility","hidden"),this.css3(t,"transform",a)},css3:function(t,e,i){var n=e.charAt(0).toUpperCase()+e.substr(1);t.style["Webkit"+n]=i,t.style["Moz"+n]=i,t.style["O"+n]=i,t.style["ms"+n]=i,t.style[""+e]=i}},u={},d={},p=0,f=function(t,e,i){t.drawImage(e,i.x,i.y);var n=t.getImageData(i.x,i.y,i.width,i.height);return t.clearRect(i.x,i.y,i.width,i.height),n},g=function(t,e,i){var n="string"==typeof t?t:t.src;if(u[n])e(u[n],i);else{var r=new Image;r.onload=function(t){u[n]=t.target,e(u[n],i)},r.src=n}},y=function(t,e,i){var n=t.src;if(!d[n]){var r=a(t.width),s=a(t.height),o=c.createCanvas("proton_canvas_cache_"+ ++p,r,s);o.getContext("2d").drawImage(t,0,0,t.width,t.height),d[n]=o}return e&&e(d[n],i),d[n]},m={initValue:function(t,e){return t=null!=t?t:e},isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyArray:function(t){t&&(t.length=0)},toArray:function(t){return this.isArray(t)?t:[t]},sliceArray:function(t,e,i){this.emptyArray(i);for(var n=e;n-1||delete t[i]},classApply:function(t,e){return void 0===e&&(e=null),e?new(t.bind.apply(t,[null].concat(e))):new t},getImageData:function(t,e,i){return f(t,e,i)},destroyAll:function(t,e){void 0===e&&(e=null);for(var i=t.length;i--;){try{t[i].destroy(e)}catch(t){}delete t[i]}t.length=0},assign:function(t,e){if("function"!=typeof Object.assign){for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t}return Object.assign(t,e)}},v={},b={_index:0,_cache:{},id:function(t){return void 0!==v[t]&&null!==v[t]||(v[t]=0),t+"_"+v[t]++},getId:function(t){var e=this.getIdFromCache(t);return e||(e="PUID_"+this._index++,this._cache[e]=t,e)},getIdFromCache:function(t){var e,i;for(i in this._cache){if((e=this._cache[i])===t)return i;if(this.isBody(e,t)&&e.src===t.src)return i}return null},isBody:function(t,e){return"object"==typeof t&&"object"==typeof e&&t.isInner&&e.isInner},getTarget:function(t){return this._cache[t]}},x=function(){function t(t){this.total=0,this.cache={}}var e=t.prototype;return e.get=function(t,e,i){var n;return i=i||t.__puid||b.getId(t),(n=this.cache[i]&&this.cache[i].length>0?this.cache[i].pop():this.createOrClone(t,e)).__puid=t.__puid||i,n},e.expire=function(t){return this.getCache(t.__puid).push(t)},e.createOrClone=function(t,e){return this.total++,this.create?this.create(t,e):"function"==typeof t?m.classApply(t,e):t.clone()},e.getCount=function(){var t=0;for(var e in this.cache)t+=this.cache[e].length;return t++},e.destroy=function(){for(var t in this.cache)this.cache[t].length=0,delete this.cache[t]},e.getCache=function(t){return void 0===t&&(t="default"),this.cache[t]||(this.cache[t]=[]),this.cache[t]},t}(),E=function(){function t(t){this.proton=t,this.container=null,this.type=1,this.emitterIndex=0,this.rendererIndex=0}var e=t.prototype;return e.update=function(t,e){this.add(t,e);var i=this.getEmitter(),n=this.getRenderer(),r="";switch(this.type){case 2:r+="emitter:"+this.proton.emitters.length+"
",i&&(r+="em speed:"+i.emitSpeed+"
"),i&&(r+="pos:"+this.getEmitterPos(i));break;case 3:i&&(r+="initializes:"+i.initializes.length+"
"),i&&(r+=''+this.concatArr(i.initializes)+"
"),i&&(r+="behaviours:"+i.behaviours.length+"
"),i&&(r+=''+this.concatArr(i.behaviours)+"
");break;case 4:n&&(r+=n.name+"
"),n&&(r+="body:"+this.getCreatedNumber(n)+"
");break;default:r+="particles:"+this.proton.getCount()+"
",r+="pool:"+this.proton.pool.getCount()+"
",r+="total:"+this.proton.pool.total}this.container.innerHTML=r},e.add=function(t,e){var i=this;if(!this.container){var n,r;switch(this.type=1,this.container=document.createElement("div"),this.container.style.cssText=["position:absolute;bottom:0px;left:0;cursor:pointer;","opacity:0.9;z-index:10000;padding:10px;font-size:12px;font-family:Helvetica,Arial,sans-serif;","width:120px;height:50px;background-color:#002;color:#0ff;"].join(""),this.container.addEventListener("click",(function(t){i.type++,i.type>4&&(i.type=1)}),!1),t){case 2:n="#201",r="#f08";break;case 3:n="#020",r="#0f0";break;default:n="#002",r="#0ff"}this.container.style["background-color"]=n,this.container.style.color=r}this.container.parentNode||(e=e||this.body||document.body).appendChild(this.container)},e.getEmitter=function(){return this.proton.emitters[this.emitterIndex]},e.getRenderer=function(){return this.proton.renderers[this.rendererIndex]},e.concatArr=function(t){var e="";if(!t||!t.length)return e;for(var i=0;i0&&this.emittersUpdate(this.elapsed),this.then=this.now):this.emittersUpdate(t.DEFAULT_INTERVAL),this.dispatchEvent(t.PROTON_UPDATE_AFTER)):(this.then||(this.then=(new Date).getTime()),this.now=(new Date).getTime(),this.elapsed=.001*(this.now-this.then),this.elapsed>this._interval&&(this.dispatchEvent(t.PROTON_UPDATE),this.emittersUpdate(this._interval),this.then=this.now-this.elapsed%this._interval*1e3,this.dispatchEvent(t.PROTON_UPDATE_AFTER)))},a.emittersUpdate=function(t){for(var e=this.emitters.length;e--;)this.emitters[e].update(t)},a.amendChangeTabsBug=function(){t.amendChangeTabsBug&&this.elapsed>.5&&(this.then=(new Date).getTime(),this.elapsed=0)},a.getCount=function(){for(var t=0,e=this.emitters.length;e--;)t+=this.emitters[e].particles.length;return t},a.getAllParticles=function(){for(var t=[],e=this.emitters.length;e--;)t=t.concat(this.emitters[e].particles);return t},a.destroyAllEmitters=function(){m.destroyAll(this.emitters)},a.destroy=function(t){var e=this;void 0===t&&(t=!1);var i=function(){e.time=0,e.then=0,e.pool.destroy(),e.stats.destroy(),m.destroyAll(e.emitters),m.destroyAll(e.renderers,e.getAllParticles()),e.integrator=null,e.renderers=null,e.emitters=null,e.stats=null,e.pool=null};t?setTimeout(i,200):i()},i=t,(n=[{key:"fps",get:function(){return this._fps},set:function(e){this._fps=e,this._interval="auto"===e?t.DEFAULT_INTERVAL:R.floor(1/e,7)}}])&&e(i.prototype,n),r&&e(i,r),Object.defineProperty(i,"prototype",{writable:!1}),i}();w.USE_CLOCK=!1,w.MEASURE=100,w.EULER="euler",w.RK2="runge-kutta2",w.PARTICLE_CREATED="PARTICLE_CREATED",w.PARTICLE_UPDATE="PARTICLE_UPDATE",w.PARTICLE_SLEEP="PARTICLE_SLEEP",w.PARTICLE_DEAD="PARTICLE_DEAD",w.EMITTER_ADDED="EMITTER_ADDED",w.EMITTER_REMOVED="EMITTER_REMOVED",w.PROTON_UPDATE="PROTON_UPDATE",w.PROTON_UPDATE_AFTER="PROTON_UPDATE_AFTER",w.DEFAULT_INTERVAL=.0167,w.amendChangeTabsBug=!0,P.bind(w);var C=function(){function t(t,e,i){void 0===t&&(t=255),void 0===e&&(e=255),void 0===i&&(i=255),this.r=t,this.g=e,this.b=i}return t.prototype.reset=function(){this.r=255,this.g=255,this.b=255},t}(),I=function(){function t(t,e,i){this.isArray=void 0,this.a=void 0,this.b=void 0,this.center=void 0,m.isArray(t)?(this.isArray=!0,this.a=t):(this.isArray=!1,this.a=m.initValue(t,1),this.b=m.initValue(e,this.a),this.center=m.initValue(i,!1))}return t.prototype.getValue=function(t){return void 0===t&&(t=!1),this.isArray?m.getRandFromArray(this.a):this.center?R.randomFloating(this.a,this.b,t):R.randomAToB(this.a,this.b,t)},t.setSpanValue=function(e,i,n){return e instanceof t?e:void 0===i?new t(e):void 0===n?new t(e,i):new t(e,i,n)},t.getSpanValue=function(e){return e instanceof t?e.getValue():e},t}(),S={hasProp:function(t,e){return!!t&&void 0!==t[e]},setProp:function(t,e){for(var i in e)t.hasOwnProperty(i)&&(t[i]=I.getSpanValue(e[i]));return t},setVectorVal:function(t,e){void 0===e&&(e=null),e&&(this.hasProp(e,"x")&&(t.p.x=e.x),this.hasProp(e,"y")&&(t.p.y=e.y),this.hasProp(e,"vx")&&(t.v.x=e.vx),this.hasProp(e,"vy")&&(t.v.y=e.vy),this.hasProp(e,"ax")&&(t.a.x=e.ax),this.hasProp(e,"ay")&&(t.a.y=e.ay),this.hasProp(e,"p")&&t.p.copy(e.p),this.hasProp(e,"v")&&t.v.copy(e.v),this.hasProp(e,"a")&&t.a.copy(e.a),this.hasProp(e,"position")&&t.p.copy(e.position),this.hasProp(e,"velocity")&&t.v.copy(e.velocity),this.hasProp(e,"accelerate")&&t.a.copy(e.accelerate))}},D={easeLinear:function(t){return t},easeInQuad:function(t){return Math.pow(t,2)},easeOutQuad:function(t){return-(Math.pow(t-1,2)-1)},easeInOutQuad:function(t){return(t/=.5)<1?.5*Math.pow(t,2):-.5*((t-=2)*t-2)},easeInCubic:function(t){return Math.pow(t,3)},easeOutCubic:function(t){return Math.pow(t-1,3)+1},easeInOutCubic:function(t){return(t/=.5)<1?.5*Math.pow(t,3):.5*(Math.pow(t-2,3)+2)},easeInQuart:function(t){return Math.pow(t,4)},easeOutQuart:function(t){return-(Math.pow(t-1,4)-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*Math.pow(t,4):-.5*((t-=2)*Math.pow(t,3)-2)},easeInSine:function(t){return 1-Math.cos(t*R.PI_2)},easeOutSine:function(t){return Math.sin(t*R.PI_2)},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t)-1)},easeInExpo:function(t){return 0===t?0:Math.pow(2,10*(t-1))},easeOutExpo:function(t){return 1===t?1:1-Math.pow(2,-10*t)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*--t))},easeInCirc:function(t){return-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-Math.pow(t-1,2))},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},getEasing:function(t){return"function"==typeof t?t:this[t]||this.easeLinear}},V=function(){function t(t,e){this.x=void 0,this.y=void 0,this.x=t||0,this.y=e||0}var e=t.prototype;return e.set=function(t,e){return this.x=t,this.y=e,this},e.setX=function(t){return this.x=t,this},e.setY=function(t){return this.y=t,this},e.getGradient=function(){return 0!==this.x?Math.atan2(this.y,this.x):this.y>0?R.PI_2:this.y<0?-R.PI_2:void 0},e.copy=function(t){return this.x=t.x,this.y=t.y,this},e.add=function(t,e){return void 0!==e?this.addVectors(t,e):(this.x+=t.x,this.y+=t.y,this)},e.addXY=function(t,e){return this.x+=t,this.y+=e,this},e.addVectors=function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this},e.sub=function(t,e){return void 0!==e?this.subVectors(t,e):(this.x-=t.x,this.y-=t.y,this)},e.subVectors=function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this},e.divideScalar=function(t){return 0!==t?(this.x/=t,this.y/=t):this.set(0,0),this},e.multiplyScalar=function(t){return this.x*=t,this.y*=t,this},e.negate=function(){return this.multiplyScalar(-1)},e.dot=function(t){return this.x*t.x+this.y*t.y},e.lengthSq=function(){return this.x*this.x+this.y*this.y},e.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y)},e.normalize=function(){return this.divideScalar(this.length())},e.distanceTo=function(t){return Math.sqrt(this.distanceToSquared(t))},e.rotate=function(t){var e=this.x,i=this.y;return this.x=e*Math.cos(t)+i*Math.sin(t),this.y=-e*Math.sin(t)+i*Math.cos(t),this},e.distanceToSquared=function(t){var e=this.x-t.x,i=this.y-t.y;return e*e+i*i},e.lerp=function(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this},e.equals=function(t){return t.x===this.x&&t.y===this.y},e.clear=function(){return this.x=0,this.y=0,this},e.clone=function(){return new t(this.x,this.y)},t}(),M=function(){function t(t){this.id="",this.old=null,this.data=null,this.behaviours=null,this.p=null,this.v=null,this.a=null,this.rgb=null,this.name="Particle",this.id=b.id(this.name),this.old={},this.data={},this.behaviours=[],this.p=new V,this.v=new V,this.a=new V,this.old.p=new V,this.old.v=new V,this.old.a=new V,this.rgb=new C,this.reset(),t&&S.setProp(this,t)}var e=t.prototype;return e.getDirection=function(){return Math.atan2(this.v.x,-this.v.y)*R.N180_PI},e.reset=function(){return this.life=1/0,this.age=0,this.dead=!1,this.sleep=!1,this.body=null,this.sprite=null,this.parent=null,this.energy=1,this.mass=1,this.radius=10,this.alpha=1,this.scale=1,this.rotation=0,this.color=null,this.p.set(0,0),this.v.set(0,0),this.a.set(0,0),this.old.p.set(0,0),this.old.v.set(0,0),this.old.a.set(0,0),this.easing=D.easeLinear,this.rgb.reset(),m.emptyObject(this.data),this.removeAllBehaviours(),this},e.update=function(t,e){if(this.sleep||(this.age+=t,this.applyBehaviours(t,e)),this.age-1&&(this.behaviours.splice(e,1).parents=null)},e.removeAllBehaviours=function(){m.emptyArray(this.behaviours)},e.destroy=function(){this.removeAllBehaviours(),this.energy=0,this.dead=!0,this.parent=null},t}(),B={hexToRgb:function(t){var e="#"===t.charAt(0)?t.substring(1,7):t;return{r:parseInt(e.substring(0,2),16),g:parseInt(e.substring(2,4),16),b:parseInt(e.substring(4,6),16)}},rgbToHex:function(t){return"rgb("+t.r+", "+t.g+", "+t.b+")"},getHex16FromParticle:function(t){return 65536*Number(t.rgb.r)+256*Number(t.rgb.g)+Number(t.rgb.b)}},L=function(){function t(t,e){this.r=Math.abs(t)||0,this.tha=e||0}var e=t.prototype;return e.set=function(t,e){return this.r=t,this.tha=e,this},e.setR=function(t){return this.r=t,this},e.setTha=function(t){return this.tha=t,this},e.copy=function(t){return this.r=t.r,this.tha=t.tha,this},e.toVector=function(){return new V(this.getX(),this.getY())},e.getX=function(){return this.r*Math.sin(this.tha)},e.getY=function(){return-this.r*Math.cos(this.tha)},e.normalize=function(){return this.r=1,this},e.equals=function(t){return t.r===this.r&&t.tha===this.tha},e.clear=function(){return this.r=0,this.tha=0,this},e.clone=function(){return new t(this.r,this.tha)},t}(),U={create:function(t){var e=new Float32Array(9);return t&&this.set(t,e),e},set:function(t,e){for(var i=0;i<9;i++)e[i]=t[i];return e},multiply:function(t,e,i){var n=t[0],r=t[1],a=t[2],s=t[3],o=t[4],h=t[6],l=t[7],c=e[0],u=e[1],d=e[2],p=e[3],f=e[4],g=e[6],y=e[7];return i[0]=c*n+u*s,i[1]=c*r+u*o,i[2]=a*d,i[3]=p*n+f*s,i[4]=p*r+f*o,i[6]=g*n+y*s+h,i[7]=g*r+y*o+l,i},inverse:function(t,e){var i,n=t[0],r=t[1],a=t[3],s=t[4],o=t[6],h=t[7],l=s,c=-a,u=h*a-s*o;return i=1/(n*l+r*c),e[0]=l*i,e[1]=-r*i,e[3]=c*i,e[4]=n*i,e[6]=u*i,e[7]=(-h*n+r*o)*i,e},multiplyVec2:function(t,e,i){var n=e[0],r=e[1];return i[0]=n*t[0]+r*t[3]+t[6],i[1]=n*t[1]+r*t[4]+t[7],i}},F=function(t){function e(e){var i;return(i=t.call(this)||this)._arr=m.toArray(e),i}return i(e,t),e.prototype.getValue=function(){var t=m.getRandFromArray(this._arr);return"random"===t||"Random"===t?R.randomColor():t},e.createArraySpan=function(t){return t?t instanceof e?t:new e(t):null},e}(I),O=function(){function t(t,e,i,n){this.x=t,this.y=e,this.width=i,this.height=n,this.bottom=this.y+this.height,this.right=this.x+this.width}return t.prototype.contains=function(t,e){return t<=this.right&&t>=this.x&&e<=this.bottom&&e>=this.y},t}(),z=function(){function t(t,e){this.numPan=void 0,this.timePan=void 0,this.startTime=void 0,this.nextTime=void 0,this.numPan=I.setSpanValue(m.initValue(t,1)),this.timePan=I.setSpanValue(m.initValue(e,1)),this.startTime=0,this.nextTime=0,this.init()}var e=t.prototype;return e.init=function(){this.startTime=0,this.nextTime=this.timePan.getValue()},e.getValue=function(t){return this.startTime+=t,this.startTime>=this.nextTime?(this.startTime=0,this.nextTime=this.timePan.getValue(),1===this.numPan.b?this.numPan.getValue(!1)>.5?1:0:this.numPan.getValue(!0)):0},t}(),k=function(){function t(){}var e=t.prototype;return e.reset=function(){},e.init=function(t,e){e?this.initialize(e):this.initialize(t)},e.initialize=function(t){},t}(),N=function(t){function e(e,i,n){var r;return(r=t.call(this)||this).lifePan=void 0,r.name=void 0,r.lifePan=I.setSpanValue(e,i,n),r.name="Life",r}return i(e,t),e.prototype.initialize=function(t){this.lifePan.a===1/0?t.life=1/0:t.life=this.lifePan.getValue()},e}(k),H=function(){function t(){this.vector=new V(0,0),this.random=0,this.crossType="dead",this.alert=!0}var e=t.prototype;return e.getPosition=function(){},e.crossing=function(t){},e.destroy=function(){this.vector=null},t}(),G=function(t){function e(e,i){var n;return(n=t.call(this)||this).x=e,n.y=i,n}i(e,t);var n=e.prototype;return n.getPosition=function(){return this.vector.x=this.x,this.vector.y=this.y,this.vector},n.crossing=function(t){this.alert&&(console.error("Sorry, PointZone does not support crossing method!"),this.alert=!1)},e}(H),q=function(t){function e(e){var i;return(i=t.call(this)||this).zone=void 0,i.name=void 0,i.zone=m.initValue(e,new G),i.name="Position",i}i(e,t);var n=e.prototype;return n.reset=function(t){this.zone=m.initValue(t,new G)},n.initialize=function(t){this.zone.getPosition(),t.p.x=this.zone.vector.x,t.p.y=this.zone.vector.y},e}(k),X=function(t){function e(e,i,n){var r;return(r=t.call(this)||this).rPan=void 0,r.thaPan=void 0,r.name=void 0,r.rPan=I.setSpanValue(e),r.thaPan=I.setSpanValue(i),r.type=m.initValue(n,"vector"),r.name="Velocity",r}i(e,t);var n=e.prototype;return n.reset=function(t,e,i){this.rPan=I.setSpanValue(t),this.thaPan=I.setSpanValue(e),this.type=m.initValue(i,"vector")},n.normalizeVelocity=function(t){return t*w.MEASURE},n.initialize=function(t){if("p"===this.type||"P"===this.type||"polar"===this.type){var e=new L(this.normalizeVelocity(this.rPan.getValue()),this.thaPan.getValue()*R.PI_180);t.v.x=e.getX(),t.v.y=e.getY()}else t.v.x=this.normalizeVelocity(this.rPan.getValue()),t.v.y=this.normalizeVelocity(this.thaPan.getValue())},e}(k),j=function(t){function e(e,i,n){var r;return(r=t.call(this)||this).massPan=void 0,r.name=void 0,r.massPan=I.setSpanValue(e,i,n),r.name="Mass",r}return i(e,t),e.prototype.initialize=function(t){t.mass=this.massPan.getValue()},e}(k),Y=function(t){function e(e,i,n){var r;return(r=t.call(this)||this).radius=void 0,r.name=void 0,r.radius=I.setSpanValue(e,i,n),r.name="Radius",r}i(e,t);var n=e.prototype;return n.reset=function(t,e,i){this.radius=I.setSpanValue(t,e,i)},n.initialize=function(t){t.radius=this.radius.getValue(),t.data.oldRadius=t.radius},e}(k),Z=function(t){function e(e,i,n){var r;return(r=t.call(this)||this).image=void 0,r.name=void 0,r.image=r.setSpanValue(e),r.w=m.initValue(i,20),r.h=m.initValue(n,r.w),r.name="Body",r}i(e,t);var n=e.prototype;return n.initialize=function(t){var e=this.image.getValue();t.body="string"==typeof e?{width:this.w,height:this.h,src:e,isInner:!0,inner:!0}:e},n.setSpanValue=function(t){return t instanceof F?t:new F(t)},e}(k),W=function(){function t(e,i){this.life=m.initValue(e,1/0),this.easing=D.getEasing(i),this.age=0,this.energy=1,this.dead=!1,this.parents=[],this.id="Behaviour_"+t.id++,this.name="Behaviour"}var e=t.prototype;return e.reset=function(t,e){this.life=m.initValue(t,1/0),this.easing=D.getEasing(e)},e.normalizeForce=function(t){return t.multiplyScalar(w.MEASURE)},e.normalizeValue=function(t){return t*w.MEASURE},e.initialize=function(t){},e.calculate=function(t,e,i){if(this.age+=e,this.age>=this.life||this.dead)this.energy=0,this.dead=!0,this.destroy();else{var n=this.easing(t.age/t.life);this.energy=Math.max(1-n,0)}},e.applyBehaviour=function(t,e,i){this.calculate(t,e,i)},e.destroy=function(){for(var t=this.parents.length;t--;)this.parents[t].removeBehaviour(this);this.parents.length=0},t}();W.id=0;var Q=function(t){function e(e,i,n,r){var a;return(a=t.call(this,n,r)||this).force=a.normalizeForce(new V(e,i)),a.name="Force",a}i(e,t);var n=e.prototype;return n.reset=function(e,i,n,r){this.force=this.normalizeForce(new V(e,i)),n&&t.prototype.reset.call(this,n,r)},n.applyBehaviour=function(t,e,i){this.calculate(t,e,i),t.a.add(this.force)},e}(W),K=function(t){function e(e,i,n,r,a){var s;return(s=t.call(this,r,a)||this).targetPosition=m.initValue(e,new V),s.radius=m.initValue(n,1e3),s.force=m.initValue(s.normalizeValue(i),100),s.radiusSq=s.radius*s.radius,s.attractionForce=new V,s.lengthSq=0,s.name="Attraction",s}i(e,t);var n=e.prototype;return n.reset=function(e,i,n,r,a){this.targetPosition=m.initValue(e,new V),this.radius=m.initValue(n,1e3),this.force=m.initValue(this.normalizeValue(i),100),this.radiusSq=this.radius*this.radius,this.attractionForce=new V,this.lengthSq=0,r&&t.prototype.reset.call(this,r,a)},n.applyBehaviour=function(t,e,i){this.calculate(t,e,i),this.attractionForce.copy(this.targetPosition),this.attractionForce.sub(t.p),this.lengthSq=this.attractionForce.lengthSq(),this.lengthSq>4e-5&&this.lengthSq=this.delay&&(t.a.addXY(R.randomAToB(-this.panFoce.x,this.panFoce.x),R.randomAToB(-this.panFoce.y,this.panFoce.y)),t.data.time=0)},e}(W),$=function(t){function e(e,i,n){var r;return(r=t.call(this,0,e,i,n)||this).name="Gravity",r}return i(e,t),e.prototype.reset=function(e,i,n){t.prototype.reset.call(this,0,e,i,n)},e}(Q),tt=function(t){function e(e,i,n,r,a){var s;return(s=t.call(this,r,a)||this).reset(e,i,n),s.newPool=[],s.pool=[],s.name="Collision",s}i(e,t);var n=e.prototype;return n.reset=function(e,i,n,r,a){this.emitter=m.initValue(e,null),this.mass=m.initValue(i,!0),this.callback=m.initValue(n,null),this.collisionPool=[],this.delta=new V,r&&t.prototype.reset.call(this,r,a)},n.applyBehaviour=function(t,e,i){this.emitter?m.sliceArray(this.emitter.particles,i,this.newPool):m.sliceArray(this.pool,i,this.newPool);var n,r,a,s,o,h,l,c=this.newPool.length;for(l=0;lr;)t-=r,this.update(r);this.stoped=e,this.emitTime=i+Math.max(t,0),this.totalTime=n},n.removeAllParticles=function(){for(var t=this.particles.length;t--;)this.particles[t].dead=!0},n.addSelfInitialize=function(t){t.init&&t.init(this)},n.addInitialize=function(){for(var t=arguments.length,e=new Array(t),i=0;i-1&&this.initializes.splice(e,1)},n.removeAllInitializers=function(){m.emptyArray(this.initializes)},n.addBehaviour=function(){for(var t=arguments.length,e=new Array(t),i=0;i=this.life||this.dead)&&this.destroy(),this.emitting(t),this.integrate(t)},n.integrate=function(t){if(this.parent){var e,i,n=1-this.damping;for(this.parent.integrator.calculate(this,t,n),e=this.particles.length-1;e>=0;e--)(i=this.particles[e]).update(t,e),this.parent.integrator.calculate(i,t,n),this.dispatch("PARTICLE_UPDATE",i),i.dead&&(this.dispatch("PARTICLE_DEAD",i),this.parent.pool.expire(i),this.particles.splice(e,1))}},n.dispatch=function(t,e){this.parent&&this.parent.dispatchEvent(t,e),this.bindEvent&&this.dispatchEvent(t,e)},n.emitting=function(t){if(!this.stoped)if("none"===this.totalTime)this.emitTime+=t;else if("once"===this.totalTime){var e,i=this.rate.getValue(99999);for(i>0&&(this.emitSpeed=i),e=0;e0&&(this.emitSpeed=r),n=0;n-1&&this.selfBehaviours.splice(e,1)},n.update=function(e){if(t.prototype.update.call(this,e),!this.sleep){var i,n=this.selfBehaviours.length;for(i=0;ithis.element.width||i<0||i>this.element.height)){var a=4*((i|0)*t.width+(e|0));t.data[a]=r.r,t.data[a+1]=r.g,t.data[a+2]=r.b,t.data[a+3]=255*n.alpha}},n.onParticleDead=function(t){},n.destroy=function(){t.prototype.destroy.call(this),this.stroke=null,this.context=null,this.imageData=null,this.rectangle=null},e}(mt),Pt=function(t){function e(e,i){var n;return(n=t.call(this,e)||this).stroke=i,n.color=!1,n.setColor=!1,n.blendMode=null,n.pool.create=function(t,e){return n.createBody(t,e)},n.setPIXI(window.PIXI),n.name="PixiRenderer",n}i(e,t);var n=e.prototype;return n.setPIXI=function(t){try{dt=t||{Sprite:{}},this.createFromImage=dt.Sprite.from||dt.Sprite.fromImage}catch(t){}},n.onProtonUpdate=function(){},n.onParticleCreated=function(t){t.body?t.body=this.pool.get(t.body,t):t.body=this.pool.get(this.circleConf,t),this.blendMode&&(t.body.blendMode=this.blendMode),this.element.addChild(t.body)},n.onParticleUpdate=function(t){this.transform(t,t.body),!0!==this.setColor&&!0!==this.color||(t.body.tint=B.getHex16FromParticle(t))},n.onParticleDead=function(t){this.element.removeChild(t.body),this.pool.expire(t.body),t.body=null},n.transform=function(t,e){e.x=t.p.x,e.y=t.p.y,e.alpha=t.alpha,e.scale.x=t.scale,e.scale.y=t.scale,e.rotation=t.rotation*R.PI_180},n.createBody=function(t,e){return t.isCircle?this.createCircle(e):this.createSprite(t)},n.createSprite=function(t){var e=t.isInner?this.createFromImage(t.src):new dt.Sprite(t);return e.anchor.x=.5,e.anchor.y=.5,e},n.createCircle=function(t){var e=new dt.Graphics;if(this.stroke){var i=yt(this.stroke)?this.stroke:0;e.beginStroke(i)}return e.beginFill(t.color||36077),e.drawCircle(0,0,t.radius),e.endFill(),e},n.destroy=function(e){t.prototype.destroy.call(this);for(var i=e.length;i--;){var n=e[i];n.body&&this.element.removeChild(n.body)}},e}(mt),At=function(){function t(){this.mats=[],this.size=0;for(var t=0;t<20;t++)this.mats.push(U.create([0,0,0,0,0,0,0,0,0]))}var e=t.prototype;return e.set=function(t,e){0===e?U.set(t,this.mats[0]):U.multiply(this.mats[e-1],t,this.mats[e]),this.size=Math.max(this.size,e+1)},e.push=function(t){0===this.size?U.set(t,this.mats[0]):U.multiply(this.mats[this.size-1],t,this.mats[this.size]),this.size++},e.pop=function(){this.size>0&&this.size--},e.top=function(){return this.mats[this.size-1]},t}(),Tt=function(t){function e(e){var i;return(i=t.call(this,e)||this).gl=i.element.getContext("experimental-webgl",{antialias:!0,stencil:!1,depth:!1}),i.gl||alert("Sorry your browser do not suppest WebGL!"),i.initVar(),i.setMaxRadius(),i.initShaders(),i.initBuffers(),i.gl.blendEquation(i.gl.FUNC_ADD),i.gl.blendFunc(i.gl.SRC_ALPHA,i.gl.ONE_MINUS_SRC_ALPHA),i.gl.enable(i.gl.BLEND),i.addImg2Body=i.addImg2Body.bind(i),i.name="WebGLRenderer",i}i(e,t);var n=e.prototype;return n.init=function(e){t.prototype.init.call(this,e),this.resize(this.element.width,this.element.height)},n.resize=function(t,e){this.umat[4]=-2,this.umat[7]=1,this.smat[0]=1/t,this.smat[4]=1/e,this.mstack.set(this.umat,0),this.mstack.set(this.smat,1),this.gl.viewport(0,0,t,e),this.element.width=t,this.element.height=e},n.setMaxRadius=function(t){this.circleCanvasURL=this.createCircle(t)},n.getVertexShader=function(){return["uniform vec2 viewport;","attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","uniform mat3 tMat;","varying vec2 vTextureCoord;","varying float alpha;","void main() {","vec3 v = tMat * vec3(aVertexPosition, 1.0);","gl_Position = vec4(v.x, v.y, 0, 1);","vTextureCoord = aTextureCoord;","alpha = tMat[0][2];","}"].join("\n")},n.getFragmentShader=function(){return["precision mediump float;","varying vec2 vTextureCoord;","varying float alpha;","uniform sampler2D uSampler;","uniform vec4 color;","uniform bool useTexture;","uniform vec3 uColor;","void main() {","vec4 textureColor = texture2D(uSampler, vTextureCoord);","gl_FragColor = textureColor * vec4(uColor, 1.0);","gl_FragColor.w *= alpha;","}"].join("\n")},n.initVar=function(){this.mstack=new At,this.umat=U.create([2,0,1,0,-2,0,-1,1,1]),this.smat=U.create([.01,0,1,0,.01,0,0,0,1]),this.texturebuffers={}},n.blendEquation=function(t){this.gl.blendEquation(this.gl[t])},n.blendFunc=function(t,e){this.gl.blendFunc(this.gl[t],this.gl[e])},n.getShader=function(t,e,i){var n=i?t.createShader(t.FRAGMENT_SHADER):t.createShader(t.VERTEX_SHADER);return t.shaderSource(n,e),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.initShaders=function(){var t=this.getShader(this.gl,this.getFragmentShader(),!0),e=this.getShader(this.gl,this.getVertexShader(),!1);this.sprogram=this.gl.createProgram(),this.gl.attachShader(this.sprogram,e),this.gl.attachShader(this.sprogram,t),this.gl.linkProgram(this.sprogram),this.gl.getProgramParameter(this.sprogram,this.gl.LINK_STATUS)||alert("Could not initialise shaders"),this.gl.useProgram(this.sprogram),this.sprogram.vpa=this.gl.getAttribLocation(this.sprogram,"aVertexPosition"),this.sprogram.tca=this.gl.getAttribLocation(this.sprogram,"aTextureCoord"),this.gl.enableVertexAttribArray(this.sprogram.tca),this.gl.enableVertexAttribArray(this.sprogram.vpa),this.sprogram.tMatUniform=this.gl.getUniformLocation(this.sprogram,"tMat"),this.sprogram.samplerUniform=this.gl.getUniformLocation(this.sprogram,"uSampler"),this.sprogram.useTex=this.gl.getUniformLocation(this.sprogram,"useTexture"),this.sprogram.color=this.gl.getUniformLocation(this.sprogram,"uColor"),this.gl.uniform1i(this.sprogram.useTex,1)},n.initBuffers=function(){var t,e;this.unitIBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitIBuffer),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,new Uint16Array([0,3,1,0,2,3]),this.gl.STATIC_DRAW);var i=[];for(e=0;e<100;e++)i.push(e);for(t=new Uint16Array(i),this.unitI33=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitI33),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,t,this.gl.STATIC_DRAW),i=[],e=0;e<100;e++)i.push(e,e+1,e+2);t=new Uint16Array(i),this.stripBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.stripBuffer),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,t,this.gl.STATIC_DRAW)},n.createCircle=function(t){this.circleCanvasRadius=a(m.initValue(t,32));var e=c.createCanvas("circle_canvas",2*this.circleCanvasRadius,2*this.circleCanvasRadius),i=e.getContext("2d");return i.beginPath(),i.arc(this.circleCanvasRadius,this.circleCanvasRadius,this.circleCanvasRadius,0,2*Math.PI,!0),i.closePath(),i.fillStyle="#FFF",i.fill(),e.toDataURL()},n.drawImg2Canvas=function(t){var e=t.body.width,i=t.body.height,n=a(t.body.width),r=a(t.body.height),s=t.body.width/n,o=t.body.height/r;this.texturebuffers[t.data.src]||(this.texturebuffers[t.data.src]=[this.gl.createTexture(),this.gl.createBuffer(),this.gl.createBuffer()]),t.data.texture=this.texturebuffers[t.data.src][0],t.data.vcBuffer=this.texturebuffers[t.data.src][1],t.data.tcBuffer=this.texturebuffers[t.data.src][2],this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.tcBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,0,s,0,0,o,o,o]),this.gl.STATIC_DRAW),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.vcBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,0,e,0,0,i,e,i]),this.gl.STATIC_DRAW);var h=t.data.canvas.getContext("2d").getImageData(0,0,n,r);this.gl.bindTexture(this.gl.TEXTURE_2D,t.data.texture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,h),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR_MIPMAP_NEAREST),this.gl.generateMipmap(this.gl.TEXTURE_2D),t.data.textureLoaded=!0,t.data.textureWidth=e,t.data.textureHeight=i},n.onProtonUpdate=function(){},n.onParticleCreated=function(t){t.data.textureLoaded=!1,t.data.tmat=U.create(),t.data.tmat[8]=1,t.data.imat=U.create(),t.data.imat[8]=1,t.body?g(t.body,this.addImg2Body,t):(g(this.circleCanvasURL,this.addImg2Body,t),t.data.oldScale=t.radius/this.circleCanvasRadius)},n.addImg2Body=function(t,e){e.dead||(e.body=t,e.data.src=t.src,e.data.canvas=y(t),e.data.oldScale=1,this.drawImg2Canvas(e))},n.onParticleUpdate=function(t){t.data.textureLoaded&&(this.updateMatrix(t),this.gl.uniform3f(this.sprogram.color,t.rgb.r/255,t.rgb.g/255,t.rgb.b/255),this.gl.uniformMatrix3fv(this.sprogram.tMatUniform,!1,this.mstack.top()),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.vcBuffer),this.gl.vertexAttribPointer(this.sprogram.vpa,2,this.gl.FLOAT,!1,0,0),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.tcBuffer),this.gl.vertexAttribPointer(this.sprogram.tca,2,this.gl.FLOAT,!1,0,0),this.gl.bindTexture(this.gl.TEXTURE_2D,t.data.texture),this.gl.uniform1i(this.sprogram.samplerUniform,0),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitIBuffer),this.gl.drawElements(this.gl.TRIANGLES,6,this.gl.UNSIGNED_SHORT,0),this.mstack.pop())},n.onParticleDead=function(t){},n.updateMatrix=function(t){var e=s(-t.data.textureWidth/2,-t.data.textureHeight/2),i=s(t.p.x,t.p.y),n=t.rotation*R.PI_180,r=o(n),a=t.scale*t.data.oldScale,c=h(a,a),u=l(e,c);u=l(u,r),u=l(u,i),U.inverse(u,t.data.imat),u[2]=t.alpha,this.mstack.push(u)},n.destroy=function(){t.prototype.destroy.call(this),this.gl=null,this.mstack=null,this.umat=null,this.smat=null,this.texturebuffers=null},e}(mt),Rt=function(t){function e(e){var i;return(i=t.call(this,e)||this).name="CustomRenderer",i}return i(e,t),e}(mt),_t=function(t){function e(e,i,n,r,a){var s;return void 0===a&&(a=">"),s=t.call(this)||this,n-e>=0?(s.x1=e,s.y1=i,s.x2=n,s.y2=r):(s.x1=n,s.y1=r,s.x2=e,s.y2=i),s.dx=s.x2-s.x1,s.dy=s.y2-s.y1,s.minx=Math.min(s.x1,s.x2),s.miny=Math.min(s.y1,s.y2),s.maxx=Math.max(s.x1,s.x2),s.maxy=Math.max(s.y1,s.y2),s.dot=s.x2*s.y1-s.x1*s.y2,s.xxyy=s.dx*s.dx+s.dy*s.dy,s.gradient=s.getGradient(),s.length=s.getLength(),s.direction=m.initValue(a,">"),s}i(e,t);var n=e.prototype;return n.getPosition=function(){return this.random=Math.random(),this.vector.x=this.x1+this.random*this.length*Math.cos(this.gradient),this.vector.y=this.y1+this.random*this.length*Math.sin(this.gradient),this.vector},n.getDirection=function(t,e){var i=this.dy,n=-this.dx;return(i*t+n*e+this.dot)*(0===n?1:n)>0},n.getDistance=function(t,e){return(this.dy*t+-this.dx*e+this.dot)/Math.sqrt(this.xxyy)},n.getSymmetric=function(t){var e=t.getGradient(),i=2*(this.getGradient()-e),n=t.x,r=t.y;return t.x=n*Math.cos(i)-r*Math.sin(i),t.y=n*Math.sin(i)+r*Math.cos(i),t},n.getGradient=function(){return Math.atan2(this.dy,this.dx)},n.rangeOut=function(t){if(Math.abs(this.getGradient())<=R.PI/4){if(t.p.x<=this.maxx&&t.p.x>=this.minx)return!0}else if(t.p.y<=this.maxy&&t.p.y>=this.miny)return!0;return!1},n.getLength=function(){return Math.sqrt(this.dx*this.dx+this.dy*this.dy)},n.crossing=function(t){if("dead"===this.crossType)if(">"===this.direction||"R"===this.direction||"right"===this.direction||"down"===this.direction){if(!this.rangeOut(t))return;this.getDirection(t.p.x,t.p.y)&&(t.dead=!0)}else{if(!this.rangeOut(t))return;this.getDirection(t.p.x,t.p.y)||(t.dead=!0)}else if("bound"===this.crossType){if(!this.rangeOut(t))return;this.getDistance(t.p.x,t.p.y)<=t.radius&&(0===this.dx?t.v.x*=-1:0===this.dy?t.v.y*=-1:this.getSymmetric(t.v))}else"cross"===this.crossType&&this.alert&&(console.error("Sorry, LineZone does not support cross method!"),this.alert=!1)},e}(H),wt=function(t){function e(e,i,n){var r;return(r=t.call(this)||this).x=e,r.y=i,r.radius=n,r.angle=0,r.center={x:e,y:i},r}i(e,t);var n=e.prototype;return n.getPosition=function(){return this.angle=R.PIx2*Math.random(),this.randomRadius=Math.random()*this.radius,this.vector.x=this.x+this.randomRadius*Math.cos(this.angle),this.vector.y=this.y+this.randomRadius*Math.sin(this.angle),this.vector},n.setCenter=function(t,e){this.center.x=t,this.center.y=e},n.crossing=function(t){var e=t.p.distanceTo(this.center);"dead"===this.crossType?e-t.radius>this.radius&&(t.dead=!0):"bound"===this.crossType?e+t.radius>=this.radius&&this.getSymmetric(t):"cross"===this.crossType&&this.alert&&(console.error("Sorry, CircleZone does not support cross method!"),this.alert=!1)},n.getSymmetric=function(t){var e=t.v.getGradient(),i=2*(this.getGradient(t)-e),n=t.v.x,r=t.v.y;t.v.x=n*Math.cos(i)-r*Math.sin(i),t.v.y=n*Math.sin(i)+r*Math.cos(i)},n.getGradient=function(t){return-R.PI_2+Math.atan2(t.p.y-this.center.y,t.p.x-this.center.x)},e}(H),Ct=function(t){function e(e,i,n,r){var a;return void 0===n&&(n=200),void 0===r&&(r=200),(a=t.call(this)||this).x=e,a.y=i,a.width=n,a.height=r,a}i(e,t);var n=e.prototype;return n.getPosition=function(){return this.vector.x=this.x+Math.random()*this.width,this.vector.y=this.y+Math.random()*this.height,this.vector},n.crossing=function(t){"dead"===this.crossType?((t.p.x+t.radiusthis.x+this.width)&&(t.dead=!0),(t.p.y+t.radiusthis.y+this.height)&&(t.dead=!0)):"bound"===this.crossType?(t.p.x-t.radiusthis.x+this.width&&(t.p.x=this.x+this.width-t.radius,t.v.x*=-1),t.p.y-t.radiusthis.y+this.height&&(t.p.y=this.y+this.height-t.radius,t.v.y*=-1)):"cross"===this.crossType&&(t.p.x+t.radiusthis.x+this.width&&t.v.x>=0&&(t.p.x=this.x-t.radius),t.p.y+t.radiusthis.y+this.height&&t.v.y>=0&&(t.p.y=this.y-t.radius))},e}(H),It=function(t){function e(e,i,n,r){var a;return(a=t.call(this)||this).reset(e,i,n,r),a}i(e,t);var n=e.prototype;return n.reset=function(t,e,i,n){this.imageData=t,this.x=m.initValue(e,0),this.y=m.initValue(i,0),this.d=m.initValue(n,2),this.vectors=[],this.setVectors()},n.setVectors=function(){var t,e,i=this.imageData.width,n=this.imageData.height;for(t=0;t0&&this.vectors.push({x:t+this.x,y:e+this.y})}return this.vector},n.getBound=function(t,e){var i=4*((e|0)*this.imageData.width+(t|0));return this.imageData.data[i+3]>0},n.getPosition=function(){var t=m.getRandFromArray(this.vectors);return this.vector.copy(t)},n.getColor=function(t,e){t-=this.x;var i=4*(((e-=this.y)|0)*this.imageData.width+(t|0));return{r:this.imageData.data[i],g:this.imageData.data[i+1],b:this.imageData.data[i+2],a:this.imageData.data[i+3]}},n.crossing=function(t){"dead"===this.crossType?t.dead=this.getBound(t.p.x-this.x,t.p.y-this.y):"bound"===this.crossType&&(this.getBound(t.p.x-this.x,t.p.y-this.y)||t.v.negate())},n.destroy=function(){t.prototype.destroy.call(this),this.imageData=null},e}(H),St={addEventListener:function(t,e){t.addEventListener("PROTON_UPDATE_AFTER",(function(){return e()}))},getStyle:function(t){void 0===t&&(t="#ff0000");var e=B.hexToRgb(t);return"rgba("+e.r+", "+e.g+", "+e.b+", 0.5)"},drawZone:function(t,e,i,n){var r=e.getContext("2d"),a=this.getStyle();this.addEventListener(t,(function(){n&&r.clearRect(0,0,e.width,e.height),i instanceof G?(r.beginPath(),r.fillStyle=a,r.arc(i.x,i.y,10,0,2*Math.PI,!0),r.fill(),r.closePath()):i instanceof _t?(r.beginPath(),r.strokeStyle=a,r.moveTo(i.x1,i.y1),r.lineTo(i.x2,i.y2),r.stroke(),r.closePath()):i instanceof Ct?(r.beginPath(),r.strokeStyle=a,r.drawRect(i.x,i.y,i.width,i.height),r.stroke(),r.closePath()):i instanceof wt&&(r.beginPath(),r.strokeStyle=a,r.arc(i.x,i.y,i.radius,0,2*Math.PI,!0),r.stroke(),r.closePath())}))},drawEmitter:function(t,e,i,n){var r=e.getContext("2d"),a=this.getStyle();this.addEventListener(t,(function(){n&&r.clearRect(0,0,e.width,e.height),r.beginPath(),r.fillStyle=a,r.arc(i.p.x,i.p.y,10,0,2*Math.PI,!0),r.fill(),r.closePath()}))}};w.Particle=M,w.Pool=x,w.Util=m,w.ColorUtil=B,w.MathUtil=R,w.Vector2D=w.Vector=V,w.Polar2D=w.Polar=L,w.ArraySpan=F,w.Rectangle=O,w.Rate=z,w.ease=D,w.Span=I,w.Mat3=U,w.getSpan=function(t,e,i){return new I(t,e,i)},w.createArraySpan=F.createArraySpan,w.Initialize=w.Init=k,w.Life=w.L=N,w.Position=w.P=q,w.Velocity=w.V=X,w.Mass=w.M=j,w.Radius=w.R=Y,w.Body=w.B=Z,w.Behaviour=W,w.Force=w.F=Q,w.Attraction=w.A=K,w.RandomDrift=w.RD=J,w.Gravity=w.G=$,w.Collision=tt,w.CrossZone=et,w.Alpha=it,w.Scale=w.S=nt,w.Rotate=rt,w.Color=at,w.Repulsion=ht,w.Cyclone=ot,w.GravityWell=lt,w.Emitter=ut,w.BehaviourEmitter=pt,w.FollowEmitter=ft,w.Zone=H,w.LineZone=_t,w.CircleZone=wt,w.PointZone=G,w.RectZone=Ct,w.ImageZone=It,w.CanvasRenderer=vt,w.DomRenderer=bt,w.EaselRenderer=xt,w.PixiRenderer=Pt,w.PixelRenderer=Et,w.WebGLRenderer=w.WebGlRenderer=Tt,w.CustomRenderer=Rt,w.Debug=St,m.assign(w,D),t.Alpha=it,t.ArraySpan=F,t.Attraction=K,t.Behaviour=W,t.BehaviourEmitter=pt,t.Body=Z,t.CanvasRenderer=vt,t.CircleZone=wt,t.Collision=tt,t.Color=at,t.ColorUtil=B,t.CrossZone=et,t.CustomRenderer=Rt,t.Cyclone=ot,t.Debug=St,t.DomRenderer=bt,t.EaselRenderer=xt,t.Emitter=ut,t.FollowEmitter=ft,t.Force=Q,t.Gravity=$,t.GravityWell=lt,t.ImageZone=It,t.Initialize=k,t.Life=N,t.LineZone=_t,t.Mass=j,t.Mat3=U,t.MathUtil=R,t.Particle=M,t.PixelRenderer=Et,t.PixiRenderer=Pt,t.PointZone=G,t.Polar2D=L,t.Pool=x,t.Position=q,t.Radius=Y,t.RandomDrift=J,t.Rate=z,t.RectZone=Ct,t.Rectangle=O,t.Repulsion=ht,t.Rotate=rt,t.Scale=nt,t.Span=I,t.Util=m,t.Vector2D=V,t.Velocity=X,t.WebGLRenderer=Tt,t.Zone=H,t.default=w,t.ease=D,Object.defineProperty(t,"__esModule",{value:!0})}));
//# sourceMappingURL=proton.min.js.map
diff --git a/build/proton.min.js.map b/build/proton.min.js.map
index cb8f89e..a780768 100644
--- a/build/proton.min.js.map
+++ b/build/proton.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"proton.min.js","sources":["../src/math/MathUtils.js","../src/math/Vector2D.js","../src/math/Span.js","../src/utils/WebGLUtil.js","../src/utils/DomUtil.js","../src/utils/ImgUtil.js","../src/utils/Util.js","../src/utils/PUID.js","../src/core/Pool.js","../src/debug/Stats.js","../src/events/EventDispatcher.js","../src/math/Integration.js","../src/core/Proton.js","../src/math/ease.js","../src/core/Particle.js","../src/utils/ColorUtil.js","../src/math/Polar2D.js","../src/math/Mat3.js","../src/math/ArraySpan.js","../src/math/Rectangle.js","../src/initialize/Rate.js","../src/initialize/Initialize.js","../src/initialize/Life.js","../src/zone/Zone.js","../src/zone/PointZone.js","../src/initialize/Position.js","../src/initialize/Velocity.js","../src/initialize/Mass.js","../src/initialize/Radius.js","../src/initialize/Body.js","../src/behaviour/Behaviour.js","../src/behaviour/Force.js","../src/behaviour/Attraction.js","../src/behaviour/RandomDrift.js","../src/behaviour/Gravity.js","../src/behaviour/Collision.js","../src/behaviour/CrossZone.js","../src/behaviour/Alpha.js","../src/behaviour/Scale.js","../src/behaviour/Rotate.js","../src/behaviour/Color.js","../src/behaviour/Repulsion.js","../src/behaviour/GravityWell.js","../src/initialize/InitializeUtil.js","../src/emitter/Emitter.js","../src/emitter/BehaviourEmitter.js","../src/emitter/FollowEmitter.js","../src/render/BaseRenderer.js","../src/render/CanvasRenderer.js","../src/render/DomRenderer.js","../src/render/EaselRenderer.js","../src/render/PixelRenderer.js","../src/render/PixiRenderer.js","../src/utils/MStack.js","../src/render/WebGLRenderer.js","../src/render/CustomRenderer.js","../src/zone/LineZone.js","../src/zone/CircleZone.js","../src/zone/RectZone.js","../src/zone/ImageZone.js","../src/debug/Debug.js","../src/polyfill/requestAnimationFrame.js","../src/index.js"],"sourcesContent":["const PI = 3.1415926;\r\n\r\nconst MathUtils = {\r\n\r\n PI: PI,\r\n PIx2: PI * 2,\r\n PI_2: PI / 2,\r\n PI_180: PI / 180,\r\n N180_PI: 180 / PI,\r\n\r\n randomAToB(a, b, INT) {\r\n if (!INT)\r\n return a + Math.random() * (b - a);\r\n else\r\n return Math.floor(Math.random() * (b - a)) + a;\r\n },\r\n\r\n randomFloating(center, f, INT) {\r\n return this.randomAToB(center - f, center + f, INT);\r\n },\r\n\r\n randomZone(display) {},\r\n\r\n degreeTransform(a) {\r\n return a * PI / 180;\r\n },\r\n\r\n toColor16(num) {\r\n return \"#\" + num.toString(16);\r\n },\r\n\r\n randomColor() {\r\n return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).slice(-6);\r\n }\r\n}\r\n\r\nexport default MathUtils;","import MathUtils from '../math/MathUtils';\r\n\r\nexport default class Vector2D {\r\n\r\n constructor(x, y) {\r\n this.x = x || 0;\r\n this.y = y || 0;\r\n }\r\n\r\n set(x, y) {\r\n this.x = x;\r\n this.y = y;\r\n return this;\r\n }\r\n\r\n setX(x) {\r\n this.x = x;\r\n return this;\r\n }\r\n\r\n setY(y) {\r\n this.y = y;\r\n return this;\r\n }\r\n\r\n getGradient() {\r\n if (this.x != 0)\r\n return Math.atan2(this.y, this.x);\r\n else if (this.y > 0)\r\n return MathUtils.PI_2;\r\n else if (this.y < 0)\r\n return -MathUtils.PI_2;\r\n }\r\n\r\n copy(v) {\r\n this.x = v.x;\r\n this.y = v.y;\r\n\r\n return this;\r\n }\r\n\r\n add(v, w) {\r\n if (w !== undefined) {\r\n return this.addVectors(v, w);\r\n }\r\n\r\n this.x += v.x;\r\n this.y += v.y;\r\n\r\n return this;\r\n }\r\n\r\n addXY(a, b) {\r\n this.x += a;\r\n this.y += b;\r\n\r\n return this;\r\n }\r\n\r\n addVectors(a, b) {\r\n this.x = a.x + b.x;\r\n this.y = a.y + b.y;\r\n\r\n return this;\r\n }\r\n\r\n sub(v, w) {\r\n if (w !== undefined) {\r\n return this.subVectors(v, w);\r\n }\r\n\r\n this.x -= v.x;\r\n this.y -= v.y;\r\n\r\n return this;\r\n }\r\n\r\n subVectors(a, b) {\r\n this.x = a.x - b.x;\r\n this.y = a.y - b.y;\r\n\r\n return this;\r\n }\r\n\r\n divideScalar(s) {\r\n if (s !== 0) {\r\n this.x /= s;\r\n this.y /= s;\r\n } else {\r\n this.set(0, 0);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n multiplyScalar(s) {\r\n this.x *= s;\r\n this.y *= s;\r\n\r\n return this;\r\n }\r\n\r\n negate() {\r\n return this.multiplyScalar(-1);\r\n }\r\n\r\n dot(v) {\r\n return this.x * v.x + this.y * v.y;\r\n }\r\n\r\n lengthSq() {\r\n return this.x * this.x + this.y * this.y;\r\n }\r\n\r\n length() {\r\n return Math.sqrt(this.x * this.x + this.y * this.y);\r\n }\r\n\r\n normalize() {\r\n return this.divideScalar(this.length());\r\n }\r\n\r\n distanceTo(v) {\r\n return Math.sqrt(this.distanceToSquared(v));\r\n }\r\n\r\n rotate(tha) {\r\n const x = this.x;\r\n const y = this.y;\r\n\r\n this.x = x * Math.cos(tha) + y * Math.sin(tha);\r\n this.y = -x * Math.sin(tha) + y * Math.cos(tha);\r\n\r\n return this;\r\n }\r\n\r\n distanceToSquared(v) {\r\n const dx = this.x - v.x;\r\n const dy = this.y - v.y;\r\n\r\n return dx * dx + dy * dy;\r\n }\r\n\r\n lerp(v, alpha) {\r\n this.x += (v.x - this.x) * alpha;\r\n this.y += (v.y - this.y) * alpha;\r\n\r\n return this;\r\n }\r\n\r\n equals(v) {\r\n return ((v.x === this.x) && (v.y === this.y));\r\n }\r\n\r\n clear() {\r\n this.x = 0.0;\r\n this.y = 0.0;\r\n return this;\r\n }\r\n\r\n clone() {\r\n return new Vector2D(this.x, this.y);\r\n }\r\n}","import Util from '../utils/Util';\r\nimport MathUtils from '../math/MathUtils';\r\n\r\nexport default class Span {\r\n\r\n\tconstructor(a, b, center) {\r\n\t\tthis.isArray = false;\r\n\r\n\t\tif (Util.isArray(a)) {\r\n\t\t\tthis.isArray = true;\r\n\t\t\tthis.a = a;\r\n\t\t} else {\r\n\t\t\tthis.a = Util.initValue(a, 1);\r\n\t\t\tthis.b = Util.initValue(b, this.a);\r\n\t\t\tthis.center = Util.initValue(center, false);\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tgetValue(INT) {\r\n\t\tif (this.isArray) {\r\n\t\t\treturn this.a[Math.floor(this.a.length * Math.random())];\r\n\t\t} else {\r\n\t\t\tif (!this.center)\r\n\t\t\t\treturn MathUtils.randomAToB(this.a, this.b, INT);\r\n\t\t\telse\r\n\t\t\t\treturn MathUtils.randomFloating(this.a, this.b, INT);\r\n\t\t}\r\n\t}\r\n}","export default {\r\n\r\n /**\r\n * @memberof Proton#Proton.WebGLUtil\r\n * @method ipot\r\n *\r\n * @todo add description\r\n * @todo add length description\r\n *\r\n * @param {Number} length\r\n *\r\n * @return {Boolean}\r\n */\r\n ipot(length) {\r\n return (length & (length - 1)) == 0;\r\n },\r\n\r\n /**\r\n * @memberof Proton#Proton.WebGLUtil\r\n * @method nhpot\r\n *\r\n * @todo add description\r\n * @todo add length description\r\n *\r\n * @param {Number} length\r\n *\r\n * @return {Number}\r\n */\r\n nhpot(length) {\r\n --length;\r\n for (let i = 1; i < 32; i <<= 1) {\r\n length = length | length >> i;\r\n }\r\n\r\n return length + 1;\r\n },\r\n\r\n /**\r\n * @memberof Proton#Proton.WebGLUtil\r\n * @method makeTranslation\r\n *\r\n * @todo add description\r\n * @todo add tx, ty description\r\n * @todo add return description\r\n *\r\n * @param {Number} tx either 0 or 1\r\n * @param {Number} ty either 0 or 1\r\n *\r\n * @return {Object}\r\n */\r\n makeTranslation(tx, ty) {\r\n return [1, 0, 0, 0, 1, 0, tx, ty, 1];\r\n },\r\n\r\n /**\r\n * @memberof Proton#Proton.WebGLUtil\r\n * @method makeRotation\r\n *\r\n * @todo add description\r\n * @todo add return description\r\n *\r\n * @param {Number} angleInRadians\r\n *\r\n * @return {Object}\r\n */\r\n makeRotation(angleInRadians) {\r\n let c = Math.cos(angleInRadians);\r\n let s = Math.sin(angleInRadians);\r\n\r\n return [c, -s, 0, s, c, 0, 0, 0, 1];\r\n },\r\n\r\n /**\r\n * @memberof Proton#Proton.WebGLUtil\r\n * @method makeScale\r\n *\r\n * @todo add description\r\n * @todo add tx, ty description\r\n * @todo add return description\r\n *\r\n * @param {Number} sx either 0 or 1\r\n * @param {Number} sy either 0 or 1\r\n *\r\n * @return {Object}\r\n */\r\n makeScale(sx, sy) {\r\n return [sx, 0, 0, 0, sy, 0, 0, 0, 1];\r\n },\r\n\r\n /**\r\n * @memberof Proton#Proton.WebGLUtil\r\n * @method matrixMultiply\r\n *\r\n * @todo add description\r\n * @todo add a, b description\r\n * @todo add return description\r\n *\r\n * @param {Object} a\r\n * @param {Object} b\r\n *\r\n * @return {Object}\r\n */\r\n matrixMultiply(a, b) {\r\n let a00 = a[0 * 3 + 0];\r\n let a01 = a[0 * 3 + 1];\r\n let a02 = a[0 * 3 + 2];\r\n let a10 = a[1 * 3 + 0];\r\n let a11 = a[1 * 3 + 1];\r\n let a12 = a[1 * 3 + 2];\r\n let a20 = a[2 * 3 + 0];\r\n let a21 = a[2 * 3 + 1];\r\n let a22 = a[2 * 3 + 2];\r\n let b00 = b[0 * 3 + 0];\r\n let b01 = b[0 * 3 + 1];\r\n let b02 = b[0 * 3 + 2];\r\n let b10 = b[1 * 3 + 0];\r\n let b11 = b[1 * 3 + 1];\r\n let b12 = b[1 * 3 + 2];\r\n let b20 = b[2 * 3 + 0];\r\n let b21 = b[2 * 3 + 1];\r\n let b22 = b[2 * 3 + 2];\r\n\r\n return [\r\n a00 * b00 + a01 * b10 + a02 * b20,\r\n a00 * b01 + a01 * b11 + a02 * b21,\r\n a00 * b02 + a01 * b12 + a02 * b22,\r\n a10 * b00 + a11 * b10 + a12 * b20,\r\n a10 * b01 + a11 * b11 + a12 * b21,\r\n a10 * b02 + a11 * b12 + a12 * b22,\r\n a20 * b00 + a21 * b10 + a22 * b20,\r\n a20 * b01 + a21 * b11 + a22 * b21,\r\n a20 * b02 + a21 * b12 + a22 * b22\r\n ];\r\n }\r\n}","export default {\r\n\r\n /**\r\n * Creates and returns a new canvas. The opacity is by default set to 0\r\n *\r\n * @memberof Proton#Proton.DomUtil\r\n * @method createCanvas\r\n *\r\n * @param {String} $id the canvas' id\r\n * @param {Number} $width the canvas' width\r\n * @param {Number} $height the canvas' height\r\n * @param {String} [$position=absolute] the canvas' position, default is 'absolute' \r\n *\r\n * @return {Object}\r\n */\r\n createCanvas(id, width, height, position) {\r\n const dom = document.createElement(\"canvas\");\r\n position = position || 'absolute';\r\n\r\n dom.id = id;\r\n dom.width = width;\r\n dom.height = height;\r\n dom.style.opacity = 0;\r\n dom.style.position = position;\r\n\r\n this.transform(dom, -500, -500, 0, 0);\r\n\r\n return dom;\r\n },\r\n\r\n createDiv(id, width, height) {\r\n const dom = document.createElement(\"div\");\r\n\r\n dom.id = id;\r\n dom.style.position = 'absolute';\r\n this.resize(dom, width, height);\r\n\r\n return dom;\r\n },\r\n\r\n resize(dom, width, height) {\r\n dom.style.width = width + 'px';\r\n dom.style.height = height + 'px';\r\n dom.style.marginLeft = -width / 2 + 'px';\r\n dom.style.marginTop = -height / 2 + 'px';\r\n },\r\n\r\n /**\r\n * Adds a transform: translate(), scale(), rotate() to a given div dom for all browsers\r\n *\r\n * @memberof Proton#Proton.DomUtil\r\n * @method transform\r\n *\r\n * @param {HTMLDivElement} div \r\n * @param {Number} $x \r\n * @param {Number} $y \r\n * @param {Number} $scale \r\n * @param {Number} $rotate \r\n */\r\n transform(div, x, y, scale, rotate) {\r\n const transform = `translate(${x}px, ${y}px) scale(${scale}) rotate(${rotate}deg)`;\r\n\r\n div.style.willChange = 'transform';\r\n this.css3(div, 'transform', transform);\r\n },\r\n\r\n transform3d(div, x, y, scale, rotate) {\r\n const transform = `translate3d(${x}px, ${y}px, 0) scale(${scale}) rotate(${rotate}deg)`;\r\n\r\n div.style.willChange = 'transform';\r\n this.css3(div, 'backfaceVisibility', 'hidden');\r\n this.css3(div, 'transform', transform);\r\n },\r\n\r\n css3(div, key, val) {\r\n const bkey = key.charAt(0).toUpperCase() + key.substr(1);\r\n\r\n div.style[`Webkit${bkey}`] = val;\r\n div.style[`Moz${bkey}`] = val;\r\n div.style[`O${bkey}`] = val;\r\n div.style[`ms${bkey}`] = val;\r\n div.style[`${key}`] = val;\r\n }\r\n}","import WebGLUtil from './WebGLUtil';\r\nimport DomUtil from './DomUtil';\r\n\r\nconst IMG_CACHE = {};\r\nconst CANVAS_CACHE = {};\r\nlet canvasID = 0;\r\n\r\nexport default {\r\n\r\n /**\r\n * This will get the image data. It could be necessary to create a Proton.Zone.\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method getImageData\r\n *\r\n * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'\r\n * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');\r\n * @param {Proton.Rectangle} rect\r\n */\r\n getImageData(context, image, rect) {\r\n context.drawImage(image, rect.x, rect.y);\r\n const imagedata = context.getImageData(rect.x, rect.y, rect.width, rect.height);\r\n context.clearRect(rect.x, rect.y, rect.width, rect.height);\r\n\r\n return imagedata;\r\n },\r\n\r\n /**\r\n * @memberof Proton#Proton.Util\r\n * @method getImgFromCache\r\n *\r\n * @todo add description\r\n * @todo describe func\r\n *\r\n * @param {Mixed} img\r\n * @param {Proton.Particle} particle\r\n * @param {Boolean} drawCanvas set to true if a canvas should be saved into particle.transform.canvas\r\n * @param {Boolean} func\r\n */\r\n getImgFromCache(img, callback, param) {\r\n const src = typeof (img) == 'string' ? img : img.src;\r\n\r\n if (IMG_CACHE[src]) {\r\n callback(IMG_CACHE[src], param);\r\n } else {\r\n const image = new Image();\r\n image.onload = e => {\r\n IMG_CACHE[src] = e.target;\r\n callback(IMG_CACHE[src], param);\r\n }\r\n\r\n image.src = src;\r\n }\r\n },\r\n\r\n getCanvasFromCache(img, callback, param) {\r\n const src = img.src;\r\n\r\n if (!CANVAS_CACHE[src]) {\r\n const width = WebGLUtil.nhpot(img.width);\r\n const height = WebGLUtil.nhpot(img.height);\r\n\r\n const canvas = DomUtil.createCanvas(`canvas_cache_${canvasID}`, width, height);\r\n const context = canvas.getContext('2d');\r\n context.drawImage(img, 0, 0, img.width, img.height);\r\n\r\n CANVAS_CACHE[src] = canvas;\r\n }\r\n\r\n callback && callback(CANVAS_CACHE[src], param);\r\n\r\n return CANVAS_CACHE[src];\r\n }\r\n}","import Vector2D from '../math/Vector2D';\r\nimport Span from '../math/Span';\r\nimport ImgUtil from './ImgUtil';\r\nimport DomUtil from './DomUtil';\r\n\r\nexport default {\r\n\r\n /**\r\n * Returns the default if the value is null or undefined\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method initValue\r\n *\r\n * @param {Mixed} value a specific value, could be everything but null or undefined\r\n * @param {Mixed} defaults the default if the value is null or undefined\r\n */\r\n initValue(value, defaults) {\r\n value = (value !== null && value !== undefined) ? value : defaults;\r\n return value;\r\n },\r\n\r\n /**\r\n * Checks if the value is a valid array\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method isArray\r\n *\r\n * @param {Array} value Any array\r\n *\r\n * @returns {Boolean} \r\n */\r\n isArray(value) {\r\n return Object.prototype.toString.call(value) === '[object Array]';\r\n },\r\n\r\n /**\r\n * Destroyes the given array\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method destroyArray\r\n *\r\n * @param {Array} array Any array\r\n */\r\n destroyArray(array) {\r\n if (array) array.length = 0;\r\n },\r\n\r\n /**\r\n * Destroyes the given object\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method destroyObject\r\n *\r\n * @param {Object} obj Any object\r\n */\r\n destroyObject(obj, ignore) {\r\n for (let o in obj) {\r\n if (ignore && ignore.indexOf(o) > -1) continue;\r\n delete obj[o];\r\n }\r\n },\r\n\r\n /**\r\n * Makes an instance of a class and binds the given array\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method classApply\r\n *\r\n * @param {Function} constructor A class to make an instance from\r\n * @param {Array} [args] Any array to bind it to the constructor\r\n *\r\n * @return {Object} The instance of constructor, optionally bind with args\r\n */\r\n classApply(constructor, args) {\r\n if (!args) return new constructor;\r\n\r\n args = [null].concat(args);\r\n const factoryFunction = constructor.bind.apply(constructor, args);\r\n return new factoryFunction();\r\n },\r\n\r\n /**\r\n * @memberof Proton#Proton.Util\r\n * @method setVector2DByObject\r\n *\r\n * @todo add description for param `target`\r\n * @todo add description for param `pOBJ`\r\n * @todo add description for function\r\n *\r\n * @param {Object} target\r\n * @param {Object} pOBJ\r\n */\r\n setVector2DByObject(target, pOBJ) {\r\n if (this.hasProp(pOBJ, 'x')) target.p.x = pOBJ['x'];\r\n if (this.hasProp(pOBJ, 'y')) target.p.y = pOBJ['y'];\r\n\r\n if (this.hasProp(pOBJ, 'vx')) target.v.x = pOBJ['vx'];\r\n if (this.hasProp(pOBJ, 'vy')) target.v.y = pOBJ['vy'];\r\n\r\n if (this.hasProp(pOBJ, 'ax')) target.a.x = pOBJ['ax'];\r\n if (this.hasProp(pOBJ, 'ay')) target.a.y = pOBJ['ay'];\r\n\r\n if (this.hasProp(pOBJ, 'p')) particle.p.copy(pOBJ['p']);\r\n if (this.hasProp(pOBJ, 'v')) particle.v.copy(pOBJ['v']);\r\n if (this.hasProp(pOBJ, 'a')) particle.a.copy(pOBJ['a']);\r\n\r\n if (this.hasProp(pOBJ, 'position')) particle.p.copy(pOBJ['position']);\r\n if (this.hasProp(pOBJ, 'velocity')) particle.v.copy(pOBJ['velocity']);\r\n if (this.hasProp(pOBJ, 'accelerate')) particle.a.copy(pOBJ['accelerate']);\r\n },\r\n\r\n hasProp(obj, key) {\r\n if (!obj) return false;\r\n return obj[key] !== undefined;\r\n // return obj.hasOwnProperty(key);\r\n },\r\n\r\n /**\r\n * set the prototype in a given prototypeObject\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method setPrototypeByObject\r\n *\r\n * @todo add description for param `target`\r\n * @todo add description for param `filters`\r\n * @todo translate desription from chinese to english\r\n *\r\n * @param {Object} target\r\n * @param {Object} prototypeObject An object of single prototypes\r\n * @param {Object} filters\r\n *\r\n * @return {Object} target\r\n */\r\n setPrototypeByObject(target, prototypeObject, filters) {\r\n for (let singleProp in prototypeObject) {\r\n if (target.hasOwnProperty(singleProp)) {\r\n if (filters) {\r\n if (filters.indexOf(singleProp) < 0)\r\n target[singleProp] = this.getSpanValue(prototypeObject[singleProp]);\r\n } else {\r\n target[singleProp] = this.getSpanValue(prototypeObject[singleProp]);\r\n }\r\n }\r\n }\r\n\r\n return target;\r\n },\r\n\r\n /**\r\n * Returns a new Span object\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method setSpanValue\r\n *\r\n * @todo a, b and c should be 'Mixed' or 'Number'?\r\n *\r\n * @param {Mixed | Span} a\r\n * @param {Mixed} b\r\n * @param {Mixed} c\r\n *\r\n * @return {Span}\r\n */\r\n setSpanValue(a, b, c) {\r\n if (a instanceof Span) {\r\n return a;\r\n } else {\r\n if (!b) {\r\n return new Span(a);\r\n } else {\r\n if (!c)\r\n return new Span(a, b);\r\n else\r\n return new Span(a, b, c);\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * Returns the value from a Span, if the param is not a Span it will return the given parameter\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method getSpanValue\r\n *\r\n * @param {Mixed | Span} pan\r\n *\r\n * @return {Mixed} the value of Span OR the parameter if it is not a Span\r\n */\r\n getSpanValue(pan) {\r\n return pan instanceof Span ? pan.getValue() : pan;\r\n },\r\n\r\n /**\r\n * This will get the image data. It could be necessary to create a Proton.Zone.\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method getImageData\r\n *\r\n * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'\r\n * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');\r\n * @param {Proton.Rectangle} rect\r\n */\r\n getImageData(context, image, rect) {\r\n return ImgUtil.getImageData(context, image, rect);\r\n },\r\n\r\n destroy(arr, param) {\r\n let i = arr.length;\r\n\r\n while (i--) {\r\n try { arr[i].destroy(param); } catch (e) { }\r\n delete arr[i];\r\n }\r\n\r\n arr.length = 0;\r\n }\r\n\r\n}","export default {\r\n id: 0,\r\n cache: {},\r\n\r\n getID(target) {\r\n let uid = this.getCacheID(target);\r\n if (uid) return uid;\r\n\r\n uid = `PUID_${this.id++}`;\r\n this.cache[uid] = target;\r\n\r\n return uid;\r\n },\r\n\r\n getCacheID(target) {\r\n let obj;\r\n for (let id in this.cache) {\r\n obj = this.cache[id];\r\n\r\n if (obj === target) return id;\r\n \r\n if (typeof obj === 'object' && typeof target === 'object' && obj.isInner && target.isInner) {\r\n if (obj.src === target.src)\r\n return id;\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n getTarget(uid) {\r\n return this.cache[uid];\r\n }\r\n}","/**\r\n * get -> PUID :: uid-> Body\r\n * -> cache[abc]. -> cache[abc] .pop()\r\n * -> create [new Body| clone]\r\n * -> return p1: { __pid: abc }\r\n * \r\n * expire -> cache[abc]= [p0, p1];\r\n * \r\n */\r\nimport Util from '../utils/Util';\r\nimport PUID from '../utils/PUID';\r\n\r\nexport default class Pool {\r\n\r\n /**\r\n * @memberof! Proton#\r\n * @constructor\r\n * @alias Proton.Pool\r\n *\r\n * @todo add description\r\n * @todo add description of properties\r\n *\r\n * @property {Number} total\r\n * @property {Object} cache\r\n */\r\n constructor(num) {\r\n this.total = 0;\r\n this.cache = {};\r\n }\r\n\r\n /**\r\n * @todo add description\r\n *\r\n * @method get\r\n * @memberof Proton#Proton.Pool\r\n *\r\n * @param {Object|Function} target\r\n * @param {Object} [params] just add if `target` is a function\r\n *\r\n * @return {Object}\r\n */\r\n get(target, params, uid) {\r\n let p;\r\n uid = uid || target.__puid || PUID.getID(target);\r\n\r\n if (this.cache[uid] && this.cache[uid].length > 0)\r\n p = this.cache[uid].pop();\r\n else\r\n p = this.createOrClone(target, params);\r\n\r\n p.__puid = target.__puid || uid;\r\n return p;\r\n }\r\n\r\n /**\r\n * @todo add description\r\n *\r\n * @method set\r\n * @memberof Proton#Proton.Pool\r\n *\r\n * @param {Object} target\r\n *\r\n * @return {Object}\r\n */\r\n expire(target) {\r\n return this.getCache(target.__puid).push(target);\r\n }\r\n\r\n /**\r\n * Creates a new class instance\r\n *\r\n * @todo add more documentation \r\n *\r\n * @method create\r\n * @memberof Proton#Proton.Pool\r\n *\r\n * @param {Object|Function} target any Object or Function\r\n * @param {Object} [params] just add if `target` is a function\r\n *\r\n * @return {Object}\r\n */\r\n createOrClone(target, params) {\r\n this.total++;\r\n\r\n if (this.create) {\r\n return this.create(target, params);\r\n } else if (typeof target == \"function\") {\r\n return Util.classApply(target, params);\r\n } else {\r\n return target.clone();\r\n }\r\n }\r\n\r\n /**\r\n * @todo add description - what is in the cache?\r\n *\r\n * @method getCount\r\n * @memberof Proton#Proton.Pool\r\n *\r\n * @return {Number}\r\n */\r\n getCount() {\r\n let count = 0;\r\n\r\n for (let id in this.cache)\r\n count += this.cache[id].length;\r\n\r\n return count++;;\r\n }\r\n\r\n /**\r\n * Destroyes all items from Pool.cache\r\n *\r\n * @method destroy\r\n * @memberof Proton#Proton.Pool\r\n */\r\n destroy() {\r\n for (let id in this.cache) {\r\n this.cache[id].length = 0;\r\n delete this.cache[id];\r\n }\r\n }\r\n\r\n /**\r\n * Returns Pool.cache\r\n *\r\n * @method getCache\r\n * @memberof Proton#Proton.Pool\r\n * @private\r\n *\r\n * @param {Number} uid the unique id\r\n *\r\n * @return {Object}\r\n */\r\n getCache(uid) {\r\n uid = uid || \"default\";\r\n\r\n if (!this.cache[uid]) this.cache[uid] = [];\r\n return this.cache[uid];\r\n }\r\n}","export default class Stats {\r\n\r\n constructor(proton) {\r\n this.proton = proton;\r\n this.container = null;\r\n this.type = 1;\r\n\r\n this.emitterIndex = 0;\r\n this.rendererIndex = 0;\r\n }\r\n\r\n update(style, body) {\r\n this.add(style, body);\r\n\r\n const emitter = this.getEmitter();\r\n const renderer = this.getRenderer();\r\n let str = \"\";\r\n\r\n switch (this.type) {\r\n case 2:\r\n str += \"emitter:\" + this.proton.emitters.length + \"
\";\r\n if (emitter) str += \"em speed:\" + emitter.emitSpeed + \"
\";\r\n if (emitter) str += \"pos:\" + this.getEmitterPos(emitter);\r\n break;\r\n\r\n case 3:\r\n if (emitter) str += \"initializes:\" + emitter.initializes.length + \"
\";\r\n if (emitter) str += \"\" + this.concatArr(emitter.initializes) + \"
\";\r\n if (emitter) str += \"behaviours:\" + emitter.behaviours.length + \"
\";\r\n if (emitter) str += \"\" + this.concatArr(emitter.behaviours) + \"
\";\r\n break;\r\n\r\n case 4:\r\n if (renderer) str += renderer.name + \"
\";\r\n if (renderer) str += \"body:\" + this.getCreatedNumber(renderer) + \"
\";\r\n break;\r\n\r\n default:\r\n str += \"particles:\" + this.proton.getCount() + \"
\";\r\n str += \"pool:\" + this.proton.pool.getCount() + \"
\";\r\n str += \"total:\" + this.proton.pool.total;\r\n }\r\n\r\n this.container.innerHTML = str;\r\n }\r\n\r\n add(style, body) {\r\n if (!this.container) {\r\n this.type = 1;\r\n\r\n this.container = document.createElement('div');\r\n this.container.style.cssText = [\r\n 'position:absolute;bottom:0px;left:0;cursor:pointer;',\r\n 'opacity:0.9;z-index:10000;padding:10px;font-size:12px;font-family:Helvetica,Arial,sans-serif;',\r\n 'width:120px;height:50px;background-color:#002;color:#0ff;'\r\n ].join('');\r\n\r\n this.container.addEventListener('click', e => {\r\n this.type++;\r\n if (this.type > 4) this.type = 1;\r\n }, false);\r\n\r\n let bg, color;\r\n switch (style) {\r\n case 2:\r\n bg = \"#201\";\r\n color = \"#f08\";\r\n break;\r\n\r\n case 3:\r\n bg = \"#020\";\r\n color = \"#0f0\";\r\n break;\r\n\r\n default:\r\n bg = \"#002\";\r\n color = \"#0ff\";\r\n }\r\n\r\n this.container.style[\"background-color\"] = bg;\r\n this.container.style[\"color\"] = color;\r\n }\r\n\r\n if (!this.container.parentNode) {\r\n body = body || this.body || document.body;\r\n body.appendChild(this.container);\r\n }\r\n }\r\n\r\n getEmitter() {\r\n return this.proton.emitters[this.emitterIndex];\r\n }\r\n\r\n getRenderer() {\r\n return this.proton.renderers[this.rendererIndex];\r\n }\r\n\r\n concatArr(arr) {\r\n let result = '';\r\n if (!arr || !arr.length) return result;\r\n\r\n for (let i = 0; i < arr.length; i++) {\r\n result += (arr[i].name || '').substr(0, 1) + '.';\r\n }\r\n\r\n return result;\r\n }\r\n\r\n getCreatedNumber(renderer) {\r\n return renderer.pool.total || (renderer.cpool && renderer.cpool.total) || 0;\r\n }\r\n\r\n getEmitterPos(e) {\r\n return Math.round(e.p.x) + \",\" + Math.round(e.p.y);\r\n }\r\n}","/*\r\n * EventDispatcher\r\n * This code reference since http://createjs.com/.\r\n *\r\n **/\r\n\r\nexport default class EventDispatcher {\r\n\r\n constructor() {\r\n this._listeners = null;\r\n }\r\n\r\n static bind(TargetClass){\r\n TargetClass.prototype.dispatchEvent = EventDispatcher.prototype.dispatchEvent;\r\n TargetClass.prototype.hasEventListener = EventDispatcher.prototype.hasEventListener;\r\n TargetClass.prototype.addEventListener = EventDispatcher.prototype.addEventListener;\r\n TargetClass.prototype.removeEventListener = EventDispatcher.prototype.removeEventListener;\r\n TargetClass.prototype.removeAllEventListeners = EventDispatcher.prototype.removeAllEventListeners;\r\n }\r\n\r\n addEventListener(type, listener) {\r\n if (!this._listeners) {\r\n this._listeners = {};\r\n } else {\r\n this.removeEventListener(type, listener);\r\n }\r\n\r\n if (!this._listeners[type]) this._listeners[type] = [];\r\n this._listeners[type].push(listener);\r\n\r\n return listener;\r\n }\r\n\r\n removeEventListener(type, listener) {\r\n if (!this._listeners) return;\r\n if (!this._listeners[type]) return;\r\n\r\n const arr = this._listeners[type];\r\n const length = arr.length;\r\n\r\n for (let i = 0;i < length; i++) {\r\n if (arr[i] == listener) {\r\n if (length == 1) {\r\n delete (this._listeners[type]);\r\n }\r\n\r\n // allows for faster checks.\r\n else {\r\n arr.splice(i, 1);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n removeAllEventListeners(type) {\r\n if (!type)\r\n this._listeners = null;\r\n else if (this._listeners)\r\n delete (this._listeners[type]);\r\n }\r\n\r\n dispatchEvent(type, args) {\r\n let result = false;\r\n const listeners = this._listeners;\r\n\r\n if (type && listeners) {\r\n let arr = listeners[type];\r\n if (!arr) return result;\r\n\r\n //arr = arr.slice();\r\n // to avoid issues with items being removed or added during the dispatch\r\n\r\n let handler;\r\n let i = arr.length;\r\n while (i--) {\r\n handler = arr[i];\r\n result = result || handler(args);\r\n }\r\n\r\n }\r\n\r\n return !!result;\r\n }\r\n\r\n hasEventListener(type) {\r\n const listeners = this._listeners;\r\n return !!(listeners && listeners[type]);\r\n }\r\n\r\n}","import Util from '../utils/Util';\r\n\r\nexport default class Integration {\r\n\r\n\tconstructor(type) {\r\n\t\tthis.type = type;\r\n\t}\r\n\r\n\tcalculate(particles, time, damping) {\r\n\t\tthis.eulerIntegrate(particles, time, damping);\r\n\t}\r\n\r\n\t// Euler Integrate\r\n\teulerIntegrate(particle, time, damping) {\r\n\t\tif (!particle.sleep) {\r\n\t\t\tparticle.old.p.copy(particle.p);\r\n\t\t\tparticle.old.v.copy(particle.v);\r\n\r\n\t\t\tparticle.a.multiplyScalar(1 / particle.mass);\r\n\t\t\tparticle.v.add(particle.a.multiplyScalar(time));\r\n\t\t\tparticle.p.add(particle.old.v.multiplyScalar(time));\r\n\r\n\t\t\tif (damping) particle.v.multiplyScalar(damping);\r\n\r\n\t\t\tparticle.a.clear();\r\n\t\t}\r\n\t}\r\n}","import Pool from './Pool';\r\nimport Util from '../utils/Util';\r\nimport Stats from '../debug/Stats';\r\nimport EventDispatcher from '../events/EventDispatcher';\r\nimport Integration from '../math/Integration';\r\n\r\nexport default class Proton {\r\n\r\n static USE_CLOCK = false;\r\n\r\n //1:100\r\n static MEASURE = 100;\r\n static EULER = 'euler';\r\n static RK2 = 'runge-kutta2';\r\n\r\n static PARTICLE_CREATED = 'PARTICLE_CREATED';\r\n static PARTICLE_UPDATE = 'PARTICLE_UPDATE';\r\n static PARTICLE_SLEEP = 'PARTICLE_SLEEP';\r\n static PARTICLE_DEAD = 'PARTICLE_DEAD';\r\n static PROTON_UPDATE = 'PROTON_UPDATE';\r\n static PROTON_UPDATE_AFTER = 'PROTON_UPDATE_AFTER';\r\n static EMITTER_ADDED = 'EMITTER_ADDED';\r\n static EMITTER_REMOVED = 'EMITTER_REMOVED';\r\n\r\n static amendChangeTabsBug = true;\r\n\r\n /**\r\n * The constructor to add emitters\r\n *\r\n * @constructor Proton\r\n *\r\n * @todo proParticleCount is not in use\r\n * @todo add more documentation of the single properties and parameters\r\n *\r\n * @param {Number} [proParticleCount] not in use?\r\n * @param {Number} [integrationType=Proton.EULER]\r\n *\r\n * @property {String} [integrationType=Proton.EULER]\r\n * @property {Array} emitters All added emitter\r\n * @property {Array} renderers All added renderer\r\n * @property {Number} time The active time\r\n * @property {Number} oldtime The old time\r\n */\r\n constructor(integrationType) {\r\n\r\n this.emitters = [];\r\n this.renderers = [];\r\n\r\n this.time = 0;\r\n this.oldTime = 0;\r\n this.elapsed = 0;\r\n\r\n this.stats = new Stats(this);\r\n this.pool = new Pool(80);\r\n\r\n this.integrationType = Util.initValue(integrationType, Proton.EULER);\r\n this.integrator = new Integration(this.integrationType);\r\n }\r\n\r\n /**\r\n * add a type of Renderer\r\n *\r\n * @method addRenderer\r\n * @memberof Proton\r\n * @instance\r\n *\r\n * @param {Renderer} render\r\n */\r\n addRenderer(render) {\r\n render.init(this);\r\n this.renderers.push(render);\r\n }\r\n\r\n /**\r\n * @name add a type of Renderer\r\n *\r\n * @method addRenderer\r\n * @param {Renderer} render\r\n */\r\n removeRenderer(render) {\r\n const index = this.renderers.indexOf(render);\r\n this.renderers.splice(index, 1);\r\n render.remove(this);\r\n }\r\n\r\n /**\r\n * add the Emitter\r\n *\r\n * @method addEmitter\r\n * @memberof Proton\r\n * @instance\r\n *\r\n * @param {Emitter} emitter\r\n */\r\n addEmitter(emitter) {\r\n this.emitters.push(emitter);\r\n emitter.parent = this;\r\n\r\n this.dispatchEvent(Proton.EMITTER_ADDED, emitter);\r\n }\r\n\r\n /**\r\n * Removes an Emitter\r\n *\r\n * @method removeEmitter\r\n * @memberof Proton\r\n * @instance\r\n *\r\n * @param {Proton.Emitter} emitter\r\n */\r\n removeEmitter(emitter) {\r\n const index = this.emitters.indexOf(emitter);\r\n this.emitters.splice(index, 1);\r\n emitter.parent = null;\r\n\r\n this.dispatchEvent(Proton.EMITTER_REMOVED, emitter);\r\n }\r\n\r\n /**\r\n * Updates all added emitters\r\n *\r\n * @method update\r\n * @memberof Proton\r\n * @instance\r\n */\r\n update() {\r\n this.dispatchEvent(Proton.PROTON_UPDATE);\r\n\r\n if (Proton.USE_CLOCK) {\r\n if (!this.oldTime) this.oldTime = (new Date()).getTime();\r\n\r\n let time = new Date().getTime();\r\n this.elapsed = (time - this.oldTime) / 1000;\r\n Proton.amendChangeTabsBug && this.amendChangeTabsBug();\r\n\r\n this.oldTime = time;\r\n } else {\r\n this.elapsed = 0.0167;\r\n }\r\n\r\n // emitter update\r\n if (this.elapsed > 0) this.emittersUpdate(this.elapsed);\r\n\r\n this.dispatchEvent(Proton.PROTON_UPDATE_AFTER);\r\n }\r\n\r\n emittersUpdate(elapsed) {\r\n let i = this.emitters.length;\r\n while (i--) this.emitters[i].update(elapsed);\r\n }\r\n\r\n /**\r\n * @todo add description\r\n *\r\n * @method amendChangeTabsBug\r\n * @memberof Proton\r\n * @instance\r\n */\r\n amendChangeTabsBug() {\r\n if (this.elapsed > .5) {\r\n this.oldTime = (new Date()).getTime();\r\n this.elapsed = 0;\r\n }\r\n }\r\n\r\n /**\r\n * Counts all particles from all emitters\r\n *\r\n * @method getCount\r\n * @memberof Proton\r\n * @instance\r\n */\r\n getCount() {\r\n let total = 0;\r\n let i = this.emitters.length;\r\n\r\n while (i--) total += this.emitters[i].particles.length;\r\n return total;\r\n }\r\n\r\n getAllParticles() {\r\n let particles = [];\r\n let i = this.emitters.length;\r\n\r\n while (i--) particles = particles.concat(this.emitters[i].particles);\r\n return particles;\r\n }\r\n\r\n /**\r\n * Destroys everything related to this Proton instance. This includes all emitters, and all properties\r\n *\r\n * @method destroy\r\n * @memberof Proton\r\n * @instance\r\n */\r\n destroy() {\r\n Util.destroy(this.renderers, this.getAllParticles());\r\n Util.destroy(this.emitters);\r\n\r\n this.time = 0;\r\n this.oldTime = 0;\r\n\r\n this.pool.destroy();\r\n }\r\n}\r\n\r\nEventDispatcher.bind(Proton);","import MathUtils from './MathUtils';\r\n\r\nexport default {\r\n\r\n easeLinear(value) {\r\n return value;\r\n },\r\n\r\n easeInQuad(value) {\r\n return Math.pow(value, 2);\r\n },\r\n\r\n easeOutQuad(value) {\r\n return -(Math.pow((value - 1), 2) - 1);\r\n },\r\n\r\n easeInOutQuad(value) {\r\n if ((value /= 0.5) < 1)\r\n return 0.5 * Math.pow(value, 2);\r\n\r\n return -0.5 * ((value -= 2) * value - 2);\r\n },\r\n\r\n easeInCubic(value) {\r\n return Math.pow(value, 3);\r\n },\r\n\r\n easeOutCubic(value) {\r\n return (Math.pow((value - 1), 3) + 1);\r\n },\r\n\r\n easeInOutCubic(value) {\r\n if ((value /= 0.5) < 1)\r\n return 0.5 * Math.pow(value, 3);\r\n\r\n return 0.5 * (Math.pow((value - 2), 3) + 2);\r\n },\r\n\r\n easeInQuart(value) {\r\n return Math.pow(value, 4);\r\n },\r\n\r\n easeOutQuart(value) {\r\n return -(Math.pow((value - 1), 4) - 1);\r\n },\r\n\r\n easeInOutQuart(value) {\r\n if ((value /= 0.5) < 1)\r\n return 0.5 * Math.pow(value, 4);\r\n\r\n return -0.5 * ((value -= 2) * Math.pow(value, 3) - 2);\r\n },\r\n\r\n easeInSine(value) {\r\n return -Math.cos(value * (MathUtils.PI_2)) + 1;\r\n },\r\n\r\n easeOutSine(value) {\r\n return Math.sin(value * (MathUtils.PI_2));\r\n },\r\n\r\n easeInOutSine(value) {\r\n return (-0.5 * (Math.cos(MathUtils.PI * value) - 1));\r\n },\r\n\r\n easeInExpo(value) {\r\n return (value === 0) ? 0 : Math.pow(2, 10 * (value - 1));\r\n },\r\n\r\n easeOutExpo(value) {\r\n return (value === 1) ? 1 : -Math.pow(2, -10 * value) + 1;\r\n },\r\n\r\n easeInOutExpo(value) {\r\n if (value === 0)\r\n return 0;\r\n\r\n if (value === 1)\r\n return 1;\r\n\r\n if ((value /= 0.5) < 1)\r\n return 0.5 * Math.pow(2, 10 * (value - 1));\r\n\r\n return 0.5 * (-Math.pow(2, -10 * --value) + 2);\r\n },\r\n\r\n easeInCirc(value) {\r\n return -(Math.sqrt(1 - (value * value)) - 1);\r\n },\r\n\r\n easeOutCirc(value) {\r\n return Math.sqrt(1 - Math.pow((value - 1), 2));\r\n },\r\n\r\n easeInOutCirc(value) {\r\n if ((value /= 0.5) < 1)\r\n return -0.5 * (Math.sqrt(1 - value * value) - 1);\r\n return 0.5 * (Math.sqrt(1 - (value -= 2) * value) + 1);\r\n },\r\n\r\n easeInBack(value) {\r\n let s = 1.70158;\r\n return (value) * value * ((s + 1) * value - s);\r\n },\r\n\r\n easeOutBack(value) {\r\n let s = 1.70158;\r\n return (value = value - 1) * value * ((s + 1) * value + s) + 1;\r\n },\r\n\r\n easeInOutBack(value) {\r\n let s = 1.70158;\r\n if ((value /= 0.5) < 1)\r\n return 0.5 * (value * value * (((s *= (1.525)) + 1) * value - s));\r\n return 0.5 * ((value -= 2) * value * (((s *= (1.525)) + 1) * value + s) + 2);\r\n },\r\n\r\n getEasing(ease) {\r\n if (typeof ease === 'function')\r\n return ease;\r\n else\r\n return this[ease] || this.easeLinear;\r\n }\r\n};","import Util from '../utils/Util';\r\nimport ease from '../math/ease';\r\nimport Vector2D from '../math/Vector2D';\r\nimport MathUtils from '../math/MathUtils';\r\n\r\nexport default class Particle {\r\n\r\n static ID = 0;\r\n\r\n /**\r\n * the Particle class\r\n *\r\n * @class Proton.Particle\r\n * @constructor\r\n * @param {Object} pObj the parameters object;\r\n * for example {life:3,dead:false}\r\n */\r\n constructor(pOBJ) {\r\n /**\r\n * The particle's id;\r\n * @property id\r\n * @type {string}\r\n */\r\n this.id = `particle_${Particle.ID++}`;\r\n this.reset('init');\r\n\r\n pOBJ && Util.setPrototypeByObject(this, pOBJ);\r\n }\r\n\r\n getDirection() {\r\n return Math.atan2(this.v.x, -this.v.y) * MathUtils.N180_PI;\r\n }\r\n\r\n reset(init) {\r\n this.life = Infinity;\r\n this.age = 0;\r\n\r\n //Energy loss\r\n this.energy = 1;\r\n this.dead = false;\r\n this.sleep = false;\r\n this.body = null;\r\n this.sprite = null;\r\n this.parent = null;\r\n\r\n this.mass = 1;\r\n this.radius = 10;\r\n this.alpha = 1;\r\n this.scale = 1;\r\n this.rotation = 0;\r\n this.color = null;\r\n\r\n this.easing = ease.easeLinear;\r\n\r\n if (init == 'init') {\r\n this.transform = {};\r\n this.p = new Vector2D();\r\n this.v = new Vector2D();\r\n this.a = new Vector2D();\r\n\r\n this.old = {\r\n p: new Vector2D(),\r\n v: new Vector2D(),\r\n a: new Vector2D()\r\n };\r\n\r\n this.behaviours = [];\r\n } else {\r\n Util.destroyObject(this.transform, 'rgb');\r\n\r\n this.p.set(0, 0);\r\n this.v.set(0, 0);\r\n this.a.set(0, 0);\r\n\r\n this.old.p.set(0, 0);\r\n this.old.v.set(0, 0);\r\n this.old.a.set(0, 0);\r\n\r\n this.removeAllBehaviours();\r\n }\r\n\r\n if (!this.transform.rgb) {\r\n this.transform.rgb = { r: 255, g: 255, b: 255 };\r\n } else {\r\n this.transform.rgb.r = 255;\r\n this.transform.rgb.g = 255;\r\n this.transform.rgb.b = 255;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n update(time, index) {\r\n if (!this.sleep) {\r\n this.age += time;\r\n this.applyBehaviours(time, index);\r\n }\r\n\r\n if (this.age < this.life) {\r\n const scale = this.easing(this.age / this.life);\r\n this.energy = Math.max(1 - scale, 0);\r\n } else {\r\n this.destroy();\r\n }\r\n }\r\n\r\n applyBehaviours(time, index) {\r\n const length = this.behaviours.length;\r\n let i;\r\n\r\n for (i = 0; i < length; i++) {\r\n this.behaviours[i] && this.behaviours[i].applyBehaviour(this, time, index)\r\n }\r\n }\r\n\r\n addBehaviour(behaviour) {\r\n this.behaviours.push(behaviour);\r\n\r\n if (behaviour.hasOwnProperty('parents')) behaviour.parents.push(this);\r\n behaviour.initialize(this);\r\n }\r\n\r\n addBehaviours(behaviours) {\r\n const length = behaviours.length;\r\n let i;\r\n\r\n for (i = 0; i < length; i++) {\r\n this.addBehaviour(behaviours[i]);\r\n }\r\n }\r\n\r\n removeBehaviour(behaviour) {\r\n const index = this.behaviours.indexOf(behaviour);\r\n\r\n if (index > -1) {\r\n const behaviour = this.behaviours.splice(index, 1);\r\n behaviour.parents = null;\r\n }\r\n }\r\n\r\n removeAllBehaviours() {\r\n Util.destroyArray(this.behaviours);\r\n }\r\n\r\n /**\r\n * Destory this particle\r\n * @method destroy\r\n */\r\n destroy() {\r\n this.removeAllBehaviours();\r\n this.energy = 0;\r\n this.dead = true;\r\n this.parent = null;\r\n }\r\n\r\n}","export default {\r\n\r\n /**\r\n * @typedef {Object} rgbObject\r\n * @property {Number} r red value\r\n * @property {Number} g green value\r\n * @property {Number} b blue value\r\n */\r\n /**\r\n * converts a hex value to a rgb object\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method hexToRGB\r\n *\r\n * @param {String} h any hex value, e.g. #000000 or 000000 for black\r\n *\r\n * @return {rgbObject}\r\n */\r\n hexToRGB(h) {\r\n const hex16 = (h.charAt(0) == \"#\") ? h.substring(1, 7) : h;\r\n const r = parseInt(hex16.substring(0, 2), 16);\r\n const g = parseInt(hex16.substring(2, 4), 16);\r\n const b = parseInt(hex16.substring(4, 6), 16);\r\n\r\n return { r, g, b };\r\n },\r\n\r\n /**\r\n * converts a rgb value to a rgb string\r\n *\r\n * @memberof Proton#Proton.Util\r\n * @method rgbToHex\r\n *\r\n * @param {Object | Proton.hexToRGB} rgb a rgb object like in {@link Proton#Proton.}\r\n *\r\n * @return {String} rgb()\r\n */\r\n rgbToHex(rbg) {\r\n return `rgb(${rbg.r}, ${rbg.g}, ${rbg.b})`;\r\n },\r\n\r\n getHex16FromParticle(p) {\r\n return Number(p.transform.rgb.r) * 65536 + Number(p.transform.rgb.g) * 256 + Number(p.transform.rgb.b);\r\n }\r\n}","import Vector2D from './Vector2D';\r\n\r\nexport default class Polar2D {\r\n\r\n\tconstructor(r, tha) {\r\n\t\tthis.r = Math.abs(r) || 0;\r\n\t\tthis.tha = tha || 0;\r\n\t}\r\n\r\n\tset(r, tha) {\r\n\t\tthis.r = r;\r\n\t\tthis.tha = tha;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tsetR(r) {\r\n\t\tthis.r = r;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tsetTha(tha) {\r\n\t\tthis.tha = tha;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tcopy(p) {\r\n\t\tthis.r = p.r;\r\n\t\tthis.tha = p.tha;\r\n\t\treturn this;\r\n\t}\r\n\r\n\ttoVector() {\r\n\t\treturn new Vector2D(this.getX(), this.getY());\r\n\t}\r\n\r\n\tgetX() {\r\n\t\treturn this.r * Math.sin(this.tha);\r\n\t}\r\n\r\n\tgetY() {\r\n\t\treturn -this.r * Math.cos(this.tha);\r\n\t}\r\n\r\n\tnormalize() {\r\n\t\tthis.r = 1;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tequals(v) {\r\n\t\treturn ((v.r === this.r) && (v.tha === this.tha));\r\n\t}\r\n\r\n\tclear() {\r\n\t\tthis.r = 0.0;\r\n\t\tthis.tha = 0.0;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tclone() {\r\n\t\treturn new Polar2D(this.r, this.tha);\r\n\t}\r\n}","export default {\r\n\tcreate(mat3) {\r\n\t\tconst mat = new Float32Array(9);\r\n\t\tif (mat3) this.set(mat3, mat);\r\n\r\n\t\treturn mat;\r\n\t},\r\n\r\n\tset(mat1, mat2) {\r\n\t\tfor (let i = 0; i < 9; i++)\r\n\t\t\tmat2[i] = mat1[i];\r\n\r\n\t\treturn mat2;\r\n\t},\r\n\r\n\tmultiply(mat, mat2, mat3) {\r\n\t\tlet a00 = mat[0], a01 = mat[1], a02 = mat[2], a10 = mat[3], a11 = mat[4], a20 = mat[6], a21 = mat[7], b00 = mat2[0], b01 = mat2[1], b02 = mat2[2], b10 = mat2[3], b11 = mat2[4], b20 = mat2[6], b21 = mat2[7];\r\n\r\n\t\tmat3[0] = b00 * a00 + b01 * a10;\r\n\t\tmat3[1] = b00 * a01 + b01 * a11;\r\n\t\tmat3[2] = a02 * b02;\r\n\t\tmat3[3] = b10 * a00 + b11 * a10;\r\n\t\tmat3[4] = b10 * a01 + b11 * a11;\r\n\t\tmat3[6] = b20 * a00 + b21 * a10 + a20;\r\n\t\tmat3[7] = b20 * a01 + b21 * a11 + a21;\r\n\r\n\t\treturn mat3;\r\n\t},\r\n\r\n\tinverse(mat, mat3) {\r\n\t\tlet a00 = mat[0], a01 = mat[1], a10 = mat[3], a11 = mat[4], a20 = mat[6], a21 = mat[7], b01 = a11, b11 = -a10, b21 = a21 * a10 - a11 * a20, d = a00 * b01 + a01 * b11, id;\r\n\r\n\t\tid = 1 / d;\r\n\t\tmat3[0] = b01 * id;\r\n\t\tmat3[1] = (-a01) * id;\r\n\t\tmat3[3] = b11 * id;\r\n\t\tmat3[4] = a00 * id;\r\n\t\tmat3[6] = b21 * id;\r\n\t\tmat3[7] = (-a21 * a00 + a01 * a20) * id;\r\n\r\n\t\treturn mat3;\r\n\t},\r\n\r\n\tmultiplyVec2(m, vec, mat3) {\r\n\t\tlet x = vec[0], y = vec[1];\r\n\r\n\t\tmat3[0] = x * m[0] + y * m[3] + m[6];\r\n\t\tmat3[1] = x * m[1] + y * m[4] + m[7];\r\n\r\n\t\treturn mat3;\r\n\t}\r\n}","import Span from './Span';\r\nimport Util from '../utils/Util';\r\nimport MathUtils from './MathUtils';\r\n\r\nexport default class ArraySpan extends Span {\r\n\r\n constructor(color) {\r\n super();\r\n this._arr = Util.isArray(color) ? color : [color];\r\n }\r\n\r\n getValue() {\r\n const color = this._arr[Math.floor(this._arr.length * Math.random())];\r\n return color === 'random' || color === 'Random' ? MathUtils.randomColor() : color;\r\n }\r\n\r\n /**\r\n * Make sure that the color is an instance of Proton.ArraySpan, if not it makes a new instance\r\n *\r\n * @method setSpanValue\r\n * @memberof Proton#Proton.Color\r\n * @instance\r\n *\r\n * @param {Proton.Particle} particle\r\n * @param {Number} the integrate time 1/ms\r\n * @param {Int} the particle index\r\n */\r\n static createArraySpan(arr) {\r\n if (!arr) return null;\r\n\r\n if (arr instanceof ArraySpan)\r\n return arr;\r\n else\r\n return new ArraySpan(arr);\r\n }\r\n\r\n}","export default class Rectangle {\r\n\r\n\tconstructor(x, y, w, h) {\r\n\t\tthis.x = x;\r\n\t\tthis.y = y;\r\n\r\n\t\tthis.width = w;\r\n\t\tthis.height = h;\r\n\r\n\t\tthis.bottom = this.y + this.height;\r\n\t\tthis.right = this.x + this.width;\r\n\t}\r\n\r\n\tcontains(x, y) {\r\n\t\tif (x <= this.right && x >= this.x && y <= this.bottom && y >= this.y)\r\n\t\t\treturn true;\r\n\t\telse\r\n\t\t\treturn false;\r\n\t}\r\n}\r\n","import Util from '../utils/Util';\r\n\r\nexport default class Rate {\r\n\r\n\t/**\r\n\t * The number of particles per second emission (a [particle]/b [s]);\r\n\t * @namespace\r\n\t * @memberof! Proton#\r\n\t * @constructor\r\n\t * @alias Rate\r\n\t *\r\n\t * @param {Array | Number | Span} numpan the number of each emission;\r\n\t * @param {Array | Number | Span} timepan the time of each emission;\r\n\t * for example: new Rate(new Span(10, 20), new Span(.1, .25));\r\n\t */\r\n\tconstructor(numpan, timepan) {\r\n\t\tthis.numPan = Util.setSpanValue(Util.initValue(numpan, 1));\r\n\t\tthis.timePan = Util.setSpanValue(Util.initValue(timepan, 1));\r\n\r\n\t\tthis.startTime = 0;\r\n\t\tthis.nextTime = 0;\r\n\t\tthis.init();\r\n\t}\r\n\r\n\tinit() {\r\n\t\tthis.startTime = 0;\r\n\t\tthis.nextTime = this.timePan.getValue();\r\n\t}\r\n\r\n\tgetValue(time) {\r\n\t\tthis.startTime += time;\r\n\r\n\t\tif (this.startTime >= this.nextTime) {\r\n\t\t\tthis.startTime = 0;\r\n\t\t\tthis.nextTime = this.timePan.getValue();\r\n\r\n\t\t\tif (this.numPan.b == 1) {\r\n\t\t\t\tif (this.numPan.getValue(false) > 0.5)\r\n\t\t\t\t\treturn 1;\r\n\t\t\t\telse\r\n\t\t\t\t\treturn 0;\r\n\t\t\t} else {\r\n\t\t\t\treturn this.numPan.getValue(true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn 0;\r\n\t}\r\n}","export default class Initialize {\r\n\t\r\n\treset() {\r\n\t}\r\n\r\n\tinit(emitter, particle) {\r\n\t\tif (particle) {\r\n\t\t\tthis.initialize(particle);\r\n\t\t} else {\r\n\t\t\tthis.initialize(emitter);\r\n\t\t}\r\n\t};\r\n\r\n\t///sub class init\r\n\tinitialize(target) {\r\n\t};\r\n}","import Util from '../utils/Util';\r\nimport Initialize from './Initialize';\r\n\r\nexport default class Life extends Initialize {\r\n\r\n\tconstructor(a, b, c) {\r\n\t\tsuper();\r\n\r\n\t\tthis.lifePan = Util.setSpanValue(a, b, c);\r\n\t\tthis.name = 'Life';\r\n\t}\r\n\r\n\tinitialize(target) {\r\n\t\tif (this.lifePan.a == Infinity)\r\n\t\t\ttarget.life = Infinity;\r\n\t\telse\r\n\t\t\ttarget.life = this.lifePan.getValue();\r\n\t}\r\n}\r\n","import Vector2D from '../math/Vector2D';\r\n\r\nexport default class Zone {\r\n\tconstructor() {\r\n\t\tthis.vector = new Vector2D(0, 0);\r\n\t\tthis.random = 0;\r\n\t\tthis.crossType = \"dead\";\r\n\t\tthis.alert = true;\r\n\t}\r\n\r\n\tgetPosition() {\r\n\t}\r\n\r\n\tcrossing(particle) {\r\n\t}\r\n}","import Zone from './Zone';\r\n\r\nexport default class PointZone extends Zone {\r\n\r\n\tconstructor(x, y) {\r\n\t\tsuper();\r\n\t\tthis.x = x;\r\n\t\tthis.y = y;\r\n\t}\r\n\r\n\tgetPosition() {\r\n\t\tthis.vector.x = this.x;\r\n\t\tthis.vector.y = this.y;\r\n\r\n\t\treturn this.vector;\r\n\t}\r\n\r\n\tcrossing(particle) {\r\n\t\t\r\n\t\tif (this.alert) {\r\n\t\t\talert('Sorry PointZone does not support crossing method');\r\n\t\t\tthis.alert = false;\r\n\t\t}\r\n\t}\r\n}","import Util from '../utils/Util';\r\nimport PointZone from '../zone/PointZone';\r\nimport Initialize from './Initialize';\r\n\r\nexport default class Position extends Initialize {\r\n\r\n\tconstructor(zone) {\r\n\t\tsuper();\r\n\t\tthis.zone = Util.initValue(zone, new PointZone());\r\n\r\n\t\tthis.name = 'Position';\r\n\t}\r\n\r\n\treset(zone) {\r\n\t\tthis.zone = Util.initValue(zone, new PointZone());\r\n\t}\r\n\r\n\tinitialize(target) {\r\n\t\tthis.zone.getPosition();\r\n\r\n\t\ttarget.p.x = this.zone.vector.x;\r\n\t\ttarget.p.y = this.zone.vector.y;\r\n\t};\r\n\r\n}\r\n","import Proton from '../core/Proton';\r\nimport Util from '../utils/Util';\r\nimport Polar2D from '../math/Polar2D';\r\nimport MathUtils from '../math/MathUtils';\r\nimport Initialize from './Initialize';\r\n\r\nexport default class Velocity extends Initialize {\r\n\r\n constructor(rpan, thapan, type) {\r\n super();\r\n\r\n this.rPan = Util.setSpanValue(rpan);\r\n this.thaPan = Util.setSpanValue(thapan);\r\n this.type = Util.initValue(type, 'vector');\r\n\r\n this.name = 'Velocity';\r\n }\r\n\r\n reset(rpan, thapan, type) {\r\n this.rPan = Util.setSpanValue(rpan);\r\n this.thaPan = Util.setSpanValue(thapan);\r\n this.type = Util.initValue(type, 'vector');\r\n };\r\n\r\n normalizeVelocity(vr) {\r\n return vr * Proton.MEASURE;\r\n }\r\n\r\n initialize(target) {\r\n if (this.type == 'p' || this.type == 'P' || this.type == 'polar') {\r\n const polar2d = new Polar2D(this.normalizeVelocity(this.rPan.getValue()), this.thaPan.getValue() * MathUtils.PI_180);\r\n\r\n target.v.x = polar2d.getX();\r\n target.v.y = polar2d.getY();\r\n } else {\r\n target.v.x = this.normalizeVelocity(this.rPan.getValue());\r\n target.v.y = this.normalizeVelocity(this.thaPan.getValue());\r\n }\r\n };\r\n}","import Util from '../utils/Util';\r\nimport Initialize from './Initialize';\r\n\r\nexport default class Mass extends Initialize {\r\n\r\n\tconstructor(a, b, c) {\r\n\t\tsuper();\r\n\t\tthis.massPan = Util.setSpanValue(a, b, c);\r\n\t\tthis.name = 'Mass';\r\n\t}\r\n\r\n\tinitialize(target) {\r\n\t\ttarget.mass = this.massPan.getValue();\r\n\t}\r\n}","import Util from '../utils/Util';\r\nimport Initialize from './Initialize';\r\n\r\nexport default class Radius extends Initialize {\r\n\r\n\tconstructor(a, b, c) {\r\n\t\tsuper();\r\n\t\tthis.radius = Util.setSpanValue(a, b, c);\r\n\r\n\t\tthis.name = 'Radius';\r\n\t}\r\n\r\n\treset(a, b, c) {\r\n\t\tthis.radius = Util.setSpanValue(a, b, c);\r\n\t};\r\n\r\n\tinitialize(particle) {\r\n\t\tparticle.radius = this.radius.getValue();\r\n\t\tparticle.transform.oldRadius = particle.radius;\r\n\t};\r\n}","import Util from '../utils/Util';\r\nimport ArraySpan from '../math/ArraySpan';\r\nimport Initialize from './Initialize';\r\n\r\nexport default class Body extends Initialize {\r\n\r\n constructor(image, w, h) {\r\n super();\r\n\r\n this.image = this.setSpanValue(image);\r\n this.w = Util.initValue(w, 20);\r\n this.h = Util.initValue(h, this.w);\r\n this.name = 'Body';\r\n }\r\n\r\n initialize(particle) {\r\n const imagetarget = this.image.getValue();\r\n\r\n if (typeof(imagetarget) == 'string') {\r\n particle.body = { width: this.w, height: this.h, src: imagetarget , isInner: true, inner: true };\r\n } else {\r\n particle.body = imagetarget;\r\n }\r\n };\r\n\r\n setSpanValue(color) {\r\n return color instanceof ArraySpan ? color : new ArraySpan(color);\r\n }\r\n}","import Proton from '../core/Proton';\r\nimport Util from '../utils/Util';\r\nimport ease from '../math/ease';\r\n\r\nexport default class Behaviour {\r\n static id = 0;\r\n\r\n /**\r\n * The Behaviour class is the base for the other Behaviour\r\n *\r\n * @memberof! -\r\n * @interface\r\n * @alias Proton.Behaviour\r\n *\r\n * @param {Number} life \tthe behaviours life\r\n * @param {String} easing \tThe behaviour's decaying trend, for example ease.easeOutQuart\r\n *\r\n * @property {String} id \t\tThe behaviours id\r\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n * @property {Number} age=0 \tHow long the particle should be 'alife'\r\n * @property {Number} energy=1\r\n * @property {Boolean} dead=false The particle is dead at first\r\n * @property {Array} parents \tThe behaviour's parents array\r\n * @property {String} name \tThe behaviour name\r\n */\r\n constructor(life, easing) {\r\n\r\n this.life = Util.initValue(life, Infinity);\r\n this.easing = ease.getEasing(easing);\r\n\r\n this.age = 0;\r\n this.energy = 1;\r\n this.dead = false;\r\n this.parents = [];\r\n\r\n this.id = `Behaviour_${Behaviour.id++}`;\r\n this.name = 'Behaviour';\r\n }\r\n\r\n /**\r\n * Reset this behaviour's parameters\r\n *\r\n * @method reset\r\n * @memberof Proton.Behaviour\r\n * @instance\r\n *\r\n * @param {Number} [life=Infinity] \t\tthis behaviour's life\r\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\r\n */\r\n reset(life, easing) {\r\n this.life = Util.initValue(life, Infinity);\r\n this.easing = ease.getEasing(easing);\r\n }\r\n\r\n /**\r\n * Normalize a force by 1:100;\r\n *\r\n * @method normalizeForce\r\n * @memberof Proton.Behaviour\r\n * @instance\r\n *\r\n * @param {Proton.Vector2D} force \r\n */\r\n normalizeForce(force) {\r\n return force.multiplyScalar(Proton.MEASURE);\r\n }\r\n\r\n /**\r\n * Normalize a value by 1:100;\r\n *\r\n * @method normalizeValue\r\n * @memberof Proton.Behaviour\r\n * @instance\r\n *\r\n * @param {Number} value\r\n */\r\n normalizeValue(value) {\r\n return value * Proton.MEASURE;\r\n }\r\n\r\n /**\r\n * Initialize the behaviour's parameters for all particles\r\n *\r\n * @method initialize\r\n * @memberof Proton.Behaviour\r\n * @instance\r\n *\r\n * @param {Proton.Particle} particle\r\n */\r\n initialize(particle) {}\r\n\r\n /**\r\n * Apply this behaviour for all particles every time\r\n *\r\n * @method applyBehaviour\r\n * @memberof Proton.Behaviour\r\n * @instance\r\n *\r\n * @param {Proton.Particle} particle\r\n * @param {Number} \t\t\ttime the integrate time 1/ms\r\n * @param {Int} \t\t\tindex the particle index\r\n */\r\n calculate(particle, time, index) {\r\n this.age += time;\r\n\r\n if (this.age >= this.life || this.dead) {\r\n this.energy = 0;\r\n this.dead = true;\r\n this.destroy();\r\n } else {\r\n const scale = this.easing(particle.age / particle.life);\r\n this.energy = Math.max(1 - scale, 0);\r\n }\r\n }\r\n\r\n /**\r\n * Destory this behaviour\r\n *\r\n * @method destroy\r\n * @memberof Proton.Behaviour\r\n * @instance\r\n */\r\n destroy() {\r\n let i = this.parents.length;\r\n while (i--) {\r\n this.parents[i].removeBehaviour(this);\r\n }\r\n\r\n this.parents.length = 0;\r\n }\r\n}","import Util from '../utils/Util';\r\nimport Vector2D from '../math/Vector2D';\r\nimport Behaviour from './Behaviour';\r\n\r\nexport default class Force extends Behaviour {\r\n\r\n\t/**\r\n\t * @memberof! Proton#\r\n\t * @augments Proton.Behaviour\r\n\t * @constructor\r\n\t * @alias Proton.Force\r\n\t *\r\n\t * @param {Number} fx\r\n\t * @param {Number} fy\r\n\t * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t *\r\n\t * @property {String} name The Behaviour name\r\n\t */\r\n\tconstructor(fx, fy, life, easing) {\r\n\t\tsuper(life, easing);\r\n\r\n\t\tthis.force = this.normalizeForce(new Vector2D(fx, fy));\r\n\t\tthis.name = \"Force\";\r\n\t}\r\n\r\n\t/**\r\n\t * Reset this behaviour's parameters\r\n\t *\r\n\t * @method reset\r\n\t * @memberof Proton#Proton.Force\r\n\t * @instance\r\n\t *\r\n\t * @param {Number} fx\r\n\t * @param {Number} fy\r\n\t * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t */\r\n\treset(fx, fy, life, easing) {\r\n\t\tthis.force = this.normalizeForce(new Vector2D(fx, fy));\r\n\r\n\t\tlife && super.reset(life, easing);\r\n\t}\r\n\r\n\t/**\r\n\t * Apply this behaviour for all particles every time\r\n\t *\r\n\t * @method applyBehaviour\r\n\t * @memberof Proton#Proton.Force\r\n\t * @instance\r\n\t *\r\n\t * @param {Proton.Particle} particle\r\n\t * @param {Number} the integrate time 1/ms\r\n\t * @param {Int} the particle index\r\n\t */\r\n\tapplyBehaviour(particle, time, index) {\r\n\t\tthis.calculate(particle, time, index);\r\n\t\tparticle.a.add(this.force);\r\n\t}\r\n}","import Util from '../utils/Util';\r\nimport Vector2D from '../math/Vector2D';\r\nimport Behaviour from './Behaviour';\r\n\r\nexport default class Attraction extends Behaviour {\r\n\r\n\t/**\r\n\t * This behaviour let the particles follow one specific Proton.Vector2D\r\n\t *\r\n\t * @memberof! Proton#\r\n\t * @augments Proton.Behaviour\r\n\t * @constructor\r\n\t * @alias Proton.Attraction\r\n\t *\r\n\t * @todo add description for 'force' and 'radius'\r\n\t *\r\n\t * @param {Proton.Vector2D} targetPosition the attraction point coordinates\r\n\t * @param {Number} [force=100]\r\n\t * @param {Number} [radius=1000]\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t *\r\n\t * @property {Proton.Vector2D} targetPosition\r\n\t * @property {Number} radius\r\n\t * @property {Number} force\r\n\t * @property {Number} radiusSq\r\n\t * @property {Proton.Vector2D} attractionForce\r\n\t * @property {Number} lengthSq\r\n\t * @property {String} name The Behaviour name\r\n\t */\r\n\tconstructor(targetPosition, force, radius, life, easing) {\r\n\t\tsuper(life, easing);\r\n\r\n\t\tthis.targetPosition = Util.initValue(targetPosition, new Vector2D);\r\n\t\tthis.radius = Util.initValue(radius, 1000);\r\n\t\tthis.force = Util.initValue(this.normalizeValue(force), 100);\r\n\r\n\t\tthis.radiusSq = this.radius * this.radius\r\n\t\tthis.attractionForce = new Vector2D();\r\n\t\tthis.lengthSq = 0;\r\n\r\n\t\tthis.name = \"Attraction\";\r\n\t}\r\n\r\n\t/**\r\n\t * Reset this behaviour's parameters\r\n\t *\r\n\t * @method reset\r\n\t * @memberof Proton#Proton.Attraction\r\n\t * @instance\r\n\t *\r\n\t * @todo add description for 'force' and 'radius'\r\n\t *\r\n\t * @param {Proton.Vector2D} targetPosition the attraction point coordinates\r\n\t * @param {Number} [force=100]\r\n\t * @param {Number} [radius=1000]\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t */\r\n\treset(targetPosition, force, radius, life, easing) {\r\n\t\tthis.targetPosition = Util.initValue(targetPosition, new Vector2D);\r\n\t\tthis.radius = Util.initValue(radius, 1000);\r\n\t\tthis.force = Util.initValue(this.normalizeValue(force), 100);\r\n\r\n\t\tthis.radiusSq = this.radius * this.radius\r\n\t\tthis.attractionForce = new Vector2D();\r\n\t\tthis.lengthSq = 0;\r\n\r\n\t\tlife && super.reset(life, easing);\r\n\t}\r\n\r\n\t/**\r\n\t * Apply this behaviour for all particles every time\r\n\t *\r\n\t * @memberof Proton#Proton.Attraction\r\n\t * @method applyBehaviour\r\n\t * @instance\r\n\t *\r\n\t * @param {Proton.Particle} particle\r\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\r\n\t * @param {Int} \t\t\tindex the particle index\r\n\t */\r\n\tapplyBehaviour(particle, time, index) {\r\n\t\tthis.calculate(particle, time, index);\r\n\r\n\t\tthis.attractionForce.copy(this.targetPosition);\r\n\t\tthis.attractionForce.sub(particle.p);\r\n\t\tthis.lengthSq = this.attractionForce.lengthSq();\r\n\r\n\t\tif (this.lengthSq > 0.000004 && this.lengthSq < this.radiusSq) {\r\n\t\t\tthis.attractionForce.normalize();\r\n\t\t\tthis.attractionForce.multiplyScalar(1 - this.lengthSq / this.radiusSq);\r\n\t\t\tthis.attractionForce.multiplyScalar(this.force);\r\n\r\n\t\t\tparticle.a.add(this.attractionForce);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n","import Util from '../utils/Util';\r\nimport Vector2D from '../math/Vector2D';\r\nimport MathUtils from '../math/MathUtils';\r\nimport Behaviour from './Behaviour';\r\n\r\nexport default class RandomDrift extends Behaviour {\r\n\r\n\t/**\r\n\t * @memberof! Proton#\r\n\t * @augments Behaviour\r\n\t * @constructor\r\n\t * @alias RandomDrift\r\n\t *\r\n\t * @param {Number} driftX \t\t\t\tX value of the new Vector2D\r\n\t * @param {Number} driftY \t\t\t\tY value of the new Vector2D\r\n\t * @param {Number} delay \t\t\t\tHow much delay the drift should have\r\n\t * @param {Number} [life=Infinity] \t\tthis behaviour's life\r\n\t * @param {String} [easing=easeLinear] \tthis behaviour's easing\r\n\t *\r\n\t * @property {Number} time The time of the drift\r\n\t * @property {String} name The Behaviour name\r\n\t */\r\n\tconstructor(driftX, driftY, delay, life, easing) {\r\n\t\tsuper(life, easing);\r\n\r\n\t\tthis.reset(driftX, driftY, delay);\r\n\t\tthis.time = 0;\r\n\t\tthis.name = \"RandomDrift\";\r\n\t}\r\n\r\n\t/**\r\n\t * Reset this behaviour's parameters\r\n\t *\r\n\t * @method reset\r\n\t * @memberof Proton#RandomDrift\r\n\t * @instance\r\n\t *\r\n\t * @param {Number} driftX \t\t\t\tX value of the new Vector2D\r\n\t * @param {Number} driftY \t\t\t\tY value of the new Vector2D\r\n\t * @param {Number} delay \t\t\t\tHow much delay the drift should have\r\n\t * @param {Number} [life=Infinity] \t\tthis behaviour's life\r\n\t * @param {String} [easing=easeLinear] \tthis behaviour's easing\r\n\t */\r\n\treset(driftX, driftY, delay, life, easing) {\r\n\t\tthis.panFoce = new Vector2D(driftX, driftY);\r\n\t\tthis.panFoce = this.normalizeForce(this.panFoce);\r\n\t\tthis.delay = delay;\r\n\r\n\t\tlife && super.reset(life, easing);\r\n\t}\r\n\r\n\t/**\r\n\t * Apply this behaviour for all particles every time\r\n\t *\r\n\t * @method applyBehaviour\r\n\t * @memberof Proton#RandomDrift\r\n\t * @instance\r\n\t *\r\n\t * @param {Particle} particle\r\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\r\n\t * @param {Int} \t\t\tindex the particle index\r\n\t */\r\n\tapplyBehaviour(particle, time, index) {\r\n\t\tthis.calculate(particle, time, index);\r\n\t\tthis.time += time;\r\n\r\n\t\tif (this.time >= this.delay) {\r\n\t\t\tparticle.a.addXY(MathUtils.randomAToB(-this.panFoce.x, this.panFoce.x), MathUtils.randomAToB(-this.panFoce.y, this.panFoce.y));\r\n\t\t\tthis.time = 0;\r\n\t\t};\r\n\t}\r\n}\r\n","import Util from '../utils/Util';\r\nimport Vector2D from '../math/Vector2D';\r\nimport Force from './Force';\r\n\r\nexport default class Gravity extends Force {\r\n\r\n\t/**\r\n\t * @memberof! Proton#\r\n\t * @augments Proton#Proton.Force\r\n\t * @constructor\r\n\t * @alias Proton.Gravity\r\n\t *\r\n\t * @param {Number} g \t\t\t\t\t\t\tGravity\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t *\r\n\t * @property {String} name The Behaviour name\r\n\t */\r\n\tconstructor(g, life, easing) {\r\n\t\tsuper(0, g, life, easing);\r\n\t\tthis.name = \"Gravity\";\r\n\t}\r\n\r\n\t/**\r\n\t * Reset this behaviour's parameters\r\n\t *\r\n\t * @method reset\r\n\t * @memberof Proton#Proton.Gravity\r\n\t * @instance\r\n\t *\r\n\t * @param {Number} g \t\t\t\t\t\t\tGravity\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t */\r\n\treset(g, life, easing) {\r\n\t\tsuper.reset(0, g, life, easing);\r\n\t}\r\n}","import Util from '../utils/Util';\r\nimport Vector2D from '../math/Vector2D';\r\nimport Behaviour from './Behaviour';\r\n\r\n//can use Collision(emitter,true,function(){}) or Collision();\r\nexport default class Collision extends Behaviour {\r\n\r\n\t/**\r\n\t * The callback after collision\r\n\t *\r\n\t * @callback Callback\r\n\t *\r\n\t * @param {Proton.Particle} particle\r\n\t * @param {Proton.Paritcle} otherParticle\r\n\t */\r\n\t/**\r\n\t * @memberof! Proton#\r\n\t * @augments Proton.Behaviour\r\n\t * @constructor\r\n\t * @alias Proton.Collision\r\n\t *\r\n\t * @todo add description to mass\r\n\t *\r\n\t * @param {Proton.Emitter} \t[emitter=null] \t\tthe attraction point coordinates\r\n\t * @param {Boolean} \t\t[mass=true]\t\t\t\r\n\t * @param {Callback}\t \t[callback=null]\t\tthe callback after the collision\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t *\r\n\t * @property {String} name The Behaviour name\r\n\t */\r\n\tconstructor(emitter, mass, callback, life, easing) {\r\n\t\tsuper(life, easing);\r\n\r\n\t\tthis.reset(emitter, mass, callback);\r\n\t\tthis.name = \"Collision\";\r\n\t}\r\n\r\n\t/**\r\n\t * Reset this behaviour's parameters\r\n\t *\r\n\t * @memberof Proton#Proton.Collision\r\n\t * @method reset\r\n\t * @instance\r\n\t *\r\n\t * @todo add description to mass\r\n\t *\r\n\t * @param {Proton.Emitter} \t[emitter=null] \t\tthe attraction point coordinates\r\n\t * @param {Boolean} \t\t[mass=true]\t\t\t\r\n\t * @param {Callback}\t \t[callback=null]\t\tthe callback after the collision\r\n\t * @param {Number} \t\t\t[life=Infinity] \tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t */\r\n\treset(emitter, mass, callback, life, easing) {\r\n\t\tthis.emitter = Util.initValue(emitter, null);\r\n\t\tthis.mass = Util.initValue(mass, true);\r\n\t\tthis.callback = Util.initValue(callback, null);\r\n\r\n\t\tthis.collisionPool = [];\r\n\t\tthis.delta = new Vector2D();\r\n\r\n\t\tlife && super.reset(life, easing);\r\n\t}\r\n\r\n\t/**\r\n\t * Apply this behaviour for all particles every time\r\n\t *\r\n\t * @memberof Proton#Proton.Collision\r\n\t * @method applyBehaviour\r\n\t * @instance\r\n\t *\r\n\t * @param {Proton.Particle} particle\r\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\r\n\t * @param {Int} \t\t\tindex the particle index\r\n\t */\r\n\tapplyBehaviour(particle, time, index) {\r\n\t\tconst newPool = this.emitter ? this.emitter.particles.slice(index) : this.pool.slice(index);\r\n\t\tconst length = newPool.length;\r\n\r\n\t\tlet otherParticle;\r\n\t\tlet lengthSq;\r\n\t\tlet overlap;\r\n\t\tlet totalMass;\r\n\t\tlet averageMass1, averageMass2;\r\n\t\tlet i;\r\n\r\n\t\tfor (i = 0; i < length; i++) {\r\n\t\t\totherParticle = newPool[i];\r\n\r\n\t\t\tif (otherParticle !== particle) {\r\n\t\t\t\tthis.delta.copy(otherParticle.p);\r\n\t\t\t\tthis.delta.sub(particle.p);\r\n\r\n\t\t\t\tlengthSq = this.delta.lengthSq();\r\n\t\t\t\tconst distance = particle.radius + otherParticle.radius;\r\n\r\n\t\t\t\tif (lengthSq <= distance * distance) {\r\n\t\t\t\t\toverlap = distance - Math.sqrt(lengthSq);\r\n\t\t\t\t\toverlap += 0.5;\r\n\r\n\t\t\t\t\ttotalMass = particle.mass + otherParticle.mass;\r\n\t\t\t\t\taverageMass1 = this.mass ? otherParticle.mass / totalMass : 0.5;\r\n\t\t\t\t\taverageMass2 = this.mass ? particle.mass / totalMass : 0.5;\r\n\t\t\t\t\t\r\n\t\t\t\t\tparticle.p.add(this.delta.clone().normalize().multiplyScalar(overlap * -averageMass1));\r\n\t\t\t\t\totherParticle.p.add(this.delta.normalize().multiplyScalar(overlap * averageMass2));\r\n\r\n\t\t\t\t\tthis.callback && this.callback(particle, otherParticle);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n","import Util from '../utils/Util';\r\nimport Behaviour from './Behaviour';\r\n\r\nexport default class CrossZone extends Behaviour {\r\n\r\n /**\r\n * Defines what happens if the particles come to the end of the specified zone\r\n *\r\n * @memberof! Proton#\r\n * @augments Proton.Behaviour\r\n * @constructor\r\n * @alias Proton.CrossZone\r\n *\r\n * @param {Proton.Zone} zone \t\t\t\t\t\tcan be any Proton.Zone - e.g. Proton.RectZone()\r\n * @param {String} \t\t[crossType=dead] \t\t\twhat happens if the particles pass the zone - allowed strings: dead | bound | cross\r\n * @param {Number} \t\t[life=Infinity] \t\t\tthis behaviour's life\r\n * @param {String} \t\t[easing=ease.easeLinear] \tthis behaviour's easing\r\n *\r\n * @property {String} name The Behaviour name\r\n */\r\n constructor(zone, crossType, life, easing) {\r\n super(life, easing);\r\n\r\n this.reset(zone, crossType);\r\n this.name = \"CrossZone\";\r\n }\r\n\r\n /**\r\n * Reset this behaviour's parameters\r\n *\r\n * @method reset\r\n * @memberof Proton#Proton.CrossZone\r\n * @instance\r\n *\r\n * @param {Proton.Zone} zone \t\t\t\tcan be any Proton.Zone - e.g. Proton.RectZone()\r\n * @param {String} \t\t[crossType=dead] \twhat happens if the particles pass the zone - allowed strings: dead | bound | cross\r\n * @param {Number} \t\t[life=Infinity] \tthis behaviour's life\r\n * @param {String} \t\t[easing=easeLinear]\tthis behaviour's easing\r\n */\r\n reset(zone, crossType, life, easing) {\r\n this.zone = zone;\r\n this.zone.crossType = Util.initValue(crossType, \"dead\");\r\n\r\n life && super.reset(life, easing);\r\n }\r\n\r\n /**\r\n * Apply this behaviour for all particles every time\r\n *\r\n * @method applyBehaviour\r\n * @memberof Proton#Proton.CrossZone\r\n * @instance\r\n *\r\n * @param {Proton.Particle} particle\r\n * @param {Number} the integrate time 1/ms\r\n * @param {Int} the particle index\r\n */\r\n applyBehaviour(particle, time, index) {\r\n this.calculate(particle, time, index);\r\n this.zone.crossing(particle);\r\n };\r\n}","import Util from '../utils/Util';\r\nimport Behaviour from './Behaviour';\r\n\r\nexport default class Alpha extends Behaviour {\r\n\r\n\t/**\r\n\t * @memberof! Proton#\r\n\t * @augments Proton.Behaviour\r\n\t * @constructor\r\n\t * @alias Proton.Alpha\r\n\t *\r\n\t * @todo add description for 'a' and 'b'\r\n\t *\r\n\t * @param {Number} a\r\n\t * @param {String} b\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t *\r\n\t * @property {String} name The Behaviour name\r\n\t */\r\n\tconstructor(a, b, life, easing) {\r\n\t\tsuper(life, easing);\r\n\r\n\t\tthis.reset(a, b);\r\n\t\tthis.name = \"Alpha\";\r\n\t}\r\n\r\n\t/**\r\n\t * Reset this behaviour's parameters\r\n\t *\r\n\t * @method reset\r\n\t * @memberof Proton#Proton.Alpha\r\n\t * @instance\r\n\t *\r\n\t * @todo add description for 'a' and 'b'\r\n\t *\r\n\t * @param {Number} a\r\n\t * @param {String} b\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t */\r\n\treset(a, b, life, easing) {\r\n\t\tthis.same = b === null || b === undefined ? true : false;\r\n\t\tthis.a = Util.setSpanValue(Util.initValue(a, 1));\r\n\t\tthis.b = Util.setSpanValue(b);\r\n\r\n\t\tlife && super.reset(life, easing);\r\n\t}\r\n\t\r\n\t/**\r\n\t * Sets the new alpha value of the particle\r\n\t *\r\n\t * @method initialize\r\n\t * @memberof Proton#Proton.Alpha\r\n\t * @instance\r\n\t *\r\n\t * @param {Proton.Particle} particle A single Proton generated particle\r\n\t */\r\n\tinitialize(particle) {\r\n\t\tparticle.transform.alphaA = this.a.getValue();\r\n\r\n\t\tif (this.same)\r\n\t\t\tparticle.transform.alphaB = particle.transform.alphaA;\r\n\t\telse\r\n\t\t\tparticle.transform.alphaB = this.b.getValue();\r\n\t}\r\n\r\n\t/**\r\n\t * @method applyBehaviour\r\n\t * @memberof Proton#Proton.Alpha\r\n\t * @instance\r\n\t *\r\n\t * @param {Proton.Particle} particle\r\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\r\n\t * @param {Int} \t\t\tindex the particle index\r\n \t */\r\n\tapplyBehaviour(particle, time, index) {\r\n\t\tthis.calculate(particle, time, index);\r\n\t\t\r\n\t\tparticle.alpha = particle.transform.alphaB + (particle.transform.alphaA - particle.transform.alphaB) * this.energy;\r\n\t\tif (particle.alpha < 0.001) particle.alpha = 0;\r\n\t}\r\n}\r\n","import Util from '../utils/Util';\r\nimport Behaviour from './Behaviour';\r\n\r\nexport default class Scale extends Behaviour {\r\n\r\n\t/**\r\n\t * @memberof! Proton#\r\n\t * @augments Proton.Behaviour\r\n\t * @constructor\r\n\t * @alias Proton.Scale\r\n\t *\r\n\t * @todo add description for 'a' and 'b'\r\n\t *\r\n\t * @param {Number} a\r\n\t * @param {String} b\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t *\r\n\t * @property {String} name The Behaviour name\r\n\t */\r\n\tconstructor(a, b, life, easing) {\r\n\t\tsuper(life, easing);\r\n\r\n\t\tthis.reset(a, b);\r\n\t\tthis.name = \"Scale\";\r\n\t}\r\n\r\n\t/**\r\n\t * Reset this behaviour's parameters\r\n\t *\r\n\t * @method reset\r\n\t * @memberof Proton#Proton.Scale\r\n\t * @instance\r\n\t *\r\n\t * @param {Number} a\r\n\t * @param {String} b\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t */\r\n\treset(a, b, life, easing) {\r\n\t\tthis.same = b === null || b === undefined ? true : false;\r\n\t\tthis.a = Util.setSpanValue(Util.initValue(a, 1));\r\n\t\tthis.b = Util.setSpanValue(b);\r\n\r\n\t\tlife && super.reset(life, easing);\r\n\t}\r\n\r\n\t/**\r\n\t * Initialize the behaviour's parameters for all particles\r\n\t *\r\n\t * @method initialize\r\n\t * @memberof Proton#Proton.Scale\r\n\t * @instance\r\n\t *\r\n\t * @param {Proton.Particle} particle\r\n\t */\r\n\tinitialize(particle) {\r\n\t\tparticle.transform.scaleA = this.a.getValue();\r\n\t\tparticle.transform.oldRadius = particle.radius;\r\n\t\tparticle.transform.scaleB = this.same ? particle.transform.scaleA : this.b.getValue();\r\n\t};\r\n\r\n\t/**\r\n\t * Apply this behaviour for all particles every time\r\n\t *\r\n\t * @method applyBehaviour\r\n\t * @memberof Proton#Proton.Scale\r\n\t * @instance\r\n\t *\r\n\t * @param {Proton.Particle} particle\r\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\r\n\t * @param {Int} \t\t\tindex the particle index\r\n\t */\r\n\tapplyBehaviour(particle, time, index) {\r\n\t\tthis.calculate(particle, time, index);\r\n\t\tparticle.scale = particle.transform.scaleB + (particle.transform.scaleA - particle.transform.scaleB) * this.energy;\r\n\r\n\t\tif (particle.scale < 0.0001) particle.scale = 0;\r\n\t\tparticle.radius = particle.transform.oldRadius * particle.scale;\r\n\t}\r\n}","import Util from '../utils/Util';\r\nimport Behaviour from './Behaviour';\r\n\r\nexport default class Rotate extends Behaviour {\r\n\r\n\t/**\r\n\t * @memberof! Proton#\r\n\t * @augments Proton.Behaviour\r\n\t * @constructor\r\n\t * @alias Proton.Rotate\r\n\t *\r\n\t * @todo add description for 'a', 'b' and 'style'\r\n\t *\r\n\t * @param {String} [influence=Velocity] The rotation's influence\r\n\t * @param {String} b\r\n\t * @param {String} [style=to]\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t *\r\n\t * @property {String} name The Behaviour name\r\n\t */\r\n\tconstructor(influence, b, style, life, easing) {\r\n\t\tsuper(life, easing);\r\n\r\n\t\tthis.reset(influence, b, style);\r\n\t\tthis.name = \"Rotate\";\r\n\t}\r\n\r\n\t/**\r\n\t * Reset this behaviour's parameters\r\n\t *\r\n\t * @method reset\r\n\t * @memberof Proton#Proton.Rotate\r\n\t * @instance\r\n\t *\r\n\t * @todo add description for 'a', 'b' and 'style'\r\n\t *\r\n\t * @param {String} a \r\n\t * @param {String} b\r\n\t * @param {String} [style=to]\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t */\r\n\treset(a, b, style, life, easing) {\r\n\t\tthis.same = b === null || b === undefined ? true : false;\r\n\r\n\t\tthis.a = Util.setSpanValue(Util.initValue(a, \"Velocity\"));\r\n\t\tthis.b = Util.setSpanValue(Util.initValue(b, 0));\r\n\t\tthis.style = Util.initValue(style, 'to');\r\n\r\n\t\tlife && super.reset(life, easing);\r\n\t}\r\n\r\n\t/**\r\n\t * Initialize the behaviour's parameters for all particles\r\n\t *\r\n\t * @method initialize\r\n\t * @memberof Proton#Proton.Rotate\r\n\t * @instance\r\n\t *\r\n\t * @param {Proton.Particle} particle\r\n\t */\r\n\tinitialize(particle) {\r\n\t\tparticle.rotation = this.a.getValue();\r\n\t\tparticle.transform.rotationA = this.a.getValue();\r\n\r\n\t\tif (!this.same) particle.transform.rotationB = this.b.getValue();\r\n\t};\r\n\r\n\t/**\r\n\t * Apply this behaviour for all particles every time\r\n\t *\r\n\t * @method applyBehaviour\r\n\t * @memberof Proton#Proton.Rotate\r\n\t * @instance\r\n\t *\r\n\t * @param {Proton.Particle} particle\r\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\r\n\t * @param {Int} \t\t\tindex the particle index\r\n\t */\r\n\tapplyBehaviour(particle, time, index) {\r\n\t\tthis.calculate(particle, time, index);\r\n\r\n\t\tif (!this.same) {\r\n\t\t\tif (this.style == 'to' || this.style == 'TO' || this.style == '_') {\r\n\t\t\t\tparticle.rotation += particle.transform.rotationB + (particle.transform.rotationA - particle.transform.rotationB) * this.energy\r\n\t\t\t} else {\r\n\t\t\t\tparticle.rotation += particle.transform.rotationB;\r\n\t\t\t}\r\n\t\t} else if (this.a.a == \"V\" || this.a.a == \"Velocity\" || this.a.a == \"v\") {\r\n\t\t\t//beta...\r\n\t\t\tparticle.rotation = particle.getDirection();\r\n\t\t}\r\n\t}\r\n\r\n}\r\n","import Util from '../utils/Util';\r\nimport ColorUtil from '../utils/ColorUtil';\r\nimport ArraySpan from '../math/ArraySpan';\r\nimport Behaviour from './Behaviour';\r\n\r\nexport default class Color extends Behaviour {\r\n\r\n /**\r\n * @memberof! Proton#\r\n * @augments Proton.Behaviour\r\n * @constructor\r\n * @alias Proton.Color\r\n *\r\n * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black\r\n * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black\r\n * @param {Number} [life=Infinity] \tthis behaviour's life\r\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\r\n *\r\n * @property {String} name The Behaviour name\r\n */\r\n constructor(a, b, life, easing) {\r\n super(life, easing);\r\n\r\n this.reset(a, b);\r\n this.name = \"Color\";\r\n }\r\n\r\n /**\r\n * Reset this behaviour's parameters\r\n *\r\n * @method reset\r\n * @memberof Proton#Proton.Color\r\n * @instance\r\n *\r\n * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black\r\n * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black\r\n * @param {Number} [life=Infinity] \tthis behaviour's life\r\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\r\n */\r\n reset(a, b, life, easing) {\r\n this.a = ArraySpan.createArraySpan(a);\r\n this.b = ArraySpan.createArraySpan(b);\r\n\r\n life && super.reset(life, easing);\r\n }\r\n\r\n /**\r\n * Initialize the behaviour's parameters for all particles\r\n *\r\n * @method initialize\r\n * @memberof Proton#Proton.Color\r\n * @instance\r\n *\r\n * @param {Proton.Particle} particle\r\n */\r\n initialize(particle) {\r\n particle.color = this.a.getValue();\r\n particle.transform.colorA = ColorUtil.hexToRGB(particle.color);\r\n\r\n if (this.b)\r\n particle.transform.colorB = ColorUtil.hexToRGB(this.b.getValue());\r\n };\r\n\r\n /**\r\n * Apply this behaviour for all particles every time\r\n *\r\n * @method applyBehaviour\r\n * @memberof Proton#Proton.Color\r\n * @instance\r\n *\r\n * @param {Proton.Particle} particle\r\n * @param {Number} the integrate time 1/ms\r\n * @param {Int} the particle index\r\n */\r\n applyBehaviour(particle, time, index) {\r\n if (this.b) {\r\n this.calculate(particle, time, index);\r\n\r\n particle.transform.rgb.r = particle.transform.colorB.r + (particle.transform.colorA.r - particle.transform.colorB.r) * this.energy;\r\n particle.transform.rgb.g = particle.transform.colorB.g + (particle.transform.colorA.g - particle.transform.colorB.g) * this.energy;\r\n particle.transform.rgb.b = particle.transform.colorB.b + (particle.transform.colorA.b - particle.transform.colorB.b) * this.energy;\r\n\r\n particle.transform.rgb.r = Math.floor(particle.transform.rgb.r);\r\n particle.transform.rgb.g = Math.floor(particle.transform.rgb.g);\r\n particle.transform.rgb.b = Math.floor(particle.transform.rgb.b);\r\n\r\n } else {\r\n particle.transform.rgb.r = particle.transform.colorA.r;\r\n particle.transform.rgb.g = particle.transform.colorA.g;\r\n particle.transform.rgb.b = particle.transform.colorA.b;\r\n }\r\n };\r\n\r\n}","import Util from '../utils/Util';\r\nimport Attraction from './Attraction';\r\n\r\nexport default class Repulsion extends Attraction {\r\n\r\n\t/**\r\n\t * The oppisite of Proton.Attraction - turns the force\r\n\t *\r\n\t * @memberof! Proton#\r\n\t * @augments Proton#Proton.Attraction\r\n\t * @constructor\r\n\t * @alias Proton.Repulsion\r\n\t *\r\n\t * @todo add description for 'force' and 'radius'\r\n\t *\r\n\t * @param {Proton.Vector2D} targetPosition the attraction point coordinates\r\n\t * @param {Number} [force=100]\r\n\t * @param {Number} [radius=1000]\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t *\r\n\t * @property {Number} force\r\n\t * @property {String} name The Behaviour name\r\n\t */\r\n\tconstructor(targetPosition, force, radius, life, easing) {\r\n\t\tsuper(targetPosition, force, radius, life, easing);\r\n\r\n\t\tthis.force *= -1;\r\n\t\tthis.name = \"Repulsion\";\r\n\t}\r\n\r\n\t/**\r\n\t * Reset this behaviour's parameters\r\n\t *\r\n\t * @method reset\r\n\t * @memberof Proton#Proton.Repulsion\r\n\t * @instance\r\n\t *\r\n\t * @todo add description for 'force' and 'radius'\r\n\t *\r\n\t * @param {Proton.Vector2D} targetPosition the attraction point coordinates\r\n\t * @param {Number} [force=100]\r\n\t * @param {Number} [radius=1000]\r\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\r\n\t */\r\n\treset(targetPosition, force, radius, life, easing) {\r\n\t\tsuper.reset(targetPosition, force, radius, life, easing);\r\n\t\tthis.force *= -1;\r\n\t}\r\n}\r\n","import Util from '../utils/Util';\r\nimport Vector2D from '../math/Vector2D';\r\nimport Behaviour from './Behaviour';\r\n\r\nexport default class GravityWell extends Behaviour {\r\n\r\n\t/**\r\n\t * @memberof! Proton#\r\n\t * @augments Behaviour\r\n\t * @constructor\r\n\t * @alias GravityWell\r\n\t *\r\n\t * @param {Vector2D} [centerPoint=new Vector2D] The point in the center\r\n\t * @param {Number} [force=100]\t\t\t\t\tThe force\t\r\n\t * @param {Number} [life=Infinity]\t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=easeLinear]\tthis behaviour's easing\r\n\t *\r\n\t * @property {String} name The Behaviour name\r\n\t */\r\n\tconstructor(centerPoint, force, life, easing) {\r\n\t\tsuper(life, easing);\r\n\r\n\t\tthis.distanceVec = new Vector2D();\r\n\t\tthis.centerPoint = Util.initValue(centerPoint, new Vector2D);\r\n\t\tthis.force = Util.initValue(this.normalizeValue(force), 100);\r\n\r\n\t\tthis.name = \"GravityWell\";\r\n\t}\r\n\r\n\t/**\r\n\t * Reset this behaviour's parameters\r\n\t *\r\n\t * @method reset\r\n\t * @memberof Proton#GravityWell\r\n\t * @instance\r\n\t *\r\n\t * @param {Vector2D} [centerPoint=new Vector2D] The point in the center\r\n\t * @param {Number} [force=100]\t\t\t\t\tThe force\t\r\n\t * @param {Number} [life=Infinity]\t\t\t\tthis behaviour's life\r\n\t * @param {String} [easing=easeLinear]\tthis behaviour's easing\r\n\t */\r\n\treset(centerPoint, force, life, easing) {\r\n\t\tthis.distanceVec = new Vector2D();\r\n\t\tthis.centerPoint = Util.initValue(centerPoint, new Vector2D);\r\n\t\tthis.force = Util.initValue(this.normalizeValue(force), 100);\r\n\t\t\r\n\t\tlife && super.reset(life, easing);\r\n\t};\r\n\r\n\t/**\r\n\t * @inheritdoc\r\n\t */\r\n\tinitialize(particle) {\r\n\t};\r\n\r\n\t/**\r\n\t * Apply this behaviour for all particles every time\r\n\t *\r\n\t * @method applyBehaviour\r\n\t * @memberof Proton#GravityWell\r\n\t * @instance\r\n\t *\r\n\t * @param {Particle} particle\r\n\t * @param {Number} the integrate time 1/ms\r\n\t * @param {Int} the particle index\r\n\t */\r\n\tapplyBehaviour(particle, time, index) {\r\n\t\tthis.distanceVec.set(this.centerPoint.x - particle.p.x, this.centerPoint.y - particle.p.y);\r\n\t\tconst distanceSq = this.distanceVec.lengthSq();\r\n\r\n\t\tif (distanceSq != 0) {\r\n\t\t\tconst distance = this.distanceVec.length();\r\n\t\t\tconst factor = (this.force * time) / (distanceSq * distance);\r\n\r\n\t\t\tparticle.v.x += factor * this.distanceVec.x;\r\n\t\t\tparticle.v.y += factor * this.distanceVec.y;\r\n\t\t}\r\n\t}\r\n}","import Util from '../utils/Util';\r\nimport Initialize from './Initialize';\r\nimport MathUtils from '../math/MathUtils';\r\n\r\nexport default {\r\n\r\n\tinitialize(emitter, particle, initializes) {\r\n\t\tconst length = initializes.length;\r\n\t\tlet i;\r\n\r\n\t\tfor (i = 0; i < length; i++) {\r\n\t\t\tif (initializes[i] instanceof Initialize)\r\n\t\t\t\tinitializes[i].init(emitter, particle);\r\n\t\t\telse\r\n\t\t\t\tthis.init(emitter, particle, initializes[i]);\r\n\t\t}\r\n\r\n\t\tthis.bindEmitter(emitter, particle);\r\n\t},\r\n\r\n\t//////////////////////init//////////////////////\r\n\tinit(emitter, particle, initialize) {\r\n\t\tUtil.setPrototypeByObject(particle, initialize);\r\n\t\tUtil.setVector2DByObject(particle, initialize);\r\n\t},\r\n\t\r\n\tbindEmitter(emitter, particle) {\r\n\t\tif (emitter.bindEmitter) {\r\n\t\t\tparticle.p.add(emitter.p);\r\n\t\t\tparticle.v.add(emitter.v);\r\n\t\t\tparticle.a.add(emitter.a);\r\n\r\n\t\t\tparticle.v.rotate(MathUtils.degreeTransform(emitter.rotation));\r\n\t\t}\r\n\t}\r\n}\r\n","import Util from '../utils/Util';\r\nimport Particle from '../core/Particle';\r\nimport EventDispatcher from '../events/EventDispatcher';\r\n\r\nimport Rate from '../initialize/Rate';\r\nimport InitializeUtil from '../initialize/InitializeUtil';\r\n\r\nexport default class Emitter extends Particle {\r\n\r\n\tstatic ID = 0;\r\n\r\n\t/**\r\n\t * You can use this emit particles.\r\n\t *\r\n\t * It will dispatch follow events:\r\n\t * PARTICLE_CREATED\r\n\t * PARTICLE_UPDATA\r\n\t * PARTICLE_DEAD\r\n\t *\r\n\t * @class Emitter\r\n\t * @constructor\r\n\t * @param {Object} pObj the parameters object;\r\n\t * for example {damping:0.01,bindEmitter:false}\r\n\t */\r\n\tconstructor(pObj) {\r\n\t\tsuper(pObj);\r\n\r\n\t\tthis.initializes = [];\r\n\t\tthis.particles = [];\r\n\t\tthis.behaviours = [];\r\n\r\n\t\tthis.emitSpeed = 0;\r\n\t\tthis.emitTime = 0;\r\n\t\tthis.totalTime = -1;\r\n\r\n\t\t/**\r\n\t\t * The friction coefficient for all particle emit by This;\r\n\t\t * @property damping\r\n\t\t * @type {Number}\r\n\t\t * @default 0.006\r\n\t\t */\r\n\t\tthis.damping = .006;\r\n\r\n\t\t/**\r\n\t\t * If bindEmitter the particles can bind this emitter's property;\r\n\t\t * @property bindEmitter\r\n\t\t * @type {Boolean}\r\n\t\t * @default true\r\n\t\t */\r\n\t\tthis.bindEmitter = true;\r\n\r\n\t\t/**\r\n\t\t * The number of particles per second emit (a [particle]/b [s]);\r\n\t\t * @property rate\r\n\t\t * @type {Rate}\r\n\t\t * @default Rate(1, .1)\r\n\t\t */\r\n\t\tthis.rate = new Rate(1, .1);\r\n\r\n\t\tthis.id = `emitter_${Emitter.ID++}`;\r\n\t\tthis.name = 'Emitter';\r\n\t}\r\n\r\n\t/**\r\n\t * start emit particle\r\n\t * @method emit\r\n\t * @param {Number} emitTime begin emit time;\r\n\t * @param {String} life the life of this emitter\r\n\t */\r\n\temit(totalTime, life) {\r\n\t\tthis.stoped = false;\r\n\t\tthis.emitTime = 0;\r\n\t\tthis.totalTime = Util.initValue(totalTime, Infinity);\r\n\r\n\t\tif (life == true || life == 'life' || life == 'destroy') {\r\n\t\t\tthis.life = totalTime == 'once' ? 1 : this.totalTime;\r\n\t\t} else if (!isNaN(life)) {\r\n\t\t\tthis.life = life;\r\n\t\t}\r\n\r\n\t\tthis.rate.init();\r\n\t}\r\n\r\n\t/**\r\n\t * stop emiting\r\n\t * @method stop\r\n\t */\r\n\tstop() {\r\n\t\tthis.totalTime = -1;\r\n\t\tthis.emitTime = 0;\r\n\t\tthis.stoped = true;\r\n\t}\r\n\r\n\tpreEmit(time) {\r\n\t\tlet oldStoped = this.stoped;\r\n\t\tlet oldEmitTime = this.emitTime;\r\n\t\tlet oldTotalTime = this.totalTime;\r\n\r\n\t\tthis.stoped = false;\r\n\t\tthis.emitTime = 0;\r\n\t\tthis.totalTime = time;\r\n\t\tthis.rate.init();\r\n\r\n\t\tconst step = 0.0167;\r\n\t\twhile (time > step) {\r\n\t\t\ttime -= step;\r\n\t\t\tthis.update(step);\r\n\t\t}\r\n\r\n\t\tthis.stoped = oldStoped;\r\n\t\tthis.emitTime = oldEmitTime + Math.max(time, 0);\r\n\t\tthis.totalTime = oldTotalTime;\r\n\t}\r\n\r\n\t/**\r\n\t * remove current all particles\r\n\t * @method removeAllParticles\r\n\t */\r\n\tremoveAllParticles() {\r\n\t\tlet i = this.particles.length;\r\n\t\twhile (i--) this.particles[i].dead = true;\r\n\t}\r\n\r\n\t/**\r\n\t * add initialize to this emitter\r\n\t * @method addSelfInitialize\r\n\t */\r\n\taddSelfInitialize(pObj) {\r\n\t\tif (pObj['init']) {\r\n\t\t\tpObj.init(this);\r\n\t\t} else {\r\n\t\t\tthis.initAll();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * add the Initialize to particles;\r\n\t * \r\n\t * you can use initializes array:for example emitter.addInitialize(initialize1,initialize2,initialize3);\r\n\t * @method addInitialize\r\n\t * @param {Initialize} initialize like this new Radius(1, 12)\r\n\t */\r\n\taddInitialize(...rest) {\r\n\t\tlet i = rest.length;\r\n\t\twhile (i--)\r\n\t\t\tthis.initializes.push(rest[i]);\r\n\t}\r\n\r\n\t/**\r\n\t * remove the Initialize\r\n\t * @method removeInitialize\r\n\t * @param {Initialize} initialize a initialize\r\n\t */\r\n\tremoveInitialize(initializer) {\r\n\t\tconst index = this.initializes.indexOf(initializer);\r\n\t\tif (index > -1) this.initializes.splice(index, 1);\r\n\t}\r\n\r\n\t/**\r\n\t * remove all Initializes\r\n\t * @method removeInitializers\r\n\t */\r\n\tremoveAllInitializers() {\r\n\t\tUtil.destroyArray(this.initializes);\r\n\t}\r\n\r\n\t/**\r\n\t * add the Behaviour to particles;\r\n\t * \r\n\t * you can use Behaviours array:emitter.addBehaviour(Behaviour1,Behaviour2,Behaviour3);\r\n\t * @method addBehaviour\r\n\t * @param {Behaviour} behaviour like this new Color('random')\r\n\t */\r\n\taddBehaviour(...rest) {\r\n\t\tlet i = arguments.length;\r\n\t\twhile (i--) {\r\n\t\t\tlet behaviour = rest[i];\r\n\t\t\tthis.behaviours.push(behaviour);\r\n\t\t\tif (behaviour.parents) behaviour.parents.push(this);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * remove the Behaviour\r\n\t * @method removeBehaviour\r\n\t * @param {Behaviour} behaviour a behaviour\r\n\t */\r\n\tremoveBehaviour(behaviour) {\r\n\t\tlet index = this.behaviours.indexOf(behaviour);\r\n\t\tthis.behaviours.splice(index, 1);\r\n\r\n\t\tif (behaviour.parents) {\r\n\t\t\tindex = behaviour.parents.indexOf(behaviour);\r\n\t\t\tbehaviour.parents.splice(index, 1);\r\n\t\t}\r\n\r\n\t\treturn index;\r\n\t}\r\n\r\n\t/**\r\n\t * remove all behaviours\r\n\t * @method removeAllBehaviours\r\n\t */\r\n\tremoveAllBehaviours() {\r\n\t\tUtil.destroyArray(this.behaviours);\r\n\t}\r\n\r\n\t// emitter update \r\n\tupdate(time) {\r\n\t\tthis.age += time;\r\n\t\tif (this.age >= this.life || this.dead) this.destroy();\r\n\r\n\t\tthis.emitting(time);\r\n\t\tthis.integrate(time);\r\n\t}\r\n\r\n\tintegrate(time) {\r\n\t\tif (!this.parent) return;\r\n\r\n\t\tconst damping = 1 - this.damping;\r\n\t\tthis.parent.integrator.calculate(this, time, damping);\r\n\r\n\t\tconst length = this.particles.length;\r\n\t\tlet i, particle;\r\n\r\n\t\tfor (i = length - 1; i >= 0; i--) {\r\n\t\t\tparticle = this.particles[i];\r\n\r\n\t\t\t// particle update\r\n\t\t\tparticle.update(time, i);\r\n\t\t\tthis.parent.integrator.calculate(particle, time, damping);\r\n\t\t\tthis.dispatch(\"PARTICLE_UPDATE\", particle);\r\n\r\n\t\t\t// check dead\r\n\t\t\tif (particle.dead) {\r\n\t\t\t\tthis.dispatch(\"PARTICLE_DEAD\", particle);\r\n\r\n\t\t\t\tthis.parent.pool.expire(particle);\r\n\t\t\t\tthis.particles.splice(i, 1);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tdispatch(event, target) {\r\n\t\tthis.parent && this.parent.dispatchEvent(event, target);\r\n\t\tthis.bindEvent && this.dispatchEvent(event, target);\r\n\t}\r\n\r\n\temitting(time) {\r\n\t\tif (this.totalTime == 'once') {\r\n\t\t\tlet i;\r\n\t\t\tconst length = this.rate.getValue(99999);\r\n\r\n\t\t\tif (length > 0) this.emitSpeed = length;\r\n\t\t\tfor (i = 0; i < length; i++) this.createParticle();\r\n\t\t\tthis.totalTime = 'none';\r\n\t\t}\r\n\r\n\t\telse {\r\n\t\t\tthis.emitTime += time;\r\n\r\n\t\t\tif (this.emitTime < this.totalTime) {\r\n\t\t\t\tconst length = this.rate.getValue(time)\r\n\t\t\t\tlet i;\r\n\r\n\t\t\t\tif (length > 0) this.emitSpeed = length;\r\n\t\t\t\tfor (i = 0; i < length; i++) this.createParticle();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * create single particle;\r\n\t * \r\n\t * can use emit({x:10},new Gravity(10),{'particleUpdate',fun}) or emit([{x:10},new Initialize],new Gravity(10),{'particleUpdate',fun})\r\n\t * @method removeAllParticles\r\n\t */\r\n\tcreateParticle(initialize, behaviour) {\r\n\t\tconst particle = this.parent.pool.get(Particle);\r\n\t\tthis.setupParticle(particle, initialize, behaviour);\r\n\t\tthis.dispatch(\"PARTICLE_CREATED\", particle);\r\n\r\n\t\treturn particle;\r\n\t}\r\n\r\n\tsetupParticle(particle, initialize, behaviour) {\r\n\t\tlet initializes = this.initializes;\r\n\t\tlet behaviours = this.behaviours;\r\n\r\n\t\tif (initialize) {\r\n\t\t\tinitializes = Util.isArray(initialize) ? initialize : [initialize];\r\n\t\t}\r\n\r\n\t\tif (behaviour) {\r\n\t\t\tbehaviour = Util.isArray(behaviour) ? behaviour : [behaviour];\r\n\t\t}\r\n\r\n\t\tparticle.reset();\r\n\t\tInitializeUtil.initialize(this, particle, initializes);\r\n\t\tparticle.addBehaviours(behaviours);\r\n\t\tparticle.parent = this;\r\n\r\n\t\tthis.particles.push(particle);\r\n\t}\r\n\r\n\tremove() {\r\n\t\tthis.stop();\r\n\t\tUtil.destroy(this.particles);\r\n\t}\r\n\r\n\t/**\r\n\t * Destory this Emitter\r\n\t * @method destroy\r\n\t */\r\n\tdestroy(slow) {\r\n\t\tthis.dead = true;\r\n\t\tthis.remove();\r\n\t\tthis.removeAllInitializers();\r\n\t\tthis.removeAllBehaviours();\r\n\t\tthis.parent && this.parent.removeEmitter(this);\r\n\t}\r\n\r\n}\r\n\r\nEventDispatcher.bind(Emitter);","import Util from '../utils/Util';\r\nimport Emitter from './Emitter';\r\n\r\nexport default class BehaviourEmitter extends Emitter {\r\n\r\n\t/**\r\n\t * The BehaviourEmitter class inherits from Proton.Emitter\r\n\t *\r\n\t * use the BehaviourEmitter you can add behaviours to self;\r\n\t * @class Proton.BehaviourEmitter\r\n\t * @constructor\r\n\t * @param {Object} pObj the parameters object;\r\n\t */\r\n\tconstructor(pObj) {\r\n\t\tsuper(pObj);\r\n\r\n\t\tthis.selfBehaviours = [];\r\n\t};\r\n\t\r\n\t/**\r\n\t * add the Behaviour to emitter;\r\n\t *\r\n\t * you can use Behaviours array:emitter.addSelfBehaviour(Behaviour1,Behaviour2,Behaviour3);\r\n\t * @method addSelfBehaviour\r\n\t * @param {Proton.Behaviour} behaviour like this new Proton.Color('random')\r\n\t */\r\n\taddSelfBehaviour(...rest) {\r\n\t\tconst length = rest.length;\r\n\t\tlet i;\r\n\r\n\t\tfor (i = 0; i < length; i++) {\r\n\t\t\tthis.selfBehaviours.push(rest[i]);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * remove the Behaviour for self\r\n\t * @method removeSelfBehaviour\r\n\t * @param {Proton.Behaviour} behaviour a behaviour\r\n\t */\r\n\tremoveSelfBehaviour(behaviour) {\r\n\t\tconst index = this.selfBehaviours.indexOf(behaviour);\r\n\t\tif (index > -1) this.selfBehaviours.splice(index, 1);\r\n\t};\r\n\r\n\tupdate(time) {\r\n\t\tsuper.update(time);\r\n\r\n\t\tif (!this.sleep) {\r\n\t\t\tconst length = this.selfBehaviours.length;\r\n\t\t\tlet i;\r\n\r\n\t\t\tfor (i = 0; i < length; i++) {\r\n\t\t\t\tthis.selfBehaviours[i].applyBehaviour(this, time, i);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}","import Util from '../utils/Util';\r\nimport Emitter from './Emitter';\r\n\r\nexport default class FollowEmitter extends Emitter {\r\n\r\n\t/**\r\n\t * The FollowEmitter class inherits from Proton.Emitter\r\n\t *\r\n\t * use the FollowEmitter will emit particle when mousemoving\r\n\t *\r\n\t * @class Proton.FollowEmitter\r\n\t * @constructor\r\n\t * @param {Element} mouseTarget mouseevent's target;\r\n\t * @param {Number} ease the easing of following speed;\r\n\t * @default 0.7\r\n\t * @param {Object} pObj the parameters object;\r\n\t */\r\n\tconstructor(mouseTarget, ease, pObj) {\r\n\t\tsuper(pObj);\r\n\r\n\t\tthis.mouseTarget = Util.initValue(mouseTarget, window);\r\n\t\tthis.ease = Util.initValue(ease, .7);\r\n\r\n\t\tthis._allowEmitting = false;\r\n\t\tthis.initEventHandler();\r\n\t};\r\n\r\n\tinitEventHandler() {\r\n\t\tthis.mousemoveHandler = e => this.mousemove.call(this, e);\r\n\t\tthis.mousedownHandler = e => this.mousedown.call(this, e);\r\n\t\tthis.mouseupHandler = e => this.mouseup.call(this, e);\r\n\r\n\t\tthis.mouseTarget.addEventListener('mousemove', this.mousemoveHandler, false);\r\n\t}\r\n\r\n\t/**\r\n\t * start emit particle\r\n\t * @method emit\r\n\t */\r\n\temit() {\r\n\t\tthis._allowEmitting = true;\r\n\t}\r\n\r\n\t/**\r\n\t * stop emiting\r\n\t * @method stop\r\n\t */\r\n\tstop() {\r\n\t\tthis._allowEmitting = false;\r\n\t}\r\n\r\n\tmousemove(e) {\r\n\t\tif (e.layerX || e.layerX === 0) {\r\n\t\t\tthis.p.x += (e.layerX - this.p.x) * this.ease;\r\n\t\t\tthis.p.y += (e.layerY - this.p.y) * this.ease;\r\n\t\t} else if (e.offsetX || e.offsetX === 0) {\r\n\t\t\tthis.p.x += (e.offsetX - this.p.x) * this.ease;\r\n\t\t\tthis.p.y += (e.offsetY - this.p.y) * this.ease;\r\n\t\t}\r\n\r\n\t\tif (this._allowEmitting) super.emit('once');\r\n\t};\r\n\r\n\t/**\r\n\t * Destory this Emitter\r\n\t * @method destroy\r\n\t */\r\n\tdestroy() {\r\n\t\tsuper.destroy();\r\n\t\tthis.mouseTarget.removeEventListener('mousemove', this.mousemoveHandler, false);\r\n\t}\r\n\r\n}\r\n","import Pool from '../core/Pool';\r\nimport Util from '../utils/Util';\r\n\r\nexport default class BaseRenderer {\r\n\r\n constructor(element, stroke) {\r\n this.element = element;\r\n this.stroke = stroke;\r\n\r\n this.initHandler();\r\n\r\n this.circleConf = { isCircle: true };\r\n this.pool = new Pool();\r\n this.name = 'BaseRenderer';\r\n }\r\n\r\n setStroke(color, thinkness) {\r\n color = Util.initValue(color, '#000000');\r\n thinkness = Util.initValue(thinkness, 1);\r\n\r\n this.stroke = { color, thinkness };\r\n }\r\n\r\n initHandler() {\r\n this._protonUpdateHandler = () => { this.onProtonUpdate.call(this) };\r\n this._protonUpdateAfterHandler = () => { this.onProtonUpdateAfter.call(this) };\r\n this._emitterAddedHandler = (emitter) => { this.onEmitterAdded.call(this, emitter) };\r\n this._emitterRemovedHandler = (emitter) => { this.onEmitterRemoved.call(this, emitter) };\r\n this._particleCreatedHandler = (particle) => { this.onParticleCreated.call(this, particle) };\r\n this._particleUpdateHandler = (particle) => { this.onParticleUpdate.call(this, particle) };\r\n this._particleDeadHandler = (particle) => { this.onParticleDead.call(this, particle) };\r\n }\r\n\r\n init(proton) {\r\n this.parent = proton;\r\n\r\n proton.addEventListener('PROTON_UPDATE', this._protonUpdateHandler);\r\n proton.addEventListener('PROTON_UPDATE_AFTER', this._protonUpdateAfterHandler);\r\n\r\n proton.addEventListener('EMITTER_ADDED', this._emitterAddedHandler);\r\n proton.addEventListener('EMITTER_REMOVED', this._emitterRemovedHandler);\r\n\r\n proton.addEventListener('PARTICLE_CREATED', this._particleCreatedHandler);\r\n proton.addEventListener('PARTICLE_UPDATE', this._particleUpdateHandler);\r\n proton.addEventListener('PARTICLE_DEAD', this._particleDeadHandler);\r\n }\r\n\r\n resize(width, height) {}\r\n\r\n remove(proton) {\r\n this.parent.removeEventListener('PROTON_UPDATE', this._protonUpdateHandler);\r\n this.parent.removeEventListener('PROTON_UPDATE_AFTER', this._protonUpdateAfterHandler);\r\n\r\n this.parent.removeEventListener('EMITTER_ADDED', this._emitterAddedHandler);\r\n this.parent.removeEventListener('EMITTER_REMOVED', this._emitterRemovedHandler);\r\n\r\n this.parent.removeEventListener('PARTICLE_CREATED', this._particleCreatedHandler);\r\n this.parent.removeEventListener('PARTICLE_UPDATE', this._particleUpdateHandler);\r\n this.parent.removeEventListener('PARTICLE_DEAD', this._particleDeadHandler);\r\n\r\n this.parent = null;\r\n }\r\n\r\n destroy(){\r\n this.remove();\r\n }\r\n \r\n onProtonUpdate() {}\r\n onProtonUpdateAfter() {}\r\n\r\n onEmitterAdded(emitter) {}\r\n onEmitterRemoved(emitter) {}\r\n\r\n onParticleCreated(particle) {}\r\n onParticleUpdate(particle) {}\r\n onParticleDead(particle) {}\r\n}","import Util from '../utils/Util';\r\nimport ImgUtil from '../utils/ImgUtil';\r\nimport ColorUtil from '../utils/ColorUtil';\r\nimport MathUtils from '../math/MathUtils';\r\nimport BaseRenderer from './BaseRenderer';\r\n\r\nexport default class CanvasRenderer extends BaseRenderer {\r\n\r\n constructor(element) {\r\n super(element);\r\n\r\n this.stroke = null;\r\n this.context = this.element.getContext(\"2d\");\r\n this.bufferCache = {};\r\n\r\n this.name = 'CanvasRenderer';\r\n }\r\n\r\n resize(width, height) {\r\n this.element.width = width;\r\n this.element.height = height;\r\n }\r\n\r\n onProtonUpdate() {\r\n this.context.clearRect(0, 0, this.element.width, this.element.height);\r\n }\r\n\r\n onParticleCreated(particle) {\r\n if (particle.body)\r\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\r\n else\r\n particle.color = particle.color || '#ff0000';\r\n }\r\n\r\n onParticleUpdate(particle) {\r\n if (particle.body) {\r\n if (particle.body instanceof Image) this.drawImage(particle);\r\n } else {\r\n this.drawCircle(particle);\r\n }\r\n }\r\n\r\n onParticleDead(particle) {\r\n particle.body = null;\r\n }\r\n\r\n\r\n // private \r\n addImg2Body(img, particle) {\r\n particle.body = img;\r\n }\r\n\r\n // private drawCircle --\r\n drawImage(particle) {\r\n const w = particle.body.width * particle.scale | 0;\r\n const h = particle.body.height * particle.scale | 0;\r\n const x = particle.p.x - w / 2;\r\n const y = particle.p.y - h / 2;\r\n\r\n if (!!particle.color) {\r\n if (!particle.transform[\"buffer\"]) particle.transform.buffer = this.createBuffer(particle.body);\r\n\r\n const bufferContext = particle.transform.buffer.getContext('2d');\r\n bufferContext.clearRect(0, 0, particle.transform.buffer.width, particle.transform.buffer.height);\r\n bufferContext.globalAlpha = particle.alpha;\r\n bufferContext.drawImage(particle.body, 0, 0);\r\n\r\n bufferContext.globalCompositeOperation = \"source-atop\";\r\n bufferContext.fillStyle = ColorUtil.rgbToHex(particle.transform.rgb);\r\n bufferContext.fillRect(0, 0, particle.transform.buffer.width, particle.transform.buffer.height);\r\n bufferContext.globalCompositeOperation = \"source-over\";\r\n bufferContext.globalAlpha = 1;\r\n\r\n this.context.drawImage(particle.transform.buffer, 0, 0, particle.transform.buffer.width, particle.transform.buffer.height, x, y, w, h);\r\n } else {\r\n this.context.save();\r\n\r\n this.context.globalAlpha = particle.alpha;\r\n this.context.translate(particle.p.x, particle.p.y);\r\n this.context.rotate(MathUtils.degreeTransform(particle.rotation));\r\n this.context.translate(-particle.p.x, -particle.p.y);\r\n this.context.drawImage(particle.body, 0, 0, particle.body.width, particle.body.height, x, y, w, h);\r\n\r\n this.context.globalAlpha = 1;\r\n this.context.restore();\r\n }\r\n }\r\n\r\n // private drawCircle --\r\n drawCircle(particle) {\r\n if (particle.transform[\"rgb\"])\r\n this.context.fillStyle = 'rgba(' + particle.transform.rgb.r + ',' + particle.transform.rgb.g + ',' + particle.transform.rgb.b + ',' + particle.alpha + ')';\r\n else\r\n this.context.fillStyle = particle.color;\r\n\r\n // draw circle\r\n this.context.beginPath();\r\n this.context.arc(particle.p.x, particle.p.y, particle.radius, 0, Math.PI * 2, true);\r\n\r\n if (this.stroke) {\r\n this.context.strokeStyle = this.stroke.color;\r\n this.context.lineWidth = this.stroke.thinkness;\r\n this.context.stroke();\r\n }\r\n\r\n this.context.closePath();\r\n this.context.fill();\r\n }\r\n\r\n // private createBuffer --\r\n createBuffer(image) {\r\n if (image instanceof Image) {\r\n const size = image.width + '_' + image.height;\r\n let canvas = this.bufferCache[size];\r\n\r\n if (!canvas) {\r\n canvas = document.createElement('canvas');\r\n canvas.width = image.width;\r\n canvas.height = image.height;\r\n this.bufferCache[size] = canvas;\r\n }\r\n\r\n return canvas;\r\n }\r\n }\r\n}","import Util from '../utils/Util';\r\nimport DomUtil from '../utils/DomUtil';\r\nimport ImgUtil from '../utils/ImgUtil';\r\nimport MathUtils from '../math/MathUtils';\r\nimport BaseRenderer from './BaseRenderer';\r\n\r\nexport default class DomRenderer extends BaseRenderer {\r\n\r\n constructor(element) {\r\n super(element);\r\n\r\n this.stroke = null;\r\n this.pool.create = (body, particle) => this.createBody(body, particle);\r\n this.addImg2Body = this.addImg2Body.bind(this);\r\n\r\n this.transform3d = false;\r\n\r\n this.name = 'DomRenderer';\r\n }\r\n\r\n onParticleCreated(particle) {\r\n if (particle.body) {\r\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\r\n } else {\r\n particle.body = this.pool.get(this.circleConf, particle);\r\n this.element.appendChild(particle.body);\r\n }\r\n }\r\n\r\n onParticleUpdate(particle) {\r\n if (this.bodyReady(particle)) {\r\n if (this.transform3d)\r\n DomUtil.transform3d(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);\r\n else\r\n DomUtil.transform(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);\r\n\r\n particle.body.style.opacity = particle.alpha;\r\n if (particle.body.isCircle) {\r\n particle.body.style.backgroundColor = particle.color || '#ff0000';\r\n }\r\n }\r\n }\r\n\r\n onParticleDead(particle) {\r\n if (this.bodyReady(particle)) {\r\n this.element.removeChild(particle.body);\r\n this.pool.expire(particle.body);\r\n particle.body = null;\r\n }\r\n }\r\n\r\n bodyReady(particle) {\r\n return typeof particle.body === 'object' && particle.body && !particle.body.isInner;\r\n }\r\n\r\n // private \r\n addImg2Body(img, particle) {\r\n if (particle.dead) return;\r\n particle.body = this.pool.get(img, particle);\r\n DomUtil.resize(particle.body, img.width, img.height);\r\n\r\n this.element.appendChild(particle.body);\r\n }\r\n\r\n createBody(body, particle) {\r\n if (body.isCircle)\r\n return this.createCircle(particle);\r\n else\r\n return this.createSprite(body, particle);\r\n }\r\n\r\n // private --\r\n createCircle(particle) {\r\n const dom = DomUtil.createDiv(`${particle.id}_dom`, 2 * particle.radius, 2 * particle.radius);\r\n dom.style.borderRadius = `${particle.radius}px`;\r\n\r\n if (this.stroke) {\r\n dom.style.borderColor = this.stroke.color;\r\n dom.style.borderWidth = `${this.stroke.thinkness}px`;\r\n }\r\n dom.isCircle = true;\r\n\r\n return dom;\r\n }\r\n\r\n createSprite(body, particle) {\r\n const url = typeof body === 'string' ? body : body.src;\r\n const dom = DomUtil.createDiv(`${particle.id}_dom`, body.width, body.height);\r\n dom.style.backgroundImage = `url(${url})`;\r\n\r\n return dom;\r\n }\r\n\r\n}","import Util from '../utils/Util';\r\nimport BaseRenderer from './BaseRenderer';\r\n\r\nexport default class EaselRenderer extends BaseRenderer {\r\n\r\n constructor(element, stroke) {\r\n super(element);\r\n\r\n this.stroke = stroke;\r\n this.name = 'EaselRenderer';\r\n }\r\n\r\n onParticleCreated(particle) {\r\n if (particle.body) {\r\n this.createSprite(particle);\r\n } else {\r\n this.createCircle(particle);\r\n }\r\n\r\n this.element.addChild(particle.body);\r\n }\r\n\r\n onParticleUpdate(particle) {\r\n if (particle.body) {\r\n particle.body.x = particle.p.x;\r\n particle.body.y = particle.p.y;\r\n\r\n particle.body.alpha = particle.alpha;\r\n particle.body.scaleX = particle.body.scaleY = particle.scale;\r\n particle.body.rotation = particle.rotation;\r\n }\r\n }\r\n\r\n onParticleDead(particle) {\r\n if (particle.body) {\r\n particle.body.parent && particle.body.parent.removeChild(particle.body);\r\n this.pool.expire(particle.body);\r\n particle.body = null;\r\n }\r\n\r\n if (particle.graphics) this.pool.expire(particle.graphics);\r\n }\r\n\r\n // private\r\n createSprite(particle) {\r\n particle.body = this.pool.get(particle.body);\r\n\r\n if (particle.body.parent) return;\r\n if (particle.body['image']) {\r\n particle.body.regX = particle.body.image.width / 2;\r\n particle.body.regY = particle.body.image.height / 2;\r\n }\r\n }\r\n\r\n createCircle(particle) {\r\n const graphics = this.pool.get(createjs.Graphics);\r\n\r\n if (this.stroke) {\r\n if (this.stroke instanceof String)\r\n graphics.beginStroke(this.stroke);\r\n else\r\n graphics.beginStroke('#000000');\r\n }\r\n graphics.beginFill(particle.color || '#ff0000').drawCircle(0, 0, particle.radius);\r\n\r\n const shape = this.pool.get(createjs.Shape, [graphics]);\r\n\r\n particle.body = shape;\r\n particle.graphics = graphics;\r\n }\r\n\r\n}","import Util from '../utils/Util';\r\nimport Rectangle from '../math/Rectangle';\r\nimport BaseRenderer from './BaseRenderer';\r\n\r\nexport default class PixelRenderer extends BaseRenderer {\r\n\r\n constructor(element, rectangle) {\r\n super(element);\r\n\r\n this.context = this.element.getContext('2d');\r\n this.imageData = null;\r\n this.rectangle = null;\r\n this.rectangle = rectangle;\r\n this.createImageData(rectangle);\r\n\r\n this.name = 'PixelRenderer';\r\n }\r\n\r\n resize(width, height) {\r\n this.element.width = width;\r\n this.element.height = height;\r\n }\r\n\r\n createImageData(rectangle) {\r\n this.rectangle = rectangle ? rectangle : new Rectangle(0, 0, this.element.width, this.element.height);\r\n this.imageData = this.context.createImageData(this.rectangle.width, this.rectangle.height);\r\n this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);\r\n }\r\n\r\n onProtonUpdate() {\r\n this.context.clearRect(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height);\r\n this.imageData = this.context.getImageData(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height);\r\n }\r\n\r\n onProtonUpdateAfter() {\r\n this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);\r\n }\r\n\r\n onParticleCreated(particle) {}\r\n\r\n onParticleUpdate(particle) {\r\n if (this.imageData) {\r\n this.setPixel(this.imageData, Math.floor(particle.p.x - this.rectangle.x), Math.floor(particle.p.y - this.rectangle.y), particle);\r\n }\r\n }\r\n\r\n setPixel(imagedata, x, y, particle) {\r\n const rgb = particle.transform.rgb;\r\n\r\n if ((x < 0) || (x > this.element.width) || (y < 0) || (y > this.elementwidth))\r\n return;\r\n\r\n const i = ((y >> 0) * imagedata.width + (x >> 0)) * 4;\r\n\r\n imagedata.data[i] = rgb.r;\r\n imagedata.data[i + 1] = rgb.g;\r\n imagedata.data[i + 2] = rgb.b;\r\n imagedata.data[i + 3] = particle.alpha * 255;\r\n }\r\n\r\n onParticleDead(particle) {\r\n\r\n }\r\n\r\n}","import Pool from '../core/Pool';\r\nimport Util from '../utils/Util';\r\nimport ColorUtil from '../utils/ColorUtil';\r\nimport MathUtils from '../math/MathUtils';\r\nimport BaseRenderer from './BaseRenderer';\r\n\r\nexport default class PixiRenderer extends BaseRenderer {\r\n\r\n constructor(element, stroke) {\r\n super(element);\r\n\r\n this.stroke = stroke;\r\n this.setColor = false;\r\n this.pool.create = (body, particle) => this.createBody(body, particle);\r\n this.name = 'PixiRenderer';\r\n }\r\n\r\n onProtonUpdate() { }\r\n\r\n /**\r\n * @param particle\r\n */\r\n onParticleCreated(particle) {\r\n if (particle.body) {\r\n particle.body = this.pool.get(particle.body, particle);\r\n } else {\r\n particle.body = this.pool.get(this.circleConf, particle);\r\n }\r\n\r\n this.element.addChild(particle.body);\r\n }\r\n\r\n /**\r\n * @param particle\r\n */\r\n onParticleUpdate(particle) {\r\n this.transform(particle, particle.body);\r\n if (this.setColor) particle.body.tint = ColorUtil.getHex16FromParticle(particle);\r\n }\r\n\r\n /**\r\n * @param particle\r\n */\r\n onParticleDead(particle) {\r\n this.element.removeChild(particle.body);\r\n this.pool.expire(particle.body);\r\n particle.body = null;\r\n }\r\n\r\n destroy(particles) {\r\n super.destroy();\r\n this.pool.destroy();\r\n\r\n let i = particles.length;\r\n while (i--) {\r\n let particle = particles[i];\r\n if (particle.body) {\r\n this.element.removeChild(particle.body);\r\n }\r\n }\r\n }\r\n\r\n transform(particle, target) {\r\n target.x = particle.p.x;\r\n target.y = particle.p.y;\r\n\r\n target.alpha = particle.alpha;\r\n\r\n target.scale.x = particle.scale;\r\n target.scale.y = particle.scale;\r\n\r\n // using cached version of MathUtils.PI_180 for slight performance increase.\r\n target.rotation = particle.rotation * MathUtils.PI_180; // MathUtils.PI_180;\r\n }\r\n\r\n createBody(body, particle) {\r\n if (body.isCircle)\r\n return this.createCircle(particle);\r\n else\r\n return this.createSprite(body);\r\n }\r\n\r\n createSprite(body) {\r\n const sprite = body.isInner ? PIXI.Sprite.fromImage(body.src) : new PIXI.Sprite(body);\r\n sprite.anchor.x = 0.5;\r\n sprite.anchor.y = 0.5;\r\n\r\n return sprite;\r\n }\r\n\r\n createCircle(particle) {\r\n const graphics = new PIXI.Graphics();\r\n\r\n if (this.stroke) {\r\n let stroke = this.stroke instanceof String ? this.stroke : 0x000000;\r\n graphics.beginStroke(this.stroke);\r\n }\r\n\r\n graphics.beginFill(particle.color || 0x008ced);\r\n graphics.drawCircle(0, 0, particle.radius);\r\n graphics.endFill();\r\n\r\n return graphics;\r\n }\r\n}","import Mat3 from '../math/Mat3';\r\n\r\nexport default class MStack {\r\n\r\n\tconstructor() {\r\n\t\tthis.mats = [];\r\n\t\tthis.size = 0;\r\n\r\n\t\tfor (let i = 0; i < 20; i++) this.mats.push(Mat3.create([0, 0, 0, 0, 0, 0, 0, 0, 0]));\r\n\t}\r\n\r\n\tset(m, i) {\r\n\t\tif (i == 0)\r\n\t\t\tMat3.set(m, this.mats[0]);\r\n\t\telse\r\n\t\t\tMat3.multiply(this.mats[i - 1], m, this.mats[i]);\r\n\r\n\t\tthis.size = Math.max(this.size, i + 1);\r\n\t}\r\n\r\n\tpush(m) {\r\n\t\tif (this.size == 0)\r\n\t\t\tMat3.set(m, this.mats[0]);\r\n\t\telse\r\n\t\t\tMat3.multiply(this.mats[this.size - 1], m, this.mats[this.size]);\r\n\r\n\t\tthis.size++;\r\n\t}\r\n\r\n\tpop() {\r\n\t\tif (this.size > 0)\r\n\t\t\tthis.size--;\r\n\t}\r\n\r\n\ttop() {\r\n\t\treturn (this.mats[this.size - 1]);\r\n\t}\r\n}","import Mat3 from '../math/Mat3';\r\nimport BaseRenderer from './BaseRenderer';\r\n\r\nimport Util from '../utils/Util';\r\nimport ImgUtil from '../utils/ImgUtil';\r\nimport MStack from '../utils/MStack';\r\nimport DomUtil from '../utils/DomUtil';\r\nimport WebGLUtil from '../utils/WebGLUtil';\r\nimport MathUtils from '../math/MathUtils';\r\n\r\nexport default class WebGLRenderer extends BaseRenderer {\r\n\r\n constructor(element) {\r\n super(element);\r\n\r\n this.gl = this.element.getContext('experimental-webgl', { antialias: true, stencil: false, depth: false });\r\n if (!this.gl) alert(\"Sorry your browser do not suppest WebGL!\");\r\n\r\n this.initVar();\r\n this.setMaxRadius();\r\n this.initShaders();\r\n this.initBuffers();\r\n\r\n this.gl.blendEquation(this.gl.FUNC_ADD);\r\n this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\r\n this.gl.enable(this.gl.BLEND);\r\n\r\n this.addImg2Body = this.addImg2Body.bind(this);\r\n\r\n this.name = 'WebGLRenderer';\r\n }\r\n\r\n init(proton) {\r\n super.init(proton);\r\n this.resize(this.element.width, this.element.height);\r\n }\r\n\r\n resize(width, height) {\r\n this.umat[4] = -2;\r\n this.umat[7] = 1;\r\n\r\n this.smat[0] = 1 / width;\r\n this.smat[4] = 1 / height;\r\n\r\n this.mstack.set(this.umat, 0);\r\n this.mstack.set(this.smat, 1);\r\n\r\n this.gl.viewport(0, 0, width, height);\r\n this.element.width = width;\r\n this.element.height = height;\r\n }\r\n\r\n setMaxRadius(radius) {\r\n this.circleCanvasURL = this.createCircle(radius);\r\n }\r\n\r\n getVertexShader() {\r\n const vsSource = [\"uniform vec2 viewport;\", \"attribute vec2 aVertexPosition;\", \"attribute vec2 aTextureCoord;\", \"uniform mat3 tMat;\", \"varying vec2 vTextureCoord;\", \"varying float alpha;\", \"void main() {\", \"vec3 v = tMat * vec3(aVertexPosition, 1.0);\", \"gl_Position = vec4(v.x, v.y, 0, 1);\", \"vTextureCoord = aTextureCoord;\", \"alpha = tMat[0][2];\", \"}\"].join(\"\\n\");\r\n return vsSource;\r\n }\r\n\r\n getFragmentShader() {\r\n const fsSource = [\"precision mediump float;\", \"varying vec2 vTextureCoord;\", \"varying float alpha;\", \"uniform sampler2D uSampler;\", \"uniform vec4 color;\", \"uniform bool useTexture;\", \"uniform vec3 uColor;\", \"void main() {\", \"vec4 textureColor = texture2D(uSampler, vTextureCoord);\", \"gl_FragColor = textureColor * vec4(uColor, 1.0);\", \"gl_FragColor.w *= alpha;\", \"}\"].join(\"\\n\");\r\n return fsSource;\r\n }\r\n\r\n initVar() {\r\n this.mstack = new MStack();\r\n this.umat = Mat3.create([2, 0, 1, 0, -2, 0, -1, 1, 1]);\r\n this.smat = Mat3.create([1 / 100, 0, 1, 0, 1 / 100, 0, 0, 0, 1]);\r\n this.texturebuffers = {};\r\n }\r\n\r\n blendEquation(A) {\r\n this.gl.blendEquation(this.gl[A]);\r\n }\r\n\r\n blendFunc(A, B) {\r\n this.gl.blendFunc(this.gl[A], this.gl[B]);\r\n }\r\n\r\n getShader(gl, str, fs) {\r\n const shader = fs ? gl.createShader(gl.FRAGMENT_SHADER) : gl.createShader(gl.VERTEX_SHADER);\r\n\r\n gl.shaderSource(shader, str);\r\n gl.compileShader(shader);\r\n\r\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\r\n alert(gl.getShaderInfoLog(shader));\r\n return null;\r\n }\r\n\r\n return shader;\r\n }\r\n\r\n initShaders() {\r\n const fragmentShader = this.getShader(this.gl, this.getFragmentShader(), true);\r\n const vertexShader = this.getShader(this.gl, this.getVertexShader(), false);\r\n\r\n this.sprogram = this.gl.createProgram();\r\n this.gl.attachShader(this.sprogram, vertexShader);\r\n this.gl.attachShader(this.sprogram, fragmentShader);\r\n this.gl.linkProgram(this.sprogram);\r\n\r\n if (!this.gl.getProgramParameter(this.sprogram, this.gl.LINK_STATUS))\r\n alert(\"Could not initialise shaders\");\r\n\r\n this.gl.useProgram(this.sprogram);\r\n this.sprogram.vpa = this.gl.getAttribLocation(this.sprogram, \"aVertexPosition\");\r\n this.sprogram.tca = this.gl.getAttribLocation(this.sprogram, \"aTextureCoord\");\r\n this.gl.enableVertexAttribArray(this.sprogram.tca);\r\n this.gl.enableVertexAttribArray(this.sprogram.vpa);\r\n\r\n this.sprogram.tMatUniform = this.gl.getUniformLocation(this.sprogram, \"tMat\");\r\n this.sprogram.samplerUniform = this.gl.getUniformLocation(this.sprogram, \"uSampler\");\r\n this.sprogram.useTex = this.gl.getUniformLocation(this.sprogram, \"useTexture\");\r\n this.sprogram.color = this.gl.getUniformLocation(this.sprogram, \"uColor\");\r\n this.gl.uniform1i(this.sprogram.useTex, 1);\r\n };\r\n\r\n initBuffers() {\r\n const vs = [0, 3, 1, 0, 2, 3];\r\n let idx;\r\n\r\n this.unitIBuffer = this.gl.createBuffer();\r\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);\r\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(vs), this.gl.STATIC_DRAW);\r\n\r\n let i;\r\n let ids = [];\r\n for (i = 0; i < 100; i++) ids.push(i);\r\n idx = new Uint16Array(ids);\r\n\r\n this.unitI33 = this.gl.createBuffer();\r\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitI33);\r\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);\r\n\r\n ids = [];\r\n for (i = 0; i < 100; i++) ids.push(i, i + 1, i + 2);\r\n idx = new Uint16Array(ids);\r\n\r\n this.stripBuffer = this.gl.createBuffer();\r\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.stripBuffer);\r\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);\r\n };\r\n\r\n createCircle(raidus) {\r\n this.circleCanvasRadius = WebGLUtil.nhpot(Util.initValue(raidus, 32));\r\n const canvas = DomUtil.createCanvas('circle_canvas', this.circleCanvasRadius * 2, this.circleCanvasRadius * 2);\r\n const context = canvas.getContext('2d');\r\n\r\n context.beginPath();\r\n context.arc(this.circleCanvasRadius, this.circleCanvasRadius, this.circleCanvasRadius, 0, Math.PI * 2, true);\r\n context.closePath();\r\n context.fillStyle = '#FFF';\r\n context.fill();\r\n\r\n return canvas.toDataURL();\r\n };\r\n\r\n drawImg2Canvas(particle) {\r\n const _w = particle.body.width;\r\n const _h = particle.body.height;\r\n\r\n const _width = WebGLUtil.nhpot(particle.body.width);\r\n const _height = WebGLUtil.nhpot(particle.body.height);\r\n\r\n const _scaleX = particle.body.width / _width;\r\n const _scaleY = particle.body.height / _height;\r\n\r\n if (!this.texturebuffers[particle.transform.src])\r\n this.texturebuffers[particle.transform.src] = [this.gl.createTexture(), this.gl.createBuffer(), this.gl.createBuffer()];\r\n\r\n particle.transform.texture = this.texturebuffers[particle.transform.src][0];\r\n particle.transform.vcBuffer = this.texturebuffers[particle.transform.src][1];\r\n particle.transform.tcBuffer = this.texturebuffers[particle.transform.src][2];\r\n\r\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.tcBuffer);\r\n this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, _scaleX, 0.0, 0.0, _scaleY, _scaleY, _scaleY]), this.gl.STATIC_DRAW);\r\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.vcBuffer);\r\n this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, _w, 0.0, 0.0, _h, _w, _h]), this.gl.STATIC_DRAW);\r\n\r\n const context = particle.transform.canvas.getContext('2d');\r\n const data = context.getImageData(0, 0, _width, _height);\r\n\r\n this.gl.bindTexture(this.gl.TEXTURE_2D, particle.transform.texture);\r\n this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, data);\r\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);\r\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_NEAREST);\r\n this.gl.generateMipmap(this.gl.TEXTURE_2D);\r\n\r\n particle.transform.textureLoaded = true;\r\n particle.transform.textureWidth = _w;\r\n particle.transform.textureHeight = _h;\r\n }\r\n\r\n onProtonUpdate() {\r\n //this.gl.clearColor(0, 0, 0, 1);\r\n //this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);\r\n }\r\n\r\n onParticleCreated(particle) {\r\n particle.transform.textureLoaded = false;\r\n particle.transform.tmat = Mat3.create();\r\n particle.transform.tmat[8] = 1;\r\n particle.transform.imat = Mat3.create();\r\n particle.transform.imat[8] = 1;\r\n\r\n if (particle.body) {\r\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\r\n } else {\r\n ImgUtil.getImgFromCache(this.circleCanvasURL, this.addImg2Body, particle);\r\n particle.transform.oldScale = particle.radius / this.circleCanvasRadius;\r\n }\r\n }\r\n\r\n // private \r\n addImg2Body(img, particle) {\r\n if (particle.dead) return;\r\n \r\n particle.body = img;\r\n particle.transform.src = img.src;\r\n particle.transform.canvas = ImgUtil.getCanvasFromCache(img);\r\n particle.transform.oldScale = 1;\r\n\r\n this.drawImg2Canvas(particle);\r\n }\r\n\r\n onParticleUpdate(particle) {\r\n if (particle.transform.textureLoaded) {\r\n this.updateMatrix(particle);\r\n\r\n this.gl.uniform3f(this.sprogram.color, particle.transform.rgb.r / 255, particle.transform.rgb.g / 255, particle.transform.rgb.b / 255);\r\n this.gl.uniformMatrix3fv(this.sprogram.tMatUniform, false, this.mstack.top());\r\n\r\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.vcBuffer);\r\n this.gl.vertexAttribPointer(this.sprogram.vpa, 2, this.gl.FLOAT, false, 0, 0);\r\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.tcBuffer);\r\n this.gl.vertexAttribPointer(this.sprogram.tca, 2, this.gl.FLOAT, false, 0, 0);\r\n this.gl.bindTexture(this.gl.TEXTURE_2D, particle.transform.texture);\r\n this.gl.uniform1i(this.sprogram.samplerUniform, 0);\r\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);\r\n\r\n this.gl.drawElements(this.gl.TRIANGLES, 6, this.gl.UNSIGNED_SHORT, 0);\r\n\r\n this.mstack.pop();\r\n }\r\n }\r\n\r\n onParticleDead(particle) { }\r\n\r\n updateMatrix(particle) {\r\n const moveOriginMatrix = WebGLUtil.makeTranslation(-particle.transform.textureWidth / 2, -particle.transform.textureHeight / 2);\r\n const translationMatrix = WebGLUtil.makeTranslation(particle.p.x, particle.p.y);\r\n\r\n const angel = particle.rotation * (MathUtils.PI_180);\r\n const rotationMatrix = WebGLUtil.makeRotation(angel);\r\n\r\n const scale = particle.scale * particle.transform.oldScale;\r\n const scaleMatrix = WebGLUtil.makeScale(scale, scale);\r\n let matrix = WebGLUtil.matrixMultiply(moveOriginMatrix, scaleMatrix);\r\n\r\n matrix = WebGLUtil.matrixMultiply(matrix, rotationMatrix);\r\n matrix = WebGLUtil.matrixMultiply(matrix, translationMatrix);\r\n\r\n Mat3.inverse(matrix, particle.transform.imat);\r\n matrix[2] = particle.alpha;\r\n\r\n this.mstack.push(matrix);\r\n }\r\n}","import Util from '../utils/Util';\r\nimport BaseRenderer from './BaseRenderer';\r\n\r\nexport default class CustomRenderer extends BaseRenderer {\r\n\r\n constructor(element) {\r\n super(element);\r\n\r\n this.name = 'CustomRenderer';\r\n }\r\n\r\n}","import Zone from './Zone';\r\nimport Util from '../utils/Util';\r\nimport MathUtils from '../math/MathUtils';\r\n\r\nexport default class LineZone extends Zone {\r\n\r\n\tconstructor(x1, y1, x2, y2, direction) {\r\n\t\tsuper();\r\n\r\n\t\tif (x2 - x1 >= 0) {\r\n\t\t\tthis.x1 = x1;\r\n\t\t\tthis.y1 = y1;\r\n\t\t\tthis.x2 = x2;\r\n\t\t\tthis.y2 = y2;\r\n\t\t} else {\r\n\t\t\tthis.x1 = x2;\r\n\t\t\tthis.y1 = y2;\r\n\t\t\tthis.x2 = x1;\r\n\t\t\tthis.y2 = y1;\r\n\t\t}\r\n\r\n\t\tthis.dx = this.x2 - this.x1;\r\n\t\tthis.dy = this.y2 - this.y1;\r\n\r\n\t\tthis.minx = Math.min(this.x1, this.x2);\r\n\t\tthis.miny = Math.min(this.y1, this.y2);\r\n\t\tthis.maxx = Math.max(this.x1, this.x2);\r\n\t\tthis.maxy = Math.max(this.y1, this.y2);\r\n\r\n\t\tthis.dot = this.x2 * this.y1 - this.x1 * this.y2;\r\n\t\tthis.xxyy = this.dx * this.dx + this.dy * this.dy;\r\n\r\n\t\tthis.gradient = this.getGradient();\r\n\t\tthis.length = this.getLength();\r\n\t\tthis.direction = Util.initValue(direction, '>');\r\n\t}\r\n\r\n\r\n\tgetPosition() {\r\n\t\tthis.random = Math.random();\r\n\t\tthis.vector.x = this.x1 + this.random * this.length * Math.cos(this.gradient);\r\n\t\tthis.vector.y = this.y1 + this.random * this.length * Math.sin(this.gradient);\r\n\r\n\t\treturn this.vector;\r\n\t}\r\n\r\n\tgetDirection(x, y) {\r\n\t\tconst A = this.dy;\r\n\t\tconst B = -this.dx;\r\n\t\tconst C = this.dot;\r\n\t\tconst D = B == 0 ? 1 : B;\r\n\r\n\t\tif ((A * x + B * y + C) * D > 0)\r\n\t\t\treturn true;\r\n\t\telse\r\n\t\t\treturn false;\r\n\t}\r\n\r\n\tgetDistance(x, y) {\r\n\t\tconst A = this.dy;\r\n\t\tconst B = -this.dx;\r\n\t\tconst C = this.dot;\r\n\t\tconst D = (A * x + B * y + C);\r\n\r\n\t\treturn D / Math.sqrt(this.xxyy);\r\n\t}\r\n\r\n\tgetSymmetric(v) {\r\n\t\tconst tha2 = v.getGradient();\r\n\t\tconst tha1 = this.getGradient();\r\n\t\tconst tha = 2 * (tha1 - tha2);\r\n\r\n\t\tconst oldx = v.x;\r\n\t\tconst oldy = v.y;\r\n\r\n\t\tv.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);\r\n\t\tv.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);\r\n\r\n\t\treturn v;\r\n\t}\r\n\r\n\tgetGradient() {\r\n\t\treturn Math.atan2(this.dy, this.dx);\r\n\t}\r\n\r\n\trangeOut(particle) {\r\n\t\tconst angle = Math.abs(this.getGradient());\r\n\r\n\t\tif (angle <= MathUtils.PI / 4) {\r\n\t\t\tif (particle.p.x <= this.maxx && particle.p.x >= this.minx) return true;\r\n\t\t} else {\r\n\t\t\tif (particle.p.y <= this.maxy && particle.p.y >= this.miny) return true;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\tgetLength() {\r\n\t\treturn Math.sqrt(this.dx * this.dx + this.dy * this.dy)\r\n\t}\r\n\r\n\tcrossing(particle) {\r\n\t\tif (this.crossType == \"dead\") {\r\n\t\t\tif (this.direction == \">\" || this.direction == \"R\" || this.direction == \"right\" || this.direction == \"down\") {\r\n\t\t\t\tif (!this.rangeOut(particle)) return;\r\n\t\t\t\tif (this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;\r\n\t\t\t} else {\r\n\t\t\t\tif (!this.rangeOut(particle)) return;\r\n\t\t\t\tif (!this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\telse if (this.crossType == \"bound\") {\r\n\t\t\tif (!this.rangeOut(particle)) return;\r\n\r\n\t\t\tif (this.getDistance(particle.p.x, particle.p.y) <= particle.radius) {\r\n\t\t\t\tif (this.dx == 0) {\r\n\t\t\t\t\tparticle.v.x *= -1;\r\n\t\t\t\t} else if (this.dy == 0) {\r\n\t\t\t\t\tparticle.v.y *= -1;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.getSymmetric(particle.v);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\telse if (this.crossType == \"cross\") {\r\n\t\t\tif (this.alert) {\r\n\t\t\t\tconsole.error('Sorry lineZone does not support cross method');\r\n\t\t\t\tthis.alert = false;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n}","import Zone from './Zone';\r\nimport MathUtils from '../math/MathUtils';\r\n\r\nexport default class CircleZone extends Zone {\r\n\r\n constructor(x, y, radius) {\r\n super();\r\n\r\n this.x = x;\r\n this.y = y;\r\n this.radius = radius;\r\n\r\n this.angle = 0;\r\n this.center = { x, y };\r\n }\r\n\r\n getPosition() {\r\n this.random = Math.random();\r\n this.angle = MathUtils.PIx2 * Math.random();\r\n\r\n this.vector.x = this.x + this.random * this.radius * Math.cos(this.angle);\r\n this.vector.y = this.y + this.random * this.radius * Math.sin(this.angle);\r\n\r\n return this.vector;\r\n }\r\n\r\n setCenter(x, y) {\r\n this.center.x = x;\r\n this.center.y = y;\r\n }\r\n\r\n crossing(particle) {\r\n const d = particle.p.distanceTo(this.center);\r\n\r\n if (this.crossType == \"dead\") {\r\n if (d - particle.radius > this.radius)\r\n particle.dead = true;\r\n } else if (this.crossType == \"bound\") {\r\n if (d + particle.radius >= this.radius)\r\n this.getSymmetric(particle);\r\n } else if (this.crossType == \"cross\") {\r\n if (this.alert) {\r\n alert('Sorry CircleZone does not support cross method');\r\n this.alert = false;\r\n }\r\n }\r\n }\r\n\r\n getSymmetric(particle) {\r\n let tha2 = particle.v.getGradient();\r\n let tha1 = this.getGradient(particle);\r\n\r\n let tha = 2 * (tha1 - tha2);\r\n let oldx = particle.v.x;\r\n let oldy = particle.v.y;\r\n\r\n particle.v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);\r\n particle.v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);\r\n }\r\n\r\n getGradient(particle) {\r\n return -MathUtils.PI_2 + Math.atan2(particle.p.y - this.center.y, particle.p.x - this.center.x);\r\n }\r\n}","import Zone from './Zone';\r\n\r\nexport default class RectZone extends Zone {\r\n\r\n\tconstructor(x, y, width, height) {\r\n\t\tsuper();\r\n\r\n\t\tthis.x = x;\r\n\t\tthis.y = y;\r\n\t\tthis.width = width;\r\n\t\tthis.height = height;\r\n\t}\r\n\r\n\tgetPosition() {\r\n\t\tthis.vector.x = this.x + Math.random() * this.width;\r\n\t\tthis.vector.y = this.y + Math.random() * this.height;\r\n\r\n\t\treturn this.vector;\r\n\t}\r\n\r\n\tcrossing(particle) {\r\n\t\tif (this.crossType == \"dead\") {\r\n\t\t\tif (particle.p.x + particle.radius < this.x)\r\n\t\t\t\tparticle.dead = true;\r\n\t\t\telse if (particle.p.x - particle.radius > this.x + this.width)\r\n\t\t\t\tparticle.dead = true;\r\n\r\n\t\t\tif (particle.p.y + particle.radius < this.y)\r\n\t\t\t\tparticle.dead = true;\r\n\t\t\telse if (particle.p.y - particle.radius > this.y + this.height)\r\n\t\t\t\tparticle.dead = true;\r\n\t\t}\r\n\r\n\t\telse if (this.crossType == \"bound\") {\r\n\t\t\tif (particle.p.x - particle.radius < this.x) {\r\n\t\t\t\tparticle.p.x = this.x + particle.radius;\r\n\t\t\t\tparticle.v.x *= -1;\r\n\t\t\t} else if (particle.p.x + particle.radius > this.x + this.width) {\r\n\t\t\t\tparticle.p.x = this.x + this.width - particle.radius;\r\n\t\t\t\tparticle.v.x *= -1;\r\n\t\t\t}\r\n\r\n\t\t\tif (particle.p.y - particle.radius < this.y) {\r\n\t\t\t\tparticle.p.y = this.y + particle.radius;\r\n\t\t\t\tparticle.v.y *= -1;\r\n\t\t\t} else if (particle.p.y + particle.radius > this.y + this.height) {\r\n\t\t\t\tparticle.p.y = this.y + this.height - particle.radius;\r\n\t\t\t\tparticle.v.y *= -1;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\telse if (this.crossType == \"cross\") {\r\n\t\t\tif (particle.p.x + particle.radius < this.x && particle.v.x <= 0)\r\n\t\t\t\tparticle.p.x = this.x + this.width + particle.radius;\r\n\t\t\telse if (particle.p.x - particle.radius > this.x + this.width && particle.v.x >= 0)\r\n\t\t\t\tparticle.p.x = this.x - particle.radius;\r\n\r\n\t\t\tif (particle.p.y + particle.radius < this.y && particle.v.y <= 0)\r\n\t\t\t\tparticle.p.y = this.y + this.height + particle.radius;\r\n\t\t\telse if (particle.p.y - particle.radius > this.y + this.height && particle.v.y >= 0)\r\n\t\t\t\tparticle.p.y = this.y - particle.radius;\r\n\t\t}\r\n\t}\r\n}","import Zone from './Zone';\r\nimport Util from '../utils/Util';\r\n\r\nexport default class ImageZone extends Zone {\r\n\r\n\tconstructor(imageData, x, y, d) {\r\n\t\tsuper();\r\n\r\n\t\tthis.reset(imageData, x, y, d);\r\n\t}\r\n\r\n\treset(imageData, x, y, d) {\r\n\t\tthis.imageData = imageData;\r\n\t\tthis.x = Util.initValue(x, 0);\r\n\t\tthis.y = Util.initValue(y, 0);\r\n\t\tthis.d = Util.initValue(d, 2);\r\n\r\n\t\tthis.vectors = [];\r\n\t\tthis.setVectors();\r\n\t}\r\n\r\n\tsetVectors() {\r\n\t\tlet i, j;\r\n\t\tconst length1 = this.imageData.width;\r\n\t\tconst length2 = this.imageData.height;\r\n\r\n\t\tfor (i = 0; i < length1; i += this.d) {\r\n\t\t\tfor (j = 0; j < length2; j += this.d) {\r\n\t\t\t\tlet index = ((j >> 0) * length1 + (i >> 0)) * 4;\r\n\r\n\t\t\t\tif (this.imageData.data[index + 3] > 0) {\r\n\t\t\t\t\tthis.vectors.push({ x: i + this.x, y: j + this.y });\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.vector;\r\n\t}\r\n\r\n\tgetBound(x, y) {\r\n\t\tvar index = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;\r\n\t\tif (this.imageData.data[index + 3] > 0)\r\n\t\t\treturn true;\r\n\t\telse\r\n\t\t\treturn false;\r\n\t}\r\n\r\n\tgetPosition() {\r\n\t\treturn this.vector.copy(this.vectors[Math.floor(Math.random() * this.vectors.length)]);\r\n\t}\r\n\r\n\tgetColor(x, y) {\r\n\t\tx -= this.x;\r\n\t\ty -= this.y;\r\n\t\tvar i = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;\r\n\r\n\t\treturn {\r\n\t\t\tr: this.imageData.data[i],\r\n\t\t\tg: this.imageData.data[i + 1],\r\n\t\t\tb: this.imageData.data[i + 2],\r\n\t\t\ta: this.imageData.data[i + 3]\r\n\t\t};\r\n\t}\r\n\r\n\tcrossing(particle) {\r\n\t\tif (this.crossType == \"dead\") {\r\n\t\t\tif (this.getBound(particle.p.x - this.x, particle.p.y - this.y))\r\n\t\t\t\tparticle.dead = true;\r\n\t\t\telse\r\n\t\t\t\tparticle.dead = false;\r\n\t\t} \r\n\t\t\r\n\t\telse if (this.crossType == \"bound\") {\r\n\t\t\tif (!this.getBound(particle.p.x - this.x, particle.p.y - this.y))\r\n\t\t\t\tparticle.v.negate();\r\n\t\t}\r\n\t}\r\n}","import Util from '../utils/Util';\r\nimport ColorUtil from '../utils/ColorUtil';\r\nimport MathUtils from '../math/MathUtils';\r\nimport CircleZone from '../zone/CircleZone';\r\nimport PointZone from '../zone/PointZone';\r\nimport LineZone from '../zone/LineZone';\r\nimport RectZone from '../zone/RectZone';\r\n\r\nexport default {\r\n\taddEventListener(proton, fun) {\r\n\t\tproton.addEventListener(\"PROTON_UPDATE_AFTER\", () => fun());\r\n\t},\r\n\r\n\tgetStyle(color) {\r\n\t\tconst rgb = ColorUtil.hexToRGB(color || '#ff0000');\r\n\t\treturn `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.5)`;\r\n\t},\r\n\t\r\n\tdrawZone(proton, canvas, zone, clear) {\r\n\t\tconst context = canvas.getContext('2d');\r\n\t\tconst style = this.getStyle();\r\n\r\n\t\tthis.addEventListener(proton, () => {\r\n\t\t\tif (clear)\r\n\t\t\t\tcontext.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n\t\t\tif (zone instanceof PointZone) {\r\n\t\t\t\tcontext.beginPath();\r\n\t\t\t\tcontext.fillStyle = style;\r\n\t\t\t\tcontext.arc(zone.x, zone.y, 10, 0, Math.PI * 2, true);\r\n\t\t\t\tcontext.fill();\r\n\t\t\t\tcontext.closePath();\r\n\t\t\t} else if (zone instanceof LineZone) {\r\n\t\t\t\tcontext.beginPath();\r\n\t\t\t\tcontext.strokeStyle = style;\r\n\t\t\t\tcontext.moveTo(zone.x1, zone.y1);\r\n\t\t\t\tcontext.lineTo(zone.x2, zone.y2);\r\n\t\t\t\tcontext.stroke();\r\n\t\t\t\tcontext.closePath();\r\n\t\t\t} else if (zone instanceof RectZone) {\r\n\t\t\t\tcontext.beginPath();\r\n\t\t\t\tcontext.strokeStyle = style;\r\n\t\t\t\tcontext.drawRect(zone.x, zone.y, zone.width, zone.height);\r\n\t\t\t\tcontext.stroke();\r\n\t\t\t\tcontext.closePath();\r\n\t\t\t} else if (zone instanceof CircleZone) {\r\n\t\t\t\tcontext.beginPath();\r\n\t\t\t\tcontext.strokeStyle = style;\r\n\t\t\t\tcontext.arc(zone.x, zone.y, zone.radius, 0, Math.PI * 2, true);\r\n\t\t\t\tcontext.stroke();\r\n\t\t\t\tcontext.closePath();\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\t\r\n\tdrawEmitter(proton, canvas, emitter, clear) {\r\n\t\tconst context = canvas.getContext('2d');\r\n\t\tconst style = this.getStyle();\r\n\r\n\t\tthis.addEventListener(proton, () => {\r\n\t\t\tif (clear) context.clearRect(0, 0, canvas.width, canvas.height);\r\n\t\t\t\r\n\t\t\tcontext.beginPath();\r\n\t\t\tcontext.fillStyle = style;\r\n\t\t\tcontext.arc(emitter.p.x, emitter.p.y, 10, 0, Math.PI * 2, true);\r\n\t\t\tcontext.fill();\r\n\t\t\tcontext.closePath();\r\n\t\t});\r\n\t},\r\n}\r\n\r\n","// http://paulirish.com/2011/requestanimationframe-for-smart-animating/\r\n// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating\r\n\r\n// requestAnimationFrame polyfill by Erik Möller\r\n// fixes from Paul Irish and Tino Zijdel\r\n( function() {\r\n\t\tvar lastTime = 0;\r\n\t\tvar vendors = ['ms', 'moz', 'webkit', 'o'];\r\n\t\tfor (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\r\n\t\t\twindow.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];\r\n\t\t\twindow.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\r\n\t\t}\r\n\r\n\t\tif (!window.requestAnimationFrame)\r\n\t\t\twindow.requestAnimationFrame = function(callback, element) {\r\n\t\t\t\tvar currTime = new Date().getTime();\r\n\t\t\t\tvar timeToCall = Math.max(0, 16 - (currTime - lastTime));\r\n\t\t\t\tvar id = window.setTimeout(function() {\r\n\t\t\t\t\tcallback(currTime + timeToCall);\r\n\t\t\t\t}, timeToCall);\r\n\t\t\t\tlastTime = currTime + timeToCall;\r\n\t\t\t\treturn id;\r\n\t\t\t};\r\n\r\n\t\tif (!window.cancelAnimationFrame)\r\n\t\t\twindow.cancelAnimationFrame = function(id) {\r\n\t\t\t\tclearTimeout(id);\r\n\t\t\t};\r\n\t}()); ","// import \r\nimport Proton from \"./core/Proton\";\r\nimport Particle from \"./core/Particle\";\r\nimport Pool from \"./core/Pool\";\r\n\r\nimport Util from \"./utils/Util\";\r\nimport ColorUtil from \"./utils/ColorUtil\";\r\nimport MathUtils from \"./math/MathUtils\";\r\nimport Vector2D from \"./math/Vector2D\";\r\nimport Polar2D from \"./math/Polar2D\";\r\nimport Mat3 from \"./math/Mat3\";\r\nimport Span from \"./math/Span\";\r\nimport ArraySpan from \"./math/ArraySpan\";\r\nimport Rectangle from \"./math/Rectangle\";\r\nimport ease from \"./math/ease\";\r\n\r\nimport Rate from \"./initialize/Rate\";\r\nimport Initialize from \"./initialize/Initialize\";\r\nimport Life from \"./initialize/Life\";\r\nimport Position from \"./initialize/Position\";\r\nimport Velocity from \"./initialize/Velocity\";\r\nimport Mass from \"./initialize/Mass\";\r\nimport Radius from \"./initialize/Radius\";\r\nimport Body from \"./initialize/Body\";\r\n\r\nimport Behaviour from \"./behaviour/Behaviour\";\r\nimport Force from \"./behaviour/Force\";\r\nimport Attraction from \"./behaviour/Attraction\";\r\nimport RandomDrift from \"./behaviour/RandomDrift\";\r\nimport Gravity from \"./behaviour/Gravity\";\r\nimport Collision from \"./behaviour/Collision\";\r\nimport CrossZone from \"./behaviour/CrossZone\";\r\nimport Alpha from \"./behaviour/Alpha\";\r\nimport Scale from \"./behaviour/Scale\";\r\nimport Rotate from \"./behaviour/Rotate\";\r\nimport Color from \"./behaviour/Color\";\r\nimport Repulsion from \"./behaviour/Repulsion\";\r\nimport GravityWell from \"./behaviour/GravityWell\";\r\n\r\nimport Emitter from \"./emitter/Emitter\";\r\nimport BehaviourEmitter from \"./emitter/BehaviourEmitter\";\r\nimport FollowEmitter from \"./emitter/FollowEmitter\";\r\n\r\nimport CanvasRenderer from \"./render/CanvasRenderer\";\r\nimport DomRenderer from \"./render/DomRenderer\";\r\nimport EaselRenderer from \"./render/EaselRenderer\";\r\nimport PixelRenderer from \"./render/PixelRenderer\";\r\nimport PixiRenderer from \"./render/PixiRenderer\";\r\nimport WebGLRenderer from \"./render/WebGLRenderer\";\r\nimport CustomRenderer from \"./render/CustomRenderer\";\r\n\r\nimport Zone from \"./zone/Zone\";\r\nimport LineZone from \"./zone/LineZone\";\r\nimport CircleZone from \"./zone/CircleZone\";\r\nimport PointZone from \"./zone/PointZone\";\r\nimport RectZone from \"./zone/RectZone\";\r\nimport ImageZone from \"./zone/ImageZone\";\r\n\r\nimport Debug from \"./debug/Debug\";\r\nimport \"./polyfill/requestAnimationFrame\";\r\n\r\n// namespace\r\nProton.Particle = Proton.P = Particle;\r\nProton.Pool = Pool;\r\n\r\nProton.Util = Util;\r\nProton.ColorUtil = ColorUtil;\r\nProton.MathUtils = MathUtils;\r\nProton.Vector2D = Proton.Vector = Vector2D;\r\nProton.Polar2D = Proton.Polar = Polar2D;\r\nProton.ArraySpan = ArraySpan;\r\nProton.Rectangle = Rectangle;\r\nProton.Rate = Rate;\r\nProton.ease = ease;\r\nProton.Span = Span;\r\nProton.Mat3 = Mat3;\r\nProton.getSpan = (a, b, center) => new Span(a, b, center);\r\nProton.createArraySpan = ArraySpan.createArraySpan;\r\n\r\nProton.Initialize = Proton.Init = Initialize;\r\nProton.Life = Proton.L = Life;\r\nProton.Position = Proton.P = Position;\r\nProton.Velocity = Proton.V = Velocity;\r\nProton.Mass = Proton.M = Mass;\r\nProton.Radius = Proton.R = Radius;\r\nProton.Body = Proton.B = Body;\r\n\r\nProton.Behaviour = Behaviour;\r\nProton.Force = Proton.F = Force;\r\nProton.Attraction = Proton.A = Attraction;\r\nProton.RandomDrift = Proton.RD = RandomDrift;\r\nProton.Gravity = Proton.G = Gravity;\r\nProton.Collision = Collision;\r\nProton.CrossZone = CrossZone;\r\nProton.Alpha = Proton.A = Alpha;\r\nProton.Scale = Proton.S = Scale;\r\nProton.Rotate = Rotate;\r\nProton.Color = Color;\r\nProton.Repulsion = Repulsion;\r\nProton.GravityWell = GravityWell;\r\n\r\nProton.Emitter = Emitter;\r\nProton.BehaviourEmitter = BehaviourEmitter;\r\nProton.FollowEmitter = FollowEmitter;\r\n\r\nProton.Zone = Zone;\r\nProton.LineZone = LineZone;\r\nProton.CircleZone = CircleZone;\r\nProton.PointZone = PointZone;\r\nProton.RectZone = RectZone;\r\nProton.ImageZone = ImageZone;\r\n\r\nProton.CanvasRenderer = CanvasRenderer;\r\nProton.DomRenderer = DomRenderer;\r\nProton.EaselRenderer = EaselRenderer;\r\nProton.PixiRenderer = PixiRenderer;\r\nProton.PixelRenderer = PixelRenderer;\r\nProton.WebGLRenderer = Proton.WebGlRenderer = WebGLRenderer;\r\nProton.CustomRenderer = CustomRenderer;\r\n\r\nProton.Debug = Debug;\r\n\r\nObject.assign(Proton, ease);\r\n\r\n// export\r\nexport default Proton;"],"names":["PI","MathUtils","a","b","INT","Math","floor","random","center","f","this","randomAToB","display","num","toString","slice","Vector2D","x","y","atan2","PI_2","v","w","undefined","addVectors","subVectors","s","set","multiplyScalar","sqrt","divideScalar","length","distanceToSquared","tha","cos","sin","dx","dy","alpha","Span","isArray","Util","initValue","randomFloating","i","tx","ty","angleInRadians","c","sx","sy","a00","a01","a02","a10","a11","a12","a20","a21","a22","b00","b01","b02","b10","b11","b12","b20","b21","b22","id","width","height","position","dom","document","createElement","style","opacity","transform","resize","marginLeft","marginTop","div","scale","rotate","willChange","css3","key","val","bkey","charAt","toUpperCase","substr","IMG_CACHE","CANVAS_CACHE","context","image","rect","drawImage","imagedata","getImageData","clearRect","img","callback","param","src","Image","onload","e","target","WebGLUtil","canvas","DomUtil","createCanvas","getContext","value","defaults","Object","prototype","call","array","obj","ignore","o","indexOf","constructor","args","concat","bind","apply","pOBJ","hasProp","p","particle","copy","prototypeObject","filters","singleProp","hasOwnProperty","getSpanValue","pan","getValue","ImgUtil","arr","destroy","uid","getCacheID","cache","isInner","Pool","total","params","__puid","PUID","getID","pop","createOrClone","getCache","push","create","classApply","clone","count","Stats","proton","container","type","emitterIndex","rendererIndex","body","add","emitter","getEmitter","renderer","getRenderer","str","emitters","emitSpeed","getEmitterPos","initializes","concatArr","behaviours","name","getCreatedNumber","getCount","pool","innerHTML","cssText","join","addEventListener","_this","bg","color","parentNode","appendChild","renderers","result","cpool","round","EventDispatcher","_listeners","listener","removeEventListener","splice","listeners","handler","TargetClass","dispatchEvent","hasEventListener","removeAllEventListeners","Integration","particles","time","damping","eulerIntegrate","sleep","old","mass","clear","Proton","integrationType","oldTime","elapsed","stats","EULER","integrator","render","init","index","remove","parent","EMITTER_ADDED","EMITTER_REMOVED","PROTON_UPDATE","USE_CLOCK","Date","getTime","amendChangeTabsBug","emittersUpdate","PROTON_UPDATE_AFTER","update","getAllParticles","MEASURE","RK2","PARTICLE_CREATED","PARTICLE_UPDATE","PARTICLE_SLEEP","PARTICLE_DEAD","pow","ease","easeLinear","Particle","ID","reset","setPrototypeByObject","N180_PI","life","Infinity","age","energy","dead","sprite","radius","rotation","easing","destroyObject","removeAllBehaviours","rgb","r","g","applyBehaviours","max","applyBehaviour","behaviour","parents","initialize","addBehaviour","destroyArray","h","hex16","substring","parseInt","rbg","Number","Polar2D","abs","getX","getY","mat3","mat","Float32Array","mat1","mat2","m","vec","ArraySpan","_arr","randomColor","Rectangle","bottom","right","Rate","numpan","timepan","numPan","setSpanValue","timePan","startTime","nextTime","Initialize","Life","lifePan","Zone","vector","crossType","alert","PointZone","Position","zone","getPosition","Velocity","rpan","thapan","rPan","thaPan","vr","polar2d","normalizeVelocity","PI_180","Mass","massPan","Radius","oldRadius","Body","imagetarget","inner","Behaviour","getEasing","force","removeBehaviour","Force","fx","fy","normalizeForce","calculate","Attraction","targetPosition","normalizeValue","radiusSq","attractionForce","lengthSq","sub","normalize","RandomDrift","driftX","driftY","delay","panFoce","addXY","Gravity","Collision","collisionPool","delta","newPool","otherParticle","overlap","totalMass","averageMass1","averageMass2","distance","CrossZone","crossing","Alpha","same","alphaA","alphaB","Scale","scaleA","scaleB","Rotate","influence","rotationA","rotationB","getDirection","Color","createArraySpan","colorA","ColorUtil","hexToRGB","colorB","Repulsion","GravityWell","centerPoint","distanceVec","distanceSq","factor","bindEmitter","setVector2DByObject","degreeTransform","Emitter","pObj","emitTime","totalTime","rate","stoped","isNaN","oldStoped","oldEmitTime","oldTotalTime","initAll","rest","initializer","arguments","emitting","integrate","dispatch","expire","event","bindEvent","createParticle","get","setupParticle","addBehaviours","stop","slow","removeAllInitializers","removeEmitter","BehaviourEmitter","selfBehaviours","FollowEmitter","mouseTarget","window","_allowEmitting","initEventHandler","mousemoveHandler","_this2","mousemove","mousedownHandler","mousedown","mouseupHandler","mouseup","layerX","layerY","offsetX","offsetY","babelHelpers.get","BaseRenderer","element","stroke","initHandler","circleConf","isCircle","thinkness","_protonUpdateHandler","onProtonUpdate","_protonUpdateAfterHandler","onProtonUpdateAfter","_emitterAddedHandler","onEmitterAdded","_emitterRemovedHandler","onEmitterRemoved","_particleCreatedHandler","onParticleCreated","_particleUpdateHandler","onParticleUpdate","_particleDeadHandler","onParticleDead","CanvasRenderer","bufferCache","addImg2Body","drawCircle","buffer","createBuffer","bufferContext","globalAlpha","globalCompositeOperation","fillStyle","rgbToHex","fillRect","save","translate","restore","beginPath","arc","strokeStyle","lineWidth","closePath","fill","size","DomRenderer","createBody","transform3d","bodyReady","backgroundColor","removeChild","babelHelpers.typeof","createCircle","createSprite","createDiv","borderRadius","borderColor","borderWidth","url","backgroundImage","EaselRenderer","addChild","scaleX","scaleY","graphics","regX","regY","createjs","Graphics","String","beginStroke","beginFill","shape","Shape","PixelRenderer","rectangle","imageData","createImageData","putImageData","setPixel","elementwidth","data","PixiRenderer","setColor","tint","getHex16FromParticle","PIXI","Sprite","fromImage","anchor","endFill","MStack","mats","Mat3","multiply","WebGLRenderer","gl","antialias","stencil","depth","initVar","setMaxRadius","initShaders","initBuffers","blendEquation","FUNC_ADD","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","enable","BLEND","umat","smat","mstack","viewport","circleCanvasURL","texturebuffers","A","B","fs","shader","createShader","FRAGMENT_SHADER","VERTEX_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","fragmentShader","getShader","getFragmentShader","vertexShader","getVertexShader","sprogram","createProgram","attachShader","linkProgram","getProgramParameter","LINK_STATUS","useProgram","vpa","getAttribLocation","tca","enableVertexAttribArray","tMatUniform","getUniformLocation","samplerUniform","useTex","uniform1i","idx","unitIBuffer","bindBuffer","ELEMENT_ARRAY_BUFFER","bufferData","Uint16Array","STATIC_DRAW","ids","unitI33","stripBuffer","raidus","circleCanvasRadius","toDataURL","_w","_h","_width","_height","_scaleX","_scaleY","createTexture","texture","vcBuffer","tcBuffer","ARRAY_BUFFER","bindTexture","TEXTURE_2D","texImage2D","RGBA","UNSIGNED_BYTE","texParameteri","TEXTURE_MAG_FILTER","LINEAR","TEXTURE_MIN_FILTER","LINEAR_MIPMAP_NEAREST","generateMipmap","textureLoaded","textureWidth","textureHeight","tmat","imat","oldScale","drawImg2Canvas","updateMatrix","uniform3f","uniformMatrix3fv","top","vertexAttribPointer","FLOAT","drawElements","TRIANGLES","UNSIGNED_SHORT","moveOriginMatrix","translationMatrix","angel","rotationMatrix","scaleMatrix","matrix","inverse","CustomRenderer","LineZone","x1","y1","x2","y2","direction","minx","min","miny","maxx","maxy","dot","xxyy","gradient","getGradient","getLength","tha2","oldx","oldy","rangeOut","getDistance","getSymmetric","error","CircleZone","angle","PIx2","d","distanceTo","RectZone","ImageZone","vectors","setVectors","j","length1","length2","getBound","negate","fun","getStyle","moveTo","lineTo","drawRect","lastTime","vendors","requestAnimationFrame","cancelAnimationFrame","currTime","timeToCall","setTimeout","P","Vector","Polar","getSpan","Init","L","V","M","R","F","RD","G","S","WebGlRenderer","Debug","assign"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"proton.min.js","sources":["../src/utils/WebGLUtil.js","../src/utils/DomUtil.js","../src/utils/ImgUtil.js","../src/utils/Util.js","../src/utils/Puid.js","../src/core/Pool.js","../src/debug/Stats.js","../src/events/EventDispatcher.js","../src/math/MathUtil.js","../src/math/Integration.js","../src/core/Proton.js","../src/utils/Rgb.js","../src/math/Span.js","../src/utils/PropUtil.js","../src/math/ease.js","../src/math/Vector2D.js","../src/core/Particle.js","../src/utils/ColorUtil.js","../src/math/Polar2D.js","../src/math/Mat3.js","../src/math/ArraySpan.js","../src/math/Rectangle.js","../src/initialize/Rate.js","../src/initialize/Initialize.js","../src/initialize/Life.js","../src/zone/Zone.js","../src/zone/PointZone.js","../src/initialize/Position.js","../src/initialize/Velocity.js","../src/initialize/Mass.js","../src/initialize/Radius.js","../src/initialize/Body.js","../src/behaviour/Behaviour.js","../src/behaviour/Force.js","../src/behaviour/Attraction.js","../src/behaviour/RandomDrift.js","../src/behaviour/Gravity.js","../src/behaviour/Collision.js","../src/behaviour/CrossZone.js","../src/behaviour/Alpha.js","../src/behaviour/Scale.js","../src/behaviour/Rotate.js","../src/behaviour/Color.js","../src/behaviour/Cyclone.js","../src/behaviour/Repulsion.js","../src/behaviour/GravityWell.js","../src/initialize/InitializeUtil.js","../src/emitter/Emitter.js","../src/emitter/BehaviourEmitter.js","../src/render/PixiRenderer.js","../src/emitter/FollowEmitter.js","../src/utils/Types.js","../src/render/BaseRenderer.js","../src/render/CanvasRenderer.js","../src/render/DomRenderer.js","../src/render/EaselRenderer.js","../src/render/PixelRenderer.js","../src/utils/MStack.js","../src/render/WebGLRenderer.js","../src/render/CustomRenderer.js","../src/zone/LineZone.js","../src/zone/CircleZone.js","../src/zone/RectZone.js","../src/zone/ImageZone.js","../src/debug/Debug.js","../src/index.js"],"sourcesContent":["export default {\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method ipot\n *\n * @todo add description\n * @todo add length description\n *\n * @param {Number} length\n *\n * @return {Boolean}\n */\n ipot(length) {\n return (length & (length - 1)) === 0;\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method nhpot\n *\n * @todo add description\n * @todo add length description\n *\n * @param {Number} length\n *\n * @return {Number}\n */\n nhpot(length) {\n --length;\n for (let i = 1; i < 32; i <<= 1) {\n length = length | (length >> i);\n }\n\n return length + 1;\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeTranslation\n *\n * @todo add description\n * @todo add tx, ty description\n * @todo add return description\n *\n * @param {Number} tx either 0 or 1\n * @param {Number} ty either 0 or 1\n *\n * @return {Object}\n */\n makeTranslation(tx, ty) {\n return [1, 0, 0, 0, 1, 0, tx, ty, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeRotation\n *\n * @todo add description\n * @todo add return description\n *\n * @param {Number} angleInRadians\n *\n * @return {Object}\n */\n makeRotation(angleInRadians) {\n let c = Math.cos(angleInRadians);\n let s = Math.sin(angleInRadians);\n\n return [c, -s, 0, s, c, 0, 0, 0, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeScale\n *\n * @todo add description\n * @todo add tx, ty description\n * @todo add return description\n *\n * @param {Number} sx either 0 or 1\n * @param {Number} sy either 0 or 1\n *\n * @return {Object}\n */\n makeScale(sx, sy) {\n return [sx, 0, 0, 0, sy, 0, 0, 0, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method matrixMultiply\n *\n * @todo add description\n * @todo add a, b description\n * @todo add return description\n *\n * @param {Object} a\n * @param {Object} b\n *\n * @return {Object}\n */\n matrixMultiply(a, b) {\n let a00 = a[0 * 3 + 0];\n let a01 = a[0 * 3 + 1];\n let a02 = a[0 * 3 + 2];\n let a10 = a[1 * 3 + 0];\n let a11 = a[1 * 3 + 1];\n let a12 = a[1 * 3 + 2];\n let a20 = a[2 * 3 + 0];\n let a21 = a[2 * 3 + 1];\n let a22 = a[2 * 3 + 2];\n let b00 = b[0 * 3 + 0];\n let b01 = b[0 * 3 + 1];\n let b02 = b[0 * 3 + 2];\n let b10 = b[1 * 3 + 0];\n let b11 = b[1 * 3 + 1];\n let b12 = b[1 * 3 + 2];\n let b20 = b[2 * 3 + 0];\n let b21 = b[2 * 3 + 1];\n let b22 = b[2 * 3 + 2];\n\n return [\n a00 * b00 + a01 * b10 + a02 * b20,\n a00 * b01 + a01 * b11 + a02 * b21,\n a00 * b02 + a01 * b12 + a02 * b22,\n a10 * b00 + a11 * b10 + a12 * b20,\n a10 * b01 + a11 * b11 + a12 * b21,\n a10 * b02 + a11 * b12 + a12 * b22,\n a20 * b00 + a21 * b10 + a22 * b20,\n a20 * b01 + a21 * b11 + a22 * b21,\n a20 * b02 + a21 * b12 + a22 * b22\n ];\n }\n};\n","export default {\n /**\n * Creates and returns a new canvas. The opacity is by default set to 0\n *\n * @memberof Proton#Proton.DomUtil\n * @method createCanvas\n *\n * @param {String} $id the canvas' id\n * @param {Number} $width the canvas' width\n * @param {Number} $height the canvas' height\n * @param {String} [$position=absolute] the canvas' position, default is 'absolute'\n *\n * @return {Object}\n */\n createCanvas(id, width, height, position = \"absolute\") {\n const dom = document.createElement(\"canvas\");\n\n dom.id = id;\n dom.width = width;\n dom.height = height;\n dom.style.opacity = 0;\n dom.style.position = position;\n this.transform(dom, -500, -500, 0, 0);\n\n return dom;\n },\n\n createDiv(id, width, height) {\n const dom = document.createElement(\"div\");\n\n dom.id = id;\n dom.style.position = \"absolute\";\n this.resize(dom, width, height);\n\n return dom;\n },\n\n resize(dom, width, height) {\n dom.style.width = width + \"px\";\n dom.style.height = height + \"px\";\n dom.style.marginLeft = -width / 2 + \"px\";\n dom.style.marginTop = -height / 2 + \"px\";\n },\n\n /**\n * Adds a transform: translate(), scale(), rotate() to a given div dom for all browsers\n *\n * @memberof Proton#Proton.DomUtil\n * @method transform\n *\n * @param {HTMLDivElement} div\n * @param {Number} $x\n * @param {Number} $y\n * @param {Number} $scale\n * @param {Number} $rotate\n */\n transform(div, x, y, scale, rotate) {\n div.style.willChange = \"transform\";\n const transform = `translate(${x}px, ${y}px) scale(${scale}) rotate(${rotate}deg)`;\n this.css3(div, \"transform\", transform);\n },\n\n transform3d(div, x, y, scale, rotate) {\n div.style.willChange = \"transform\";\n const transform = `translate3d(${x}px, ${y}px, 0) scale(${scale}) rotate(${rotate}deg)`;\n this.css3(div, \"backfaceVisibility\", \"hidden\");\n this.css3(div, \"transform\", transform);\n },\n\n css3(div, key, val) {\n const bkey = key.charAt(0).toUpperCase() + key.substr(1);\n\n div.style[`Webkit${bkey}`] = val;\n div.style[`Moz${bkey}`] = val;\n div.style[`O${bkey}`] = val;\n div.style[`ms${bkey}`] = val;\n div.style[`${key}`] = val;\n }\n};\n","import WebGLUtil from \"./WebGLUtil\";\nimport DomUtil from \"./DomUtil\";\n\nconst imgsCache = {};\nconst canvasCache = {};\nlet canvasId = 0;\n\nexport default {\n /**\n * This will get the image data. It could be necessary to create a Proton.Zone.\n *\n * @memberof Proton#Proton.Util\n * @method getImageData\n *\n * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'\n * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');\n * @param {Proton.Rectangle} rect\n */\n getImageData(context, image, rect) {\n context.drawImage(image, rect.x, rect.y);\n const imagedata = context.getImageData(rect.x, rect.y, rect.width, rect.height);\n context.clearRect(rect.x, rect.y, rect.width, rect.height);\n\n return imagedata;\n },\n\n /**\n * @memberof Proton#Proton.Util\n * @method getImgFromCache\n *\n * @todo add description\n * @todo describe func\n *\n * @param {Mixed} img\n * @param {Proton.Particle} particle\n * @param {Boolean} drawCanvas set to true if a canvas should be saved into particle.data.canvas\n * @param {Boolean} func\n */\n getImgFromCache(img, callback, param) {\n const src = typeof img === \"string\" ? img : img.src;\n\n if (imgsCache[src]) {\n callback(imgsCache[src], param);\n } else {\n const image = new Image();\n image.onload = e => {\n imgsCache[src] = e.target;\n callback(imgsCache[src], param);\n };\n\n image.src = src;\n }\n },\n\n getCanvasFromCache(img, callback, param) {\n const src = img.src;\n\n if (!canvasCache[src]) {\n const width = WebGLUtil.nhpot(img.width);\n const height = WebGLUtil.nhpot(img.height);\n\n const canvas = DomUtil.createCanvas(`proton_canvas_cache_${++canvasId}`, width, height);\n const context = canvas.getContext(\"2d\");\n context.drawImage(img, 0, 0, img.width, img.height);\n\n canvasCache[src] = canvas;\n }\n\n callback && callback(canvasCache[src], param);\n\n return canvasCache[src];\n }\n};\n","import ImgUtil from \"./ImgUtil\";\n\nexport default {\n /**\n * Returns the default if the value is null or undefined\n *\n * @memberof Proton#Proton.Util\n * @method initValue\n *\n * @param {Mixed} value a specific value, could be everything but null or undefined\n * @param {Mixed} defaults the default if the value is null or undefined\n */\n initValue(value, defaults) {\n value = value !== null && value !== undefined ? value : defaults;\n return value;\n },\n\n /**\n * Checks if the value is a valid array\n *\n * @memberof Proton#Proton.Util\n * @method isArray\n *\n * @param {Array} value Any array\n *\n * @returns {Boolean}\n */\n isArray(value) {\n return Object.prototype.toString.call(value) === \"[object Array]\";\n },\n\n /**\n * Destroyes the given array\n *\n * @memberof Proton#Proton.Util\n * @method emptyArray\n *\n * @param {Array} array Any array\n */\n emptyArray(arr) {\n if (arr) arr.length = 0;\n },\n\n toArray(arr) {\n return this.isArray(arr) ? arr : [arr];\n },\n\n sliceArray(arr1, index, arr2) {\n this.emptyArray(arr2);\n for (let i = index; i < arr1.length; i++) {\n arr2.push(arr1[i]);\n }\n },\n\n getRandFromArray(arr) {\n if (!arr) return null;\n return arr[Math.floor(arr.length * Math.random())];\n },\n\n /**\n * Destroyes the given object\n *\n * @memberof Proton#Proton.Util\n * @method emptyObject\n *\n * @param {Object} obj Any object\n */\n emptyObject(obj, ignore = null) {\n for (let key in obj) {\n if (ignore && ignore.indexOf(key) > -1) continue;\n delete obj[key];\n }\n },\n\n /**\n * Makes an instance of a class and binds the given array\n *\n * @memberof Proton#Proton.Util\n * @method classApply\n *\n * @param {Function} constructor A class to make an instance from\n * @param {Array} [args] Any array to bind it to the constructor\n *\n * @return {Object} The instance of constructor, optionally bind with args\n */\n classApply(constructor, args = null) {\n if (!args) {\n return new constructor();\n } else {\n const FactoryFunc = constructor.bind.apply(constructor, [null].concat(args));\n return new FactoryFunc();\n }\n },\n\n /**\n * This will get the image data. It could be necessary to create a Proton.Zone.\n *\n * @memberof Proton#Proton.Util\n * @method getImageData\n *\n * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'\n * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');\n * @param {Proton.Rectangle} rect\n */\n getImageData(context, image, rect) {\n return ImgUtil.getImageData(context, image, rect);\n },\n\n destroyAll(arr, param = null) {\n let i = arr.length;\n\n while (i--) {\n try {\n arr[i].destroy(param);\n } catch (e) {}\n\n delete arr[i];\n }\n\n arr.length = 0;\n },\n\n assign(target, source) {\n if (typeof Object.assign !== \"function\") {\n for (let key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n\n return target;\n } else {\n return Object.assign(target, source);\n }\n }\n};\n","const idsMap = {};\n\nconst Puid = {\n _index: 0,\n _cache: {},\n\n id(type) {\n if (idsMap[type] === undefined || idsMap[type] === null) idsMap[type] = 0;\n return `${type}_${idsMap[type]++}`;\n },\n\n getId(target) {\n let uid = this.getIdFromCache(target);\n if (uid) return uid;\n\n uid = `PUID_${this._index++}`;\n this._cache[uid] = target;\n return uid;\n },\n\n getIdFromCache(target) {\n let obj, id;\n\n for (id in this._cache) {\n obj = this._cache[id];\n\n if (obj === target) return id;\n if (this.isBody(obj, target) && obj.src === target.src) return id;\n }\n\n return null;\n },\n\n isBody(obj, target) {\n return typeof obj === \"object\" && typeof target === \"object\" && obj.isInner && target.isInner;\n },\n\n getTarget(uid) {\n return this._cache[uid];\n }\n};\n\nexport default Puid;\n","/**\n * Pool is the cache pool of the proton engine, it is very important.\n *\n * get(target, params, uid)\n * Class\n * uid = Puid.getId -> Puid save target cache\n * target.__puid = uid\n *\n * body\n * uid = Puid.getId -> Puid save target cache\n *\n *\n * expire(target)\n * cache[target.__puid] push target\n *\n */\nimport Util from \"../utils/Util\";\nimport Puid from \"../utils/Puid\";\n\nexport default class Pool {\n /**\n * @memberof! Proton#\n * @constructor\n * @alias Proton.Pool\n *\n * @todo add description\n * @todo add description of properties\n *\n * @property {Number} total\n * @property {Object} cache\n */\n constructor(num) {\n this.total = 0;\n this.cache = {};\n }\n\n /**\n * @todo add description\n *\n * @method get\n * @memberof Proton#Proton.Pool\n *\n * @param {Object|Function} target\n * @param {Object} [params] just add if `target` is a function\n *\n * @return {Object}\n */\n get(target, params, uid) {\n let p;\n uid = uid || target.__puid || Puid.getId(target);\n\n if (this.cache[uid] && this.cache[uid].length > 0) {\n p = this.cache[uid].pop();\n } else {\n p = this.createOrClone(target, params);\n }\n\n p.__puid = target.__puid || uid;\n return p;\n }\n\n /**\n * @todo add description\n *\n * @method set\n * @memberof Proton#Proton.Pool\n *\n * @param {Object} target\n *\n * @return {Object}\n */\n expire(target) {\n return this.getCache(target.__puid).push(target);\n }\n\n /**\n * Creates a new class instance\n *\n * @todo add more documentation\n *\n * @method create\n * @memberof Proton#Proton.Pool\n *\n * @param {Object|Function} target any Object or Function\n * @param {Object} [params] just add if `target` is a function\n *\n * @return {Object}\n */\n createOrClone(target, params) {\n this.total++;\n\n if (this.create) {\n return this.create(target, params);\n } else if (typeof target === \"function\") {\n return Util.classApply(target, params);\n } else {\n return target.clone();\n }\n }\n\n /**\n * @todo add description - what is in the cache?\n *\n * @method getCount\n * @memberof Proton#Proton.Pool\n *\n * @return {Number}\n */\n getCount() {\n let count = 0;\n for (let id in this.cache) count += this.cache[id].length;\n return count++;\n }\n\n /**\n * Destroyes all items from Pool.cache\n *\n * @method destroy\n * @memberof Proton#Proton.Pool\n */\n destroy() {\n for (let id in this.cache) {\n this.cache[id].length = 0;\n delete this.cache[id];\n }\n }\n\n /**\n * Returns Pool.cache\n *\n * @method getCache\n * @memberof Proton#Proton.Pool\n * @private\n *\n * @param {Number} uid the unique id\n *\n * @return {Object}\n */\n getCache(uid = \"default\") {\n if (!this.cache[uid]) this.cache[uid] = [];\n return this.cache[uid];\n }\n}\n","export default class Stats {\n constructor(proton) {\n this.proton = proton;\n this.container = null;\n this.type = 1;\n\n this.emitterIndex = 0;\n this.rendererIndex = 0;\n }\n\n update(style, body) {\n this.add(style, body);\n\n const emitter = this.getEmitter();\n const renderer = this.getRenderer();\n let str = \"\";\n\n switch (this.type) {\n case 2:\n str += \"emitter:\" + this.proton.emitters.length + \"
\";\n if (emitter) str += \"em speed:\" + emitter.emitSpeed + \"
\";\n if (emitter) str += \"pos:\" + this.getEmitterPos(emitter);\n break;\n\n case 3:\n if (emitter) str += \"initializes:\" + emitter.initializes.length + \"
\";\n if (emitter)\n str += '' + this.concatArr(emitter.initializes) + \"
\";\n if (emitter) str += \"behaviours:\" + emitter.behaviours.length + \"
\";\n if (emitter) str += '' + this.concatArr(emitter.behaviours) + \"
\";\n break;\n\n case 4:\n if (renderer) str += renderer.name + \"
\";\n if (renderer) str += \"body:\" + this.getCreatedNumber(renderer) + \"
\";\n break;\n\n default:\n str += \"particles:\" + this.proton.getCount() + \"
\";\n str += \"pool:\" + this.proton.pool.getCount() + \"
\";\n str += \"total:\" + this.proton.pool.total;\n }\n\n this.container.innerHTML = str;\n }\n\n add(style, body) {\n if (!this.container) {\n this.type = 1;\n\n this.container = document.createElement(\"div\");\n this.container.style.cssText = [\n \"position:absolute;bottom:0px;left:0;cursor:pointer;\",\n \"opacity:0.9;z-index:10000;padding:10px;font-size:12px;font-family:Helvetica,Arial,sans-serif;\",\n \"width:120px;height:50px;background-color:#002;color:#0ff;\"\n ].join(\"\");\n\n this.container.addEventListener(\n \"click\",\n e => {\n this.type++;\n if (this.type > 4) this.type = 1;\n },\n false\n );\n\n let bg, color;\n switch (style) {\n case 2:\n bg = \"#201\";\n color = \"#f08\";\n break;\n\n case 3:\n bg = \"#020\";\n color = \"#0f0\";\n break;\n\n default:\n bg = \"#002\";\n color = \"#0ff\";\n }\n\n this.container.style[\"background-color\"] = bg;\n this.container.style[\"color\"] = color;\n }\n\n if (!this.container.parentNode) {\n body = body || this.body || document.body;\n body.appendChild(this.container);\n }\n }\n\n getEmitter() {\n return this.proton.emitters[this.emitterIndex];\n }\n\n getRenderer() {\n return this.proton.renderers[this.rendererIndex];\n }\n\n concatArr(arr) {\n let result = \"\";\n if (!arr || !arr.length) return result;\n\n for (let i = 0; i < arr.length; i++) {\n result += (arr[i].name || \"\").substr(0, 1) + \".\";\n }\n\n return result;\n }\n\n getCreatedNumber(renderer) {\n return renderer.pool.total || (renderer.cpool && renderer.cpool.total) || 0;\n }\n\n getEmitterPos(e) {\n return Math.round(e.p.x) + \",\" + Math.round(e.p.y);\n }\n\n destroy() {\n if (this.container && this.container.parentNode) {\n const body = this.body || document.body;\n body.removeChild(this.container);\n }\n\n this.proton = null;\n this.container = null;\n }\n}\n","/*\n * EventDispatcher\n * This code reference since http://createjs.com/.\n *\n **/\n\nexport default class EventDispatcher {\n constructor() {\n this._listeners = null;\n }\n\n static bind(target) {\n target.prototype.dispatchEvent = EventDispatcher.prototype.dispatchEvent;\n target.prototype.hasEventListener = EventDispatcher.prototype.hasEventListener;\n target.prototype.addEventListener = EventDispatcher.prototype.addEventListener;\n target.prototype.removeEventListener = EventDispatcher.prototype.removeEventListener;\n target.prototype.removeAllEventListeners = EventDispatcher.prototype.removeAllEventListeners;\n }\n\n addEventListener(type, listener) {\n if (!this._listeners) {\n this._listeners = {};\n } else {\n this.removeEventListener(type, listener);\n }\n\n if (!this._listeners[type]) this._listeners[type] = [];\n this._listeners[type].push(listener);\n\n return listener;\n }\n\n removeEventListener(type, listener) {\n if (!this._listeners) return;\n if (!this._listeners[type]) return;\n\n const arr = this._listeners[type];\n const length = arr.length;\n\n for (let i = 0; i < length; i++) {\n if (arr[i] === listener) {\n if (length === 1) {\n delete this._listeners[type];\n }\n\n // allows for faster checks.\n else {\n arr.splice(i, 1);\n }\n\n break;\n }\n }\n }\n\n removeAllEventListeners(type) {\n if (!type) this._listeners = null;\n else if (this._listeners) delete this._listeners[type];\n }\n\n dispatchEvent(type, args) {\n let result = false;\n const listeners = this._listeners;\n\n if (type && listeners) {\n let arr = listeners[type];\n if (!arr) return result;\n\n // arr = arr.slice();\n // to avoid issues with items being removed or added during the dispatch\n\n let handler;\n let i = arr.length;\n while (i--) {\n handler = arr[i];\n result = result || handler(args);\n }\n }\n\n return !!result;\n }\n\n hasEventListener(type) {\n const listeners = this._listeners;\n return !!(listeners && listeners[type]);\n }\n}\n","const PI = 3.1415926;\nconst INFINITY = Infinity;\n\nconst MathUtil = {\n PI: PI,\n PIx2: PI * 2,\n PI_2: PI / 2,\n PI_180: PI / 180,\n N180_PI: 180 / PI,\n Infinity: -999,\n\n isInfinity(num) {\n return num === this.Infinity || num === INFINITY;\n },\n\n randomAToB(a, b, isInt = false) {\n if (!isInt) return a + Math.random() * (b - a);\n else return ((Math.random() * (b - a)) >> 0) + a;\n },\n\n randomFloating(center, f, isInt) {\n return this.randomAToB(center - f, center + f, isInt);\n },\n\n randomColor() {\n return \"#\" + (\"00000\" + ((Math.random() * 0x1000000) << 0).toString(16)).slice(-6);\n },\n\n randomZone(display) {},\n\n floor(num, k = 4) {\n const digits = Math.pow(10, k);\n return Math.floor(num * digits) / digits;\n },\n\n degreeTransform(a) {\n return (a * PI) / 180;\n },\n\n toColor16(num) {\n return `#${num.toString(16)}`;\n }\n};\n\nexport default MathUtil;\n","export default class Integration {\n constructor(type) {\n this.type = type;\n }\n\n calculate(particles, time, damping) {\n this.eulerIntegrate(particles, time, damping);\n }\n\n // Euler Integrate\n // https://rosettacode.org/wiki/Euler_method\n eulerIntegrate(particle, time, damping) {\n if (!particle.sleep) {\n particle.old.p.copy(particle.p);\n particle.old.v.copy(particle.v);\n\n particle.a.multiplyScalar(1 / particle.mass);\n particle.v.add(particle.a.multiplyScalar(time));\n particle.p.add(particle.old.v.multiplyScalar(time));\n\n if (damping) particle.v.multiplyScalar(damping);\n\n particle.a.clear();\n }\n }\n}\n","import Pool from \"./Pool\";\nimport Util from \"../utils/Util\";\nimport Stats from \"../debug/Stats\";\nimport EventDispatcher from \"../events/EventDispatcher\";\nimport MathUtil from \"../math/MathUtil\";\nimport Integration from \"../math/Integration\";\n\nexport default class Proton {\n static USE_CLOCK = false;\n\n // measure 1:100\n static MEASURE = 100;\n static EULER = \"euler\";\n static RK2 = \"runge-kutta2\";\n\n // event name\n static PARTICLE_CREATED = \"PARTICLE_CREATED\";\n static PARTICLE_UPDATE = \"PARTICLE_UPDATE\";\n static PARTICLE_SLEEP = \"PARTICLE_SLEEP\";\n static PARTICLE_DEAD = \"PARTICLE_DEAD\";\n\n static EMITTER_ADDED = \"EMITTER_ADDED\";\n static EMITTER_REMOVED = \"EMITTER_REMOVED\";\n\n static PROTON_UPDATE = \"PROTON_UPDATE\";\n static PROTON_UPDATE_AFTER = \"PROTON_UPDATE_AFTER\";\n static DEFAULT_INTERVAL = 0.0167;\n\n static amendChangeTabsBug = true;\n\n /**\n * The constructor to add emitters\n *\n * @constructor Proton\n *\n * @todo add more documentation of the single properties and parameters\n *\n * @param {Number | undefined} [integrationType=Proton.EULER]\n *\n * @property {String} [integrationType=Proton.EULER]\n * @property {Array} emitters All added emitter\n * @property {Array} renderers All added renderer\n * @property {Number} time The active time\n * @property {Number} oldtime The old time\n */\n constructor(integrationType) {\n this.emitters = [];\n this.renderers = [];\n\n this.time = 0;\n this.now = 0;\n this.then = 0;\n this.elapsed = 0;\n\n this.stats = new Stats(this);\n this.pool = new Pool(80);\n\n this.integrationType = Util.initValue(integrationType, Proton.EULER);\n this.integrator = new Integration(this.integrationType);\n\n this._fps = \"auto\";\n this._interval = Proton.DEFAULT_INTERVAL;\n }\n\n /**\n * Sets the frames per second (FPS) for the Proton system.\n * @param {number|string} fps - The desired FPS. Use \"auto\" for default behavior, or a number for a specific FPS.\n */\n set fps(fps) {\n this._fps = fps;\n this._interval = fps === \"auto\" ? Proton.DEFAULT_INTERVAL : MathUtil.floor(1 / fps, 7);\n }\n\n /**\n * Gets the current frames per second (FPS) setting.\n * @returns {number|string} The current FPS setting. Returns \"auto\" if set to default, or a number representing the specific FPS.\n */\n get fps() {\n return this._fps;\n }\n\n /**\n * add a type of Renderer\n *\n * @method addRenderer\n * @memberof Proton\n * @instance\n *\n * @param {Renderer} render\n */\n addRenderer(render) {\n render.init(this);\n this.renderers.push(render);\n }\n\n /**\n * @name add a type of Renderer\n *\n * @method addRenderer\n * @param {Renderer} render\n */\n removeRenderer(render) {\n const index = this.renderers.indexOf(render);\n this.renderers.splice(index, 1);\n render.remove(this);\n }\n\n /**\n * add the Emitter\n *\n * @method addEmitter\n * @memberof Proton\n * @instance\n *\n * @param {Emitter} emitter\n */\n addEmitter(emitter) {\n this.emitters.push(emitter);\n emitter.parent = this;\n\n this.dispatchEvent(Proton.EMITTER_ADDED, emitter);\n }\n\n /**\n * Removes an Emitter\n *\n * @method removeEmitter\n * @memberof Proton\n * @instance\n *\n * @param {Proton.Emitter} emitter\n */\n removeEmitter(emitter) {\n const index = this.emitters.indexOf(emitter);\n this.emitters.splice(index, 1);\n emitter.parent = null;\n\n this.dispatchEvent(Proton.EMITTER_REMOVED, emitter);\n }\n\n /**\n * Updates all added emitters\n *\n * @method update\n * @memberof Proton\n * @instance\n */\n update() {\n // 'auto' is the default browser refresh rate, the vast majority is 60fps\n if (this._fps === \"auto\") {\n this.dispatchEvent(Proton.PROTON_UPDATE);\n\n if (Proton.USE_CLOCK) {\n if (!this.then) this.then = new Date().getTime();\n this.now = new Date().getTime();\n this.elapsed = (this.now - this.then) * 0.001;\n // Fix bugs such as chrome browser switching tabs causing excessive time difference\n this.amendChangeTabsBug();\n\n if (this.elapsed > 0) this.emittersUpdate(this.elapsed);\n this.then = this.now;\n } else {\n this.emittersUpdate(Proton.DEFAULT_INTERVAL);\n }\n\n this.dispatchEvent(Proton.PROTON_UPDATE_AFTER);\n }\n\n // If the fps frame rate is set\n else {\n if (!this.then) this.then = new Date().getTime();\n this.now = new Date().getTime();\n this.elapsed = (this.now - this.then) * 0.001;\n\n if (this.elapsed > this._interval) {\n this.dispatchEvent(Proton.PROTON_UPDATE);\n this.emittersUpdate(this._interval);\n // https://stackoverflow.com/questions/19764018/controlling-fps-with-requestanimationframe\n this.then = this.now - (this.elapsed % this._interval) * 1000;\n this.dispatchEvent(Proton.PROTON_UPDATE_AFTER);\n }\n }\n }\n\n emittersUpdate(elapsed) {\n let i = this.emitters.length;\n while (i--) this.emitters[i].update(elapsed);\n }\n\n /**\n * @todo add description\n *\n * @method amendChangeTabsBug\n * @memberof Proton\n * @instance\n */\n amendChangeTabsBug() {\n if (!Proton.amendChangeTabsBug) return;\n if (this.elapsed > 0.5) {\n this.then = new Date().getTime();\n this.elapsed = 0;\n }\n }\n\n /**\n * Counts all particles from all emitters\n *\n * @method getCount\n * @memberof Proton\n * @instance\n */\n getCount() {\n let total = 0;\n let i = this.emitters.length;\n\n while (i--) total += this.emitters[i].particles.length;\n return total;\n }\n\n getAllParticles() {\n let particles = [];\n let i = this.emitters.length;\n\n while (i--) particles = particles.concat(this.emitters[i].particles);\n return particles;\n }\n\n destroyAllEmitters() {\n Util.destroyAll(this.emitters);\n }\n\n /**\n * Destroys everything related to this Proton instance. This includes all emitters, and all properties\n *\n * @method destroy\n * @memberof Proton\n * @instance\n */\n destroy(remove = false) {\n const destroyOther = () => {\n this.time = 0;\n this.then = 0;\n this.pool.destroy();\n this.stats.destroy();\n\n Util.destroyAll(this.emitters);\n Util.destroyAll(this.renderers, this.getAllParticles());\n\n this.integrator = null;\n this.renderers = null;\n this.emitters = null;\n this.stats = null;\n this.pool = null;\n };\n\n if (remove) {\n setTimeout(destroyOther, 200);\n } else {\n destroyOther();\n }\n }\n}\n\nEventDispatcher.bind(Proton);\n","export default class Rgb {\n constructor(r = 255, g = 255, b = 255) {\n this.r = r;\n this.g = g;\n this.b = b;\n }\n\n reset() {\n this.r = 255;\n this.g = 255;\n this.b = 255;\n }\n}\n","import Util from \"../utils/Util\";\nimport MathUtil from \"../math/MathUtil\";\n\n/**\n * Represents a span of values or an array.\n */\nexport default class Span {\n /**\n * @type {boolean}\n * @private\n */\n isArray;\n\n /**\n * @type {number|number[]}\n * @private\n */\n a;\n\n /**\n * @type {number}\n * @private\n */\n b;\n\n /**\n * @type {boolean}\n * @private\n */\n center;\n\n /**\n * Creates a new Span instance.\n * @param {number|number[]} a - The first value or an array of values.\n * @param {number} [b] - The second value (if a is not an array).\n * @param {boolean} [center=false] - Whether to use center-based calculation.\n */\n constructor(a, b, center) {\n if (Util.isArray(a)) {\n this.isArray = true;\n this.a = a;\n } else {\n this.isArray = false;\n this.a = Util.initValue(a, 1);\n this.b = Util.initValue(b, this.a);\n this.center = Util.initValue(center, false);\n }\n }\n\n /**\n * Gets a value from the span.\n * @param {boolean} [isInt=false] - Whether to return an integer value.\n * @returns {number} A random value from the span.\n */\n getValue(isInt = false) {\n if (this.isArray) {\n return Util.getRandFromArray(this.a);\n } else {\n if (!this.center) {\n return MathUtil.randomAToB(this.a, this.b, isInt);\n } else {\n return MathUtil.randomFloating(this.a, this.b, isInt);\n }\n }\n }\n\n /**\n * Returns a new Span object.\n * @param {*|Span} a - The first value or a Span object.\n * @param {*} [b] - The second value.\n * @param {*} [c] - The third value.\n * @returns {Span} A new Span instance.\n */\n static setSpanValue(a, b, c) {\n if (a instanceof Span) {\n return a;\n } else {\n if (b === undefined) {\n return new Span(a);\n } else {\n if (c === undefined) return new Span(a, b);\n else return new Span(a, b, c);\n }\n }\n }\n\n /**\n * Returns the value from a Span, if the param is not a Span it will return the given parameter.\n * @param {*|Span} pan - The value or Span to get the value from.\n * @returns {*} The value of Span OR the parameter if it is not a Span.\n */\n static getSpanValue(pan) {\n return pan instanceof Span ? pan.getValue() : pan;\n }\n}\n","import Span from \"../math/Span\";\n\nexport default {\n hasProp(target, key) {\n if (!target) return false;\n return target[key] !== undefined;\n // return obj.hasOwnProperty(key);\n },\n\n /**\n * set the prototype in a given prototypeObject\n *\n * @memberof Proton#Proton.Util\n * @method setProp\n *\n * @todo add description for param `target`\n * @todo translate desription from chinese to english\n *\n * @param {Object} target\n * @param {Object} prototypeObject An object of single prototypes\n *\n * @return {Object} target\n */\n setProp(target, props) {\n for (let prop in props) {\n if (target.hasOwnProperty(prop)) {\n target[prop] = Span.getSpanValue(props[prop]);\n }\n }\n\n return target;\n },\n\n /**\n * @memberof Proton#Proton.Util\n * @method setVectorVal\n *\n * @todo add description for param `target`\n * @todo add description for param `conf`\n * @todo add description for function\n *\n * @param {Object} target\n * @param {Object} conf\n */\n setVectorVal(particle, conf = null) {\n if (!conf) return;\n\n if (this.hasProp(conf, \"x\")) particle.p.x = conf[\"x\"];\n if (this.hasProp(conf, \"y\")) particle.p.y = conf[\"y\"];\n\n if (this.hasProp(conf, \"vx\")) particle.v.x = conf[\"vx\"];\n if (this.hasProp(conf, \"vy\")) particle.v.y = conf[\"vy\"];\n\n if (this.hasProp(conf, \"ax\")) particle.a.x = conf[\"ax\"];\n if (this.hasProp(conf, \"ay\")) particle.a.y = conf[\"ay\"];\n\n if (this.hasProp(conf, \"p\")) particle.p.copy(conf[\"p\"]);\n if (this.hasProp(conf, \"v\")) particle.v.copy(conf[\"v\"]);\n if (this.hasProp(conf, \"a\")) particle.a.copy(conf[\"a\"]);\n\n if (this.hasProp(conf, \"position\")) particle.p.copy(conf[\"position\"]);\n if (this.hasProp(conf, \"velocity\")) particle.v.copy(conf[\"velocity\"]);\n if (this.hasProp(conf, \"accelerate\")) particle.a.copy(conf[\"accelerate\"]);\n }\n};\n","import MathUtil from \"./MathUtil\";\n\nexport default {\n easeLinear(value) {\n return value;\n },\n\n easeInQuad(value) {\n return Math.pow(value, 2);\n },\n\n easeOutQuad(value) {\n return -(Math.pow(value - 1, 2) - 1);\n },\n\n easeInOutQuad(value) {\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 2);\n\n return -0.5 * ((value -= 2) * value - 2);\n },\n\n easeInCubic(value) {\n return Math.pow(value, 3);\n },\n\n easeOutCubic(value) {\n return Math.pow(value - 1, 3) + 1;\n },\n\n easeInOutCubic(value) {\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 3);\n\n return 0.5 * (Math.pow(value - 2, 3) + 2);\n },\n\n easeInQuart(value) {\n return Math.pow(value, 4);\n },\n\n easeOutQuart(value) {\n return -(Math.pow(value - 1, 4) - 1);\n },\n\n easeInOutQuart(value) {\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 4);\n\n return -0.5 * ((value -= 2) * Math.pow(value, 3) - 2);\n },\n\n easeInSine(value) {\n return -Math.cos(value * MathUtil.PI_2) + 1;\n },\n\n easeOutSine(value) {\n return Math.sin(value * MathUtil.PI_2);\n },\n\n easeInOutSine(value) {\n return -0.5 * (Math.cos(Math.PI * value) - 1);\n },\n\n easeInExpo(value) {\n return value === 0 ? 0 : Math.pow(2, 10 * (value - 1));\n },\n\n easeOutExpo(value) {\n return value === 1 ? 1 : -Math.pow(2, -10 * value) + 1;\n },\n\n easeInOutExpo(value) {\n if (value === 0) return 0;\n\n if (value === 1) return 1;\n\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(2, 10 * (value - 1));\n\n return 0.5 * (-Math.pow(2, -10 * --value) + 2);\n },\n\n easeInCirc(value) {\n return -(Math.sqrt(1 - value * value) - 1);\n },\n\n easeOutCirc(value) {\n return Math.sqrt(1 - Math.pow(value - 1, 2));\n },\n\n easeInOutCirc(value) {\n if ((value /= 0.5) < 1) return -0.5 * (Math.sqrt(1 - value * value) - 1);\n return 0.5 * (Math.sqrt(1 - (value -= 2) * value) + 1);\n },\n\n easeInBack(value) {\n let s = 1.70158;\n return value * value * ((s + 1) * value - s);\n },\n\n easeOutBack(value) {\n let s = 1.70158;\n return (value = value - 1) * value * ((s + 1) * value + s) + 1;\n },\n\n easeInOutBack(value) {\n let s = 1.70158;\n if ((value /= 0.5) < 1) return 0.5 * (value * value * (((s *= 1.525) + 1) * value - s));\n return 0.5 * ((value -= 2) * value * (((s *= 1.525) + 1) * value + s) + 2);\n },\n\n getEasing(ease) {\n if (typeof ease === \"function\") return ease;\n else return this[ease] || this.easeLinear;\n }\n};\n","import MathUtil from \"../math/MathUtil\";\n\nexport default class Vector2D {\n /** @type {number} */\n x;\n\n /** @type {number} */\n y;\n\n /**\n * Creates a new Vector2D instance.\n * @param {number} [x=0] - The x coordinate.\n * @param {number} [y=0] - The y coordinate.\n */\n constructor(x, y) {\n this.x = x || 0;\n this.y = y || 0;\n }\n\n /**\n * Sets the x and y components of this vector.\n * @param {number} x - The x coordinate.\n * @param {number} y - The y coordinate.\n * @returns {Vector2D} This vector.\n */\n set(x, y) {\n this.x = x;\n this.y = y;\n return this;\n }\n\n /**\n * Sets the x component of this vector.\n * @param {number} x - The x coordinate.\n * @returns {Vector2D} This vector.\n */\n setX(x) {\n this.x = x;\n return this;\n }\n\n /**\n * Sets the y component of this vector.\n * @param {number} y - The y coordinate.\n * @returns {Vector2D} This vector.\n */\n setY(y) {\n this.y = y;\n return this;\n }\n\n /**\n * Calculates the gradient (angle) of this vector.\n * @returns {number} The gradient in radians.\n */\n getGradient() {\n if (this.x !== 0) return Math.atan2(this.y, this.x);\n else if (this.y > 0) return MathUtil.PI_2;\n else if (this.y < 0) return -MathUtil.PI_2;\n }\n\n /**\n * Copies the values of another vector to this one.\n * @param {Vector2D} v - The vector to copy from.\n * @returns {Vector2D} This vector.\n */\n copy(v) {\n this.x = v.x;\n this.y = v.y;\n\n return this;\n }\n\n /**\n * Adds another vector to this one.\n * @param {Vector2D} v - The vector to add.\n * @param {Vector2D} [w] - An optional second vector to add.\n * @returns {Vector2D} This vector.\n */\n add(v, w) {\n if (w !== undefined) {\n return this.addVectors(v, w);\n }\n\n this.x += v.x;\n this.y += v.y;\n\n return this;\n }\n\n /**\n * Adds scalar values to this vector's components.\n * @param {number} a - Value to add to x.\n * @param {number} b - Value to add to y.\n * @returns {Vector2D} This vector.\n */\n addXY(a, b) {\n this.x += a;\n this.y += b;\n\n return this;\n }\n\n /**\n * Adds two vectors and sets the result to this vector.\n * @param {Vector2D} a - The first vector to add.\n * @param {Vector2D} b - The second vector to add.\n * @returns {Vector2D} This vector.\n */\n addVectors(a, b) {\n this.x = a.x + b.x;\n this.y = a.y + b.y;\n\n return this;\n }\n\n /**\n * Subtracts another vector from this one.\n * @param {Vector2D} v - The vector to subtract.\n * @param {Vector2D} [w] - An optional second vector to subtract.\n * @returns {Vector2D} This vector.\n */\n sub(v, w) {\n if (w !== undefined) {\n return this.subVectors(v, w);\n }\n\n this.x -= v.x;\n this.y -= v.y;\n\n return this;\n }\n\n /**\n * Subtracts one vector from another and sets the result to this vector.\n * @param {Vector2D} a - The vector to subtract from.\n * @param {Vector2D} b - The vector to subtract.\n * @returns {Vector2D} This vector.\n */\n subVectors(a, b) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n\n return this;\n }\n\n /**\n * Divides this vector by a scalar.\n * @param {number} s - The scalar to divide by.\n * @returns {Vector2D} This vector.\n */\n divideScalar(s) {\n if (s !== 0) {\n this.x /= s;\n this.y /= s;\n } else {\n this.set(0, 0);\n }\n\n return this;\n }\n\n /**\n * Multiplies this vector by a scalar.\n * @param {number} s - The scalar to multiply by.\n * @returns {Vector2D} This vector.\n */\n multiplyScalar(s) {\n this.x *= s;\n this.y *= s;\n\n return this;\n }\n\n /**\n * Negates this vector (inverts its direction).\n * @returns {Vector2D} This vector.\n */\n negate() {\n return this.multiplyScalar(-1);\n }\n\n /**\n * Calculates the dot product of this vector with another.\n * @param {Vector2D} v - The other vector.\n * @returns {number} The dot product.\n */\n dot(v) {\n return this.x * v.x + this.y * v.y;\n }\n\n /**\n * Calculates the squared length of this vector.\n * @returns {number} The squared length.\n */\n lengthSq() {\n return this.x * this.x + this.y * this.y;\n }\n\n /**\n * Calculates the length of this vector.\n * @returns {number} The length.\n */\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n\n /**\n * Normalizes this vector (makes it unit length).\n * @returns {Vector2D} This vector.\n */\n normalize() {\n return this.divideScalar(this.length());\n }\n\n /**\n * Calculates the distance to another vector.\n * @param {Vector2D} v - The other vector.\n * @returns {number} The distance.\n */\n distanceTo(v) {\n return Math.sqrt(this.distanceToSquared(v));\n }\n\n /**\n * Rotates this vector by an angle.\n * @param {number} tha - The angle to rotate by (in radians).\n * @returns {Vector2D} This vector.\n */\n rotate(tha) {\n const x = this.x;\n const y = this.y;\n\n this.x = x * Math.cos(tha) + y * Math.sin(tha);\n this.y = -x * Math.sin(tha) + y * Math.cos(tha);\n\n return this;\n }\n\n /**\n * Calculates the squared distance to another vector.\n * @param {Vector2D} v - The other vector.\n * @returns {number} The squared distance.\n */\n distanceToSquared(v) {\n const dx = this.x - v.x;\n const dy = this.y - v.y;\n\n return dx * dx + dy * dy;\n }\n\n /**\n * Linearly interpolates this vector toward another vector.\n * @param {Vector2D} v - The target vector.\n * @param {number} alpha - The interpolation factor (0-1).\n * @returns {Vector2D} This vector.\n */\n lerp(v, alpha) {\n this.x += (v.x - this.x) * alpha;\n this.y += (v.y - this.y) * alpha;\n\n return this;\n }\n\n /**\n * Checks if this vector is equal to another vector.\n * @param {Vector2D} v - The other vector.\n * @returns {boolean} True if the vectors are equal, false otherwise.\n */\n equals(v) {\n return v.x === this.x && v.y === this.y;\n }\n\n /**\n * Sets this vector to zero.\n * @returns {Vector2D} This vector.\n */\n clear() {\n this.x = 0.0;\n this.y = 0.0;\n return this;\n }\n\n /**\n * Creates a new vector with the same x and y values as this one.\n * @returns {Vector2D} A new Vector2D instance.\n */\n clone() {\n return new Vector2D(this.x, this.y);\n }\n}\n","import Rgb from \"../utils/Rgb\";\nimport Puid from \"../utils/Puid\";\nimport Util from \"../utils/Util\";\nimport PropUtil from \"../utils/PropUtil\";\nimport ease from \"../math/ease\";\nimport Vector2D from \"../math/Vector2D\";\nimport MathUtil from \"../math/MathUtil\";\n\n/**\n * Represents a particle in a particle system.\n * @class Particle\n */\nexport default class Particle {\n /** @type {string} The unique identifier of the particle */\n id = \"\";\n\n /** @type {{p:Vector2D,v:Vector2D,a:Vector2D}} Old state of the particle */\n old = null;\n\n /** @type {object} Custom data associated with the particle */\n data = null;\n\n /** @type {Behaviour[]} Array of behaviours applied to the particle */\n behaviours = null;\n\n /** @type {Vector2D} Current position of the particle */\n p = null;\n\n /** @type {Vector2D} Current velocity of the particle */\n v = null;\n\n /** @type {Vector2D} Current acceleration of the particle */\n a = null;\n\n /** @type {Rgb} Color of the particle */\n rgb = null;\n\n /**\n * Creates a new Particle instance.\n * @param {Object} [conf] Configuration object for the particle\n */\n constructor(conf) {\n this.name = \"Particle\";\n this.id = Puid.id(this.name);\n this.old = {};\n this.data = {};\n this.behaviours = [];\n\n this.p = new Vector2D();\n this.v = new Vector2D();\n this.a = new Vector2D();\n this.old.p = new Vector2D();\n this.old.v = new Vector2D();\n this.old.a = new Vector2D();\n\n this.rgb = new Rgb();\n this.reset();\n conf && PropUtil.setProp(this, conf);\n }\n\n /**\n * Gets the direction of the particle's movement in degrees.\n * @returns {number} The direction in degrees\n */\n getDirection() {\n return Math.atan2(this.v.x, -this.v.y) * MathUtil.N180_PI;\n }\n\n /**\n * Resets the particle to its initial state.\n * @returns {Particle} The particle instance\n */\n reset() {\n this.life = Infinity;\n this.age = 0;\n\n this.dead = false;\n this.sleep = false;\n this.body = null;\n this.sprite = null;\n this.parent = null;\n\n this.energy = 1; // Energy Loss\n this.mass = 1;\n this.radius = 10;\n this.alpha = 1;\n this.scale = 1;\n this.rotation = 0;\n this.color = null;\n\n this.p.set(0, 0);\n this.v.set(0, 0);\n this.a.set(0, 0);\n this.old.p.set(0, 0);\n this.old.v.set(0, 0);\n this.old.a.set(0, 0);\n this.easing = ease.easeLinear;\n\n this.rgb.reset();\n Util.emptyObject(this.data);\n this.removeAllBehaviours();\n\n return this;\n }\n\n /**\n * Updates the particle's state.\n * @param {number} time The time elapsed since the last update\n * @param {number} index The index of the particle in its parent system\n */\n update(time, index) {\n if (!this.sleep) {\n this.age += time;\n this.applyBehaviours(time, index);\n }\n\n if (this.age < this.life) {\n const scale = this.easing(this.age / this.life);\n this.energy = Math.max(1 - scale, 0);\n } else {\n this.destroy();\n }\n }\n\n /**\n * Applies all behaviours attached to the particle.\n * @param {number} time The time elapsed since the last update\n * @param {number} index The index of the particle in its parent system\n */\n applyBehaviours(time, index) {\n const length = this.behaviours.length;\n let i;\n\n for (i = 0; i < length; i++) {\n this.behaviours[i] && this.behaviours[i].applyBehaviour(this, time, index);\n }\n }\n\n /**\n * Adds a behaviour to the particle.\n * @param {Behaviour} behaviour The behaviour to add\n */\n addBehaviour(behaviour) {\n this.behaviours.push(behaviour);\n\n if (behaviour.hasOwnProperty(\"parents\")) behaviour.parents.push(this);\n behaviour.initialize(this);\n }\n\n /**\n * Adds multiple behaviours to the particle.\n * @param {Behaviour[]} behaviours An array of behaviours to add\n */\n addBehaviours(behaviours) {\n const length = behaviours.length;\n let i;\n\n for (i = 0; i < length; i++) {\n this.addBehaviour(behaviours[i]);\n }\n }\n\n /**\n * Removes a specific behaviour from the particle.\n * @param {Behaviour} behaviour The behaviour to remove\n */\n removeBehaviour(behaviour) {\n const index = this.behaviours.indexOf(behaviour);\n\n if (index > -1) {\n const behaviour = this.behaviours.splice(index, 1);\n behaviour.parents = null;\n }\n }\n\n /**\n * Removes all behaviours from the particle.\n */\n removeAllBehaviours() {\n Util.emptyArray(this.behaviours);\n }\n\n /**\n * Destroys the particle, removing all behaviours and setting it as dead.\n */\n destroy() {\n this.removeAllBehaviours();\n this.energy = 0;\n this.dead = true;\n this.parent = null;\n }\n}\n","export default {\n /**\n * @typedef {Object} rgbObject\n * @property {Number} r red value\n * @property {Number} g green value\n * @property {Number} b blue value\n */\n /**\n * converts a hex value to a rgb object\n *\n * @memberof Proton#Proton.Util\n * @method hexToRgb\n *\n * @param {String} h any hex value, e.g. #000000 or 000000 for black\n *\n * @return {rgbObject}\n */\n hexToRgb(h) {\n const hex16 = h.charAt(0) === \"#\" ? h.substring(1, 7) : h;\n const r = parseInt(hex16.substring(0, 2), 16);\n const g = parseInt(hex16.substring(2, 4), 16);\n const b = parseInt(hex16.substring(4, 6), 16);\n\n return { r, g, b };\n },\n\n /**\n * converts a rgb value to a rgb string\n *\n * @memberof Proton#Proton.Util\n * @method rgbToHex\n *\n * @param {Object | Proton.hexToRgb} rgb a rgb object like in {@link Proton#Proton.}\n *\n * @return {String} rgb()\n */\n rgbToHex(rbg) {\n return `rgb(${rbg.r}, ${rbg.g}, ${rbg.b})`;\n },\n\n getHex16FromParticle(p) {\n return Number(p.rgb.r) * 65536 + Number(p.rgb.g) * 256 + Number(p.rgb.b);\n }\n};\n","import Vector2D from \"./Vector2D\";\n\nexport default class Polar2D {\n constructor(r, tha) {\n this.r = Math.abs(r) || 0;\n this.tha = tha || 0;\n }\n\n set(r, tha) {\n this.r = r;\n this.tha = tha;\n return this;\n }\n\n setR(r) {\n this.r = r;\n return this;\n }\n\n setTha(tha) {\n this.tha = tha;\n return this;\n }\n\n copy(p) {\n this.r = p.r;\n this.tha = p.tha;\n return this;\n }\n\n toVector() {\n return new Vector2D(this.getX(), this.getY());\n }\n\n getX() {\n return this.r * Math.sin(this.tha);\n }\n\n getY() {\n return -this.r * Math.cos(this.tha);\n }\n\n normalize() {\n this.r = 1;\n return this;\n }\n\n equals(v) {\n return v.r === this.r && v.tha === this.tha;\n }\n\n clear() {\n this.r = 0.0;\n this.tha = 0.0;\n return this;\n }\n\n clone() {\n return new Polar2D(this.r, this.tha);\n }\n}\n","const Mat3 = {\n create(mat3) {\n const mat = new Float32Array(9);\n if (mat3) this.set(mat3, mat);\n\n return mat;\n },\n\n set(mat1, mat2) {\n for (let i = 0; i < 9; i++) mat2[i] = mat1[i];\n\n return mat2;\n },\n\n multiply(mat, mat2, mat3) {\n let a00 = mat[0],\n a01 = mat[1],\n a02 = mat[2],\n a10 = mat[3],\n a11 = mat[4],\n a20 = mat[6],\n a21 = mat[7],\n b00 = mat2[0],\n b01 = mat2[1],\n b02 = mat2[2],\n b10 = mat2[3],\n b11 = mat2[4],\n b20 = mat2[6],\n b21 = mat2[7];\n\n mat3[0] = b00 * a00 + b01 * a10;\n mat3[1] = b00 * a01 + b01 * a11;\n mat3[2] = a02 * b02;\n mat3[3] = b10 * a00 + b11 * a10;\n mat3[4] = b10 * a01 + b11 * a11;\n mat3[6] = b20 * a00 + b21 * a10 + a20;\n mat3[7] = b20 * a01 + b21 * a11 + a21;\n\n return mat3;\n },\n\n inverse(mat, mat3) {\n let a00 = mat[0],\n a01 = mat[1],\n a10 = mat[3],\n a11 = mat[4],\n a20 = mat[6],\n a21 = mat[7],\n b01 = a11,\n b11 = -a10,\n b21 = a21 * a10 - a11 * a20,\n d = a00 * b01 + a01 * b11,\n id;\n\n id = 1 / d;\n mat3[0] = b01 * id;\n mat3[1] = -a01 * id;\n mat3[3] = b11 * id;\n mat3[4] = a00 * id;\n mat3[6] = b21 * id;\n mat3[7] = (-a21 * a00 + a01 * a20) * id;\n\n return mat3;\n },\n\n multiplyVec2(m, vec, mat3) {\n let x = vec[0],\n y = vec[1];\n\n mat3[0] = x * m[0] + y * m[3] + m[6];\n mat3[1] = x * m[1] + y * m[4] + m[7];\n\n return mat3;\n }\n};\n\nexport default Mat3;\n","import Span from \"./Span\";\nimport Util from \"../utils/Util\";\nimport MathUtil from \"./MathUtil\";\n\n/**\n * Represents an ArraySpan, a subclass of Span that works with arrays.\n * @extends Span\n */\nexport default class ArraySpan extends Span {\n /**\n * Creates an instance of ArraySpan.\n * @param {Array|*|any} arr - The array or value to be converted to an array.\n */\n constructor(arr) {\n super();\n this._arr = Util.toArray(arr);\n }\n\n /**\n * Gets a random value from the array.\n * If the value is \"random\" or \"Random\", it returns a random color.\n * @returns {*} A random value from the array or a random color.\n */\n getValue() {\n const val = Util.getRandFromArray(this._arr);\n return val === \"random\" || val === \"Random\" ? MathUtil.randomColor() : val;\n }\n\n /**\n * Creates an ArraySpan instance from the given array.\n * If the input is already an ArraySpan instance, it returns the input.\n * @static\n * @param {Array|ArraySpan|any} arr - The array or ArraySpan instance.\n * @returns {ArraySpan|null} A new ArraySpan instance or null if the input is falsy.\n */\n static createArraySpan(arr) {\n if (!arr) return null;\n\n if (arr instanceof ArraySpan) return arr;\n else return new ArraySpan(arr);\n }\n}\n","export default class Rectangle {\n constructor(x, y, w, h) {\n this.x = x;\n this.y = y;\n\n this.width = w;\n this.height = h;\n\n this.bottom = this.y + this.height;\n this.right = this.x + this.width;\n }\n\n contains(x, y) {\n if (x <= this.right && x >= this.x && y <= this.bottom && y >= this.y) return true;\n else return false;\n }\n}\n","import Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\n\n/**\n * Rate class for controlling particle emission rate.\n */\nexport default class Rate {\n /**\n * @type {Span}\n * @private\n */\n numPan;\n\n /**\n * @type {Span}\n * @private\n */\n timePan;\n\n /**\n * @type {number}\n * @private\n */\n startTime;\n\n /**\n * @type {number}\n * @private\n */\n nextTime;\n\n /**\n * Creates a new Rate instance.\n * The number of particles per second emission (a [particle]/b [s]).\n * @param {Array|number|Span} [numpan=1] - The number of particles for each emission.\n * @param {Array|number|Span} [timepan=1] - The time interval between each emission.\n * @example\n * // Create a rate of 10-20 particles every 0.1-0.25 seconds\n * new Rate(new Span(10, 20), new Span(0.1, 0.25));\n */\n constructor(numpan, timepan) {\n this.numPan = Span.setSpanValue(Util.initValue(numpan, 1));\n this.timePan = Span.setSpanValue(Util.initValue(timepan, 1));\n\n this.startTime = 0;\n this.nextTime = 0;\n this.init();\n }\n\n /**\n * Initializes the rate.\n * @private\n */\n init() {\n this.startTime = 0;\n this.nextTime = this.timePan.getValue();\n }\n\n /**\n * Gets the number of particles to emit based on the elapsed time.\n * @param {number} time - The elapsed time since the last update.\n * @returns {number} The number of particles to emit.\n */\n getValue(time) {\n this.startTime += time;\n\n if (this.startTime >= this.nextTime) {\n this.startTime = 0;\n this.nextTime = this.timePan.getValue();\n\n if (this.numPan.b === 1) {\n if (this.numPan.getValue(false) > 0.5) return 1;\n else return 0;\n } else {\n return this.numPan.getValue(true);\n }\n }\n\n return 0;\n }\n}\n","export default class Initialize {\n reset() {}\n\n init(emitter, particle) {\n if (particle) {\n this.initialize(particle);\n } else {\n this.initialize(emitter);\n }\n }\n\n // sub class init\n initialize(target) {}\n}\n","import Span from \"../math/Span\";\nimport Initialize from \"./Initialize\";\n\n/**\n * Life class for initializing particle lifetime.\n * @extends Initialize\n */\nexport default class Life extends Initialize {\n /**\n * @type {Span}\n * @private\n */\n lifePan;\n\n /**\n * @type {string}\n */\n name;\n\n /**\n * Creates a new Life instance.\n * @param {number|Span} a - The lifetime value or the lower bound of the lifetime range.\n * @param {number} [b] - The upper bound of the lifetime range (if a is a number).\n * @param {boolean} [c] - Whether to use center-based calculation (if a and b are numbers).\n */\n constructor(a, b, c) {\n super();\n\n this.lifePan = Span.setSpanValue(a, b, c);\n this.name = \"Life\";\n }\n\n /**\n * Initializes the lifetime of a target particle.\n * @param {object} target - The target particle to initialize.\n */\n initialize(target) {\n if (this.lifePan.a === Infinity) target.life = Infinity;\n else target.life = this.lifePan.getValue();\n }\n}\n","import Vector2D from \"../math/Vector2D\";\n\nexport default class Zone {\n constructor() {\n this.vector = new Vector2D(0, 0);\n this.random = 0;\n this.crossType = \"dead\";\n this.alert = true;\n }\n\n getPosition() {}\n\n crossing(particle) {}\n\n destroy() {\n this.vector = null;\n }\n}\n","import Zone from \"./Zone\";\n\n/**\n * Represents a point zone in a 2D space.\n * @extends Zone\n */\nexport default class PointZone extends Zone {\n /**\n * Creates a new PointZone.\n * @param {number} x - The x-coordinate of the point.\n * @param {number} y - The y-coordinate of the point.\n */\n constructor(x, y) {\n super();\n\n /**\n * The x-coordinate of the point.\n * @type {number}\n */\n this.x = x;\n\n /**\n * The y-coordinate of the point.\n * @type {number}\n */\n this.y = y;\n }\n\n /**\n * Gets the position of the point.\n * @returns {Object} An object representing the position vector.\n */\n getPosition() {\n this.vector.x = this.x;\n this.vector.y = this.y;\n\n return this.vector;\n }\n\n /**\n * This method is not supported for PointZone.\n * @param {Object} particle - The particle object (unused).\n */\n crossing(particle) {\n if (this.alert) {\n console.error(\"Sorry, PointZone does not support crossing method!\");\n this.alert = false;\n }\n }\n}\n","import Util from \"../utils/Util\";\nimport PointZone from \"../zone/PointZone\";\nimport Initialize from \"./Initialize\";\n\n/**\n * Position class for initializing particle positions.\n * @extends Initialize\n */\nexport default class Position extends Initialize {\n /**\n * @type {PointZone|any}\n * @private\n */\n zone;\n\n /**\n * @type {string}\n */\n name;\n\n /**\n * Creates a new Position instance.\n * @param {PointZone|any} [zone] - The zone to use for positioning. Defaults to a new PointZone if not provided.\n */\n constructor(zone) {\n super();\n this.zone = Util.initValue(zone, new PointZone());\n this.name = \"Position\";\n }\n\n /**\n * Resets this initializer's parameters.\n * @param {PointZone|any} [zone] - The new zone to use for positioning. Defaults to a new PointZone if not provided.\n */\n reset(zone) {\n this.zone = Util.initValue(zone, new PointZone());\n }\n\n /**\n * Initializes the particle's position.\n * @param {object} target - The particle to initialize.\n * @param {object} target.p - The particle's position object.\n * @param {number} target.p.x - The particle's x coordinate.\n * @param {number} target.p.y - The particle's y coordinate.\n */\n initialize(target) {\n this.zone.getPosition();\n\n target.p.x = this.zone.vector.x;\n target.p.y = this.zone.vector.y;\n }\n}\n","import Proton from \"../core/Proton\";\nimport Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\nimport Initialize from \"./Initialize\";\nimport Polar2D from \"../math/Polar2D\";\nimport MathUtil from \"../math/MathUtil\";\n\n/**\n * Velocity class for initializing particle velocities.\n * @extends Initialize\n */\nexport default class Velocity extends Initialize {\n /**\n * @type {Span}\n * @private\n */\n rPan;\n\n /**\n * @type {Span}\n * @private\n */\n thaPan;\n\n /**\n * @type {string}\n */\n name;\n\n /**\n * Creates a new Velocity instance.\n * @param {number|Span} [rpan] - The radial component of the velocity or its range.\n * @param {number|Span} [thapan] - The angular component of the velocity or its range.\n * @param {string} [type='vector'] - The type of velocity ('vector' or 'polar').\n */\n constructor(rpan, thapan, type) {\n super();\n\n this.rPan = Span.setSpanValue(rpan);\n this.thaPan = Span.setSpanValue(thapan);\n this.type = Util.initValue(type, \"vector\");\n\n this.name = \"Velocity\";\n }\n\n /**\n * Resets the velocity parameters.\n * @param {number|Span} [rpan] - The radial component of the velocity or its range.\n * @param {number|Span} [thapan] - The angular component of the velocity or its range.\n * @param {string} [type='vector'] - The type of velocity ('vector' or 'polar').\n */\n reset(rpan, thapan, type) {\n this.rPan = Span.setSpanValue(rpan);\n this.thaPan = Span.setSpanValue(thapan);\n this.type = Util.initValue(type, \"vector\");\n }\n\n /**\n * Normalizes the velocity value.\n * @param {number} vr - The velocity value to normalize.\n * @returns {number} The normalized velocity value.\n * @private\n */\n normalizeVelocity(vr) {\n return vr * Proton.MEASURE;\n }\n\n /**\n * Initializes the particle's velocity.\n * @param {object} target - The particle to initialize.\n */\n initialize(target) {\n if (this.type === \"p\" || this.type === \"P\" || this.type === \"polar\") {\n const polar2d = new Polar2D(\n this.normalizeVelocity(this.rPan.getValue()),\n this.thaPan.getValue() * MathUtil.PI_180\n );\n\n target.v.x = polar2d.getX();\n target.v.y = polar2d.getY();\n } else {\n target.v.x = this.normalizeVelocity(this.rPan.getValue());\n target.v.y = this.normalizeVelocity(this.thaPan.getValue());\n }\n }\n}\n","import Span from \"../math/Span\";\nimport Initialize from \"./Initialize\";\n\n/**\n * Mass class for initializing particle mass.\n * @extends Initialize\n */\nexport default class Mass extends Initialize {\n /**\n * @type {Span}\n * @private\n */\n massPan;\n\n /**\n * @type {string}\n */\n name;\n\n /**\n * Creates a new Mass instance.\n * @param {number|Span} a - The mass value or the lower bound of the mass range.\n * @param {number} [b] - The upper bound of the mass range (if a is a number).\n * @param {boolean} [c] - Whether to use center-based calculation (if a and b are numbers).\n */\n constructor(a, b, c) {\n super();\n this.massPan = Span.setSpanValue(a, b, c);\n this.name = \"Mass\";\n }\n\n /**\n * Initializes the mass of a target particle.\n * @param {object} target - The target particle to initialize.\n */\n initialize(target) {\n target.mass = this.massPan.getValue();\n }\n}\n","import Span from \"../math/Span\";\nimport Initialize from \"./Initialize\";\n\n/**\n * Radius class for initializing particle radius.\n * @extends Initialize\n */\nexport default class Radius extends Initialize {\n /**\n * @type {Span}\n */\n radius;\n\n /**\n * @type {string}\n */\n name;\n\n /**\n * Creates a new Radius instance.\n * @param {number|Span} a - The radius value or the lower bound of the radius range.\n * @param {number} [b] - The upper bound of the radius range (if a is a number).\n * @param {boolean} [c] - Whether to use center-based calculation (if a and b are numbers).\n */\n constructor(a, b, c) {\n super();\n this.radius = Span.setSpanValue(a, b, c);\n this.name = \"Radius\";\n }\n\n /**\n * Resets this initializer's parameters.\n * @param {number|Span} a - The radius value or the lower bound of the radius range.\n * @param {number} [b] - The upper bound of the radius range (if a is a number).\n * @param {boolean} [c] - Whether to use center-based calculation (if a and b are numbers).\n */\n reset(a, b, c) {\n this.radius = Span.setSpanValue(a, b, c);\n }\n\n /**\n * Initializes the particle's radius.\n * @param {Particle} particle - The particle to initialize.\n */\n initialize(particle) {\n particle.radius = this.radius.getValue();\n particle.data.oldRadius = particle.radius;\n }\n}\n","import Util from \"../utils/Util\";\nimport ArraySpan from \"../math/ArraySpan\";\nimport Initialize from \"./Initialize\";\n\n/**\n * Body class for initializing particle bodies.\n * @extends Initialize\n */\nexport default class Body extends Initialize {\n /**\n * @type {ArraySpan}\n * @private\n */\n image;\n\n /**\n * @type {string}\n */\n name;\n\n /**\n * Creates a new Body instance.\n * @param {string|object|Image|HTMLImageElement|ArraySpan} image - The image source or object to use for the particle body.\n * @param {number} [w=20] - The width of the particle body.\n * @param {number} [h] - The height of the particle body. Defaults to the width if not provided.\n */\n constructor(image, w, h) {\n super();\n\n this.image = this.setSpanValue(image);\n this.w = Util.initValue(w, 20);\n this.h = Util.initValue(h, this.w);\n this.name = \"Body\";\n }\n\n /**\n * Initializes the particle's body.\n * @param {object} particle - The particle to initialize.\n */\n initialize(particle) {\n const imageTarget = this.image.getValue();\n\n if (typeof imageTarget === \"string\") {\n particle.body = {\n width: this.w,\n height: this.h,\n src: imageTarget,\n isInner: true,\n inner: true\n };\n } else {\n particle.body = imageTarget;\n }\n }\n\n /**\n * Sets the span value for the image.\n * @param {string|object|Image|HTMLImageElement|ArraySpan} image - The image source or object to set as span value.\n * @returns {ArraySpan} The ArraySpan instance.\n * @private\n */\n setSpanValue(image) {\n return image instanceof ArraySpan ? image : new ArraySpan(image);\n }\n}\n","import Proton from \"../core/Proton\";\nimport Util from \"../utils/Util\";\nimport ease from \"../math/ease\";\n\n/**\n * The Behaviour class is the base for the other Behaviour\n * @class\n */\nexport default class Behaviour {\n static id = 0;\n\n /**\n * Create a new Behaviour instance\n * @param {number} [life=Infinity] - The behaviour's life\n * @param {string} [easing='easeLinear'] - The behaviour's decaying trend, for example ease.easeOutQuart\n */\n constructor(life, easing) {\n /**\n * The behaviour's life\n * @type {number}\n */\n this.life = Util.initValue(life, Infinity);\n\n /**\n * The behaviour's easing function\n * @type {function}\n */\n this.easing = ease.getEasing(easing);\n\n /**\n * The behaviour's current age\n * @type {number}\n */\n this.age = 0;\n\n /**\n * The behaviour's current energy\n * @type {number}\n */\n this.energy = 1;\n\n /**\n * Whether the behaviour is dead\n * @type {boolean}\n */\n this.dead = false;\n\n /**\n * The behaviour's parent emitters\n * @type {Array}\n */\n this.parents = [];\n\n /**\n * The behaviour's unique id\n * @type {string}\n */\n this.id = `Behaviour_${Behaviour.id++}`;\n\n /**\n * The behaviour's name\n * @type {string}\n */\n this.name = \"Behaviour\";\n }\n\n /**\n * Reset this behaviour's parameters\n * @param {number} [life=Infinity] - This behaviour's new life\n * @param {string} [easing='easeLinear'] - This behaviour's new easing\n */\n reset(life, easing) {\n this.life = Util.initValue(life, Infinity);\n this.easing = ease.getEasing(easing);\n }\n\n /**\n * Normalize a force by 1:100\n * @param {Proton.Vector2D} force - The force to normalize\n * @returns {Proton.Vector2D} The normalized force\n */\n normalizeForce(force) {\n return force.multiplyScalar(Proton.MEASURE);\n }\n\n /**\n * Normalize a value by 1:100\n * @param {number} value - The value to normalize\n * @returns {number} The normalized value\n */\n normalizeValue(value) {\n return value * Proton.MEASURE;\n }\n\n /**\n * Initialize the behaviour's parameters for a particle\n * @param {Proton.Particle} particle - The particle to initialize\n */\n initialize(particle) {}\n\n /**\n * Compute the behaviour's life cycle\n * @param {Proton.Particle} particle - The particle to calculate for\n * @param {number} time - The integrate time 1/ms\n * @param {number} index - The particle index\n */\n calculate(particle, time, index) {\n this.age += time;\n\n if (this.age >= this.life || this.dead) {\n this.energy = 0;\n this.dead = true;\n this.destroy();\n } else {\n const scale = this.easing(particle.age / particle.life);\n this.energy = Math.max(1 - scale, 0);\n }\n }\n\n /**\n * Apply this behaviour to a particle\n * @param {Proton.Particle} particle - The particle to apply the behaviour to\n * @param {number} time - The integrate time 1/ms\n * @param {number} index - The particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n }\n\n /**\n * Destroy this behaviour\n */\n destroy() {\n let i = this.parents.length;\n while (i--) {\n this.parents[i].removeBehaviour(this);\n }\n\n this.parents.length = 0;\n }\n}\n","import Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Force extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Force\n *\n * @param {Number} fx\n * @param {Number} fy\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(fx, fy, life, easing) {\n super(life, easing);\n\n this.force = this.normalizeForce(new Vector2D(fx, fy));\n this.name = \"Force\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Force\n * @instance\n *\n * @param {Number} fx\n * @param {Number} fy\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(fx, fy, life, easing) {\n this.force = this.normalizeForce(new Vector2D(fx, fy));\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Force\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n particle.a.add(this.force);\n }\n}\n","import Util from \"../utils/Util\";\nimport Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\n/**\n * Attraction behavior for particles.\n * This behaviour makes particles follow a specific target position.\n * @extends Behaviour\n */\nexport default class Attraction extends Behaviour {\n /**\n * Creates an instance of Attraction.\n * @param {Vector2D} targetPosition - The attraction point coordinates.\n * @param {number} [force=100] - The strength of the attraction force.\n * @param {number} [radius=1000] - The radius of influence for the attraction.\n * @param {number} [life=Infinity] - The life span of this behaviour.\n * @param {string} [easing='ease.easeLinear'] - The easing function for this behaviour.\n */\n constructor(targetPosition, force, radius, life, easing) {\n super(life, easing);\n\n /**\n * The target position for attraction.\n * @type {Vector2D}\n */\n this.targetPosition = Util.initValue(targetPosition, new Vector2D());\n\n /**\n * The radius of influence for the attraction.\n * @type {number}\n */\n this.radius = Util.initValue(radius, 1000);\n\n /**\n * The strength of the attraction force.\n * @type {number}\n */\n this.force = Util.initValue(this.normalizeValue(force), 100);\n\n /**\n * The squared radius (for optimization).\n * @type {number}\n */\n this.radiusSq = this.radius * this.radius;\n\n /**\n * The attraction force vector.\n * @type {Vector2D}\n */\n this.attractionForce = new Vector2D();\n\n /**\n * The squared length of the attraction force.\n * @type {number}\n */\n this.lengthSq = 0;\n\n /**\n * The name of the behaviour.\n * @type {string}\n */\n this.name = \"Attraction\";\n }\n\n /**\n * Resets the behaviour's parameters.\n * @param {Vector2D} targetPosition - The new attraction point coordinates.\n * @param {number} [force=100] - The new strength of the attraction force.\n * @param {number} [radius=1000] - The new radius of influence for the attraction.\n * @param {number} [life=Infinity] - The new life span of this behaviour.\n * @param {string} [easing='ease.easeLinear'] - The new easing function for this behaviour.\n */\n reset(targetPosition, force, radius, life, easing) {\n this.targetPosition = Util.initValue(targetPosition, new Vector2D());\n this.radius = Util.initValue(radius, 1000);\n this.force = Util.initValue(this.normalizeValue(force), 100);\n this.radiusSq = this.radius * this.radius;\n this.attractionForce = new Vector2D();\n this.lengthSq = 0;\n\n life && super.reset(life, easing);\n }\n\n /**\n * Applies this behaviour to a particle.\n * @param {Particle} particle - The particle to apply the behaviour to.\n * @param {number} time - The current simulation time.\n * @param {number} index - The index of the particle.\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n this.attractionForce.copy(this.targetPosition);\n this.attractionForce.sub(particle.p);\n this.lengthSq = this.attractionForce.lengthSq();\n\n if (this.lengthSq > 0.00004 && this.lengthSq < this.radiusSq) {\n this.attractionForce.normalize();\n this.attractionForce.multiplyScalar(1 - this.lengthSq / this.radiusSq);\n this.attractionForce.multiplyScalar(this.force);\n\n particle.a.add(this.attractionForce);\n }\n }\n}\n","import Vector2D from \"../math/Vector2D\";\nimport MathUtil from \"../math/MathUtil\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class RandomDrift extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Behaviour\n * @constructor\n * @alias RandomDrift\n *\n * @param {Number} driftX \t\t\t\tX value of the new Vector2D\n * @param {Number} driftY \t\t\t\tY value of the new Vector2D\n * @param {Number} delay \t\t\t\tHow much delay the drift should have\n * @param {Number} [life=Infinity] \t\tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n *\n * @property {Number} time The time of the drift\n * @property {String} name The Behaviour name\n */\n constructor(driftX, driftY, delay, life, easing) {\n super(life, easing);\n\n this.reset(driftX, driftY, delay);\n this.time = 0;\n this.name = \"RandomDrift\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#RandomDrift\n * @instance\n *\n * @param {Number} driftX \t\t\t\tX value of the new Vector2D\n * @param {Number} driftY \t\t\t\tY value of the new Vector2D\n * @param {Number} delay \t\t\t\tHow much delay the drift should have\n * @param {Number} [life=Infinity] \t\tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n */\n reset(driftX, driftY, delay, life, easing) {\n this.panFoce = new Vector2D(driftX, driftY);\n this.panFoce = this.normalizeForce(this.panFoce);\n this.delay = delay;\n\n life && super.reset(life, easing);\n }\n\n initialize(particle) {\n particle.data.time = 0;\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#RandomDrift\n * @instance\n *\n * @param {Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n particle.data.time += time;\n\n if (particle.data.time >= this.delay) {\n particle.a.addXY(\n MathUtil.randomAToB(-this.panFoce.x, this.panFoce.x),\n MathUtil.randomAToB(-this.panFoce.y, this.panFoce.y)\n );\n\n particle.data.time = 0;\n }\n }\n}\n","import Force from \"./Force\";\n\nexport default class Gravity extends Force {\n /**\n * @memberof! Proton#\n * @augments Proton#Proton.Force\n * @constructor\n * @alias Proton.Gravity\n *\n * @param {Number} g \t\t\t\t\t\t\tGravity\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(g, life, easing) {\n super(0, g, life, easing);\n this.name = \"Gravity\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Gravity\n * @instance\n *\n * @param {Number} g \t\t\t\t\t\t\tGravity\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(g, life, easing) {\n super.reset(0, g, life, easing);\n }\n}\n","import Util from \"../utils/Util\";\nimport Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Collision extends Behaviour {\n /**\n * The callback after collision\n *\n * @callback Callback\n *\n * @param {Proton.Particle} particle\n * @param {Proton.Paritcle} otherParticle\n */\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Collision\n *\n * @todo add description to mass\n *\n * @param {Proton.Emitter} \t[emitter=null] \t\tthe attraction point coordinates\n * @param {Boolean} \t\t[mass=true]\n * @param {Callback}\t \t[callback=null]\t\tthe callback after the collision\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(emitter, mass, callback, life, easing) {\n super(life, easing);\n this.reset(emitter, mass, callback);\n this.newPool = [];\n this.pool = [];\n this.name = \"Collision\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @memberof Proton#Proton.Collision\n * @method reset\n * @instance\n *\n * @todo add description to mass\n *\n * @param {Proton.Emitter} \t[emitter=null] \t\tthe attraction point coordinates\n * @param {Boolean} \t\t[mass=true]\n * @param {Callback}\t \t[callback=null]\t\tthe callback after the collision\n * @param {Number} \t\t\t[life=Infinity] \tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(emitter, mass, callback, life, easing) {\n this.emitter = Util.initValue(emitter, null);\n this.mass = Util.initValue(mass, true);\n this.callback = Util.initValue(callback, null);\n\n this.collisionPool = [];\n this.delta = new Vector2D();\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @memberof Proton#Proton.Collision\n * @method applyBehaviour\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n if (this.emitter) {\n Util.sliceArray(this.emitter.particles, index, this.newPool);\n } else {\n Util.sliceArray(this.pool, index, this.newPool);\n }\n\n const length = this.newPool.length;\n let otherParticle;\n let lengthSq;\n let overlap;\n let totalMass;\n let averageMass1, averageMass2;\n let i;\n\n for (i = 0; i < length; i++) {\n otherParticle = this.newPool[i];\n\n if (otherParticle !== particle) {\n this.delta.copy(otherParticle.p);\n this.delta.sub(particle.p);\n\n lengthSq = this.delta.lengthSq();\n const distance = particle.radius + otherParticle.radius;\n\n if (lengthSq <= distance * distance) {\n overlap = distance - Math.sqrt(lengthSq);\n overlap += 0.5;\n\n totalMass = particle.mass + otherParticle.mass;\n averageMass1 = this.mass ? otherParticle.mass / totalMass : 0.5;\n averageMass2 = this.mass ? particle.mass / totalMass : 0.5;\n\n particle.p.add(\n this.delta\n .clone()\n .normalize()\n .multiplyScalar(overlap * -averageMass1)\n );\n otherParticle.p.add(this.delta.normalize().multiplyScalar(overlap * averageMass2));\n\n this.callback && this.callback(particle, otherParticle);\n }\n }\n }\n }\n}\n","import Util from \"../utils/Util\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class CrossZone extends Behaviour {\n /**\n * Defines what happens if the particles come to the end of the specified zone\n *\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.CrossZone\n *\n * @param {Proton.Zone} zone \t\t\t\t\t\tcan be any Proton.Zone - e.g. Proton.RectZone()\n * @param {String} \t\t[crossType=dead] \t\t\twhat happens if the particles pass the zone - allowed strings: dead | bound | cross\n * @param {Number} \t\t[life=Infinity] \t\t\tthis behaviour's life\n * @param {String} \t\t[easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(zone, crossType, life, easing) {\n super(life, easing);\n\n this.reset(zone, crossType);\n this.name = \"CrossZone\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.CrossZone\n * @instance\n *\n * @param {Proton.Zone} zone \t\t\t\tcan be any Proton.Zone - e.g. Proton.RectZone()\n * @param {String} \t\t[crossType=dead] \twhat happens if the particles pass the zone - allowed strings: dead | bound | cross\n * @param {Number} \t\t[life=Infinity] \tthis behaviour's life\n * @param {String} \t\t[easing=easeLinear]\tthis behaviour's easing\n */\n reset(zone, crossType, life, easing) {\n this.zone = zone;\n this.zone.crossType = Util.initValue(crossType, \"dead\");\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.CrossZone\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n this.zone.crossing(particle);\n }\n}\n","import Util from \"../utils/Util\";\nimport Span from \"../math/Span\";\nimport Behaviour from \"./Behaviour\";\n\n/**\n * Alpha behaviour for controlling particle opacity over time.\n * @extends Behaviour\n */\nexport default class Alpha extends Behaviour {\n /**\n * @type {boolean}\n * @private\n */\n same;\n\n /**\n * @type {Span}\n * @private\n */\n a;\n\n /**\n * @type {Span}\n * @private\n */\n b;\n\n /**\n * @type {string}\n */\n name;\n\n /**\n * Creates a new Alpha instance.\n * @param {number|Span} [a=1] - The initial alpha value or range.\n * @param {number|Span} [b] - The final alpha value or range. If not provided, it will be the same as 'a'.\n * @param {number} [life=Infinity] - This behaviour's life.\n * @param {string} [easing='easeLinear'] - This behaviour's easing function.\n */\n constructor(a, b, life, easing) {\n super(life, easing);\n\n this.reset(a, b);\n this.name = \"Alpha\";\n }\n\n /**\n * Resets this behaviour's parameters.\n * @param {number|Span} [a=1] - The initial alpha value or range.\n * @param {number|Span} [b] - The final alpha value or range. If not provided, it will be the same as 'a'.\n * @param {number} [life] - This behaviour's life.\n * @param {string} [easing] - This behaviour's easing function.\n */\n reset(a, b, life, easing) {\n this.same = b === null || b === undefined;\n this.a = Span.setSpanValue(Util.initValue(a, 1));\n this.b = Span.setSpanValue(b);\n\n life && super.reset(life, easing);\n }\n\n /**\n * Initializes the particle's alpha values.\n * @param {Particle} particle - The particle to initialize.\n */\n initialize(particle) {\n particle.data.alphaA = this.a.getValue();\n\n if (this.same) particle.data.alphaB = particle.data.alphaA;\n else particle.data.alphaB = this.b.getValue();\n }\n\n /**\n * Applies the alpha behaviour to the particle.\n * @param {Particle} particle - The particle to apply the behaviour to.\n * @param {number} time - The current simulation time.\n * @param {number} index - The index of the particle.\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n particle.alpha = particle.data.alphaB + (particle.data.alphaA - particle.data.alphaB) * this.energy;\n\n if (particle.alpha < 0.001) particle.alpha = 0;\n }\n}\n","import Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\nimport Behaviour from \"./Behaviour\";\n\n/**\n * Scale behaviour for controlling particle size over time.\n * @extends Behaviour\n */\nexport default class Scale extends Behaviour {\n /**\n * @type {boolean}\n * @private\n */\n same;\n\n /**\n * @type {string}\n */\n name;\n\n /**\n * Creates a new Scale instance.\n * @param {number|Span} [a=1] - The initial scale value or range.\n * @param {number|Span} [b] - The final scale value or range. If not provided, it will be the same as 'a'.\n * @param {number} [life=Infinity] - This behaviour's life.\n * @param {string} [easing='easeLinear'] - This behaviour's easing function.\n */\n constructor(a, b, life, easing) {\n super(life, easing);\n\n this.reset(a, b);\n this.name = \"Scale\";\n }\n\n /**\n * Resets this behaviour's parameters.\n * @param {number|Span} a - The initial scale value or range.\n * @param {number|Span} [b] - The final scale value or range. If not provided, it will be the same as 'a'.\n * @param {number} [life] - This behaviour's life.\n * @param {string} [easing] - This behaviour's easing function.\n */\n reset(a, b, life, easing) {\n this.same = b === null || b === undefined;\n this.a = Span.setSpanValue(Util.initValue(a, 1));\n this.b = Span.setSpanValue(b);\n\n life && super.reset(life, easing);\n }\n\n /**\n * Initializes the particle's scale values.\n * @param {Particle} particle - The particle to initialize.\n */\n initialize(particle) {\n particle.data.scaleA = this.a.getValue();\n particle.data.oldRadius = particle.radius;\n particle.data.scaleB = this.same ? particle.data.scaleA : this.b.getValue();\n }\n\n /**\n * Applies the scale behaviour to the particle.\n * @param {Particle} particle - The particle to apply the behaviour to.\n * @param {number} time - The current simulation time.\n * @param {number} index - The index of the particle.\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n particle.scale = particle.data.scaleB + (particle.data.scaleA - particle.data.scaleB) * this.energy;\n\n if (particle.scale < 0.0001) particle.scale = 0;\n particle.radius = particle.data.oldRadius * particle.scale;\n }\n}\n","import Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\nimport Behaviour from \"./Behaviour\";\n\n/**\n * Rotate behaviour for controlling particle rotation.\n * @extends Behaviour\n */\nexport default class Rotate extends Behaviour {\n /**\n * @type {boolean}\n * @private\n */\n same;\n\n /**\n * @type {Span}\n * @private\n */\n a;\n\n /**\n * @type {Span}\n * @private\n */\n b;\n\n /**\n * @type {string}\n * @private\n */\n style;\n\n /**\n * @type {string}\n */\n name;\n\n /**\n * Creates a new Rotate instance.\n * @param {string|number|Span} [influence='Velocity'] - The rotation's influence or initial rotation.\n * @param {string|number|Span} [b] - The final rotation value or range.\n * @param {string} [style='to'] - The style of rotation ('to' or 'add').\n * @param {number} [life=Infinity] - This behaviour's life.\n * @param {string} [easing='easeLinear'] - This behaviour's easing function.\n */\n constructor(influence, b, style, life, easing) {\n super(life, easing);\n\n this.reset(influence, b, style);\n this.name = \"Rotate\";\n }\n\n /**\n * Resets this behaviour's parameters.\n * @param {string|number|Span} [a='Velocity'] - The rotation's influence or initial rotation.\n * @param {string|number|Span} [b] - The final rotation value or range.\n * @param {string} [style='to'] - The style of rotation ('to' or 'add').\n * @param {number} [life] - This behaviour's life.\n * @param {string} [easing] - This behaviour's easing function.\n */\n reset(a, b, style, life, easing) {\n this.same = b === null || b === undefined;\n\n this.a = Span.setSpanValue(Util.initValue(a, \"Velocity\"));\n this.b = Span.setSpanValue(Util.initValue(b, 0));\n this.style = Util.initValue(style, \"to\");\n\n life && super.reset(life, easing);\n }\n\n /**\n * Initializes the behaviour's parameters for a particle.\n * @param {object} particle - The particle to initialize.\n * @param {number} particle.rotation - The particle's rotation.\n * @param {object} particle.data - The particle's data object.\n */\n initialize(particle) {\n particle.rotation = this.a.getValue();\n particle.data.rotationA = this.a.getValue();\n\n if (!this.same) particle.data.rotationB = this.b.getValue();\n }\n\n /**\n * Applies this behaviour to a particle.\n * @param {object} particle - The particle to apply the behaviour to.\n * @param {number} time - The integrate time (1/ms).\n * @param {number} index - The particle index.\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n if (!this.same) {\n if (this.style === \"to\" || this.style === \"TO\" || this.style === \"_\") {\n particle.rotation +=\n particle.data.rotationB + (particle.data.rotationA - particle.data.rotationB) * this.energy;\n } else {\n particle.rotation += particle.data.rotationB;\n }\n } else if (this.a.a === \"V\" || this.a.a === \"Velocity\" || this.a.a === \"v\") {\n // beta...\n particle.rotation = particle.getDirection();\n }\n }\n}\n","import ColorUtil from \"../utils/ColorUtil\";\nimport ArraySpan from \"../math/ArraySpan\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Color extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Color\n *\n * @param {Proton.ArraySpan | String} [a] the string should be a hex e.g. #000000 for black\n * @param {Proton.ArraySpan | String} [b] the string should be a hex e.g. #000000 for black\n * @param {Number} [life=Infinity] \tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(a, b, life, easing) {\n super(life, easing);\n\n this.reset(a, b);\n this.name = \"Color\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black\n * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black\n * @param {Number} [life=Infinity] \tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n */\n reset(a, b, life, easing) {\n this.a = ArraySpan.createArraySpan(a);\n this.b = ArraySpan.createArraySpan(b);\n life && super.reset(life, easing);\n }\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n */\n initialize(particle) {\n particle.color = this.a.getValue();\n particle.data.colorA = ColorUtil.hexToRgb(particle.color);\n\n if (this.b) particle.data.colorB = ColorUtil.hexToRgb(this.b.getValue());\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n if (this.b) {\n this.calculate(particle, time, index);\n\n particle.rgb.r = particle.data.colorB.r + (particle.data.colorA.r - particle.data.colorB.r) * this.energy;\n particle.rgb.g = particle.data.colorB.g + (particle.data.colorA.g - particle.data.colorB.g) * this.energy;\n particle.rgb.b = particle.data.colorB.b + (particle.data.colorA.b - particle.data.colorB.b) * this.energy;\n\n particle.rgb.r = particle.rgb.r << 0;\n particle.rgb.g = particle.rgb.g << 0;\n particle.rgb.b = particle.rgb.b << 0;\n } else {\n particle.rgb.r = particle.data.colorA.r;\n particle.rgb.g = particle.data.colorA.g;\n particle.rgb.b = particle.data.colorA.b;\n }\n }\n}\n","import MathUtil from \"../math/MathUtil\";\nimport Vector2D from \"../math/Vector2D\";\nimport Span from \"../math/Span\";\nimport Behaviour from \"./Behaviour\";\n\nconst CHANGING = \"changing\";\n\nexport default class Cyclone extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Cyclone\n *\n * @param {Number} angle\n * @param {Number} force\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(angle, force, life, easing) {\n super(life, easing);\n this.setAngleAndForce(angle, force);\n this.name = \"Cyclone\";\n }\n\n setAngleAndForce(angle, force) {\n this.force = CHANGING;\n this.angle = MathUtil.PI / 2;\n\n if (angle === \"right\") {\n this.angle = MathUtil.PI / 2;\n } else if (angle === \"left\") {\n this.angle = -MathUtil.PI / 2;\n } else if (angle === \"random\") {\n this.angle = \"random\";\n } else if (angle instanceof Span) {\n this.angle = \"span\";\n this.span = angle;\n } else if (angle) {\n this.angle = angle;\n }\n\n if (\n String(force).toLowerCase() === \"changing\" ||\n String(force).toLowerCase() === \"chang\" ||\n String(force).toLowerCase() === \"auto\"\n ) {\n this.force = CHANGING;\n } else if (force) {\n this.force = force;\n }\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Cyclone\n * @instance\n *\n * @param {Number} angle\n * @param {Number} force\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(angle, force, life, easing) {\n this.angle = MathUtil.PI / 2;\n this.setAngleAndForce(angle, force);\n life && super.reset(life, easing);\n }\n\n initialize(particle) {\n if (this.angle === \"random\") {\n particle.data.cangle = MathUtil.randomAToB(-MathUtil.PI, MathUtil.PI);\n } else if (this.angle === \"span\") {\n particle.data.cangle = this.span.getValue();\n }\n\n particle.data.cyclone = new Vector2D(0, 0);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Cyclone\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n let length;\n let gradient = particle.v.getGradient();\n if (this.angle === \"random\" || this.angle === \"span\") {\n gradient += particle.data.cangle;\n } else {\n gradient += this.angle;\n }\n\n if (this.force === CHANGING) {\n length = particle.v.length() / 100;\n } else {\n length = this.force;\n }\n\n particle.data.cyclone.x = length * Math.cos(gradient);\n particle.data.cyclone.y = length * Math.sin(gradient);\n particle.data.cyclone = this.normalizeForce(particle.data.cyclone);\n particle.a.add(particle.data.cyclone);\n }\n}\n","import Attraction from \"./Attraction\";\n\n/**\n * The opposite of Attraction - turns the force\n *\n * @class\n * @extends Proton.Attraction\n * @memberof! Proton#\n * @alias Proton.Repulsion\n */\nexport default class Repulsion extends Attraction {\n /**\n * Creates a new Repulsion behaviour instance\n *\n * @constructor\n * @param {Proton.Vector2D} targetPosition - The repulsion point coordinates\n * @param {number} [force=100] - The strength of the repulsion force\n * @param {number} [radius=1000] - The radius of influence for the repulsion\n * @param {number} [life=Infinity] - The behaviour's life\n * @param {string} [easing='easeLinear'] - The behaviour's easing function\n */\n constructor(targetPosition, force, radius, life, easing) {\n super(targetPosition, force, radius, life, easing);\n\n /**\n * The strength of the repulsion force\n * @type {number}\n */\n this.force *= -1;\n\n /**\n * The name of the behaviour\n * @type {string}\n */\n this.name = \"Repulsion\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @param {Proton.Vector2D} targetPosition - The new repulsion point coordinates\n * @param {number} [force=100] - The new strength of the repulsion force\n * @param {number} [radius=1000] - The new radius of influence for the repulsion\n * @param {number} [life=Infinity] - The new behaviour's life\n * @param {string} [easing='easeLinear'] - The new behaviour's easing function\n */\n reset(targetPosition, force, radius, life, easing) {\n super.reset(targetPosition, force, radius, life, easing);\n this.force *= -1;\n }\n}\n","import Util from \"../utils/Util\";\nimport Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class GravityWell extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Behaviour\n * @constructor\n * @alias GravityWell\n *\n * @param {Vector2D} [centerPoint=new Vector2D] The point in the center\n * @param {Number} [force=100]\t\t\t\t\tThe force\n * @param {Number} [life=Infinity]\t\t\t\tthis behaviour's life\n * @param {String} [easing=easeLinear]\tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(centerPoint, force, life, easing) {\n super(life, easing);\n\n this.distanceVec = new Vector2D();\n this.centerPoint = Util.initValue(centerPoint, new Vector2D());\n this.force = Util.initValue(this.normalizeValue(force), 100);\n\n this.name = \"GravityWell\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#GravityWell\n * @instance\n *\n * @param {Vector2D} [centerPoint=new Vector2D] The point in the center\n * @param {Number} [force=100]\t\t\t\t\tThe force\n * @param {Number} [life=Infinity]\t\t\t\tthis behaviour's life\n * @param {String} [easing=easeLinear]\tthis behaviour's easing\n */\n reset(centerPoint, force, life, easing) {\n this.distanceVec = new Vector2D();\n this.centerPoint = Util.initValue(centerPoint, new Vector2D());\n this.force = Util.initValue(this.normalizeValue(force), 100);\n\n life && super.reset(life, easing);\n }\n\n /**\n * @inheritdoc\n */\n initialize(particle) {}\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#GravityWell\n * @instance\n *\n * @param {Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.distanceVec.set(this.centerPoint.x - particle.p.x, this.centerPoint.y - particle.p.y);\n const distanceSq = this.distanceVec.lengthSq();\n\n if (distanceSq !== 0) {\n const distance = this.distanceVec.length();\n const factor = (this.force * time) / (distanceSq * distance);\n\n particle.v.x += factor * this.distanceVec.x;\n particle.v.y += factor * this.distanceVec.y;\n }\n }\n}\n","import PropUtil from \"../utils/PropUtil\";\nimport Initialize from \"./Initialize\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default {\n initialize(emitter, particle, initializes) {\n const length = initializes.length;\n let i;\n\n for (i = 0; i < length; i++) {\n if (initializes[i] instanceof Initialize) {\n initializes[i].init(emitter, particle);\n } else {\n this.init(emitter, particle, initializes[i]);\n }\n }\n\n this.bindEmitter(emitter, particle);\n },\n\n // init\n init(emitter, particle, initialize) {\n PropUtil.setProp(particle, initialize);\n PropUtil.setVectorVal(particle, initialize);\n },\n\n bindEmitter(emitter, particle) {\n if (emitter.bindEmitter) {\n particle.p.add(emitter.p);\n particle.v.add(emitter.v);\n particle.a.add(emitter.a);\n particle.v.rotate(MathUtil.degreeTransform(emitter.rotation));\n }\n }\n};\n","import Util from \"../utils/Util\";\nimport Puid from \"../utils/Puid\";\nimport Particle from \"../core/Particle\";\nimport EventDispatcher from \"../events/EventDispatcher\";\n\nimport Rate from \"../initialize/Rate\";\nimport InitializeUtil from \"../initialize/InitializeUtil\";\n\nexport default class Emitter extends Particle {\n /**\n * You can use this emit particles.\n *\n * It will dispatch follow events:\n * PARTICLE_CREATED\n * PARTICLE_UPDATA\n * PARTICLE_DEAD\n *\n * @class Emitter\n * @constructor\n * @param {Object} conf the parameters object;\n * for example {damping:0.01,bindEmitter:false}\n */\n constructor(conf = {}) {\n super(conf);\n\n this.particles = [];\n this.behaviours = [];\n this.initializes = [];\n\n this.emitTime = 0;\n this.emitSpeed = 0;\n this.totalTime = -1;\n\n /**\n * The friction coefficient for all particle emit by This;\n * @property damping\n * @type {Number}\n * @default 0.006\n */\n this.damping = 0.006;\n\n /**\n * If bindEmitter the particles can bind this emitter's property;\n * @property bindEmitter\n * @type {Boolean}\n * @default true\n */\n this.bindEmitter = true;\n\n /**\n * The number of particles per second emit (a [particle]/b [s]);\n * @property rate\n * @type {Rate}\n * @default Rate(1, .1)\n */\n this.rate = new Rate(1, 0.1);\n\n this.name = \"Emitter\";\n this.id = Puid.id(this.name);\n }\n\n /**\n * start emit particle\n * @method emit\n * @param {Number | String} [totalTime] begin emit time;\n * @param {String | boolean} [life] the life of this emitter\n */\n emit(totalTime, life) {\n this.stoped = false;\n this.emitTime = 0;\n this.totalTime = Util.initValue(totalTime, Infinity);\n\n if (life === true || life === \"life\" || life === \"destroy\") {\n this.life = totalTime === \"once\" ? 1 : this.totalTime;\n } else if (!isNaN(life)) {\n this.life = life;\n }\n this.rate.init();\n }\n\n /**\n * stop emiting\n * @method stop\n */\n stop() {\n this.totalTime = -1;\n this.emitTime = 0;\n this.stoped = true;\n }\n\n preEmit(time) {\n let oldStoped = this.stoped;\n let oldEmitTime = this.emitTime;\n let oldTotalTime = this.totalTime;\n\n this.stoped = false;\n this.emitTime = 0;\n this.totalTime = time;\n this.rate.init();\n\n const step = 0.0167;\n while (time > step) {\n time -= step;\n this.update(step);\n }\n\n this.stoped = oldStoped;\n this.emitTime = oldEmitTime + Math.max(time, 0);\n this.totalTime = oldTotalTime;\n }\n\n /**\n * remove current all particles\n * @method removeAllParticles\n */\n removeAllParticles() {\n let i = this.particles.length;\n while (i--) this.particles[i].dead = true;\n }\n\n /**\n * add initialize to this emitter\n * @method addSelfInitialize\n */\n addSelfInitialize(initialize) {\n if (initialize[\"init\"]) {\n initialize.init(this);\n } else {\n // this.initAll();\n }\n }\n\n /**\n * add the Initialize to particles;\n *\n * you can use initializes array:for example emitter.addInitialize(initialize1,initialize2,initialize3);\n * @method addInitialize\n * @param {Initialize} initialize like this new Radius(1, 12)\n */\n addInitialize(...rest) {\n let i = rest.length;\n while (i--) this.initializes.push(rest[i]);\n }\n\n /**\n * remove the Initialize\n * @method removeInitialize\n * @param {Initialize} initialize a initialize\n */\n removeInitialize(initializer) {\n const index = this.initializes.indexOf(initializer);\n if (index > -1) this.initializes.splice(index, 1);\n }\n\n /**\n * remove all Initializes\n * @method removeInitializers\n */\n removeAllInitializers() {\n Util.emptyArray(this.initializes);\n }\n\n /**\n * add the Behaviour to particles;\n *\n * you can use Behaviours array:emitter.addBehaviour(Behaviour1,Behaviour2,Behaviour3);\n * @method addBehaviour\n * @param {Behaviour} behaviour like this new Color('random')\n */\n addBehaviour(...rest) {\n let i = arguments.length;\n while (i--) {\n let behaviour = rest[i];\n this.behaviours.push(behaviour);\n if (behaviour.parents) behaviour.parents.push(this);\n }\n }\n\n /**\n * remove the Behaviour\n * @method removeBehaviour\n * @param {Behaviour} behaviour a behaviour\n */\n removeBehaviour(behaviour) {\n let index = this.behaviours.indexOf(behaviour);\n this.behaviours.splice(index, 1);\n\n if (behaviour.parents) {\n index = behaviour.parents.indexOf(behaviour);\n behaviour.parents.splice(index, 1);\n }\n\n return index;\n }\n\n /**\n * remove all behaviours\n * @method removeAllBehaviours\n */\n removeAllBehaviours() {\n Util.emptyArray(this.behaviours);\n }\n\n // emitter update\n update(time) {\n this.age += time;\n if (this.age >= this.life || this.dead) this.destroy();\n\n this.emitting(time);\n this.integrate(time);\n }\n\n integrate(time) {\n if (!this.parent) return;\n\n const damping = 1 - this.damping;\n this.parent.integrator.calculate(this, time, damping);\n\n const length = this.particles.length;\n let i, particle;\n\n for (i = length - 1; i >= 0; i--) {\n particle = this.particles[i];\n\n // particle update\n particle.update(time, i);\n this.parent.integrator.calculate(particle, time, damping);\n this.dispatch(\"PARTICLE_UPDATE\", particle);\n\n // check dead\n if (particle.dead) {\n this.dispatch(\"PARTICLE_DEAD\", particle);\n\n this.parent.pool.expire(particle);\n this.particles.splice(i, 1);\n }\n }\n }\n\n dispatch(event, target) {\n this.parent && this.parent.dispatchEvent(event, target);\n this.bindEvent && this.dispatchEvent(event, target);\n }\n\n emitting(time) {\n if (this.stoped) return;\n\n if (this.totalTime === \"none\") {\n this.emitTime += time;\n } else if (this.totalTime === \"once\") {\n let i;\n const length = this.rate.getValue(99999);\n\n if (length > 0) this.emitSpeed = length;\n for (i = 0; i < length; i++) this.createParticle();\n this.totalTime = \"none\";\n } else {\n this.emitTime += time;\n\n if (this.emitTime < this.totalTime) {\n const length = this.rate.getValue(time);\n let i;\n\n if (length > 0) this.emitSpeed = length;\n for (i = 0; i < length; i++) this.createParticle();\n }\n }\n }\n\n /**\n * Creates a single particle.\n *\n * @param {Object|Array} [initialize] - Initialization parameters or array of initialization objects.\n * @param {Object|Array} [behaviour] - Behavior object or array of behavior objects.\n * @returns {Particle} The created particle.\n *\n */\n createParticle(initialize, behaviour) {\n const particle = this.parent.pool.get(Particle);\n this.setupParticle(particle, initialize, behaviour);\n this.dispatch(\"PARTICLE_CREATED\", particle);\n\n return particle;\n }\n\n /**\n * Sets up a particle with initialization and behavior.\n *\n * @param {Particle} particle - The particle to set up.\n * @param {Object|Array} [initialize] - Initialization parameters or array of initialization objects.\n * @param {Object|Array} [behaviour] - Behavior object or array of behavior objects.\n */\n setupParticle(particle, initialize, behaviour) {\n let initializes = this.initializes;\n let behaviours = this.behaviours;\n\n if (initialize) initializes = Util.toArray(initialize);\n if (behaviour) behaviours = Util.toArray(behaviour);\n\n particle.reset();\n InitializeUtil.initialize(this, particle, initializes);\n particle.addBehaviours(behaviours);\n particle.parent = this;\n\n this.particles.push(particle);\n }\n\n /**\n * Removes all particles and stops the emitter.\n */\n remove() {\n this.stop();\n Util.destroyAll(this.particles);\n }\n\n /**\n * Destory this Emitter\n * @method destroy\n */\n destroy() {\n this.dead = true;\n this.remove();\n this.removeAllInitializers();\n this.removeAllBehaviours();\n this.parent && this.parent.removeEmitter(this);\n\n this.rate = null;\n this.old = null;\n this.rgb = null;\n this.v = null;\n this.a = null;\n this.p = null;\n }\n}\n\nEventDispatcher.bind(Emitter);\n","import Emitter from \"./Emitter\";\n\nexport default class BehaviourEmitter extends Emitter {\n /**\n * The BehaviourEmitter class inherits from Proton.Emitter\n *\n * use the BehaviourEmitter you can add behaviours to self;\n * @class Proton.BehaviourEmitter\n * @constructor\n * @param {Object} conf the parameters object;\n */\n constructor(conf) {\n super(conf);\n\n this.selfBehaviours = [];\n }\n\n /**\n * add the Behaviour to emitter;\n *\n * you can use Behaviours array:emitter.addSelfBehaviour(Behaviour1,Behaviour2,Behaviour3);\n * @method addSelfBehaviour\n * @param {Proton.Behaviour} behaviour like this new Proton.Color('random')\n */\n addSelfBehaviour(...rest) {\n let i,\n length = rest.length;\n\n for (i = 0; i < length; i++) {\n let behaviour = rest[i];\n this.selfBehaviours.push(behaviour);\n behaviour.initialize(this);\n }\n }\n\n /**\n * remove the Behaviour for self\n * @method removeSelfBehaviour\n * @param {Proton.Behaviour} behaviour a behaviour\n */\n removeSelfBehaviour(behaviour) {\n const index = this.selfBehaviours.indexOf(behaviour);\n if (index > -1) this.selfBehaviours.splice(index, 1);\n }\n\n update(time) {\n super.update(time);\n\n if (!this.sleep) {\n const length = this.selfBehaviours.length;\n let i;\n\n for (i = 0; i < length; i++) {\n this.selfBehaviours[i].applyBehaviour(this, time, i);\n }\n }\n }\n}\n","import Types from \"../utils/Types\";\nimport ColorUtil from \"../utils/ColorUtil\";\nimport MathUtil from \"../math/MathUtil\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nlet PIXIClass;\n\n/**\n * Represents a PIXI-based renderer for particle systems.\n * @extends BaseRenderer\n */\nexport default class PixiRenderer extends BaseRenderer {\n /**\n * Creates a new PixiRenderer instance.\n * @param {PIXI.Container} element - The PIXI container to render to.\n * @param {string|number} [stroke] - The stroke color for particles.\n */\n constructor(element, stroke) {\n super(element);\n\n this.stroke = stroke;\n this.color = false;\n this.setColor = false;\n this.blendMode = null;\n this.pool.create = (body, particle) => this.createBody(body, particle);\n this.setPIXI(window.PIXI);\n\n this.name = \"PixiRenderer\";\n }\n\n setPIXI(PIXI) {\n try {\n PIXIClass = PIXI || { Sprite: {} };\n this.createFromImage = PIXIClass.Sprite.from || PIXIClass.Sprite.fromImage;\n } catch (e) {}\n }\n\n onProtonUpdate() {}\n\n /**\n * @param particle\n */\n onParticleCreated(particle) {\n if (particle.body) {\n particle.body = this.pool.get(particle.body, particle);\n } else {\n particle.body = this.pool.get(this.circleConf, particle);\n }\n\n if (this.blendMode) {\n particle.body.blendMode = this.blendMode;\n }\n\n this.element.addChild(particle.body);\n }\n\n /**\n * @param particle\n */\n onParticleUpdate(particle) {\n this.transform(particle, particle.body);\n\n if (this.setColor === true || this.color === true) {\n particle.body.tint = ColorUtil.getHex16FromParticle(particle);\n }\n }\n\n /**\n * @param particle\n */\n onParticleDead(particle) {\n this.element.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n\n transform(particle, target) {\n target.x = particle.p.x;\n target.y = particle.p.y;\n\n target.alpha = particle.alpha;\n\n target.scale.x = particle.scale;\n target.scale.y = particle.scale;\n\n // using cached version of MathUtil.PI_180 for slight performance increase.\n target.rotation = particle.rotation * MathUtil.PI_180; // MathUtil.PI_180;\n }\n\n createBody(body, particle) {\n if (body.isCircle) return this.createCircle(particle);\n else return this.createSprite(body);\n }\n\n createSprite(body) {\n const sprite = body.isInner ? this.createFromImage(body.src) : new PIXIClass.Sprite(body);\n\n sprite.anchor.x = 0.5;\n sprite.anchor.y = 0.5;\n\n return sprite;\n }\n\n createCircle(particle) {\n const graphics = new PIXIClass.Graphics();\n\n if (this.stroke) {\n const stroke = Types.isString(this.stroke) ? this.stroke : 0x000000;\n graphics.beginStroke(stroke);\n }\n\n graphics.beginFill(particle.color || 0x008ced);\n graphics.drawCircle(0, 0, particle.radius);\n graphics.endFill();\n\n return graphics;\n }\n\n /**\n * Destroys the renderer and cleans up resources.\n * @param {Array} particles - The particles to clean up.\n */\n destroy(particles) {\n super.destroy();\n\n let i = particles.length;\n while (i--) {\n let particle = particles[i];\n if (particle.body) {\n this.element.removeChild(particle.body);\n }\n }\n }\n}\n","import Util from \"../utils/Util\";\nimport Emitter from \"./Emitter\";\n\nexport default class FollowEmitter extends Emitter {\n /**\n * The FollowEmitter class inherits from Proton.Emitter\n *\n * use the FollowEmitter will emit particle when mousemoving\n *\n * @class Proton.FollowEmitter\n * @constructor\n * @param {Element} mouseTarget mouseevent's target;\n * @param {Number} ease the easing of following speed;\n * @default 0.7\n * @param {Object} conf the parameters object;\n */\n constructor(mouseTarget, ease, conf) {\n super(conf);\n\n this.mouseTarget = Util.initValue(mouseTarget, window);\n this.ease = Util.initValue(ease, 0.7);\n\n this._allowEmitting = false;\n this.initEventHandler();\n }\n\n initEventHandler() {\n this.mousemoveHandler = e => this.mousemove.call(this, e);\n this.mousedownHandler = e => this.mousedown.call(this, e);\n this.mouseupHandler = e => this.mouseup.call(this, e);\n this.mouseTarget.addEventListener(\"mousemove\", this.mousemoveHandler, false);\n }\n\n /**\n * start emit particle\n * @method emit\n */\n emit() {\n this._allowEmitting = true;\n }\n\n /**\n * stop emiting\n * @method stop\n */\n stop() {\n this._allowEmitting = false;\n }\n\n mousemove(e) {\n if (e.layerX || e.layerX === 0) {\n this.p.x += (e.layerX - this.p.x) * this.ease;\n this.p.y += (e.layerY - this.p.y) * this.ease;\n } else if (e.offsetX || e.offsetX === 0) {\n this.p.x += (e.offsetX - this.p.x) * this.ease;\n this.p.y += (e.offsetY - this.p.y) * this.ease;\n }\n\n if (this._allowEmitting) super.emit(\"once\");\n }\n\n /**\n * Destory this Emitter\n * @method destroy\n */\n destroy() {\n super.destroy();\n this.mouseTarget.removeEventListener(\"mousemove\", this.mousemoveHandler, false);\n }\n}\n","export default {\n /**\n * Determine whether it is a picture object\n *\n * @return {boolean} is or no\n */\n isImage(obj) {\n if (!obj) return false;\n if (obj.__isImage) return true;\n\n const tagName = `${obj.tagName}`.toUpperCase();\n const nodeName = `${obj.nodeName}`.toUpperCase();\n if (nodeName === \"IMG\" || tagName === \"IMG\") {\n obj.__isImage = true;\n return true;\n }\n\n return false;\n },\n\n /**\n * Determine whether it is a string object\n *\n * @return {boolean} is or no\n */\n isString(obj) {\n return typeof obj === \"string\";\n }\n};\n","import Pool from \"../core/Pool\";\n\nexport default class BaseRenderer {\n constructor(element, stroke) {\n this.pool = new Pool();\n this.element = element;\n this.stroke = stroke;\n this.circleConf = { isCircle: true };\n\n this.initEventHandler();\n this.name = \"BaseRenderer\";\n }\n\n setStroke(color = \"#000000\", thinkness = 1) {\n this.stroke = { color, thinkness };\n }\n\n initEventHandler() {\n this._protonUpdateHandler = () => {\n this.onProtonUpdate.call(this);\n };\n\n this._protonUpdateAfterHandler = () => {\n this.onProtonUpdateAfter.call(this);\n };\n\n this._emitterAddedHandler = emitter => {\n this.onEmitterAdded.call(this, emitter);\n };\n\n this._emitterRemovedHandler = emitter => {\n this.onEmitterRemoved.call(this, emitter);\n };\n\n this._particleCreatedHandler = particle => {\n this.onParticleCreated.call(this, particle);\n };\n\n this._particleUpdateHandler = particle => {\n this.onParticleUpdate.call(this, particle);\n };\n\n this._particleDeadHandler = particle => {\n this.onParticleDead.call(this, particle);\n };\n }\n\n init(proton) {\n this.parent = proton;\n\n proton.addEventListener(\"PROTON_UPDATE\", this._protonUpdateHandler);\n proton.addEventListener(\"PROTON_UPDATE_AFTER\", this._protonUpdateAfterHandler);\n\n proton.addEventListener(\"EMITTER_ADDED\", this._emitterAddedHandler);\n proton.addEventListener(\"EMITTER_REMOVED\", this._emitterRemovedHandler);\n\n proton.addEventListener(\"PARTICLE_CREATED\", this._particleCreatedHandler);\n proton.addEventListener(\"PARTICLE_UPDATE\", this._particleUpdateHandler);\n proton.addEventListener(\"PARTICLE_DEAD\", this._particleDeadHandler);\n }\n\n resize(width, height) {}\n\n destroy() {\n this.remove();\n this.pool.destroy();\n this.pool = null;\n this.element = null;\n this.stroke = null;\n }\n\n remove(proton) {\n this.parent.removeEventListener(\"PROTON_UPDATE\", this._protonUpdateHandler);\n this.parent.removeEventListener(\"PROTON_UPDATE_AFTER\", this._protonUpdateAfterHandler);\n\n this.parent.removeEventListener(\"EMITTER_ADDED\", this._emitterAddedHandler);\n this.parent.removeEventListener(\"EMITTER_REMOVED\", this._emitterRemovedHandler);\n\n this.parent.removeEventListener(\"PARTICLE_CREATED\", this._particleCreatedHandler);\n this.parent.removeEventListener(\"PARTICLE_UPDATE\", this._particleUpdateHandler);\n this.parent.removeEventListener(\"PARTICLE_DEAD\", this._particleDeadHandler);\n\n this.parent = null;\n }\n\n onProtonUpdate() {}\n onProtonUpdateAfter() {}\n\n onEmitterAdded(emitter) {}\n onEmitterRemoved(emitter) {}\n\n onParticleCreated(particle) {}\n onParticleUpdate(particle) {}\n onParticleDead(particle) {}\n}\n","import Types from \"../utils/Types\";\nimport ImgUtil from \"../utils/ImgUtil\";\nimport ColorUtil from \"../utils/ColorUtil\";\nimport MathUtil from \"../math/MathUtil\";\nimport BaseRenderer from \"./BaseRenderer\";\n\n/**\n * CanvasRenderer class for rendering particles on a canvas element.\n * @extends BaseRenderer\n */\nexport default class CanvasRenderer extends BaseRenderer {\n /**\n * @type {object|null}\n * @private\n */\n stroke;\n\n /**\n * @type {CanvasRenderingContext2D}\n * @private\n */\n context;\n\n /**\n * @type {object}\n * @private\n */\n bufferCache;\n\n /**\n * @type {string}\n */\n name;\n\n /**\n * Creates a new CanvasRenderer instance.\n * @param {HTMLCanvasElement} element - The canvas element to render on.\n */\n constructor(element) {\n super(element);\n\n this.stroke = null;\n this.context = this.element.getContext(\"2d\");\n this.bufferCache = {};\n this.name = \"CanvasRenderer\";\n }\n\n /**\n * Resizes the canvas element.\n * @param {number} width - The new width of the canvas.\n * @param {number} height - The new height of the canvas.\n */\n resize(width, height) {\n this.element.width = width;\n this.element.height = height;\n }\n\n /**\n * Clears the canvas on Proton update.\n */\n onProtonUpdate() {\n this.context.clearRect(0, 0, this.element.width, this.element.height);\n }\n\n /**\n * Handles particle creation.\n * @param {object} particle - The created particle.\n */\n onParticleCreated(particle) {\n if (particle.body) {\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n } else {\n particle.color = particle.color || \"#ff0000\";\n }\n }\n\n /**\n * Handles particle updates.\n * @param {object} particle - The updated particle.\n */\n onParticleUpdate(particle) {\n if (particle.body) {\n if (Types.isImage(particle.body)) {\n this.drawImage(particle);\n }\n } else {\n this.drawCircle(particle);\n }\n }\n\n /**\n * Handles particle destruction.\n * @param {object} particle - The destroyed particle.\n */\n onParticleDead(particle) {\n particle.body = null;\n }\n\n /**\n * Adds an image to the particle body.\n * @param {HTMLImageElement} img - The image to add.\n * @param {object} particle - The particle to add the image to.\n * @private\n */\n addImg2Body(img, particle) {\n particle.body = img;\n }\n\n /**\n * Draws an image particle.\n * @param {object} particle - The particle to draw.\n * @private\n */\n drawImage(particle) {\n const w = (particle.body.width * particle.scale) | 0;\n const h = (particle.body.height * particle.scale) | 0;\n const x = particle.p.x - w / 2;\n const y = particle.p.y - h / 2;\n\n if (!!particle.color) {\n if (!particle.data[\"buffer\"]) particle.data.buffer = this.createBuffer(particle.body);\n\n const bufContext = particle.data.buffer.getContext(\"2d\");\n bufContext.clearRect(0, 0, particle.data.buffer.width, particle.data.buffer.height);\n bufContext.globalAlpha = particle.alpha;\n bufContext.drawImage(particle.body, 0, 0);\n\n bufContext.globalCompositeOperation = \"source-atop\";\n bufContext.fillStyle = ColorUtil.rgbToHex(particle.rgb);\n bufContext.fillRect(0, 0, particle.data.buffer.width, particle.data.buffer.height);\n bufContext.globalCompositeOperation = \"source-over\";\n bufContext.globalAlpha = 1;\n\n this.context.drawImage(\n particle.data.buffer,\n 0,\n 0,\n particle.data.buffer.width,\n particle.data.buffer.height,\n x,\n y,\n w,\n h\n );\n } else {\n this.context.save();\n\n this.context.globalAlpha = particle.alpha;\n this.context.translate(particle.p.x, particle.p.y);\n this.context.rotate(MathUtil.degreeTransform(particle.rotation));\n this.context.translate(-particle.p.x, -particle.p.y);\n this.context.drawImage(particle.body, 0, 0, particle.body.width, particle.body.height, x, y, w, h);\n\n this.context.globalAlpha = 1;\n this.context.restore();\n }\n }\n\n /**\n * Draws a circular particle.\n * @param {object} particle - The particle to draw.\n * @private\n */\n drawCircle(particle) {\n if (particle.rgb) {\n this.context.fillStyle = `rgba(${particle.rgb.r},${particle.rgb.g},${particle.rgb.b},${particle.alpha})`;\n } else {\n this.context.fillStyle = particle.color;\n }\n\n this.context.beginPath();\n this.context.arc(particle.p.x, particle.p.y, particle.radius, 0, Math.PI * 2, true);\n\n if (this.stroke) {\n this.context.strokeStyle = this.stroke.color;\n this.context.lineWidth = this.stroke.thinkness;\n this.context.stroke();\n }\n\n this.context.closePath();\n this.context.fill();\n }\n\n /**\n * Creates a buffer for image particles.\n * @param {HTMLImageElement} image - The image to create a buffer for.\n * @returns {HTMLCanvasElement|undefined} The created buffer canvas.\n * @private\n */\n createBuffer(image) {\n if (Types.isImage(image)) {\n const size = image.width + \"_\" + image.height;\n let canvas = this.bufferCache[size];\n\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n canvas.width = image.width;\n canvas.height = image.height;\n this.bufferCache[size] = canvas;\n }\n\n return canvas;\n }\n }\n\n /**\n * Destroys the renderer and cleans up resources.\n */\n destroy() {\n super.destroy();\n this.stroke = null;\n this.context = null;\n this.bufferCache = null;\n }\n}\n","import DomUtil from \"../utils/DomUtil\";\nimport ImgUtil from \"../utils/ImgUtil\";\nimport BaseRenderer from \"./BaseRenderer\";\n\n/**\n * Represents a DOM-based renderer for particle systems.\n * @extends BaseRenderer\n */\nexport default class DomRenderer extends BaseRenderer {\n /**\n * Creates a new DomRenderer instance.\n * @param {HTMLElement} element - The HTML element to render to.\n */\n constructor(element) {\n super(element);\n\n this.stroke = null;\n this.transform3d = false;\n this.pool.create = (body, particle) => this.createBody(body, particle);\n this.addImg2Body = this.addImg2Body.bind(this);\n\n this.name = \"DomRenderer\";\n }\n\n onParticleCreated(particle) {\n if (particle.body) {\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n } else {\n particle.body = this.pool.get(this.circleConf, particle);\n this.element.appendChild(particle.body);\n }\n }\n\n onParticleUpdate(particle) {\n if (this.bodyReady(particle)) {\n if (this.transform3d) {\n DomUtil.transform3d(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);\n } else {\n DomUtil.transform(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);\n }\n\n particle.body.style.opacity = particle.alpha;\n\n if (particle.body.isCircle) {\n particle.body.style.backgroundColor = particle.color || \"#ff0000\";\n }\n }\n }\n\n onParticleDead(particle) {\n if (this.bodyReady(particle)) {\n this.element.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n }\n\n bodyReady(particle) {\n return typeof particle.body === \"object\" && particle.body && !particle.body.isInner;\n }\n\n // private method\n addImg2Body(img, particle) {\n if (particle.dead) return;\n particle.body = this.pool.get(img, particle);\n DomUtil.resize(particle.body, img.width, img.height);\n\n this.element.appendChild(particle.body);\n }\n\n createBody(body, particle) {\n if (body.isCircle) return this.createCircle(particle);\n return this.createSprite(body, particle);\n }\n\n // private methods\n createCircle(particle) {\n const dom = DomUtil.createDiv(`${particle.id}_dom`, 2 * particle.radius, 2 * particle.radius);\n dom.style.borderRadius = `${particle.radius}px`;\n\n if (this.stroke) {\n dom.style.borderColor = this.stroke.color;\n dom.style.borderWidth = `${this.stroke.thinkness}px`;\n }\n dom.isCircle = true;\n\n return dom;\n }\n\n createSprite(body, particle) {\n const url = typeof body === \"string\" ? body : body.src;\n const dom = DomUtil.createDiv(`${particle.id}_dom`, body.width, body.height);\n dom.style.backgroundImage = `url(${url})`;\n\n return dom;\n }\n\n /**\n * Destroys the renderer and cleans up resources.\n */\n destroy() {\n super.destroy();\n this.stroke = null;\n }\n}\n","import Types from \"../utils/Types\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nexport default class EaselRenderer extends BaseRenderer {\n constructor(element, stroke) {\n super(element);\n\n this.stroke = stroke;\n this.name = \"EaselRenderer\";\n }\n\n onParticleCreated(particle) {\n if (particle.body) {\n this.createSprite(particle);\n } else {\n this.createCircle(particle);\n }\n\n this.element.addChild(particle.body);\n }\n\n onParticleUpdate(particle) {\n if (particle.body) {\n particle.body.x = particle.p.x;\n particle.body.y = particle.p.y;\n\n particle.body.alpha = particle.alpha;\n particle.body.scaleX = particle.body.scaleY = particle.scale;\n particle.body.rotation = particle.rotation;\n }\n }\n\n onParticleDead(particle) {\n if (particle.body) {\n particle.body.parent && particle.body.parent.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n\n if (particle.graphics) this.pool.expire(particle.graphics);\n }\n\n // private\n createSprite(particle) {\n particle.body = this.pool.get(particle.body);\n\n if (particle.body.parent) return;\n if (particle.body[\"image\"]) {\n particle.body.regX = particle.body.image.width / 2;\n particle.body.regY = particle.body.image.height / 2;\n }\n }\n\n createCircle(particle) {\n const graphics = this.pool.get(window.createjs.Graphics);\n\n if (this.stroke) {\n if (Types.isString(this.stroke)) {\n graphics.beginStroke(this.stroke);\n } else {\n graphics.beginStroke(\"#000000\");\n }\n }\n graphics.beginFill(particle.color || \"#ff0000\").drawCircle(0, 0, particle.radius);\n const shape = this.pool.get(window.createjs.Shape, [graphics]);\n\n particle.body = shape;\n particle.graphics = graphics;\n }\n\n destroy() {\n super.destroy();\n this.stroke = null;\n }\n}\n","import Rectangle from \"../math/Rectangle\";\nimport BaseRenderer from \"./BaseRenderer\";\n\n/**\n * Represents a pixel-based renderer for particle systems.\n * @extends BaseRenderer\n */\nexport default class PixelRenderer extends BaseRenderer {\n /**\n * Creates a new PixelRenderer instance.\n * @param {HTMLCanvasElement} element - The canvas element to render to.\n * @param {Rectangle} [rectangle] - The rectangle defining the rendering area.\n */\n constructor(element, rectangle) {\n super(element);\n\n this.context = this.element.getContext(\"2d\");\n this.imageData = null;\n this.rectangle = rectangle;\n this.createImageData(rectangle);\n\n this.name = \"PixelRenderer\";\n }\n\n resize(width, height) {\n this.element.width = width;\n this.element.height = height;\n }\n\n createImageData(rectangle) {\n this.rectangle = rectangle ? rectangle : new Rectangle(0, 0, this.element.width, this.element.height);\n this.imageData = this.context.createImageData(this.rectangle.width, this.rectangle.height);\n this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);\n }\n\n onProtonUpdate() {\n this.context.clearRect(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height);\n this.imageData = this.context.getImageData(\n this.rectangle.x,\n this.rectangle.y,\n this.rectangle.width,\n this.rectangle.height\n );\n }\n\n onProtonUpdateAfter() {\n this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);\n }\n\n onParticleCreated(particle) {}\n\n onParticleUpdate(particle) {\n if (this.imageData) {\n this.setPixel(\n this.imageData,\n (particle.p.x - this.rectangle.x) >> 0,\n (particle.p.y - this.rectangle.y) >> 0,\n particle\n );\n }\n }\n\n setPixel(imagedata, x, y, particle) {\n const rgb = particle.rgb;\n if (x < 0 || x > this.element.width || y < 0 || y > this.element.height) return;\n\n const i = ((y >> 0) * imagedata.width + (x >> 0)) * 4;\n imagedata.data[i] = rgb.r;\n imagedata.data[i + 1] = rgb.g;\n imagedata.data[i + 2] = rgb.b;\n imagedata.data[i + 3] = particle.alpha * 255;\n }\n\n onParticleDead(particle) {}\n\n /**\n * Destroys the renderer and cleans up resources.\n */\n destroy() {\n super.destroy();\n this.stroke = null;\n this.context = null;\n this.imageData = null;\n this.rectangle = null;\n }\n}\n","import Mat3 from \"../math/Mat3\";\n\nexport default class MStack {\n constructor() {\n this.mats = [];\n this.size = 0;\n\n for (let i = 0; i < 20; i++) this.mats.push(Mat3.create([0, 0, 0, 0, 0, 0, 0, 0, 0]));\n }\n\n set(m, i) {\n if (i === 0) Mat3.set(m, this.mats[0]);\n else Mat3.multiply(this.mats[i - 1], m, this.mats[i]);\n\n this.size = Math.max(this.size, i + 1);\n }\n\n push(m) {\n if (this.size === 0) Mat3.set(m, this.mats[0]);\n else Mat3.multiply(this.mats[this.size - 1], m, this.mats[this.size]);\n\n this.size++;\n }\n\n pop() {\n if (this.size > 0) this.size--;\n }\n\n top() {\n return this.mats[this.size - 1];\n }\n}\n","import Mat3 from \"../math/Mat3\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nimport Util from \"../utils/Util\";\nimport ImgUtil from \"../utils/ImgUtil\";\nimport MStack from \"../utils/MStack\";\nimport DomUtil from \"../utils/DomUtil\";\nimport WebGLUtil from \"../utils/WebGLUtil\";\nimport MathUtil from \"../math/MathUtil\";\n\n/**\n * Represents a WebGL-based renderer for particle systems.\n * @extends BaseRenderer\n */\nexport default class WebGLRenderer extends BaseRenderer {\n /**\n * Creates a new WebGLRenderer instance.\n * @param {HTMLCanvasElement} element - The canvas element to render to.\n */\n constructor(element) {\n super(element);\n\n this.gl = this.element.getContext(\"experimental-webgl\", { antialias: true, stencil: false, depth: false });\n if (!this.gl) alert(\"Sorry your browser do not suppest WebGL!\");\n\n this.initVar();\n this.setMaxRadius();\n this.initShaders();\n this.initBuffers();\n\n this.gl.blendEquation(this.gl.FUNC_ADD);\n this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n this.gl.enable(this.gl.BLEND);\n this.addImg2Body = this.addImg2Body.bind(this);\n\n this.name = \"WebGLRenderer\";\n }\n\n init(proton) {\n super.init(proton);\n this.resize(this.element.width, this.element.height);\n }\n\n resize(width, height) {\n this.umat[4] = -2;\n this.umat[7] = 1;\n\n this.smat[0] = 1 / width;\n this.smat[4] = 1 / height;\n\n this.mstack.set(this.umat, 0);\n this.mstack.set(this.smat, 1);\n\n this.gl.viewport(0, 0, width, height);\n this.element.width = width;\n this.element.height = height;\n }\n\n setMaxRadius(radius) {\n this.circleCanvasURL = this.createCircle(radius);\n }\n\n getVertexShader() {\n const vsSource = [\n \"uniform vec2 viewport;\",\n \"attribute vec2 aVertexPosition;\",\n \"attribute vec2 aTextureCoord;\",\n \"uniform mat3 tMat;\",\n \"varying vec2 vTextureCoord;\",\n \"varying float alpha;\",\n \"void main() {\",\n \"vec3 v = tMat * vec3(aVertexPosition, 1.0);\",\n \"gl_Position = vec4(v.x, v.y, 0, 1);\",\n \"vTextureCoord = aTextureCoord;\",\n \"alpha = tMat[0][2];\",\n \"}\"\n ].join(\"\\n\");\n return vsSource;\n }\n\n getFragmentShader() {\n const fsSource = [\n \"precision mediump float;\",\n \"varying vec2 vTextureCoord;\",\n \"varying float alpha;\",\n \"uniform sampler2D uSampler;\",\n \"uniform vec4 color;\",\n \"uniform bool useTexture;\",\n \"uniform vec3 uColor;\",\n \"void main() {\",\n \"vec4 textureColor = texture2D(uSampler, vTextureCoord);\",\n \"gl_FragColor = textureColor * vec4(uColor, 1.0);\",\n \"gl_FragColor.w *= alpha;\",\n \"}\"\n ].join(\"\\n\");\n return fsSource;\n }\n\n initVar() {\n this.mstack = new MStack();\n this.umat = Mat3.create([2, 0, 1, 0, -2, 0, -1, 1, 1]);\n this.smat = Mat3.create([1 / 100, 0, 1, 0, 1 / 100, 0, 0, 0, 1]);\n this.texturebuffers = {};\n }\n\n blendEquation(A) {\n this.gl.blendEquation(this.gl[A]);\n }\n\n blendFunc(A, B) {\n this.gl.blendFunc(this.gl[A], this.gl[B]);\n }\n\n getShader(gl, str, fs) {\n const shader = fs ? gl.createShader(gl.FRAGMENT_SHADER) : gl.createShader(gl.VERTEX_SHADER);\n\n gl.shaderSource(shader, str);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n alert(gl.getShaderInfoLog(shader));\n return null;\n }\n\n return shader;\n }\n\n initShaders() {\n const fragmentShader = this.getShader(this.gl, this.getFragmentShader(), true);\n const vertexShader = this.getShader(this.gl, this.getVertexShader(), false);\n\n this.sprogram = this.gl.createProgram();\n this.gl.attachShader(this.sprogram, vertexShader);\n this.gl.attachShader(this.sprogram, fragmentShader);\n this.gl.linkProgram(this.sprogram);\n\n if (!this.gl.getProgramParameter(this.sprogram, this.gl.LINK_STATUS)) alert(\"Could not initialise shaders\");\n\n this.gl.useProgram(this.sprogram);\n this.sprogram.vpa = this.gl.getAttribLocation(this.sprogram, \"aVertexPosition\");\n this.sprogram.tca = this.gl.getAttribLocation(this.sprogram, \"aTextureCoord\");\n this.gl.enableVertexAttribArray(this.sprogram.tca);\n this.gl.enableVertexAttribArray(this.sprogram.vpa);\n\n this.sprogram.tMatUniform = this.gl.getUniformLocation(this.sprogram, \"tMat\");\n this.sprogram.samplerUniform = this.gl.getUniformLocation(this.sprogram, \"uSampler\");\n this.sprogram.useTex = this.gl.getUniformLocation(this.sprogram, \"useTexture\");\n this.sprogram.color = this.gl.getUniformLocation(this.sprogram, \"uColor\");\n this.gl.uniform1i(this.sprogram.useTex, 1);\n }\n\n initBuffers() {\n const vs = [0, 3, 1, 0, 2, 3];\n let idx;\n\n this.unitIBuffer = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(vs), this.gl.STATIC_DRAW);\n\n let i;\n let ids = [];\n for (i = 0; i < 100; i++) ids.push(i);\n idx = new Uint16Array(ids);\n\n this.unitI33 = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitI33);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);\n\n ids = [];\n for (i = 0; i < 100; i++) ids.push(i, i + 1, i + 2);\n idx = new Uint16Array(ids);\n\n this.stripBuffer = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.stripBuffer);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);\n }\n\n createCircle(raidus) {\n this.circleCanvasRadius = WebGLUtil.nhpot(Util.initValue(raidus, 32));\n const canvas = DomUtil.createCanvas(\"circle_canvas\", this.circleCanvasRadius * 2, this.circleCanvasRadius * 2);\n const context = canvas.getContext(\"2d\");\n\n context.beginPath();\n context.arc(this.circleCanvasRadius, this.circleCanvasRadius, this.circleCanvasRadius, 0, Math.PI * 2, true);\n context.closePath();\n context.fillStyle = \"#FFF\";\n context.fill();\n\n return canvas.toDataURL();\n }\n\n drawImg2Canvas(particle) {\n const _w = particle.body.width;\n const _h = particle.body.height;\n\n const _width = WebGLUtil.nhpot(particle.body.width);\n const _height = WebGLUtil.nhpot(particle.body.height);\n\n const _scaleX = particle.body.width / _width;\n const _scaleY = particle.body.height / _height;\n\n if (!this.texturebuffers[particle.data.src])\n this.texturebuffers[particle.data.src] = [\n this.gl.createTexture(),\n this.gl.createBuffer(),\n this.gl.createBuffer()\n ];\n\n particle.data.texture = this.texturebuffers[particle.data.src][0];\n particle.data.vcBuffer = this.texturebuffers[particle.data.src][1];\n particle.data.tcBuffer = this.texturebuffers[particle.data.src][2];\n\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.tcBuffer);\n this.gl.bufferData(\n this.gl.ARRAY_BUFFER,\n new Float32Array([0.0, 0.0, _scaleX, 0.0, 0.0, _scaleY, _scaleY, _scaleY]),\n this.gl.STATIC_DRAW\n );\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.vcBuffer);\n this.gl.bufferData(\n this.gl.ARRAY_BUFFER,\n new Float32Array([0.0, 0.0, _w, 0.0, 0.0, _h, _w, _h]),\n this.gl.STATIC_DRAW\n );\n\n const context = particle.data.canvas.getContext(\"2d\");\n const data = context.getImageData(0, 0, _width, _height);\n\n this.gl.bindTexture(this.gl.TEXTURE_2D, particle.data.texture);\n this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, data);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_NEAREST);\n this.gl.generateMipmap(this.gl.TEXTURE_2D);\n\n particle.data.textureLoaded = true;\n particle.data.textureWidth = _w;\n particle.data.textureHeight = _h;\n }\n\n onProtonUpdate() {\n // this.gl.clearColor(0, 0, 0, 1);\n // this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);\n }\n\n onParticleCreated(particle) {\n particle.data.textureLoaded = false;\n particle.data.tmat = Mat3.create();\n particle.data.tmat[8] = 1;\n particle.data.imat = Mat3.create();\n particle.data.imat[8] = 1;\n\n if (particle.body) {\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n } else {\n ImgUtil.getImgFromCache(this.circleCanvasURL, this.addImg2Body, particle);\n particle.data.oldScale = particle.radius / this.circleCanvasRadius;\n }\n }\n\n // private\n addImg2Body(img, particle) {\n if (particle.dead) return;\n particle.body = img;\n particle.data.src = img.src;\n particle.data.canvas = ImgUtil.getCanvasFromCache(img);\n particle.data.oldScale = 1;\n\n this.drawImg2Canvas(particle);\n }\n\n onParticleUpdate(particle) {\n if (particle.data.textureLoaded) {\n this.updateMatrix(particle);\n\n this.gl.uniform3f(this.sprogram.color, particle.rgb.r / 255, particle.rgb.g / 255, particle.rgb.b / 255);\n this.gl.uniformMatrix3fv(this.sprogram.tMatUniform, false, this.mstack.top());\n\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.vcBuffer);\n this.gl.vertexAttribPointer(this.sprogram.vpa, 2, this.gl.FLOAT, false, 0, 0);\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.tcBuffer);\n this.gl.vertexAttribPointer(this.sprogram.tca, 2, this.gl.FLOAT, false, 0, 0);\n this.gl.bindTexture(this.gl.TEXTURE_2D, particle.data.texture);\n this.gl.uniform1i(this.sprogram.samplerUniform, 0);\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);\n\n this.gl.drawElements(this.gl.TRIANGLES, 6, this.gl.UNSIGNED_SHORT, 0);\n this.mstack.pop();\n }\n }\n\n onParticleDead(particle) {}\n\n updateMatrix(particle) {\n const moveOriginMatrix = WebGLUtil.makeTranslation(\n -particle.data.textureWidth / 2,\n -particle.data.textureHeight / 2\n );\n const translationMatrix = WebGLUtil.makeTranslation(particle.p.x, particle.p.y);\n\n const angel = particle.rotation * MathUtil.PI_180;\n const rotationMatrix = WebGLUtil.makeRotation(angel);\n\n const scale = particle.scale * particle.data.oldScale;\n const scaleMatrix = WebGLUtil.makeScale(scale, scale);\n let matrix = WebGLUtil.matrixMultiply(moveOriginMatrix, scaleMatrix);\n\n matrix = WebGLUtil.matrixMultiply(matrix, rotationMatrix);\n matrix = WebGLUtil.matrixMultiply(matrix, translationMatrix);\n\n Mat3.inverse(matrix, particle.data.imat);\n matrix[2] = particle.alpha;\n\n this.mstack.push(matrix);\n }\n\n destroy() {\n super.destroy();\n this.gl = null;\n this.mstack = null;\n this.umat = null;\n this.smat = null;\n this.texturebuffers = null;\n }\n}\n","import BaseRenderer from \"./BaseRenderer\";\n\n/**\n * Represents a custom renderer that extends the BaseRenderer.\n * @extends BaseRenderer\n */\nexport default class CustomRenderer extends BaseRenderer {\n /**\n * Creates a new CustomRenderer instance.\n * @param {HTMLElement} element - The HTML element to render to.\n */\n constructor(element) {\n super(element);\n\n /**\n * The name of the renderer.\n * @type {string}\n */\n this.name = \"CustomRenderer\";\n }\n}\n","import Zone from \"./Zone\";\nimport Util from \"../utils/Util\";\nimport MathUtil from \"../math/MathUtil\";\nimport Vector2D from \"../math/Vector2D\";\n\n/**\n * Represents a line zone for particle systems.\n * @extends Zone\n */\nexport default class LineZone extends Zone {\n /**\n * Creates a new LineZone.\n * @param {number} x1 - The x-coordinate of the first point.\n * @param {number} y1 - The y-coordinate of the first point.\n * @param {number} [x2] - The x-coordinate of the second point.\n * @param {number} [y2] - The y-coordinate of the second point.\n * @param {string} [direction=\">\"] - The direction of the line.\n */\n constructor(x1, y1, x2, y2, direction = \">\") {\n super();\n\n if (x2 - x1 >= 0) {\n this.x1 = x1;\n this.y1 = y1;\n this.x2 = x2;\n this.y2 = y2;\n } else {\n this.x1 = x2;\n this.y1 = y2;\n this.x2 = x1;\n this.y2 = y1;\n }\n\n this.dx = this.x2 - this.x1;\n this.dy = this.y2 - this.y1;\n\n this.minx = Math.min(this.x1, this.x2);\n this.miny = Math.min(this.y1, this.y2);\n this.maxx = Math.max(this.x1, this.x2);\n this.maxy = Math.max(this.y1, this.y2);\n\n this.dot = this.x2 * this.y1 - this.x1 * this.y2;\n this.xxyy = this.dx * this.dx + this.dy * this.dy;\n\n this.gradient = this.getGradient();\n this.length = this.getLength();\n this.direction = Util.initValue(direction, \">\");\n }\n\n /**\n * Gets a random position on the line.\n * @returns {Vector2D} A vector representing the random position.\n */\n getPosition() {\n this.random = Math.random();\n this.vector.x = this.x1 + this.random * this.length * Math.cos(this.gradient);\n this.vector.y = this.y1 + this.random * this.length * Math.sin(this.gradient);\n\n return this.vector;\n }\n\n /**\n * Determines which side of the line a point is on.\n * @param {number} x - The x-coordinate of the point.\n * @param {number} y - The y-coordinate of the point.\n * @returns {boolean} True if the point is on the positive side of the line, false otherwise.\n */\n getDirection(x, y) {\n const A = this.dy;\n const B = -this.dx;\n const C = this.dot;\n const D = B === 0 ? 1 : B;\n\n if ((A * x + B * y + C) * D > 0) return true;\n else return false;\n }\n\n /**\n * Calculates the distance of a point from the line.\n * @param {number} x - The x-coordinate of the point.\n * @param {number} y - The y-coordinate of the point.\n * @returns {number} The distance from the point to the line.\n */\n getDistance(x, y) {\n const A = this.dy;\n const B = -this.dx;\n const C = this.dot;\n const D = A * x + B * y + C;\n\n return D / Math.sqrt(this.xxyy);\n }\n\n /**\n * Calculates the symmetric vector of a given vector with respect to the line.\n * @param {Vector2D} v - The vector to reflect.\n * @returns {Vector2D} The reflected vector.\n */\n getSymmetric(v) {\n const tha2 = v.getGradient();\n const tha1 = this.getGradient();\n const tha = 2 * (tha1 - tha2);\n\n const oldx = v.x;\n const oldy = v.y;\n\n v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);\n v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);\n\n return v;\n }\n\n /**\n * Gets the gradient (angle) of the line.\n * @returns {number} The gradient of the line in radians.\n */\n getGradient() {\n return Math.atan2(this.dy, this.dx);\n }\n\n /**\n * Checks if a particle is outside the range of the line.\n * @param {Particle} particle - The particle to check.\n * @returns {boolean} True if the particle is within range, false otherwise.\n */\n rangeOut(particle) {\n const angle = Math.abs(this.getGradient());\n\n if (angle <= MathUtil.PI / 4) {\n if (particle.p.x <= this.maxx && particle.p.x >= this.minx) return true;\n } else {\n if (particle.p.y <= this.maxy && particle.p.y >= this.miny) return true;\n }\n\n return false;\n }\n\n /**\n * Gets the length of the line.\n * @returns {number} The length of the line.\n */\n getLength() {\n return Math.sqrt(this.dx * this.dx + this.dy * this.dy);\n }\n\n /**\n * Handles particle crossing behavior based on the crossType.\n * @param {Particle} particle - The particle to check for crossing.\n */\n crossing(particle) {\n if (this.crossType === \"dead\") {\n if (this.direction === \">\" || this.direction === \"R\" || this.direction === \"right\" || this.direction === \"down\") {\n if (!this.rangeOut(particle)) return;\n if (this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;\n } else {\n if (!this.rangeOut(particle)) return;\n if (!this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;\n }\n } else if (this.crossType === \"bound\") {\n if (!this.rangeOut(particle)) return;\n\n if (this.getDistance(particle.p.x, particle.p.y) <= particle.radius) {\n if (this.dx === 0) {\n particle.v.x *= -1;\n } else if (this.dy === 0) {\n particle.v.y *= -1;\n } else {\n this.getSymmetric(particle.v);\n }\n }\n } else if (this.crossType === \"cross\") {\n if (this.alert) {\n console.error(\"Sorry, LineZone does not support cross method!\");\n this.alert = false;\n }\n }\n }\n}\n","import Zone from \"./Zone\";\nimport MathUtil from \"../math/MathUtil\";\n\n/**\n * Represents a circular zone in a 2D space.\n * @extends Zone\n */\nexport default class CircleZone extends Zone {\n /**\n * Creates a new CircleZone.\n * @param {number} x - The x-coordinate of the circle's center.\n * @param {number} y - The y-coordinate of the circle's center.\n * @param {number} [radius] - The radius of the circle.\n */\n constructor(x, y, radius) {\n super();\n\n this.x = x;\n this.y = y;\n this.radius = radius;\n this.angle = 0;\n this.center = { x, y };\n }\n\n /**\n * Gets a random position within the circle.\n * @returns {Object} An object with x and y coordinates.\n */\n getPosition() {\n this.angle = MathUtil.PIx2 * Math.random();\n this.randomRadius = Math.random() * this.radius;\n this.vector.x = this.x + this.randomRadius * Math.cos(this.angle);\n this.vector.y = this.y + this.randomRadius * Math.sin(this.angle);\n\n return this.vector;\n }\n\n /**\n * Sets the center of the circle.\n * @param {number} x - The new x-coordinate of the center.\n * @param {number} y - The new y-coordinate of the center.\n */\n setCenter(x, y) {\n this.center.x = x;\n this.center.y = y;\n }\n\n /**\n * Handles particle crossing behavior.\n * @param {Object} particle - The particle to check for crossing.\n */\n crossing(particle) {\n const d = particle.p.distanceTo(this.center);\n\n if (this.crossType === \"dead\") {\n if (d - particle.radius > this.radius) particle.dead = true;\n } else if (this.crossType === \"bound\") {\n if (d + particle.radius >= this.radius) this.getSymmetric(particle);\n } else if (this.crossType === \"cross\") {\n if (this.alert) {\n console.error(\"Sorry, CircleZone does not support cross method!\");\n this.alert = false;\n }\n }\n }\n\n /**\n * Calculates the symmetric position of a particle.\n * @param {Object} particle - The particle to calculate symmetry for.\n */\n getSymmetric(particle) {\n const tha2 = particle.v.getGradient();\n const tha1 = this.getGradient(particle);\n\n const tha = 2 * (tha1 - tha2);\n const oldx = particle.v.x;\n const oldy = particle.v.y;\n\n particle.v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);\n particle.v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);\n }\n\n /**\n * Calculates the gradient for a particle.\n * @param {Object} particle - The particle to calculate the gradient for.\n * @returns {number} The calculated gradient.\n */\n getGradient(particle) {\n return -MathUtil.PI_2 + Math.atan2(particle.p.y - this.center.y, particle.p.x - this.center.x);\n }\n}\n","import Zone from \"./Zone\";\n\n/**\n * Represents a rectangular zone for particle systems.\n * @extends Zone\n */\nexport default class RectZone extends Zone {\n /**\n * Creates a new RectZone.\n * @param {number} x - The x-coordinate of the top-left corner of the rectangle.\n * @param {number} y - The y-coordinate of the top-left corner of the rectangle.\n * @param {number} [width] - The width of the rectangle.\n * @param {number} [height] - The height of the rectangle.\n */\n constructor(x, y, width = 200, height = 200) {\n super();\n\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n }\n\n /**\n * Gets a random position within the rectangular zone.\n * @returns {Vector2D} A vector representing the random position.\n */\n getPosition() {\n this.vector.x = this.x + Math.random() * this.width;\n this.vector.y = this.y + Math.random() * this.height;\n return this.vector;\n }\n\n /**\n * Handles particle crossing behavior based on the crossType.\n * @param {Particle} particle - The particle to check for crossing.\n */\n crossing(particle) {\n // particle dead zone\n if (this.crossType === \"dead\") {\n if (particle.p.x + particle.radius < this.x) particle.dead = true;\n else if (particle.p.x - particle.radius > this.x + this.width) particle.dead = true;\n\n if (particle.p.y + particle.radius < this.y) particle.dead = true;\n else if (particle.p.y - particle.radius > this.y + this.height) particle.dead = true;\n }\n\n // particle bound zone\n else if (this.crossType === \"bound\") {\n if (particle.p.x - particle.radius < this.x) {\n particle.p.x = this.x + particle.radius;\n particle.v.x *= -1;\n } else if (particle.p.x + particle.radius > this.x + this.width) {\n particle.p.x = this.x + this.width - particle.radius;\n particle.v.x *= -1;\n }\n\n if (particle.p.y - particle.radius < this.y) {\n particle.p.y = this.y + particle.radius;\n particle.v.y *= -1;\n } else if (particle.p.y + particle.radius > this.y + this.height) {\n particle.p.y = this.y + this.height - particle.radius;\n particle.v.y *= -1;\n }\n }\n\n // particle cross zone\n else if (this.crossType === \"cross\") {\n if (particle.p.x + particle.radius < this.x && particle.v.x <= 0) {\n particle.p.x = this.x + this.width + particle.radius;\n } else if (particle.p.x - particle.radius > this.x + this.width && particle.v.x >= 0) {\n particle.p.x = this.x - particle.radius;\n }\n\n if (particle.p.y + particle.radius < this.y && particle.v.y <= 0) {\n particle.p.y = this.y + this.height + particle.radius;\n } else if (particle.p.y - particle.radius > this.y + this.height && particle.v.y >= 0) {\n particle.p.y = this.y - particle.radius;\n }\n }\n }\n}\n","import Zone from \"./Zone\";\nimport Util from \"../utils/Util\";\n\n/**\n * Represents a zone based on image data.\n * @extends Zone\n */\nexport default class ImageZone extends Zone {\n /**\n * Creates an ImageZone.\n * @param {ImageData} imageData - The image data to use for the zone.\n * @param {number} [x=0] - The x-coordinate offset.\n * @param {number} [y=0] - The y-coordinate offset.\n * @param {number} [d=2] - The sampling density.\n */\n constructor(imageData, x, y, d) {\n super();\n this.reset(imageData, x, y, d);\n }\n\n /**\n * Resets the ImageZone with new parameters.\n * @param {ImageData} imageData - The image data to use for the zone.\n * @param {number} [x=0] - The x-coordinate offset.\n * @param {number} [y=0] - The y-coordinate offset.\n * @param {number} [d=2] - The sampling density.\n */\n reset(imageData, x, y, d) {\n this.imageData = imageData;\n this.x = Util.initValue(x, 0);\n this.y = Util.initValue(y, 0);\n this.d = Util.initValue(d, 2);\n\n this.vectors = [];\n this.setVectors();\n }\n\n /**\n * Sets up vectors based on the image data.\n * @returns {Object} The vector object.\n */\n setVectors() {\n let i, j;\n const length1 = this.imageData.width;\n const length2 = this.imageData.height;\n\n for (i = 0; i < length1; i += this.d) {\n for (j = 0; j < length2; j += this.d) {\n let index = ((j >> 0) * length1 + (i >> 0)) * 4;\n\n if (this.imageData.data[index + 3] > 0) {\n this.vectors.push({ x: i + this.x, y: j + this.y });\n }\n }\n }\n\n return this.vector;\n }\n\n /**\n * Checks if a point is within the bounds of the image.\n * @param {number} x - The x-coordinate to check.\n * @param {number} y - The y-coordinate to check.\n * @returns {boolean} True if the point is within bounds, false otherwise.\n */\n getBound(x, y) {\n const index = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;\n return this.imageData.data[index + 3] > 0;\n }\n\n /**\n * Gets a random position within the image zone.\n * @returns {Object} A vector representing the position.\n */\n getPosition() {\n const vector = Util.getRandFromArray(this.vectors);\n return this.vector.copy(vector);\n }\n\n /**\n * Gets the color at a specific point in the image.\n * @param {number} x - The x-coordinate.\n * @param {number} y - The y-coordinate.\n * @returns {Object} An object containing r, g, b, and a values.\n */\n getColor(x, y) {\n x -= this.x;\n y -= this.y;\n const i = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;\n\n return {\n r: this.imageData.data[i],\n g: this.imageData.data[i + 1],\n b: this.imageData.data[i + 2],\n a: this.imageData.data[i + 3]\n };\n }\n\n /**\n * Handles particle crossing behavior.\n * @param {Object} particle - The particle to check for crossing.\n */\n crossing(particle) {\n if (this.crossType === \"dead\") {\n particle.dead = this.getBound(particle.p.x - this.x, particle.p.y - this.y);\n } else if (this.crossType === \"bound\") {\n if (!this.getBound(particle.p.x - this.x, particle.p.y - this.y)) particle.v.negate();\n }\n }\n\n /**\n * Destroys the ImageZone and cleans up resources.\n */\n destroy() {\n super.destroy();\n this.imageData = null;\n }\n}\n","import ColorUtil from \"../utils/ColorUtil\";\nimport CircleZone from \"../zone/CircleZone\";\nimport PointZone from \"../zone/PointZone\";\nimport LineZone from \"../zone/LineZone\";\nimport RectZone from \"../zone/RectZone\";\n\nexport default {\n addEventListener(proton, func) {\n proton.addEventListener(\"PROTON_UPDATE_AFTER\", () => func());\n },\n\n getStyle(color = \"#ff0000\") {\n const rgb = ColorUtil.hexToRgb(color);\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.5)`;\n },\n\n drawZone(proton, canvas, zone, clear) {\n const context = canvas.getContext(\"2d\");\n const style = this.getStyle();\n\n this.addEventListener(proton, () => {\n if (clear) context.clearRect(0, 0, canvas.width, canvas.height);\n\n if (zone instanceof PointZone) {\n context.beginPath();\n context.fillStyle = style;\n context.arc(zone.x, zone.y, 10, 0, Math.PI * 2, true);\n context.fill();\n context.closePath();\n } else if (zone instanceof LineZone) {\n context.beginPath();\n context.strokeStyle = style;\n context.moveTo(zone.x1, zone.y1);\n context.lineTo(zone.x2, zone.y2);\n context.stroke();\n context.closePath();\n } else if (zone instanceof RectZone) {\n context.beginPath();\n context.strokeStyle = style;\n context.drawRect(zone.x, zone.y, zone.width, zone.height);\n context.stroke();\n context.closePath();\n } else if (zone instanceof CircleZone) {\n context.beginPath();\n context.strokeStyle = style;\n context.arc(zone.x, zone.y, zone.radius, 0, Math.PI * 2, true);\n context.stroke();\n context.closePath();\n }\n });\n },\n\n drawEmitter(proton, canvas, emitter, clear) {\n const context = canvas.getContext(\"2d\");\n const style = this.getStyle();\n\n this.addEventListener(proton, () => {\n if (clear) context.clearRect(0, 0, canvas.width, canvas.height);\n\n context.beginPath();\n context.fillStyle = style;\n context.arc(emitter.p.x, emitter.p.y, 10, 0, Math.PI * 2, true);\n context.fill();\n context.closePath();\n });\n }\n};\n","import Proton from \"./core/Proton\";\nimport Particle from \"./core/Particle\";\nimport Pool from \"./core/Pool\";\n\nimport Util from \"./utils/Util\";\nimport ColorUtil from \"./utils/ColorUtil\";\nimport MathUtil from \"./math/MathUtil\";\nimport Vector2D from \"./math/Vector2D\";\nimport Polar2D from \"./math/Polar2D\";\nimport Mat3 from \"./math/Mat3\";\nimport Span from \"./math/Span\";\nimport ArraySpan from \"./math/ArraySpan\";\nimport Rectangle from \"./math/Rectangle\";\nimport ease from \"./math/ease\";\n\nimport Rate from \"./initialize/Rate\";\nimport Initialize from \"./initialize/Initialize\";\nimport Life from \"./initialize/Life\";\nimport Position from \"./initialize/Position\";\nimport Velocity from \"./initialize/Velocity\";\nimport Mass from \"./initialize/Mass\";\nimport Radius from \"./initialize/Radius\";\nimport Body from \"./initialize/Body\";\n\nimport Behaviour from \"./behaviour/Behaviour\";\nimport Force from \"./behaviour/Force\";\nimport Attraction from \"./behaviour/Attraction\";\nimport RandomDrift from \"./behaviour/RandomDrift\";\nimport Gravity from \"./behaviour/Gravity\";\nimport Collision from \"./behaviour/Collision\";\nimport CrossZone from \"./behaviour/CrossZone\";\nimport Alpha from \"./behaviour/Alpha\";\nimport Scale from \"./behaviour/Scale\";\nimport Rotate from \"./behaviour/Rotate\";\nimport Color from \"./behaviour/Color\";\nimport Cyclone from \"./behaviour/Cyclone\";\nimport Repulsion from \"./behaviour/Repulsion\";\nimport GravityWell from \"./behaviour/GravityWell\";\n\nimport Emitter from \"./emitter/Emitter\";\nimport BehaviourEmitter from \"./emitter/BehaviourEmitter\";\nimport FollowEmitter from \"./emitter/FollowEmitter\";\n\nimport CanvasRenderer from \"./render/CanvasRenderer\";\nimport DomRenderer from \"./render/DomRenderer\";\nimport EaselRenderer from \"./render/EaselRenderer\";\nimport PixelRenderer from \"./render/PixelRenderer\";\nimport PixiRenderer from \"./render/PixiRenderer\";\nimport WebGLRenderer from \"./render/WebGLRenderer\";\nimport CustomRenderer from \"./render/CustomRenderer\";\n\nimport Zone from \"./zone/Zone\";\nimport LineZone from \"./zone/LineZone\";\nimport CircleZone from \"./zone/CircleZone\";\nimport PointZone from \"./zone/PointZone\";\nimport RectZone from \"./zone/RectZone\";\nimport ImageZone from \"./zone/ImageZone\";\n\nimport Debug from \"./debug/Debug\";\n\n// namespace\nProton.Particle = Particle;\nProton.Pool = Pool;\n\nProton.Util = Util;\nProton.ColorUtil = ColorUtil;\nProton.MathUtil = MathUtil;\nProton.Vector2D = Proton.Vector = Vector2D;\nProton.Polar2D = Proton.Polar = Polar2D;\nProton.ArraySpan = ArraySpan;\nProton.Rectangle = Rectangle;\nProton.Rate = Rate;\nProton.ease = ease;\nProton.Span = Span;\nProton.Mat3 = Mat3;\nProton.getSpan = (a, b, center) => new Span(a, b, center);\nProton.createArraySpan = ArraySpan.createArraySpan;\n\nProton.Initialize = Proton.Init = Initialize;\nProton.Life = Proton.L = Life;\nProton.Position = Proton.P = Position;\nProton.Velocity = Proton.V = Velocity;\nProton.Mass = Proton.M = Mass;\nProton.Radius = Proton.R = Radius;\nProton.Body = Proton.B = Body;\n\nProton.Behaviour = Behaviour;\nProton.Force = Proton.F = Force;\nProton.Attraction = Proton.A = Attraction;\nProton.RandomDrift = Proton.RD = RandomDrift;\nProton.Gravity = Proton.G = Gravity;\nProton.Collision = Collision;\nProton.CrossZone = CrossZone;\nProton.Alpha = Alpha;\nProton.Scale = Proton.S = Scale;\nProton.Rotate = Rotate;\nProton.Color = Color;\nProton.Repulsion = Repulsion;\nProton.Cyclone = Cyclone;\nProton.GravityWell = GravityWell;\n\nProton.Emitter = Emitter;\nProton.BehaviourEmitter = BehaviourEmitter;\nProton.FollowEmitter = FollowEmitter;\n\nProton.Zone = Zone;\nProton.LineZone = LineZone;\nProton.CircleZone = CircleZone;\nProton.PointZone = PointZone;\nProton.RectZone = RectZone;\nProton.ImageZone = ImageZone;\n\nProton.CanvasRenderer = CanvasRenderer;\nProton.DomRenderer = DomRenderer;\nProton.EaselRenderer = EaselRenderer;\nProton.PixiRenderer = PixiRenderer;\nProton.PixelRenderer = PixelRenderer;\nProton.WebGLRenderer = Proton.WebGlRenderer = WebGLRenderer;\nProton.CustomRenderer = CustomRenderer;\n\nProton.Debug = Debug;\nUtil.assign(Proton, ease);\n\n// export\nexport default Proton;\nexport {\n Particle,\n Pool,\n Util,\n ColorUtil,\n MathUtil,\n Vector2D,\n Polar2D,\n Mat3,\n Span,\n ArraySpan,\n Rectangle,\n ease,\n Rate,\n Initialize,\n Life,\n Position,\n Velocity,\n Mass,\n Radius,\n Body,\n Behaviour,\n Force,\n Attraction,\n RandomDrift,\n Gravity,\n Collision,\n CrossZone,\n Alpha,\n Scale,\n Rotate,\n Color,\n Cyclone,\n Repulsion,\n GravityWell,\n Emitter,\n BehaviourEmitter,\n FollowEmitter,\n CanvasRenderer,\n DomRenderer,\n EaselRenderer,\n PixelRenderer,\n PixiRenderer,\n WebGLRenderer,\n CustomRenderer,\n Zone,\n LineZone,\n CircleZone,\n PointZone,\n RectZone,\n ImageZone,\n Debug\n};\n"],"names":["WebGLUtil","nhpot","length","i","tx","ty","makeRotation","angleInRadians","c","Math","cos","s","sin","sx","sy","a","b","a00","a01","a02","a10","a11","a12","a20","a21","a22","b00","b01","b02","b10","b11","b12","b20","b21","b22","DomUtil","createCanvas","id","width","height","position","dom","document","createElement","style","opacity","this","transform","createDiv","resize","marginLeft","marginTop","div","x","y","scale","rotate","willChange","css3","transform3d","key","val","bkey","charAt","toUpperCase","substr","imgsCache","canvasCache","canvasId","ImgUtil","context","image","rect","drawImage","imagedata","getImageData","clearRect","img","callback","param","src","Image","onload","e","target","canvas","getContext","Util","initValue","value","defaults","isArray","Object","prototype","toString","call","emptyArray","arr","toArray","sliceArray","arr1","index","arr2","push","getRandFromArray","floor","random","emptyObject","obj","ignore","indexOf","classApply","constructor","args","bind","apply","concat","destroyAll","destroy","assign","source","hasOwnProperty","idsMap","Puid","_index","_cache","type","undefined","getId","uid","getIdFromCache","isBody","isInner","getTarget","Pool","num","total","cache","_proto","get","params","p","__puid","pop","createOrClone","expire","getCache","create","clone","getCount","count","Stats","proton","container","emitterIndex","rendererIndex","update","body","add","emitter","getEmitter","renderer","getRenderer","str","emitters","emitSpeed","getEmitterPos","initializes","concatArr","behaviours","name","getCreatedNumber","pool","innerHTML","_this","bg","color","cssText","join","addEventListener","parentNode","appendChild","renderers","result","cpool","round","removeChild","EventDispatcher","_listeners","dispatchEvent","hasEventListener","removeEventListener","removeAllEventListeners","listener","splice","listeners","handler","PI","INFINITY","Infinity","MathUtil","PIx2","PI_2","PI_180","N180_PI","isInfinity","randomAToB","isInt","randomFloating","center","f","randomColor","slice","randomZone","display","k","digits","pow","degreeTransform","toColor16","Integration","calculate","particles","time","damping","eulerIntegrate","particle","sleep","old","copy","v","multiplyScalar","mass","clear","Proton","integrationType","now","then","elapsed","stats","EULER","integrator","_fps","_interval","DEFAULT_INTERVAL","addRenderer","render","init","removeRenderer","remove","addEmitter","parent","EMITTER_ADDED","removeEmitter","EMITTER_REMOVED","PROTON_UPDATE","USE_CLOCK","Date","getTime","amendChangeTabsBug","emittersUpdate","PROTON_UPDATE_AFTER","getAllParticles","destroyAllEmitters","destroyOther","setTimeout","set","fps","MEASURE","RK2","PARTICLE_CREATED","PARTICLE_UPDATE","PARTICLE_SLEEP","PARTICLE_DEAD","Rgb","r","g","reset","Span","getValue","setSpanValue","getSpanValue","pan","PropUtil","hasProp","setProp","props","prop","setVectorVal","conf","ease","easeLinear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","sqrt","easeOutCirc","easeInOutCirc","easeInBack","easeOutBack","easeInOutBack","getEasing","Vector2D","setX","setY","getGradient","atan2","w","addVectors","addXY","sub","subVectors","divideScalar","negate","dot","lengthSq","normalize","distanceTo","distanceToSquared","tha","dx","dy","lerp","alpha","equals","Particle","data","rgb","getDirection","life","age","dead","sprite","energy","radius","rotation","easing","removeAllBehaviours","applyBehaviours","max","applyBehaviour","addBehaviour","behaviour","parents","initialize","addBehaviours","removeBehaviour","ColorUtil","hexToRgb","h","hex16","substring","parseInt","rgbToHex","rbg","getHex16FromParticle","Number","Polar2D","abs","setR","setTha","toVector","getX","getY","Mat3","mat3","mat","Float32Array","mat1","mat2","multiply","inverse","multiplyVec2","m","vec","ArraySpan","_Span","_arr","_inheritsLoose","createArraySpan","Rectangle","bottom","right","contains","Rate","numpan","timepan","numPan","timePan","startTime","nextTime","Initialize","Life","_Initialize","lifePan","Zone","vector","crossType","alert","getPosition","crossing","PointZone","_Zone","console","error","Position","zone","Velocity","rpan","thapan","rPan","thaPan","normalizeVelocity","vr","polar2d","Mass","massPan","Radius","oldRadius","Body","imageTarget","inner","Behaviour","normalizeForce","force","normalizeValue","Force","_Behaviour","fx","fy","Attraction","targetPosition","radiusSq","attractionForce","RandomDrift","driftX","driftY","delay","panFoce","Gravity","_Force","Collision","newPool","collisionPool","delta","otherParticle","overlap","totalMass","averageMass1","averageMass2","distance","CrossZone","Alpha","same","alphaA","alphaB","Scale","scaleA","scaleB","Rotate","influence","rotationA","rotationB","Color","colorA","colorB","CHANGING","Cyclone","angle","setAngleAndForce","span","String","toLowerCase","cangle","cyclone","gradient","Repulsion","_Attraction","GravityWell","centerPoint","distanceVec","distanceSq","factor","InitializeUtil","bindEmitter","Emitter","_Particle","emitTime","totalTime","rate","emit","stoped","isNaN","stop","preEmit","oldStoped","oldEmitTime","oldTotalTime","step","removeAllParticles","addSelfInitialize","addInitialize","_len","arguments","rest","Array","_key","removeInitialize","initializer","removeAllInitializers","_len2","_key2","emitting","integrate","dispatch","event","bindEvent","createParticle","setupParticle","BehaviourEmitter","PIXIClass","_Emitter","selfBehaviours","addSelfBehaviour","removeSelfBehaviour","FollowEmitter","mouseTarget","window","_allowEmitting","initEventHandler","_this2","mousemoveHandler","mousemove","mousedownHandler","mousedown","mouseupHandler","mouseup","layerX","layerY","offsetX","offsetY","Types","isImage","__isImage","tagName","nodeName","isString","BaseRenderer","element","stroke","circleConf","isCircle","setStroke","thinkness","_protonUpdateHandler","onProtonUpdate","_protonUpdateAfterHandler","onProtonUpdateAfter","_emitterAddedHandler","onEmitterAdded","_emitterRemovedHandler","onEmitterRemoved","_particleCreatedHandler","onParticleCreated","_particleUpdateHandler","onParticleUpdate","_particleDeadHandler","onParticleDead","CanvasRenderer","_BaseRenderer","bufferCache","addImg2Body","drawCircle","buffer","createBuffer","bufContext","globalAlpha","globalCompositeOperation","fillStyle","fillRect","save","translate","restore","beginPath","arc","strokeStyle","lineWidth","closePath","fill","size","DomRenderer","createBody","bodyReady","backgroundColor","createCircle","createSprite","borderRadius","borderColor","borderWidth","url","backgroundImage","EaselRenderer","addChild","scaleX","scaleY","graphics","regX","regY","createjs","Graphics","beginStroke","beginFill","shape","Shape","PixelRenderer","rectangle","imageData","createImageData","putImageData","setPixel","PixiRenderer","setColor","blendMode","setPIXI","PIXI","Sprite","createFromImage","from","fromImage","tint","anchor","endFill","MStack","mats","top","WebGLRenderer","gl","antialias","stencil","depth","initVar","setMaxRadius","initShaders","initBuffers","blendEquation","FUNC_ADD","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","enable","BLEND","umat","smat","mstack","viewport","circleCanvasURL","getVertexShader","getFragmentShader","texturebuffers","A","B","getShader","fs","shader","createShader","FRAGMENT_SHADER","VERTEX_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","fragmentShader","vertexShader","sprogram","createProgram","attachShader","linkProgram","getProgramParameter","LINK_STATUS","useProgram","vpa","getAttribLocation","tca","enableVertexAttribArray","tMatUniform","getUniformLocation","samplerUniform","useTex","uniform1i","idx","unitIBuffer","bindBuffer","ELEMENT_ARRAY_BUFFER","bufferData","Uint16Array","STATIC_DRAW","ids","unitI33","stripBuffer","raidus","circleCanvasRadius","toDataURL","drawImg2Canvas","_w","_h","_width","_height","_scaleX","_scaleY","createTexture","texture","vcBuffer","tcBuffer","ARRAY_BUFFER","bindTexture","TEXTURE_2D","texImage2D","RGBA","UNSIGNED_BYTE","texParameteri","TEXTURE_MAG_FILTER","LINEAR","TEXTURE_MIN_FILTER","LINEAR_MIPMAP_NEAREST","generateMipmap","textureLoaded","textureWidth","textureHeight","tmat","imat","oldScale","updateMatrix","uniform3f","uniformMatrix3fv","vertexAttribPointer","FLOAT","drawElements","TRIANGLES","UNSIGNED_SHORT","moveOriginMatrix","translationMatrix","angel","rotationMatrix","scaleMatrix","matrix","CustomRenderer","LineZone","x1","y1","x2","y2","direction","minx","min","miny","maxx","maxy","xxyy","getLength","getDistance","getSymmetric","tha2","oldx","oldy","rangeOut","CircleZone","randomRadius","setCenter","d","RectZone","ImageZone","vectors","setVectors","j","length1","length2","getBound","getColor","Debug","func","getStyle","drawZone","moveTo","lineTo","drawRect","drawEmitter","Vector","Polar","getSpan","Init","L","P","V","M","R","F","RD","G","S","WebGlRenderer"],"mappings":"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,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACA,CACAC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK,CAEPpI,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAK2G,UAAU0B,CACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACA,S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Q,IAC1CjN,EAEDmhB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAeE,MAdiB,CACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACA,CACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACA,CACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACA,uBACA,CACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACA,sCACA,CACA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"}
\ No newline at end of file
diff --git a/build/proton.web.js b/build/proton.web.js
new file mode 100644
index 0000000..b55f17a
--- /dev/null
+++ b/build/proton.web.js
@@ -0,0 +1,5652 @@
+this.Proton = (function () {
+ 'use strict';
+
+ function _defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ function _createClass(Constructor, protoProps, staticProps) {
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) _defineProperties(Constructor, staticProps);
+ return Constructor;
+ }
+ function _inheritsLoose(subClass, superClass) {
+ subClass.prototype = Object.create(superClass.prototype);
+ subClass.prototype.constructor = subClass;
+ _setPrototypeOf(subClass, superClass);
+ }
+ function _setPrototypeOf(o, p) {
+ _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
+ o.__proto__ = p;
+ return o;
+ };
+ return _setPrototypeOf(o, p);
+ }
+ function _assertThisInitialized(self) {
+ if (self === void 0) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }
+ return self;
+ }
+
+ var WebGLUtil = {
+ /**
+ * @memberof Proton#Proton.WebGLUtil
+ * @method ipot
+ *
+ * @todo add description
+ * @todo add length description
+ *
+ * @param {Number} length
+ *
+ * @return {Boolean}
+ */
+ ipot: function ipot(length) {
+ return (length & length - 1) === 0;
+ },
+ /**
+ * @memberof Proton#Proton.WebGLUtil
+ * @method nhpot
+ *
+ * @todo add description
+ * @todo add length description
+ *
+ * @param {Number} length
+ *
+ * @return {Number}
+ */
+ nhpot: function nhpot(length) {
+ --length;
+ for (var i = 1; i < 32; i <<= 1) {
+ length = length | length >> i;
+ }
+ return length + 1;
+ },
+ /**
+ * @memberof Proton#Proton.WebGLUtil
+ * @method makeTranslation
+ *
+ * @todo add description
+ * @todo add tx, ty description
+ * @todo add return description
+ *
+ * @param {Number} tx either 0 or 1
+ * @param {Number} ty either 0 or 1
+ *
+ * @return {Object}
+ */
+ makeTranslation: function makeTranslation(tx, ty) {
+ return [1, 0, 0, 0, 1, 0, tx, ty, 1];
+ },
+ /**
+ * @memberof Proton#Proton.WebGLUtil
+ * @method makeRotation
+ *
+ * @todo add description
+ * @todo add return description
+ *
+ * @param {Number} angleInRadians
+ *
+ * @return {Object}
+ */
+ makeRotation: function makeRotation(angleInRadians) {
+ var c = Math.cos(angleInRadians);
+ var s = Math.sin(angleInRadians);
+ return [c, -s, 0, s, c, 0, 0, 0, 1];
+ },
+ /**
+ * @memberof Proton#Proton.WebGLUtil
+ * @method makeScale
+ *
+ * @todo add description
+ * @todo add tx, ty description
+ * @todo add return description
+ *
+ * @param {Number} sx either 0 or 1
+ * @param {Number} sy either 0 or 1
+ *
+ * @return {Object}
+ */
+ makeScale: function makeScale(sx, sy) {
+ return [sx, 0, 0, 0, sy, 0, 0, 0, 1];
+ },
+ /**
+ * @memberof Proton#Proton.WebGLUtil
+ * @method matrixMultiply
+ *
+ * @todo add description
+ * @todo add a, b description
+ * @todo add return description
+ *
+ * @param {Object} a
+ * @param {Object} b
+ *
+ * @return {Object}
+ */
+ matrixMultiply: function matrixMultiply(a, b) {
+ var a00 = a[0 * 3 + 0];
+ var a01 = a[0 * 3 + 1];
+ var a02 = a[0 * 3 + 2];
+ var a10 = a[1 * 3 + 0];
+ var a11 = a[1 * 3 + 1];
+ var a12 = a[1 * 3 + 2];
+ var a20 = a[2 * 3 + 0];
+ var a21 = a[2 * 3 + 1];
+ var a22 = a[2 * 3 + 2];
+ var b00 = b[0 * 3 + 0];
+ var b01 = b[0 * 3 + 1];
+ var b02 = b[0 * 3 + 2];
+ var b10 = b[1 * 3 + 0];
+ var b11 = b[1 * 3 + 1];
+ var b12 = b[1 * 3 + 2];
+ var b20 = b[2 * 3 + 0];
+ var b21 = b[2 * 3 + 1];
+ var b22 = b[2 * 3 + 2];
+ return [a00 * b00 + a01 * b10 + a02 * b20, a00 * b01 + a01 * b11 + a02 * b21, a00 * b02 + a01 * b12 + a02 * b22, a10 * b00 + a11 * b10 + a12 * b20, a10 * b01 + a11 * b11 + a12 * b21, a10 * b02 + a11 * b12 + a12 * b22, a20 * b00 + a21 * b10 + a22 * b20, a20 * b01 + a21 * b11 + a22 * b21, a20 * b02 + a21 * b12 + a22 * b22];
+ }
+ };
+
+ var DomUtil = {
+ /**
+ * Creates and returns a new canvas. The opacity is by default set to 0
+ *
+ * @memberof Proton#Proton.DomUtil
+ * @method createCanvas
+ *
+ * @param {String} $id the canvas' id
+ * @param {Number} $width the canvas' width
+ * @param {Number} $height the canvas' height
+ * @param {String} [$position=absolute] the canvas' position, default is 'absolute'
+ *
+ * @return {Object}
+ */
+ createCanvas: function createCanvas(id, width, height, position) {
+ if (position === void 0) {
+ position = "absolute";
+ }
+ var dom = document.createElement("canvas");
+ dom.id = id;
+ dom.width = width;
+ dom.height = height;
+ dom.style.opacity = 0;
+ dom.style.position = position;
+ this.transform(dom, -500, -500, 0, 0);
+ return dom;
+ },
+ createDiv: function createDiv(id, width, height) {
+ var dom = document.createElement("div");
+ dom.id = id;
+ dom.style.position = "absolute";
+ this.resize(dom, width, height);
+ return dom;
+ },
+ resize: function resize(dom, width, height) {
+ dom.style.width = width + "px";
+ dom.style.height = height + "px";
+ dom.style.marginLeft = -width / 2 + "px";
+ dom.style.marginTop = -height / 2 + "px";
+ },
+ /**
+ * Adds a transform: translate(), scale(), rotate() to a given div dom for all browsers
+ *
+ * @memberof Proton#Proton.DomUtil
+ * @method transform
+ *
+ * @param {HTMLDivElement} div
+ * @param {Number} $x
+ * @param {Number} $y
+ * @param {Number} $scale
+ * @param {Number} $rotate
+ */
+ transform: function transform(div, x, y, scale, rotate) {
+ div.style.willChange = "transform";
+ var transform = "translate(" + x + "px, " + y + "px) scale(" + scale + ") rotate(" + rotate + "deg)";
+ this.css3(div, "transform", transform);
+ },
+ transform3d: function transform3d(div, x, y, scale, rotate) {
+ div.style.willChange = "transform";
+ var transform = "translate3d(" + x + "px, " + y + "px, 0) scale(" + scale + ") rotate(" + rotate + "deg)";
+ this.css3(div, "backfaceVisibility", "hidden");
+ this.css3(div, "transform", transform);
+ },
+ css3: function css3(div, key, val) {
+ var bkey = key.charAt(0).toUpperCase() + key.substr(1);
+ div.style["Webkit" + bkey] = val;
+ div.style["Moz" + bkey] = val;
+ div.style["O" + bkey] = val;
+ div.style["ms" + bkey] = val;
+ div.style["" + key] = val;
+ }
+ };
+
+ var imgsCache = {};
+ var canvasCache = {};
+ var canvasId = 0;
+ var ImgUtil = {
+ /**
+ * This will get the image data. It could be necessary to create a Proton.Zone.
+ *
+ * @memberof Proton#Proton.Util
+ * @method getImageData
+ *
+ * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'
+ * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');
+ * @param {Proton.Rectangle} rect
+ */
+ getImageData: function getImageData(context, image, rect) {
+ context.drawImage(image, rect.x, rect.y);
+ var imagedata = context.getImageData(rect.x, rect.y, rect.width, rect.height);
+ context.clearRect(rect.x, rect.y, rect.width, rect.height);
+ return imagedata;
+ },
+ /**
+ * @memberof Proton#Proton.Util
+ * @method getImgFromCache
+ *
+ * @todo add description
+ * @todo describe func
+ *
+ * @param {Mixed} img
+ * @param {Proton.Particle} particle
+ * @param {Boolean} drawCanvas set to true if a canvas should be saved into particle.data.canvas
+ * @param {Boolean} func
+ */
+ getImgFromCache: function getImgFromCache(img, callback, param) {
+ var src = typeof img === "string" ? img : img.src;
+ if (imgsCache[src]) {
+ callback(imgsCache[src], param);
+ } else {
+ var image = new Image();
+ image.onload = function (e) {
+ imgsCache[src] = e.target;
+ callback(imgsCache[src], param);
+ };
+ image.src = src;
+ }
+ },
+ getCanvasFromCache: function getCanvasFromCache(img, callback, param) {
+ var src = img.src;
+ if (!canvasCache[src]) {
+ var width = WebGLUtil.nhpot(img.width);
+ var height = WebGLUtil.nhpot(img.height);
+ var canvas = DomUtil.createCanvas("proton_canvas_cache_" + ++canvasId, width, height);
+ var context = canvas.getContext("2d");
+ context.drawImage(img, 0, 0, img.width, img.height);
+ canvasCache[src] = canvas;
+ }
+ callback && callback(canvasCache[src], param);
+ return canvasCache[src];
+ }
+ };
+
+ var Util = {
+ /**
+ * Returns the default if the value is null or undefined
+ *
+ * @memberof Proton#Proton.Util
+ * @method initValue
+ *
+ * @param {Mixed} value a specific value, could be everything but null or undefined
+ * @param {Mixed} defaults the default if the value is null or undefined
+ */
+ initValue: function initValue(value, defaults) {
+ value = value !== null && value !== undefined ? value : defaults;
+ return value;
+ },
+ /**
+ * Checks if the value is a valid array
+ *
+ * @memberof Proton#Proton.Util
+ * @method isArray
+ *
+ * @param {Array} value Any array
+ *
+ * @returns {Boolean}
+ */
+ isArray: function isArray(value) {
+ return Object.prototype.toString.call(value) === "[object Array]";
+ },
+ /**
+ * Destroyes the given array
+ *
+ * @memberof Proton#Proton.Util
+ * @method emptyArray
+ *
+ * @param {Array} array Any array
+ */
+ emptyArray: function emptyArray(arr) {
+ if (arr) arr.length = 0;
+ },
+ toArray: function toArray(arr) {
+ return this.isArray(arr) ? arr : [arr];
+ },
+ sliceArray: function sliceArray(arr1, index, arr2) {
+ this.emptyArray(arr2);
+ for (var i = index; i < arr1.length; i++) {
+ arr2.push(arr1[i]);
+ }
+ },
+ getRandFromArray: function getRandFromArray(arr) {
+ if (!arr) return null;
+ return arr[Math.floor(arr.length * Math.random())];
+ },
+ /**
+ * Destroyes the given object
+ *
+ * @memberof Proton#Proton.Util
+ * @method emptyObject
+ *
+ * @param {Object} obj Any object
+ */
+ emptyObject: function emptyObject(obj, ignore) {
+ if (ignore === void 0) {
+ ignore = null;
+ }
+ for (var key in obj) {
+ if (ignore && ignore.indexOf(key) > -1) continue;
+ delete obj[key];
+ }
+ },
+ /**
+ * Makes an instance of a class and binds the given array
+ *
+ * @memberof Proton#Proton.Util
+ * @method classApply
+ *
+ * @param {Function} constructor A class to make an instance from
+ * @param {Array} [args] Any array to bind it to the constructor
+ *
+ * @return {Object} The instance of constructor, optionally bind with args
+ */
+ classApply: function classApply(constructor, args) {
+ if (args === void 0) {
+ args = null;
+ }
+ if (!args) {
+ return new constructor();
+ } else {
+ var FactoryFunc = constructor.bind.apply(constructor, [null].concat(args));
+ return new FactoryFunc();
+ }
+ },
+ /**
+ * This will get the image data. It could be necessary to create a Proton.Zone.
+ *
+ * @memberof Proton#Proton.Util
+ * @method getImageData
+ *
+ * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'
+ * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');
+ * @param {Proton.Rectangle} rect
+ */
+ getImageData: function getImageData(context, image, rect) {
+ return ImgUtil.getImageData(context, image, rect);
+ },
+ destroyAll: function destroyAll(arr, param) {
+ if (param === void 0) {
+ param = null;
+ }
+ var i = arr.length;
+ while (i--) {
+ try {
+ arr[i].destroy(param);
+ } catch (e) {}
+ delete arr[i];
+ }
+ arr.length = 0;
+ },
+ assign: function assign(target, source) {
+ if (typeof Object.assign !== "function") {
+ for (var key in source) {
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
+ target[key] = source[key];
+ }
+ }
+ return target;
+ } else {
+ return Object.assign(target, source);
+ }
+ }
+ };
+
+ var idsMap = {};
+ var Puid = {
+ _index: 0,
+ _cache: {},
+ id: function id(type) {
+ if (idsMap[type] === undefined || idsMap[type] === null) idsMap[type] = 0;
+ return type + "_" + idsMap[type]++;
+ },
+ getId: function getId(target) {
+ var uid = this.getIdFromCache(target);
+ if (uid) return uid;
+ uid = "PUID_" + this._index++;
+ this._cache[uid] = target;
+ return uid;
+ },
+ getIdFromCache: function getIdFromCache(target) {
+ var obj, id;
+ for (id in this._cache) {
+ obj = this._cache[id];
+ if (obj === target) return id;
+ if (this.isBody(obj, target) && obj.src === target.src) return id;
+ }
+ return null;
+ },
+ isBody: function isBody(obj, target) {
+ return typeof obj === "object" && typeof target === "object" && obj.isInner && target.isInner;
+ },
+ getTarget: function getTarget(uid) {
+ return this._cache[uid];
+ }
+ };
+
+ /**
+ * Pool is the cache pool of the proton engine, it is very important.
+ *
+ * get(target, params, uid)
+ * Class
+ * uid = Puid.getId -> Puid save target cache
+ * target.__puid = uid
+ *
+ * body
+ * uid = Puid.getId -> Puid save target cache
+ *
+ *
+ * expire(target)
+ * cache[target.__puid] push target
+ *
+ */
+ var Pool = /*#__PURE__*/function () {
+ /**
+ * @memberof! Proton#
+ * @constructor
+ * @alias Proton.Pool
+ *
+ * @todo add description
+ * @todo add description of properties
+ *
+ * @property {Number} total
+ * @property {Object} cache
+ */
+ function Pool(num) {
+ this.total = 0;
+ this.cache = {};
+ }
+
+ /**
+ * @todo add description
+ *
+ * @method get
+ * @memberof Proton#Proton.Pool
+ *
+ * @param {Object|Function} target
+ * @param {Object} [params] just add if `target` is a function
+ *
+ * @return {Object}
+ */
+ var _proto = Pool.prototype;
+ _proto.get = function get(target, params, uid) {
+ var p;
+ uid = uid || target.__puid || Puid.getId(target);
+ if (this.cache[uid] && this.cache[uid].length > 0) {
+ p = this.cache[uid].pop();
+ } else {
+ p = this.createOrClone(target, params);
+ }
+ p.__puid = target.__puid || uid;
+ return p;
+ }
+
+ /**
+ * @todo add description
+ *
+ * @method set
+ * @memberof Proton#Proton.Pool
+ *
+ * @param {Object} target
+ *
+ * @return {Object}
+ */;
+ _proto.expire = function expire(target) {
+ return this.getCache(target.__puid).push(target);
+ }
+
+ /**
+ * Creates a new class instance
+ *
+ * @todo add more documentation
+ *
+ * @method create
+ * @memberof Proton#Proton.Pool
+ *
+ * @param {Object|Function} target any Object or Function
+ * @param {Object} [params] just add if `target` is a function
+ *
+ * @return {Object}
+ */;
+ _proto.createOrClone = function createOrClone(target, params) {
+ this.total++;
+ if (this.create) {
+ return this.create(target, params);
+ } else if (typeof target === "function") {
+ return Util.classApply(target, params);
+ } else {
+ return target.clone();
+ }
+ }
+
+ /**
+ * @todo add description - what is in the cache?
+ *
+ * @method getCount
+ * @memberof Proton#Proton.Pool
+ *
+ * @return {Number}
+ */;
+ _proto.getCount = function getCount() {
+ var count = 0;
+ for (var id in this.cache) {
+ count += this.cache[id].length;
+ }
+ return count++;
+ }
+
+ /**
+ * Destroyes all items from Pool.cache
+ *
+ * @method destroy
+ * @memberof Proton#Proton.Pool
+ */;
+ _proto.destroy = function destroy() {
+ for (var id in this.cache) {
+ this.cache[id].length = 0;
+ delete this.cache[id];
+ }
+ }
+
+ /**
+ * Returns Pool.cache
+ *
+ * @method getCache
+ * @memberof Proton#Proton.Pool
+ * @private
+ *
+ * @param {Number} uid the unique id
+ *
+ * @return {Object}
+ */;
+ _proto.getCache = function getCache(uid) {
+ if (uid === void 0) {
+ uid = "default";
+ }
+ if (!this.cache[uid]) this.cache[uid] = [];
+ return this.cache[uid];
+ };
+ return Pool;
+ }();
+
+ var Stats = /*#__PURE__*/function () {
+ function Stats(proton) {
+ this.proton = proton;
+ this.container = null;
+ this.type = 1;
+ this.emitterIndex = 0;
+ this.rendererIndex = 0;
+ }
+ var _proto = Stats.prototype;
+ _proto.update = function update(style, body) {
+ this.add(style, body);
+ var emitter = this.getEmitter();
+ var renderer = this.getRenderer();
+ var str = "";
+ switch (this.type) {
+ case 2:
+ str += "emitter:" + this.proton.emitters.length + "
";
+ if (emitter) str += "em speed:" + emitter.emitSpeed + "
";
+ if (emitter) str += "pos:" + this.getEmitterPos(emitter);
+ break;
+ case 3:
+ if (emitter) str += "initializes:" + emitter.initializes.length + "
";
+ if (emitter) str += '' + this.concatArr(emitter.initializes) + "
";
+ if (emitter) str += "behaviours:" + emitter.behaviours.length + "
";
+ if (emitter) str += '' + this.concatArr(emitter.behaviours) + "
";
+ break;
+ case 4:
+ if (renderer) str += renderer.name + "
";
+ if (renderer) str += "body:" + this.getCreatedNumber(renderer) + "
";
+ break;
+ default:
+ str += "particles:" + this.proton.getCount() + "
";
+ str += "pool:" + this.proton.pool.getCount() + "
";
+ str += "total:" + this.proton.pool.total;
+ }
+ this.container.innerHTML = str;
+ };
+ _proto.add = function add(style, body) {
+ var _this = this;
+ if (!this.container) {
+ this.type = 1;
+ this.container = document.createElement("div");
+ this.container.style.cssText = ["position:absolute;bottom:0px;left:0;cursor:pointer;", "opacity:0.9;z-index:10000;padding:10px;font-size:12px;font-family:Helvetica,Arial,sans-serif;", "width:120px;height:50px;background-color:#002;color:#0ff;"].join("");
+ this.container.addEventListener("click", function (e) {
+ _this.type++;
+ if (_this.type > 4) _this.type = 1;
+ }, false);
+ var bg, color;
+ switch (style) {
+ case 2:
+ bg = "#201";
+ color = "#f08";
+ break;
+ case 3:
+ bg = "#020";
+ color = "#0f0";
+ break;
+ default:
+ bg = "#002";
+ color = "#0ff";
+ }
+ this.container.style["background-color"] = bg;
+ this.container.style["color"] = color;
+ }
+ if (!this.container.parentNode) {
+ body = body || this.body || document.body;
+ body.appendChild(this.container);
+ }
+ };
+ _proto.getEmitter = function getEmitter() {
+ return this.proton.emitters[this.emitterIndex];
+ };
+ _proto.getRenderer = function getRenderer() {
+ return this.proton.renderers[this.rendererIndex];
+ };
+ _proto.concatArr = function concatArr(arr) {
+ var result = "";
+ if (!arr || !arr.length) return result;
+ for (var i = 0; i < arr.length; i++) {
+ result += (arr[i].name || "").substr(0, 1) + ".";
+ }
+ return result;
+ };
+ _proto.getCreatedNumber = function getCreatedNumber(renderer) {
+ return renderer.pool.total || renderer.cpool && renderer.cpool.total || 0;
+ };
+ _proto.getEmitterPos = function getEmitterPos(e) {
+ return Math.round(e.p.x) + "," + Math.round(e.p.y);
+ };
+ _proto.destroy = function destroy() {
+ if (this.container && this.container.parentNode) {
+ var body = this.body || document.body;
+ body.removeChild(this.container);
+ }
+ this.proton = null;
+ this.container = null;
+ };
+ return Stats;
+ }();
+
+ /*
+ * EventDispatcher
+ * This code reference since http://createjs.com/.
+ *
+ **/
+ var EventDispatcher = /*#__PURE__*/function () {
+ function EventDispatcher() {
+ this._listeners = null;
+ }
+ EventDispatcher.bind = function bind(target) {
+ target.prototype.dispatchEvent = EventDispatcher.prototype.dispatchEvent;
+ target.prototype.hasEventListener = EventDispatcher.prototype.hasEventListener;
+ target.prototype.addEventListener = EventDispatcher.prototype.addEventListener;
+ target.prototype.removeEventListener = EventDispatcher.prototype.removeEventListener;
+ target.prototype.removeAllEventListeners = EventDispatcher.prototype.removeAllEventListeners;
+ };
+ var _proto = EventDispatcher.prototype;
+ _proto.addEventListener = function addEventListener(type, listener) {
+ if (!this._listeners) {
+ this._listeners = {};
+ } else {
+ this.removeEventListener(type, listener);
+ }
+ if (!this._listeners[type]) this._listeners[type] = [];
+ this._listeners[type].push(listener);
+ return listener;
+ };
+ _proto.removeEventListener = function removeEventListener(type, listener) {
+ if (!this._listeners) return;
+ if (!this._listeners[type]) return;
+ var arr = this._listeners[type];
+ var length = arr.length;
+ for (var i = 0; i < length; i++) {
+ if (arr[i] === listener) {
+ if (length === 1) {
+ delete this._listeners[type];
+ }
+
+ // allows for faster checks.
+ else {
+ arr.splice(i, 1);
+ }
+ break;
+ }
+ }
+ };
+ _proto.removeAllEventListeners = function removeAllEventListeners(type) {
+ if (!type) this._listeners = null;else if (this._listeners) delete this._listeners[type];
+ };
+ _proto.dispatchEvent = function dispatchEvent(type, args) {
+ var result = false;
+ var listeners = this._listeners;
+ if (type && listeners) {
+ var arr = listeners[type];
+ if (!arr) return result;
+
+ // arr = arr.slice();
+ // to avoid issues with items being removed or added during the dispatch
+
+ var handler;
+ var i = arr.length;
+ while (i--) {
+ handler = arr[i];
+ result = result || handler(args);
+ }
+ }
+ return !!result;
+ };
+ _proto.hasEventListener = function hasEventListener(type) {
+ var listeners = this._listeners;
+ return !!(listeners && listeners[type]);
+ };
+ return EventDispatcher;
+ }();
+
+ var PI = 3.1415926;
+ var INFINITY = Infinity;
+ var MathUtil = {
+ PI: PI,
+ PIx2: PI * 2,
+ PI_2: PI / 2,
+ PI_180: PI / 180,
+ N180_PI: 180 / PI,
+ Infinity: -999,
+ isInfinity: function isInfinity(num) {
+ return num === this.Infinity || num === INFINITY;
+ },
+ randomAToB: function randomAToB(a, b, isInt) {
+ if (isInt === void 0) {
+ isInt = false;
+ }
+ if (!isInt) return a + Math.random() * (b - a);else return (Math.random() * (b - a) >> 0) + a;
+ },
+ randomFloating: function randomFloating(center, f, isInt) {
+ return this.randomAToB(center - f, center + f, isInt);
+ },
+ randomColor: function randomColor() {
+ return "#" + ("00000" + (Math.random() * 0x1000000 << 0).toString(16)).slice(-6);
+ },
+ randomZone: function randomZone(display) {},
+ floor: function floor(num, k) {
+ if (k === void 0) {
+ k = 4;
+ }
+ var digits = Math.pow(10, k);
+ return Math.floor(num * digits) / digits;
+ },
+ degreeTransform: function degreeTransform(a) {
+ return a * PI / 180;
+ },
+ toColor16: function toColor16(num) {
+ return "#" + num.toString(16);
+ }
+ };
+
+ var Integration = /*#__PURE__*/function () {
+ function Integration(type) {
+ this.type = type;
+ }
+ var _proto = Integration.prototype;
+ _proto.calculate = function calculate(particles, time, damping) {
+ this.eulerIntegrate(particles, time, damping);
+ }
+
+ // Euler Integrate
+ // https://rosettacode.org/wiki/Euler_method
+ ;
+ _proto.eulerIntegrate = function eulerIntegrate(particle, time, damping) {
+ if (!particle.sleep) {
+ particle.old.p.copy(particle.p);
+ particle.old.v.copy(particle.v);
+ particle.a.multiplyScalar(1 / particle.mass);
+ particle.v.add(particle.a.multiplyScalar(time));
+ particle.p.add(particle.old.v.multiplyScalar(time));
+ if (damping) particle.v.multiplyScalar(damping);
+ particle.a.clear();
+ }
+ };
+ return Integration;
+ }();
+
+ var Proton = /*#__PURE__*/function () {
+ // measure 1:100
+
+ // event name
+
+ /**
+ * The constructor to add emitters
+ *
+ * @constructor Proton
+ *
+ * @todo add more documentation of the single properties and parameters
+ *
+ * @param {Number | undefined} [integrationType=Proton.EULER]
+ *
+ * @property {String} [integrationType=Proton.EULER]
+ * @property {Array} emitters All added emitter
+ * @property {Array} renderers All added renderer
+ * @property {Number} time The active time
+ * @property {Number} oldtime The old time
+ */
+ function Proton(integrationType) {
+ this.emitters = [];
+ this.renderers = [];
+ this.time = 0;
+ this.now = 0;
+ this.then = 0;
+ this.elapsed = 0;
+ this.stats = new Stats(this);
+ this.pool = new Pool(80);
+ this.integrationType = Util.initValue(integrationType, Proton.EULER);
+ this.integrator = new Integration(this.integrationType);
+ this._fps = "auto";
+ this._interval = Proton.DEFAULT_INTERVAL;
+ }
+
+ /**
+ * Sets the frames per second (FPS) for the Proton system.
+ * @param {number|string} fps - The desired FPS. Use "auto" for default behavior, or a number for a specific FPS.
+ */
+ var _proto = Proton.prototype;
+ /**
+ * add a type of Renderer
+ *
+ * @method addRenderer
+ * @memberof Proton
+ * @instance
+ *
+ * @param {Renderer} render
+ */
+ _proto.addRenderer = function addRenderer(render) {
+ render.init(this);
+ this.renderers.push(render);
+ }
+
+ /**
+ * @name add a type of Renderer
+ *
+ * @method addRenderer
+ * @param {Renderer} render
+ */;
+ _proto.removeRenderer = function removeRenderer(render) {
+ var index = this.renderers.indexOf(render);
+ this.renderers.splice(index, 1);
+ render.remove(this);
+ }
+
+ /**
+ * add the Emitter
+ *
+ * @method addEmitter
+ * @memberof Proton
+ * @instance
+ *
+ * @param {Emitter} emitter
+ */;
+ _proto.addEmitter = function addEmitter(emitter) {
+ this.emitters.push(emitter);
+ emitter.parent = this;
+ this.dispatchEvent(Proton.EMITTER_ADDED, emitter);
+ }
+
+ /**
+ * Removes an Emitter
+ *
+ * @method removeEmitter
+ * @memberof Proton
+ * @instance
+ *
+ * @param {Proton.Emitter} emitter
+ */;
+ _proto.removeEmitter = function removeEmitter(emitter) {
+ var index = this.emitters.indexOf(emitter);
+ this.emitters.splice(index, 1);
+ emitter.parent = null;
+ this.dispatchEvent(Proton.EMITTER_REMOVED, emitter);
+ }
+
+ /**
+ * Updates all added emitters
+ *
+ * @method update
+ * @memberof Proton
+ * @instance
+ */;
+ _proto.update = function update() {
+ // 'auto' is the default browser refresh rate, the vast majority is 60fps
+ if (this._fps === "auto") {
+ this.dispatchEvent(Proton.PROTON_UPDATE);
+ if (Proton.USE_CLOCK) {
+ if (!this.then) this.then = new Date().getTime();
+ this.now = new Date().getTime();
+ this.elapsed = (this.now - this.then) * 0.001;
+ // Fix bugs such as chrome browser switching tabs causing excessive time difference
+ this.amendChangeTabsBug();
+ if (this.elapsed > 0) this.emittersUpdate(this.elapsed);
+ this.then = this.now;
+ } else {
+ this.emittersUpdate(Proton.DEFAULT_INTERVAL);
+ }
+ this.dispatchEvent(Proton.PROTON_UPDATE_AFTER);
+ }
+
+ // If the fps frame rate is set
+ else {
+ if (!this.then) this.then = new Date().getTime();
+ this.now = new Date().getTime();
+ this.elapsed = (this.now - this.then) * 0.001;
+ if (this.elapsed > this._interval) {
+ this.dispatchEvent(Proton.PROTON_UPDATE);
+ this.emittersUpdate(this._interval);
+ // https://stackoverflow.com/questions/19764018/controlling-fps-with-requestanimationframe
+ this.then = this.now - this.elapsed % this._interval * 1000;
+ this.dispatchEvent(Proton.PROTON_UPDATE_AFTER);
+ }
+ }
+ };
+ _proto.emittersUpdate = function emittersUpdate(elapsed) {
+ var i = this.emitters.length;
+ while (i--) {
+ this.emitters[i].update(elapsed);
+ }
+ }
+
+ /**
+ * @todo add description
+ *
+ * @method amendChangeTabsBug
+ * @memberof Proton
+ * @instance
+ */;
+ _proto.amendChangeTabsBug = function amendChangeTabsBug() {
+ if (!Proton.amendChangeTabsBug) return;
+ if (this.elapsed > 0.5) {
+ this.then = new Date().getTime();
+ this.elapsed = 0;
+ }
+ }
+
+ /**
+ * Counts all particles from all emitters
+ *
+ * @method getCount
+ * @memberof Proton
+ * @instance
+ */;
+ _proto.getCount = function getCount() {
+ var total = 0;
+ var i = this.emitters.length;
+ while (i--) {
+ total += this.emitters[i].particles.length;
+ }
+ return total;
+ };
+ _proto.getAllParticles = function getAllParticles() {
+ var particles = [];
+ var i = this.emitters.length;
+ while (i--) {
+ particles = particles.concat(this.emitters[i].particles);
+ }
+ return particles;
+ };
+ _proto.destroyAllEmitters = function destroyAllEmitters() {
+ Util.destroyAll(this.emitters);
+ }
+
+ /**
+ * Destroys everything related to this Proton instance. This includes all emitters, and all properties
+ *
+ * @method destroy
+ * @memberof Proton
+ * @instance
+ */;
+ _proto.destroy = function destroy(remove) {
+ var _this = this;
+ if (remove === void 0) {
+ remove = false;
+ }
+ var destroyOther = function destroyOther() {
+ _this.time = 0;
+ _this.then = 0;
+ _this.pool.destroy();
+ _this.stats.destroy();
+ Util.destroyAll(_this.emitters);
+ Util.destroyAll(_this.renderers, _this.getAllParticles());
+ _this.integrator = null;
+ _this.renderers = null;
+ _this.emitters = null;
+ _this.stats = null;
+ _this.pool = null;
+ };
+ if (remove) {
+ setTimeout(destroyOther, 200);
+ } else {
+ destroyOther();
+ }
+ };
+ _createClass(Proton, [{
+ key: "fps",
+ get:
+ /**
+ * Gets the current frames per second (FPS) setting.
+ * @returns {number|string} The current FPS setting. Returns "auto" if set to default, or a number representing the specific FPS.
+ */
+ function get() {
+ return this._fps;
+ },
+ set: function set(fps) {
+ this._fps = fps;
+ this._interval = fps === "auto" ? Proton.DEFAULT_INTERVAL : MathUtil.floor(1 / fps, 7);
+ }
+ }]);
+ return Proton;
+ }();
+ Proton.USE_CLOCK = false;
+ Proton.MEASURE = 100;
+ Proton.EULER = "euler";
+ Proton.RK2 = "runge-kutta2";
+ Proton.PARTICLE_CREATED = "PARTICLE_CREATED";
+ Proton.PARTICLE_UPDATE = "PARTICLE_UPDATE";
+ Proton.PARTICLE_SLEEP = "PARTICLE_SLEEP";
+ Proton.PARTICLE_DEAD = "PARTICLE_DEAD";
+ Proton.EMITTER_ADDED = "EMITTER_ADDED";
+ Proton.EMITTER_REMOVED = "EMITTER_REMOVED";
+ Proton.PROTON_UPDATE = "PROTON_UPDATE";
+ Proton.PROTON_UPDATE_AFTER = "PROTON_UPDATE_AFTER";
+ Proton.DEFAULT_INTERVAL = 0.0167;
+ Proton.amendChangeTabsBug = true;
+ EventDispatcher.bind(Proton);
+
+ var Rgb = /*#__PURE__*/function () {
+ function Rgb(r, g, b) {
+ if (r === void 0) {
+ r = 255;
+ }
+ if (g === void 0) {
+ g = 255;
+ }
+ if (b === void 0) {
+ b = 255;
+ }
+ this.r = r;
+ this.g = g;
+ this.b = b;
+ }
+ var _proto = Rgb.prototype;
+ _proto.reset = function reset() {
+ this.r = 255;
+ this.g = 255;
+ this.b = 255;
+ };
+ return Rgb;
+ }();
+
+ /**
+ * Represents a span of values or an array.
+ */
+ var Span = /*#__PURE__*/function () {
+ /**
+ * @type {boolean}
+ * @private
+ */
+
+ /**
+ * @type {number|number[]}
+ * @private
+ */
+
+ /**
+ * @type {number}
+ * @private
+ */
+
+ /**
+ * @type {boolean}
+ * @private
+ */
+
+ /**
+ * Creates a new Span instance.
+ * @param {number|number[]} a - The first value or an array of values.
+ * @param {number} [b] - The second value (if a is not an array).
+ * @param {boolean} [center=false] - Whether to use center-based calculation.
+ */
+ function Span(a, b, center) {
+ this.isArray = void 0;
+ this.a = void 0;
+ this.b = void 0;
+ this.center = void 0;
+ if (Util.isArray(a)) {
+ this.isArray = true;
+ this.a = a;
+ } else {
+ this.isArray = false;
+ this.a = Util.initValue(a, 1);
+ this.b = Util.initValue(b, this.a);
+ this.center = Util.initValue(center, false);
+ }
+ }
+
+ /**
+ * Gets a value from the span.
+ * @param {boolean} [isInt=false] - Whether to return an integer value.
+ * @returns {number} A random value from the span.
+ */
+ var _proto = Span.prototype;
+ _proto.getValue = function getValue(isInt) {
+ if (isInt === void 0) {
+ isInt = false;
+ }
+ if (this.isArray) {
+ return Util.getRandFromArray(this.a);
+ } else {
+ if (!this.center) {
+ return MathUtil.randomAToB(this.a, this.b, isInt);
+ } else {
+ return MathUtil.randomFloating(this.a, this.b, isInt);
+ }
+ }
+ }
+
+ /**
+ * Returns a new Span object.
+ * @param {*|Span} a - The first value or a Span object.
+ * @param {*} [b] - The second value.
+ * @param {*} [c] - The third value.
+ * @returns {Span} A new Span instance.
+ */;
+ Span.setSpanValue = function setSpanValue(a, b, c) {
+ if (a instanceof Span) {
+ return a;
+ } else {
+ if (b === undefined) {
+ return new Span(a);
+ } else {
+ if (c === undefined) return new Span(a, b);else return new Span(a, b, c);
+ }
+ }
+ }
+
+ /**
+ * Returns the value from a Span, if the param is not a Span it will return the given parameter.
+ * @param {*|Span} pan - The value or Span to get the value from.
+ * @returns {*} The value of Span OR the parameter if it is not a Span.
+ */;
+ Span.getSpanValue = function getSpanValue(pan) {
+ return pan instanceof Span ? pan.getValue() : pan;
+ };
+ return Span;
+ }();
+
+ var PropUtil = {
+ hasProp: function hasProp(target, key) {
+ if (!target) return false;
+ return target[key] !== undefined;
+ // return obj.hasOwnProperty(key);
+ },
+ /**
+ * set the prototype in a given prototypeObject
+ *
+ * @memberof Proton#Proton.Util
+ * @method setProp
+ *
+ * @todo add description for param `target`
+ * @todo translate desription from chinese to english
+ *
+ * @param {Object} target
+ * @param {Object} prototypeObject An object of single prototypes
+ *
+ * @return {Object} target
+ */
+ setProp: function setProp(target, props) {
+ for (var prop in props) {
+ if (target.hasOwnProperty(prop)) {
+ target[prop] = Span.getSpanValue(props[prop]);
+ }
+ }
+ return target;
+ },
+ /**
+ * @memberof Proton#Proton.Util
+ * @method setVectorVal
+ *
+ * @todo add description for param `target`
+ * @todo add description for param `conf`
+ * @todo add description for function
+ *
+ * @param {Object} target
+ * @param {Object} conf
+ */
+ setVectorVal: function setVectorVal(particle, conf) {
+ if (conf === void 0) {
+ conf = null;
+ }
+ if (!conf) return;
+ if (this.hasProp(conf, "x")) particle.p.x = conf["x"];
+ if (this.hasProp(conf, "y")) particle.p.y = conf["y"];
+ if (this.hasProp(conf, "vx")) particle.v.x = conf["vx"];
+ if (this.hasProp(conf, "vy")) particle.v.y = conf["vy"];
+ if (this.hasProp(conf, "ax")) particle.a.x = conf["ax"];
+ if (this.hasProp(conf, "ay")) particle.a.y = conf["ay"];
+ if (this.hasProp(conf, "p")) particle.p.copy(conf["p"]);
+ if (this.hasProp(conf, "v")) particle.v.copy(conf["v"]);
+ if (this.hasProp(conf, "a")) particle.a.copy(conf["a"]);
+ if (this.hasProp(conf, "position")) particle.p.copy(conf["position"]);
+ if (this.hasProp(conf, "velocity")) particle.v.copy(conf["velocity"]);
+ if (this.hasProp(conf, "accelerate")) particle.a.copy(conf["accelerate"]);
+ }
+ };
+
+ var ease = {
+ easeLinear: function easeLinear(value) {
+ return value;
+ },
+ easeInQuad: function easeInQuad(value) {
+ return Math.pow(value, 2);
+ },
+ easeOutQuad: function easeOutQuad(value) {
+ return -(Math.pow(value - 1, 2) - 1);
+ },
+ easeInOutQuad: function easeInOutQuad(value) {
+ if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 2);
+ return -0.5 * ((value -= 2) * value - 2);
+ },
+ easeInCubic: function easeInCubic(value) {
+ return Math.pow(value, 3);
+ },
+ easeOutCubic: function easeOutCubic(value) {
+ return Math.pow(value - 1, 3) + 1;
+ },
+ easeInOutCubic: function easeInOutCubic(value) {
+ if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 3);
+ return 0.5 * (Math.pow(value - 2, 3) + 2);
+ },
+ easeInQuart: function easeInQuart(value) {
+ return Math.pow(value, 4);
+ },
+ easeOutQuart: function easeOutQuart(value) {
+ return -(Math.pow(value - 1, 4) - 1);
+ },
+ easeInOutQuart: function easeInOutQuart(value) {
+ if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 4);
+ return -0.5 * ((value -= 2) * Math.pow(value, 3) - 2);
+ },
+ easeInSine: function easeInSine(value) {
+ return -Math.cos(value * MathUtil.PI_2) + 1;
+ },
+ easeOutSine: function easeOutSine(value) {
+ return Math.sin(value * MathUtil.PI_2);
+ },
+ easeInOutSine: function easeInOutSine(value) {
+ return -0.5 * (Math.cos(Math.PI * value) - 1);
+ },
+ easeInExpo: function easeInExpo(value) {
+ return value === 0 ? 0 : Math.pow(2, 10 * (value - 1));
+ },
+ easeOutExpo: function easeOutExpo(value) {
+ return value === 1 ? 1 : -Math.pow(2, -10 * value) + 1;
+ },
+ easeInOutExpo: function easeInOutExpo(value) {
+ if (value === 0) return 0;
+ if (value === 1) return 1;
+ if ((value /= 0.5) < 1) return 0.5 * Math.pow(2, 10 * (value - 1));
+ return 0.5 * (-Math.pow(2, -10 * --value) + 2);
+ },
+ easeInCirc: function easeInCirc(value) {
+ return -(Math.sqrt(1 - value * value) - 1);
+ },
+ easeOutCirc: function easeOutCirc(value) {
+ return Math.sqrt(1 - Math.pow(value - 1, 2));
+ },
+ easeInOutCirc: function easeInOutCirc(value) {
+ if ((value /= 0.5) < 1) return -0.5 * (Math.sqrt(1 - value * value) - 1);
+ return 0.5 * (Math.sqrt(1 - (value -= 2) * value) + 1);
+ },
+ easeInBack: function easeInBack(value) {
+ var s = 1.70158;
+ return value * value * ((s + 1) * value - s);
+ },
+ easeOutBack: function easeOutBack(value) {
+ var s = 1.70158;
+ return (value = value - 1) * value * ((s + 1) * value + s) + 1;
+ },
+ easeInOutBack: function easeInOutBack(value) {
+ var s = 1.70158;
+ if ((value /= 0.5) < 1) return 0.5 * (value * value * (((s *= 1.525) + 1) * value - s));
+ return 0.5 * ((value -= 2) * value * (((s *= 1.525) + 1) * value + s) + 2);
+ },
+ getEasing: function getEasing(ease) {
+ if (typeof ease === "function") return ease;else return this[ease] || this.easeLinear;
+ }
+ };
+
+ var Vector2D = /*#__PURE__*/function () {
+ /** @type {number} */
+
+ /** @type {number} */
+
+ /**
+ * Creates a new Vector2D instance.
+ * @param {number} [x=0] - The x coordinate.
+ * @param {number} [y=0] - The y coordinate.
+ */
+ function Vector2D(x, y) {
+ this.x = void 0;
+ this.y = void 0;
+ this.x = x || 0;
+ this.y = y || 0;
+ }
+
+ /**
+ * Sets the x and y components of this vector.
+ * @param {number} x - The x coordinate.
+ * @param {number} y - The y coordinate.
+ * @returns {Vector2D} This vector.
+ */
+ var _proto = Vector2D.prototype;
+ _proto.set = function set(x, y) {
+ this.x = x;
+ this.y = y;
+ return this;
+ }
+
+ /**
+ * Sets the x component of this vector.
+ * @param {number} x - The x coordinate.
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.setX = function setX(x) {
+ this.x = x;
+ return this;
+ }
+
+ /**
+ * Sets the y component of this vector.
+ * @param {number} y - The y coordinate.
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.setY = function setY(y) {
+ this.y = y;
+ return this;
+ }
+
+ /**
+ * Calculates the gradient (angle) of this vector.
+ * @returns {number} The gradient in radians.
+ */;
+ _proto.getGradient = function getGradient() {
+ if (this.x !== 0) return Math.atan2(this.y, this.x);else if (this.y > 0) return MathUtil.PI_2;else if (this.y < 0) return -MathUtil.PI_2;
+ }
+
+ /**
+ * Copies the values of another vector to this one.
+ * @param {Vector2D} v - The vector to copy from.
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.copy = function copy(v) {
+ this.x = v.x;
+ this.y = v.y;
+ return this;
+ }
+
+ /**
+ * Adds another vector to this one.
+ * @param {Vector2D} v - The vector to add.
+ * @param {Vector2D} [w] - An optional second vector to add.
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.add = function add(v, w) {
+ if (w !== undefined) {
+ return this.addVectors(v, w);
+ }
+ this.x += v.x;
+ this.y += v.y;
+ return this;
+ }
+
+ /**
+ * Adds scalar values to this vector's components.
+ * @param {number} a - Value to add to x.
+ * @param {number} b - Value to add to y.
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.addXY = function addXY(a, b) {
+ this.x += a;
+ this.y += b;
+ return this;
+ }
+
+ /**
+ * Adds two vectors and sets the result to this vector.
+ * @param {Vector2D} a - The first vector to add.
+ * @param {Vector2D} b - The second vector to add.
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.addVectors = function addVectors(a, b) {
+ this.x = a.x + b.x;
+ this.y = a.y + b.y;
+ return this;
+ }
+
+ /**
+ * Subtracts another vector from this one.
+ * @param {Vector2D} v - The vector to subtract.
+ * @param {Vector2D} [w] - An optional second vector to subtract.
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.sub = function sub(v, w) {
+ if (w !== undefined) {
+ return this.subVectors(v, w);
+ }
+ this.x -= v.x;
+ this.y -= v.y;
+ return this;
+ }
+
+ /**
+ * Subtracts one vector from another and sets the result to this vector.
+ * @param {Vector2D} a - The vector to subtract from.
+ * @param {Vector2D} b - The vector to subtract.
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.subVectors = function subVectors(a, b) {
+ this.x = a.x - b.x;
+ this.y = a.y - b.y;
+ return this;
+ }
+
+ /**
+ * Divides this vector by a scalar.
+ * @param {number} s - The scalar to divide by.
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.divideScalar = function divideScalar(s) {
+ if (s !== 0) {
+ this.x /= s;
+ this.y /= s;
+ } else {
+ this.set(0, 0);
+ }
+ return this;
+ }
+
+ /**
+ * Multiplies this vector by a scalar.
+ * @param {number} s - The scalar to multiply by.
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.multiplyScalar = function multiplyScalar(s) {
+ this.x *= s;
+ this.y *= s;
+ return this;
+ }
+
+ /**
+ * Negates this vector (inverts its direction).
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.negate = function negate() {
+ return this.multiplyScalar(-1);
+ }
+
+ /**
+ * Calculates the dot product of this vector with another.
+ * @param {Vector2D} v - The other vector.
+ * @returns {number} The dot product.
+ */;
+ _proto.dot = function dot(v) {
+ return this.x * v.x + this.y * v.y;
+ }
+
+ /**
+ * Calculates the squared length of this vector.
+ * @returns {number} The squared length.
+ */;
+ _proto.lengthSq = function lengthSq() {
+ return this.x * this.x + this.y * this.y;
+ }
+
+ /**
+ * Calculates the length of this vector.
+ * @returns {number} The length.
+ */;
+ _proto.length = function length() {
+ return Math.sqrt(this.x * this.x + this.y * this.y);
+ }
+
+ /**
+ * Normalizes this vector (makes it unit length).
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.normalize = function normalize() {
+ return this.divideScalar(this.length());
+ }
+
+ /**
+ * Calculates the distance to another vector.
+ * @param {Vector2D} v - The other vector.
+ * @returns {number} The distance.
+ */;
+ _proto.distanceTo = function distanceTo(v) {
+ return Math.sqrt(this.distanceToSquared(v));
+ }
+
+ /**
+ * Rotates this vector by an angle.
+ * @param {number} tha - The angle to rotate by (in radians).
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.rotate = function rotate(tha) {
+ var x = this.x;
+ var y = this.y;
+ this.x = x * Math.cos(tha) + y * Math.sin(tha);
+ this.y = -x * Math.sin(tha) + y * Math.cos(tha);
+ return this;
+ }
+
+ /**
+ * Calculates the squared distance to another vector.
+ * @param {Vector2D} v - The other vector.
+ * @returns {number} The squared distance.
+ */;
+ _proto.distanceToSquared = function distanceToSquared(v) {
+ var dx = this.x - v.x;
+ var dy = this.y - v.y;
+ return dx * dx + dy * dy;
+ }
+
+ /**
+ * Linearly interpolates this vector toward another vector.
+ * @param {Vector2D} v - The target vector.
+ * @param {number} alpha - The interpolation factor (0-1).
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.lerp = function lerp(v, alpha) {
+ this.x += (v.x - this.x) * alpha;
+ this.y += (v.y - this.y) * alpha;
+ return this;
+ }
+
+ /**
+ * Checks if this vector is equal to another vector.
+ * @param {Vector2D} v - The other vector.
+ * @returns {boolean} True if the vectors are equal, false otherwise.
+ */;
+ _proto.equals = function equals(v) {
+ return v.x === this.x && v.y === this.y;
+ }
+
+ /**
+ * Sets this vector to zero.
+ * @returns {Vector2D} This vector.
+ */;
+ _proto.clear = function clear() {
+ this.x = 0.0;
+ this.y = 0.0;
+ return this;
+ }
+
+ /**
+ * Creates a new vector with the same x and y values as this one.
+ * @returns {Vector2D} A new Vector2D instance.
+ */;
+ _proto.clone = function clone() {
+ return new Vector2D(this.x, this.y);
+ };
+ return Vector2D;
+ }();
+
+ /**
+ * Represents a particle in a particle system.
+ * @class Particle
+ */
+ var Particle = /*#__PURE__*/function () {
+ /** @type {string} The unique identifier of the particle */
+
+ /** @type {{p:Vector2D,v:Vector2D,a:Vector2D}} Old state of the particle */
+
+ /** @type {object} Custom data associated with the particle */
+
+ /** @type {Behaviour[]} Array of behaviours applied to the particle */
+
+ /** @type {Vector2D} Current position of the particle */
+
+ /** @type {Vector2D} Current velocity of the particle */
+
+ /** @type {Vector2D} Current acceleration of the particle */
+
+ /** @type {Rgb} Color of the particle */
+
+ /**
+ * Creates a new Particle instance.
+ * @param {Object} [conf] Configuration object for the particle
+ */
+ function Particle(conf) {
+ this.id = "";
+ this.old = null;
+ this.data = null;
+ this.behaviours = null;
+ this.p = null;
+ this.v = null;
+ this.a = null;
+ this.rgb = null;
+ this.name = "Particle";
+ this.id = Puid.id(this.name);
+ this.old = {};
+ this.data = {};
+ this.behaviours = [];
+ this.p = new Vector2D();
+ this.v = new Vector2D();
+ this.a = new Vector2D();
+ this.old.p = new Vector2D();
+ this.old.v = new Vector2D();
+ this.old.a = new Vector2D();
+ this.rgb = new Rgb();
+ this.reset();
+ conf && PropUtil.setProp(this, conf);
+ }
+
+ /**
+ * Gets the direction of the particle's movement in degrees.
+ * @returns {number} The direction in degrees
+ */
+ var _proto = Particle.prototype;
+ _proto.getDirection = function getDirection() {
+ return Math.atan2(this.v.x, -this.v.y) * MathUtil.N180_PI;
+ }
+
+ /**
+ * Resets the particle to its initial state.
+ * @returns {Particle} The particle instance
+ */;
+ _proto.reset = function reset() {
+ this.life = Infinity;
+ this.age = 0;
+ this.dead = false;
+ this.sleep = false;
+ this.body = null;
+ this.sprite = null;
+ this.parent = null;
+ this.energy = 1; // Energy Loss
+ this.mass = 1;
+ this.radius = 10;
+ this.alpha = 1;
+ this.scale = 1;
+ this.rotation = 0;
+ this.color = null;
+ this.p.set(0, 0);
+ this.v.set(0, 0);
+ this.a.set(0, 0);
+ this.old.p.set(0, 0);
+ this.old.v.set(0, 0);
+ this.old.a.set(0, 0);
+ this.easing = ease.easeLinear;
+ this.rgb.reset();
+ Util.emptyObject(this.data);
+ this.removeAllBehaviours();
+ return this;
+ }
+
+ /**
+ * Updates the particle's state.
+ * @param {number} time The time elapsed since the last update
+ * @param {number} index The index of the particle in its parent system
+ */;
+ _proto.update = function update(time, index) {
+ if (!this.sleep) {
+ this.age += time;
+ this.applyBehaviours(time, index);
+ }
+ if (this.age < this.life) {
+ var scale = this.easing(this.age / this.life);
+ this.energy = Math.max(1 - scale, 0);
+ } else {
+ this.destroy();
+ }
+ }
+
+ /**
+ * Applies all behaviours attached to the particle.
+ * @param {number} time The time elapsed since the last update
+ * @param {number} index The index of the particle in its parent system
+ */;
+ _proto.applyBehaviours = function applyBehaviours(time, index) {
+ var length = this.behaviours.length;
+ var i;
+ for (i = 0; i < length; i++) {
+ this.behaviours[i] && this.behaviours[i].applyBehaviour(this, time, index);
+ }
+ }
+
+ /**
+ * Adds a behaviour to the particle.
+ * @param {Behaviour} behaviour The behaviour to add
+ */;
+ _proto.addBehaviour = function addBehaviour(behaviour) {
+ this.behaviours.push(behaviour);
+ if (behaviour.hasOwnProperty("parents")) behaviour.parents.push(this);
+ behaviour.initialize(this);
+ }
+
+ /**
+ * Adds multiple behaviours to the particle.
+ * @param {Behaviour[]} behaviours An array of behaviours to add
+ */;
+ _proto.addBehaviours = function addBehaviours(behaviours) {
+ var length = behaviours.length;
+ var i;
+ for (i = 0; i < length; i++) {
+ this.addBehaviour(behaviours[i]);
+ }
+ }
+
+ /**
+ * Removes a specific behaviour from the particle.
+ * @param {Behaviour} behaviour The behaviour to remove
+ */;
+ _proto.removeBehaviour = function removeBehaviour(behaviour) {
+ var index = this.behaviours.indexOf(behaviour);
+ if (index > -1) {
+ var _behaviour = this.behaviours.splice(index, 1);
+ _behaviour.parents = null;
+ }
+ }
+
+ /**
+ * Removes all behaviours from the particle.
+ */;
+ _proto.removeAllBehaviours = function removeAllBehaviours() {
+ Util.emptyArray(this.behaviours);
+ }
+
+ /**
+ * Destroys the particle, removing all behaviours and setting it as dead.
+ */;
+ _proto.destroy = function destroy() {
+ this.removeAllBehaviours();
+ this.energy = 0;
+ this.dead = true;
+ this.parent = null;
+ };
+ return Particle;
+ }();
+
+ var ColorUtil = {
+ /**
+ * @typedef {Object} rgbObject
+ * @property {Number} r red value
+ * @property {Number} g green value
+ * @property {Number} b blue value
+ */
+ /**
+ * converts a hex value to a rgb object
+ *
+ * @memberof Proton#Proton.Util
+ * @method hexToRgb
+ *
+ * @param {String} h any hex value, e.g. #000000 or 000000 for black
+ *
+ * @return {rgbObject}
+ */
+ hexToRgb: function hexToRgb(h) {
+ var hex16 = h.charAt(0) === "#" ? h.substring(1, 7) : h;
+ var r = parseInt(hex16.substring(0, 2), 16);
+ var g = parseInt(hex16.substring(2, 4), 16);
+ var b = parseInt(hex16.substring(4, 6), 16);
+ return {
+ r: r,
+ g: g,
+ b: b
+ };
+ },
+ /**
+ * converts a rgb value to a rgb string
+ *
+ * @memberof Proton#Proton.Util
+ * @method rgbToHex
+ *
+ * @param {Object | Proton.hexToRgb} rgb a rgb object like in {@link Proton#Proton.}
+ *
+ * @return {String} rgb()
+ */
+ rgbToHex: function rgbToHex(rbg) {
+ return "rgb(" + rbg.r + ", " + rbg.g + ", " + rbg.b + ")";
+ },
+ getHex16FromParticle: function getHex16FromParticle(p) {
+ return Number(p.rgb.r) * 65536 + Number(p.rgb.g) * 256 + Number(p.rgb.b);
+ }
+ };
+
+ var Polar2D = /*#__PURE__*/function () {
+ function Polar2D(r, tha) {
+ this.r = Math.abs(r) || 0;
+ this.tha = tha || 0;
+ }
+ var _proto = Polar2D.prototype;
+ _proto.set = function set(r, tha) {
+ this.r = r;
+ this.tha = tha;
+ return this;
+ };
+ _proto.setR = function setR(r) {
+ this.r = r;
+ return this;
+ };
+ _proto.setTha = function setTha(tha) {
+ this.tha = tha;
+ return this;
+ };
+ _proto.copy = function copy(p) {
+ this.r = p.r;
+ this.tha = p.tha;
+ return this;
+ };
+ _proto.toVector = function toVector() {
+ return new Vector2D(this.getX(), this.getY());
+ };
+ _proto.getX = function getX() {
+ return this.r * Math.sin(this.tha);
+ };
+ _proto.getY = function getY() {
+ return -this.r * Math.cos(this.tha);
+ };
+ _proto.normalize = function normalize() {
+ this.r = 1;
+ return this;
+ };
+ _proto.equals = function equals(v) {
+ return v.r === this.r && v.tha === this.tha;
+ };
+ _proto.clear = function clear() {
+ this.r = 0.0;
+ this.tha = 0.0;
+ return this;
+ };
+ _proto.clone = function clone() {
+ return new Polar2D(this.r, this.tha);
+ };
+ return Polar2D;
+ }();
+
+ var Mat3 = {
+ create: function create(mat3) {
+ var mat = new Float32Array(9);
+ if (mat3) this.set(mat3, mat);
+ return mat;
+ },
+ set: function set(mat1, mat2) {
+ for (var i = 0; i < 9; i++) {
+ mat2[i] = mat1[i];
+ }
+ return mat2;
+ },
+ multiply: function multiply(mat, mat2, mat3) {
+ var a00 = mat[0],
+ a01 = mat[1],
+ a02 = mat[2],
+ a10 = mat[3],
+ a11 = mat[4],
+ a20 = mat[6],
+ a21 = mat[7],
+ b00 = mat2[0],
+ b01 = mat2[1],
+ b02 = mat2[2],
+ b10 = mat2[3],
+ b11 = mat2[4],
+ b20 = mat2[6],
+ b21 = mat2[7];
+ mat3[0] = b00 * a00 + b01 * a10;
+ mat3[1] = b00 * a01 + b01 * a11;
+ mat3[2] = a02 * b02;
+ mat3[3] = b10 * a00 + b11 * a10;
+ mat3[4] = b10 * a01 + b11 * a11;
+ mat3[6] = b20 * a00 + b21 * a10 + a20;
+ mat3[7] = b20 * a01 + b21 * a11 + a21;
+ return mat3;
+ },
+ inverse: function inverse(mat, mat3) {
+ var a00 = mat[0],
+ a01 = mat[1],
+ a10 = mat[3],
+ a11 = mat[4],
+ a20 = mat[6],
+ a21 = mat[7],
+ b01 = a11,
+ b11 = -a10,
+ b21 = a21 * a10 - a11 * a20,
+ d = a00 * b01 + a01 * b11,
+ id;
+ id = 1 / d;
+ mat3[0] = b01 * id;
+ mat3[1] = -a01 * id;
+ mat3[3] = b11 * id;
+ mat3[4] = a00 * id;
+ mat3[6] = b21 * id;
+ mat3[7] = (-a21 * a00 + a01 * a20) * id;
+ return mat3;
+ },
+ multiplyVec2: function multiplyVec2(m, vec, mat3) {
+ var x = vec[0],
+ y = vec[1];
+ mat3[0] = x * m[0] + y * m[3] + m[6];
+ mat3[1] = x * m[1] + y * m[4] + m[7];
+ return mat3;
+ }
+ };
+
+ var ArraySpan = /*#__PURE__*/function (_Span) {
+ _inheritsLoose(ArraySpan, _Span);
+ function ArraySpan(color) {
+ var _this;
+ _this = _Span.call(this) || this;
+ _this._arr = Util.toArray(color);
+ return _this;
+ }
+ var _proto = ArraySpan.prototype;
+ _proto.getValue = function getValue() {
+ var val = Util.getRandFromArray(this._arr);
+ return val === "random" || val === "Random" ? MathUtil.randomColor() : val;
+ }
+
+ /**
+ * Make sure that the color is an instance of Proton.ArraySpan, if not it makes a new instance
+ *
+ * @method setSpanValue
+ * @memberof Proton#Proton.Color
+ * @instance
+ *
+ * @param {Proton.Particle} particle
+ * @param {Number} the integrate time 1/ms
+ * @param {Int} the particle index
+ */;
+ ArraySpan.createArraySpan = function createArraySpan(arr) {
+ if (!arr) return null;
+ if (arr instanceof ArraySpan) return arr;else return new ArraySpan(arr);
+ };
+ return ArraySpan;
+ }(Span);
+
+ var Rectangle = /*#__PURE__*/function () {
+ function Rectangle(x, y, w, h) {
+ this.x = x;
+ this.y = y;
+ this.width = w;
+ this.height = h;
+ this.bottom = this.y + this.height;
+ this.right = this.x + this.width;
+ }
+ var _proto = Rectangle.prototype;
+ _proto.contains = function contains(x, y) {
+ if (x <= this.right && x >= this.x && y <= this.bottom && y >= this.y) return true;else return false;
+ };
+ return Rectangle;
+ }();
+
+ /**
+ * Rate class for controlling particle emission rate.
+ */
+ var Rate = /*#__PURE__*/function () {
+ /**
+ * @type {Span}
+ * @private
+ */
+
+ /**
+ * @type {Span}
+ * @private
+ */
+
+ /**
+ * @type {number}
+ * @private
+ */
+
+ /**
+ * @type {number}
+ * @private
+ */
+
+ /**
+ * Creates a new Rate instance.
+ * The number of particles per second emission (a [particle]/b [s]).
+ * @param {Array|number|Span} [numpan=1] - The number of particles for each emission.
+ * @param {Array|number|Span} [timepan=1] - The time interval between each emission.
+ * @example
+ * // Create a rate of 10-20 particles every 0.1-0.25 seconds
+ * new Rate(new Span(10, 20), new Span(0.1, 0.25));
+ */
+ function Rate(numpan, timepan) {
+ this.numPan = void 0;
+ this.timePan = void 0;
+ this.startTime = void 0;
+ this.nextTime = void 0;
+ this.numPan = Span.setSpanValue(Util.initValue(numpan, 1));
+ this.timePan = Span.setSpanValue(Util.initValue(timepan, 1));
+ this.startTime = 0;
+ this.nextTime = 0;
+ this.init();
+ }
+
+ /**
+ * Initializes the rate.
+ * @private
+ */
+ var _proto = Rate.prototype;
+ _proto.init = function init() {
+ this.startTime = 0;
+ this.nextTime = this.timePan.getValue();
+ }
+
+ /**
+ * Gets the number of particles to emit based on the elapsed time.
+ * @param {number} time - The elapsed time since the last update.
+ * @returns {number} The number of particles to emit.
+ */;
+ _proto.getValue = function getValue(time) {
+ this.startTime += time;
+ if (this.startTime >= this.nextTime) {
+ this.startTime = 0;
+ this.nextTime = this.timePan.getValue();
+ if (this.numPan.b === 1) {
+ if (this.numPan.getValue(false) > 0.5) return 1;else return 0;
+ } else {
+ return this.numPan.getValue(true);
+ }
+ }
+ return 0;
+ };
+ return Rate;
+ }();
+
+ var Initialize = /*#__PURE__*/function () {
+ function Initialize() {}
+ var _proto = Initialize.prototype;
+ _proto.reset = function reset() {};
+ _proto.init = function init(emitter, particle) {
+ if (particle) {
+ this.initialize(particle);
+ } else {
+ this.initialize(emitter);
+ }
+ }
+
+ // sub class init
+ ;
+ _proto.initialize = function initialize(target) {};
+ return Initialize;
+ }();
+
+ /**
+ * Life class for initializing particle lifetime.
+ * @extends Initialize
+ */
+ var Life = /*#__PURE__*/function (_Initialize) {
+ _inheritsLoose(Life, _Initialize);
+ /**
+ * @type {Span}
+ * @private
+ */
+
+ /**
+ * @type {string}
+ */
+
+ /**
+ * Creates a new Life instance.
+ * @param {number|Span} a - The lifetime value or the lower bound of the lifetime range.
+ * @param {number} [b] - The upper bound of the lifetime range (if a is a number).
+ * @param {boolean} [c] - Whether to use center-based calculation (if a and b are numbers).
+ */
+ function Life(a, b, c) {
+ var _this;
+ _this = _Initialize.call(this) || this;
+ _this.lifePan = void 0;
+ _this.name = void 0;
+ _this.lifePan = Span.setSpanValue(a, b, c);
+ _this.name = "Life";
+ return _this;
+ }
+
+ /**
+ * Initializes the lifetime of a target particle.
+ * @param {object} target - The target particle to initialize.
+ */
+ var _proto = Life.prototype;
+ _proto.initialize = function initialize(target) {
+ if (this.lifePan.a === Infinity) target.life = Infinity;else target.life = this.lifePan.getValue();
+ };
+ return Life;
+ }(Initialize);
+
+ var Zone = /*#__PURE__*/function () {
+ function Zone() {
+ this.vector = new Vector2D(0, 0);
+ this.random = 0;
+ this.crossType = "dead";
+ this.alert = true;
+ }
+ var _proto = Zone.prototype;
+ _proto.getPosition = function getPosition() {};
+ _proto.crossing = function crossing(particle) {};
+ _proto.destroy = function destroy() {
+ this.vector = null;
+ };
+ return Zone;
+ }();
+
+ /**
+ * Represents a point zone in a 2D space.
+ * @extends Zone
+ */
+ var PointZone = /*#__PURE__*/function (_Zone) {
+ _inheritsLoose(PointZone, _Zone);
+ /**
+ * Creates a new PointZone.
+ * @param {number} x - The x-coordinate of the point.
+ * @param {number} y - The y-coordinate of the point.
+ */
+ function PointZone(x, y) {
+ var _this;
+ _this = _Zone.call(this) || this;
+
+ /**
+ * The x-coordinate of the point.
+ * @type {number}
+ */
+ _this.x = x;
+
+ /**
+ * The y-coordinate of the point.
+ * @type {number}
+ */
+ _this.y = y;
+ return _this;
+ }
+
+ /**
+ * Gets the position of the point.
+ * @returns {Object} An object representing the position vector.
+ */
+ var _proto = PointZone.prototype;
+ _proto.getPosition = function getPosition() {
+ this.vector.x = this.x;
+ this.vector.y = this.y;
+ return this.vector;
+ }
+
+ /**
+ * This method is not supported for PointZone.
+ * @param {Object} particle - The particle object (unused).
+ */;
+ _proto.crossing = function crossing(particle) {
+ if (this.alert) {
+ console.error("Sorry, PointZone does not support crossing method!");
+ this.alert = false;
+ }
+ };
+ return PointZone;
+ }(Zone);
+
+ /**
+ * Position class for initializing particle positions.
+ * @extends Initialize
+ */
+ var Position = /*#__PURE__*/function (_Initialize) {
+ _inheritsLoose(Position, _Initialize);
+ /**
+ * @type {PointZone|any}
+ * @private
+ */
+
+ /**
+ * @type {string}
+ */
+
+ /**
+ * Creates a new Position instance.
+ * @param {PointZone|any} [zone] - The zone to use for positioning. Defaults to a new PointZone if not provided.
+ */
+ function Position(zone) {
+ var _this;
+ _this = _Initialize.call(this) || this;
+ _this.zone = void 0;
+ _this.name = void 0;
+ _this.zone = Util.initValue(zone, new PointZone());
+ _this.name = "Position";
+ return _this;
+ }
+
+ /**
+ * Resets this initializer's parameters.
+ * @param {PointZone|any} [zone] - The new zone to use for positioning. Defaults to a new PointZone if not provided.
+ */
+ var _proto = Position.prototype;
+ _proto.reset = function reset(zone) {
+ this.zone = Util.initValue(zone, new PointZone());
+ }
+
+ /**
+ * Initializes the particle's position.
+ * @param {object} target - The particle to initialize.
+ * @param {object} target.p - The particle's position object.
+ * @param {number} target.p.x - The particle's x coordinate.
+ * @param {number} target.p.y - The particle's y coordinate.
+ */;
+ _proto.initialize = function initialize(target) {
+ this.zone.getPosition();
+ target.p.x = this.zone.vector.x;
+ target.p.y = this.zone.vector.y;
+ };
+ return Position;
+ }(Initialize);
+
+ /**
+ * Velocity class for initializing particle velocities.
+ * @extends Initialize
+ */
+ var Velocity = /*#__PURE__*/function (_Initialize) {
+ _inheritsLoose(Velocity, _Initialize);
+ /**
+ * @type {Span}
+ * @private
+ */
+
+ /**
+ * @type {Span}
+ * @private
+ */
+
+ /**
+ * @type {string}
+ */
+
+ /**
+ * Creates a new Velocity instance.
+ * @param {number|Span} [rpan] - The radial component of the velocity or its range.
+ * @param {number|Span} [thapan] - The angular component of the velocity or its range.
+ * @param {string} [type='vector'] - The type of velocity ('vector' or 'polar').
+ */
+ function Velocity(rpan, thapan, type) {
+ var _this;
+ _this = _Initialize.call(this) || this;
+ _this.rPan = void 0;
+ _this.thaPan = void 0;
+ _this.name = void 0;
+ _this.rPan = Span.setSpanValue(rpan);
+ _this.thaPan = Span.setSpanValue(thapan);
+ _this.type = Util.initValue(type, "vector");
+ _this.name = "Velocity";
+ return _this;
+ }
+
+ /**
+ * Resets the velocity parameters.
+ * @param {number|Span} [rpan] - The radial component of the velocity or its range.
+ * @param {number|Span} [thapan] - The angular component of the velocity or its range.
+ * @param {string} [type='vector'] - The type of velocity ('vector' or 'polar').
+ */
+ var _proto = Velocity.prototype;
+ _proto.reset = function reset(rpan, thapan, type) {
+ this.rPan = Span.setSpanValue(rpan);
+ this.thaPan = Span.setSpanValue(thapan);
+ this.type = Util.initValue(type, "vector");
+ }
+
+ /**
+ * Normalizes the velocity value.
+ * @param {number} vr - The velocity value to normalize.
+ * @returns {number} The normalized velocity value.
+ * @private
+ */;
+ _proto.normalizeVelocity = function normalizeVelocity(vr) {
+ return vr * Proton.MEASURE;
+ }
+
+ /**
+ * Initializes the particle's velocity.
+ * @param {object} target - The particle to initialize.
+ */;
+ _proto.initialize = function initialize(target) {
+ if (this.type === "p" || this.type === "P" || this.type === "polar") {
+ var polar2d = new Polar2D(this.normalizeVelocity(this.rPan.getValue()), this.thaPan.getValue() * MathUtil.PI_180);
+ target.v.x = polar2d.getX();
+ target.v.y = polar2d.getY();
+ } else {
+ target.v.x = this.normalizeVelocity(this.rPan.getValue());
+ target.v.y = this.normalizeVelocity(this.thaPan.getValue());
+ }
+ };
+ return Velocity;
+ }(Initialize);
+
+ /**
+ * Mass class for initializing particle mass.
+ * @extends Initialize
+ */
+ var Mass = /*#__PURE__*/function (_Initialize) {
+ _inheritsLoose(Mass, _Initialize);
+ /**
+ * @type {Span}
+ * @private
+ */
+
+ /**
+ * @type {string}
+ */
+
+ /**
+ * Creates a new Mass instance.
+ * @param {number|Span} a - The mass value or the lower bound of the mass range.
+ * @param {number} [b] - The upper bound of the mass range (if a is a number).
+ * @param {boolean} [c] - Whether to use center-based calculation (if a and b are numbers).
+ */
+ function Mass(a, b, c) {
+ var _this;
+ _this = _Initialize.call(this) || this;
+ _this.massPan = void 0;
+ _this.name = void 0;
+ _this.massPan = Span.setSpanValue(a, b, c);
+ _this.name = "Mass";
+ return _this;
+ }
+
+ /**
+ * Initializes the mass of a target particle.
+ * @param {object} target - The target particle to initialize.
+ */
+ var _proto = Mass.prototype;
+ _proto.initialize = function initialize(target) {
+ target.mass = this.massPan.getValue();
+ };
+ return Mass;
+ }(Initialize);
+
+ /**
+ * Radius class for initializing particle radius.
+ * @extends Initialize
+ */
+ var Radius = /*#__PURE__*/function (_Initialize) {
+ _inheritsLoose(Radius, _Initialize);
+ /**
+ * @type {Span}
+ */
+
+ /**
+ * @type {string}
+ */
+
+ /**
+ * Creates a new Radius instance.
+ * @param {number|Span} a - The radius value or the lower bound of the radius range.
+ * @param {number} [b] - The upper bound of the radius range (if a is a number).
+ * @param {boolean} [c] - Whether to use center-based calculation (if a and b are numbers).
+ */
+ function Radius(a, b, c) {
+ var _this;
+ _this = _Initialize.call(this) || this;
+ _this.radius = void 0;
+ _this.name = void 0;
+ _this.radius = Span.setSpanValue(a, b, c);
+ _this.name = "Radius";
+ return _this;
+ }
+
+ /**
+ * Resets this initializer's parameters.
+ * @param {number|Span} a - The radius value or the lower bound of the radius range.
+ * @param {number} [b] - The upper bound of the radius range (if a is a number).
+ * @param {boolean} [c] - Whether to use center-based calculation (if a and b are numbers).
+ */
+ var _proto = Radius.prototype;
+ _proto.reset = function reset(a, b, c) {
+ this.radius = Span.setSpanValue(a, b, c);
+ }
+
+ /**
+ * Initializes the particle's radius.
+ * @param {Particle} particle - The particle to initialize.
+ */;
+ _proto.initialize = function initialize(particle) {
+ particle.radius = this.radius.getValue();
+ particle.data.oldRadius = particle.radius;
+ };
+ return Radius;
+ }(Initialize);
+
+ /**
+ * Body class for initializing particle bodies.
+ * @extends Initialize
+ */
+ var Body = /*#__PURE__*/function (_Initialize) {
+ _inheritsLoose(Body, _Initialize);
+ /**
+ * @type {ArraySpan}
+ * @private
+ */
+
+ /**
+ * @type {string}
+ */
+
+ /**
+ * Creates a new Body instance.
+ * @param {string|object|ArraySpan} image - The image source or object to use for the particle body.
+ * @param {number} [w=20] - The width of the particle body.
+ * @param {number} [h] - The height of the particle body. Defaults to the width if not provided.
+ */
+ function Body(image, w, h) {
+ var _this;
+ _this = _Initialize.call(this) || this;
+ _this.image = void 0;
+ _this.name = void 0;
+ _this.image = _this.setSpanValue(image);
+ _this.w = Util.initValue(w, 20);
+ _this.h = Util.initValue(h, _this.w);
+ _this.name = "Body";
+ return _this;
+ }
+
+ /**
+ * Initializes the particle's body.
+ * @param {object} particle - The particle to initialize.
+ */
+ var _proto = Body.prototype;
+ _proto.initialize = function initialize(particle) {
+ var imageTarget = this.image.getValue();
+ if (typeof imageTarget === "string") {
+ particle.body = {
+ width: this.w,
+ height: this.h,
+ src: imageTarget,
+ isInner: true,
+ inner: true
+ };
+ } else {
+ particle.body = imageTarget;
+ }
+ }
+
+ /**
+ * Sets the span value for the image.
+ * @param {string|object|ArraySpan} image - The image source or object to set as span value.
+ * @returns {ArraySpan} The ArraySpan instance.
+ * @private
+ */;
+ _proto.setSpanValue = function setSpanValue(image) {
+ return image instanceof ArraySpan ? image : new ArraySpan(image);
+ };
+ return Body;
+ }(Initialize);
+
+ /**
+ * The Behaviour class is the base for the other Behaviour
+ * @class
+ */
+ var Behaviour = /*#__PURE__*/function () {
+ /**
+ * Create a new Behaviour instance
+ * @param {number} [life=Infinity] - The behaviour's life
+ * @param {string} [easing='easeLinear'] - The behaviour's decaying trend, for example ease.easeOutQuart
+ */
+ function Behaviour(life, easing) {
+ /**
+ * The behaviour's life
+ * @type {number}
+ */
+ this.life = Util.initValue(life, Infinity);
+
+ /**
+ * The behaviour's easing function
+ * @type {function}
+ */
+ this.easing = ease.getEasing(easing);
+
+ /**
+ * The behaviour's current age
+ * @type {number}
+ */
+ this.age = 0;
+
+ /**
+ * The behaviour's current energy
+ * @type {number}
+ */
+ this.energy = 1;
+
+ /**
+ * Whether the behaviour is dead
+ * @type {boolean}
+ */
+ this.dead = false;
+
+ /**
+ * The behaviour's parent emitters
+ * @type {Array}
+ */
+ this.parents = [];
+
+ /**
+ * The behaviour's unique id
+ * @type {string}
+ */
+ this.id = "Behaviour_" + Behaviour.id++;
+
+ /**
+ * The behaviour's name
+ * @type {string}
+ */
+ this.name = "Behaviour";
+ }
+
+ /**
+ * Reset this behaviour's parameters
+ * @param {number} [life=Infinity] - This behaviour's new life
+ * @param {string} [easing='easeLinear'] - This behaviour's new easing
+ */
+ var _proto = Behaviour.prototype;
+ _proto.reset = function reset(life, easing) {
+ this.life = Util.initValue(life, Infinity);
+ this.easing = ease.getEasing(easing);
+ }
+
+ /**
+ * Normalize a force by 1:100
+ * @param {Proton.Vector2D} force - The force to normalize
+ * @returns {Proton.Vector2D} The normalized force
+ */;
+ _proto.normalizeForce = function normalizeForce(force) {
+ return force.multiplyScalar(Proton.MEASURE);
+ }
+
+ /**
+ * Normalize a value by 1:100
+ * @param {number} value - The value to normalize
+ * @returns {number} The normalized value
+ */;
+ _proto.normalizeValue = function normalizeValue(value) {
+ return value * Proton.MEASURE;
+ }
+
+ /**
+ * Initialize the behaviour's parameters for a particle
+ * @param {Proton.Particle} particle - The particle to initialize
+ */;
+ _proto.initialize = function initialize(particle) {}
+
+ /**
+ * Compute the behaviour's life cycle
+ * @param {Proton.Particle} particle - The particle to calculate for
+ * @param {number} time - The integrate time 1/ms
+ * @param {number} index - The particle index
+ */;
+ _proto.calculate = function calculate(particle, time, index) {
+ this.age += time;
+ if (this.age >= this.life || this.dead) {
+ this.energy = 0;
+ this.dead = true;
+ this.destroy();
+ } else {
+ var scale = this.easing(particle.age / particle.life);
+ this.energy = Math.max(1 - scale, 0);
+ }
+ }
+
+ /**
+ * Apply this behaviour to a particle
+ * @param {Proton.Particle} particle - The particle to apply the behaviour to
+ * @param {number} time - The integrate time 1/ms
+ * @param {number} index - The particle index
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ this.calculate(particle, time, index);
+ }
+
+ /**
+ * Destroy this behaviour
+ */;
+ _proto.destroy = function destroy() {
+ var i = this.parents.length;
+ while (i--) {
+ this.parents[i].removeBehaviour(this);
+ }
+ this.parents.length = 0;
+ };
+ return Behaviour;
+ }();
+ Behaviour.id = 0;
+
+ var Force = /*#__PURE__*/function (_Behaviour) {
+ _inheritsLoose(Force, _Behaviour);
+ /**
+ * @memberof! Proton#
+ * @augments Proton.Behaviour
+ * @constructor
+ * @alias Proton.Force
+ *
+ * @param {Number} fx
+ * @param {Number} fy
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ *
+ * @property {String} name The Behaviour name
+ */
+ function Force(fx, fy, life, easing) {
+ var _this;
+ _this = _Behaviour.call(this, life, easing) || this;
+ _this.force = _this.normalizeForce(new Vector2D(fx, fy));
+ _this.name = "Force";
+ return _this;
+ }
+
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @method reset
+ * @memberof Proton#Proton.Force
+ * @instance
+ *
+ * @param {Number} fx
+ * @param {Number} fy
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ */
+ var _proto = Force.prototype;
+ _proto.reset = function reset(fx, fy, life, easing) {
+ this.force = this.normalizeForce(new Vector2D(fx, fy));
+ life && _Behaviour.prototype.reset.call(this, life, easing);
+ }
+
+ /**
+ * Apply this behaviour for all particles every time
+ *
+ * @method applyBehaviour
+ * @memberof Proton#Proton.Force
+ * @instance
+ *
+ * @param {Proton.Particle} particle
+ * @param {Number} the integrate time 1/ms
+ * @param {Int} the particle index
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ this.calculate(particle, time, index);
+ particle.a.add(this.force);
+ };
+ return Force;
+ }(Behaviour);
+
+ /**
+ * Attraction behavior for particles.
+ * This behaviour makes particles follow a specific target position.
+ * @extends Behaviour
+ */
+ var Attraction = /*#__PURE__*/function (_Behaviour) {
+ _inheritsLoose(Attraction, _Behaviour);
+ /**
+ * Creates an instance of Attraction.
+ * @param {Vector2D} targetPosition - The attraction point coordinates.
+ * @param {number} [force=100] - The strength of the attraction force.
+ * @param {number} [radius=1000] - The radius of influence for the attraction.
+ * @param {number} [life=Infinity] - The life span of this behaviour.
+ * @param {string} [easing='ease.easeLinear'] - The easing function for this behaviour.
+ */
+ function Attraction(targetPosition, force, radius, life, easing) {
+ var _this;
+ _this = _Behaviour.call(this, life, easing) || this;
+
+ /**
+ * The target position for attraction.
+ * @type {Vector2D}
+ */
+ _this.targetPosition = Util.initValue(targetPosition, new Vector2D());
+
+ /**
+ * The radius of influence for the attraction.
+ * @type {number}
+ */
+ _this.radius = Util.initValue(radius, 1000);
+
+ /**
+ * The strength of the attraction force.
+ * @type {number}
+ */
+ _this.force = Util.initValue(_this.normalizeValue(force), 100);
+
+ /**
+ * The squared radius (for optimization).
+ * @type {number}
+ */
+ _this.radiusSq = _this.radius * _this.radius;
+
+ /**
+ * The attraction force vector.
+ * @type {Vector2D}
+ */
+ _this.attractionForce = new Vector2D();
+
+ /**
+ * The squared length of the attraction force.
+ * @type {number}
+ */
+ _this.lengthSq = 0;
+
+ /**
+ * The name of the behaviour.
+ * @type {string}
+ */
+ _this.name = "Attraction";
+ return _this;
+ }
+
+ /**
+ * Resets the behaviour's parameters.
+ * @param {Vector2D} targetPosition - The new attraction point coordinates.
+ * @param {number} [force=100] - The new strength of the attraction force.
+ * @param {number} [radius=1000] - The new radius of influence for the attraction.
+ * @param {number} [life=Infinity] - The new life span of this behaviour.
+ * @param {string} [easing='ease.easeLinear'] - The new easing function for this behaviour.
+ */
+ var _proto = Attraction.prototype;
+ _proto.reset = function reset(targetPosition, force, radius, life, easing) {
+ this.targetPosition = Util.initValue(targetPosition, new Vector2D());
+ this.radius = Util.initValue(radius, 1000);
+ this.force = Util.initValue(this.normalizeValue(force), 100);
+ this.radiusSq = this.radius * this.radius;
+ this.attractionForce = new Vector2D();
+ this.lengthSq = 0;
+ life && _Behaviour.prototype.reset.call(this, life, easing);
+ }
+
+ /**
+ * Applies this behaviour to a particle.
+ * @param {Particle} particle - The particle to apply the behaviour to.
+ * @param {number} time - The current simulation time.
+ * @param {number} index - The index of the particle.
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ this.calculate(particle, time, index);
+ this.attractionForce.copy(this.targetPosition);
+ this.attractionForce.sub(particle.p);
+ this.lengthSq = this.attractionForce.lengthSq();
+ if (this.lengthSq > 0.00004 && this.lengthSq < this.radiusSq) {
+ this.attractionForce.normalize();
+ this.attractionForce.multiplyScalar(1 - this.lengthSq / this.radiusSq);
+ this.attractionForce.multiplyScalar(this.force);
+ particle.a.add(this.attractionForce);
+ }
+ };
+ return Attraction;
+ }(Behaviour);
+
+ var RandomDrift = /*#__PURE__*/function (_Behaviour) {
+ _inheritsLoose(RandomDrift, _Behaviour);
+ /**
+ * @memberof! Proton#
+ * @augments Behaviour
+ * @constructor
+ * @alias RandomDrift
+ *
+ * @param {Number} driftX X value of the new Vector2D
+ * @param {Number} driftY Y value of the new Vector2D
+ * @param {Number} delay How much delay the drift should have
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=easeLinear] this behaviour's easing
+ *
+ * @property {Number} time The time of the drift
+ * @property {String} name The Behaviour name
+ */
+ function RandomDrift(driftX, driftY, delay, life, easing) {
+ var _this;
+ _this = _Behaviour.call(this, life, easing) || this;
+ _this.reset(driftX, driftY, delay);
+ _this.time = 0;
+ _this.name = "RandomDrift";
+ return _this;
+ }
+
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @method reset
+ * @memberof Proton#RandomDrift
+ * @instance
+ *
+ * @param {Number} driftX X value of the new Vector2D
+ * @param {Number} driftY Y value of the new Vector2D
+ * @param {Number} delay How much delay the drift should have
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=easeLinear] this behaviour's easing
+ */
+ var _proto = RandomDrift.prototype;
+ _proto.reset = function reset(driftX, driftY, delay, life, easing) {
+ this.panFoce = new Vector2D(driftX, driftY);
+ this.panFoce = this.normalizeForce(this.panFoce);
+ this.delay = delay;
+ life && _Behaviour.prototype.reset.call(this, life, easing);
+ };
+ _proto.initialize = function initialize(particle) {
+ particle.data.time = 0;
+ }
+
+ /**
+ * Apply this behaviour for all particles every time
+ *
+ * @method applyBehaviour
+ * @memberof Proton#RandomDrift
+ * @instance
+ *
+ * @param {Particle} particle
+ * @param {Number} time the integrate time 1/ms
+ * @param {Int} index the particle index
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ this.calculate(particle, time, index);
+ particle.data.time += time;
+ if (particle.data.time >= this.delay) {
+ particle.a.addXY(MathUtil.randomAToB(-this.panFoce.x, this.panFoce.x), MathUtil.randomAToB(-this.panFoce.y, this.panFoce.y));
+ particle.data.time = 0;
+ }
+ };
+ return RandomDrift;
+ }(Behaviour);
+
+ var Gravity = /*#__PURE__*/function (_Force) {
+ _inheritsLoose(Gravity, _Force);
+ /**
+ * @memberof! Proton#
+ * @augments Proton#Proton.Force
+ * @constructor
+ * @alias Proton.Gravity
+ *
+ * @param {Number} g Gravity
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ *
+ * @property {String} name The Behaviour name
+ */
+ function Gravity(g, life, easing) {
+ var _this;
+ _this = _Force.call(this, 0, g, life, easing) || this;
+ _this.name = "Gravity";
+ return _this;
+ }
+
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @method reset
+ * @memberof Proton#Proton.Gravity
+ * @instance
+ *
+ * @param {Number} g Gravity
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ */
+ var _proto = Gravity.prototype;
+ _proto.reset = function reset(g, life, easing) {
+ _Force.prototype.reset.call(this, 0, g, life, easing);
+ };
+ return Gravity;
+ }(Force);
+
+ var Collision = /*#__PURE__*/function (_Behaviour) {
+ _inheritsLoose(Collision, _Behaviour);
+ /**
+ * The callback after collision
+ *
+ * @callback Callback
+ *
+ * @param {Proton.Particle} particle
+ * @param {Proton.Paritcle} otherParticle
+ */
+ /**
+ * @memberof! Proton#
+ * @augments Proton.Behaviour
+ * @constructor
+ * @alias Proton.Collision
+ *
+ * @todo add description to mass
+ *
+ * @param {Proton.Emitter} [emitter=null] the attraction point coordinates
+ * @param {Boolean} [mass=true]
+ * @param {Callback} [callback=null] the callback after the collision
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ *
+ * @property {String} name The Behaviour name
+ */
+ function Collision(emitter, mass, callback, life, easing) {
+ var _this;
+ _this = _Behaviour.call(this, life, easing) || this;
+ _this.reset(emitter, mass, callback);
+ _this.newPool = [];
+ _this.pool = [];
+ _this.name = "Collision";
+ return _this;
+ }
+
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @memberof Proton#Proton.Collision
+ * @method reset
+ * @instance
+ *
+ * @todo add description to mass
+ *
+ * @param {Proton.Emitter} [emitter=null] the attraction point coordinates
+ * @param {Boolean} [mass=true]
+ * @param {Callback} [callback=null] the callback after the collision
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ */
+ var _proto = Collision.prototype;
+ _proto.reset = function reset(emitter, mass, callback, life, easing) {
+ this.emitter = Util.initValue(emitter, null);
+ this.mass = Util.initValue(mass, true);
+ this.callback = Util.initValue(callback, null);
+ this.collisionPool = [];
+ this.delta = new Vector2D();
+ life && _Behaviour.prototype.reset.call(this, life, easing);
+ }
+
+ /**
+ * Apply this behaviour for all particles every time
+ *
+ * @memberof Proton#Proton.Collision
+ * @method applyBehaviour
+ * @instance
+ *
+ * @param {Proton.Particle} particle
+ * @param {Number} time the integrate time 1/ms
+ * @param {Int} index the particle index
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ if (this.emitter) {
+ Util.sliceArray(this.emitter.particles, index, this.newPool);
+ } else {
+ Util.sliceArray(this.pool, index, this.newPool);
+ }
+ var length = this.newPool.length;
+ var otherParticle;
+ var lengthSq;
+ var overlap;
+ var totalMass;
+ var averageMass1, averageMass2;
+ var i;
+ for (i = 0; i < length; i++) {
+ otherParticle = this.newPool[i];
+ if (otherParticle !== particle) {
+ this.delta.copy(otherParticle.p);
+ this.delta.sub(particle.p);
+ lengthSq = this.delta.lengthSq();
+ var distance = particle.radius + otherParticle.radius;
+ if (lengthSq <= distance * distance) {
+ overlap = distance - Math.sqrt(lengthSq);
+ overlap += 0.5;
+ totalMass = particle.mass + otherParticle.mass;
+ averageMass1 = this.mass ? otherParticle.mass / totalMass : 0.5;
+ averageMass2 = this.mass ? particle.mass / totalMass : 0.5;
+ particle.p.add(this.delta.clone().normalize().multiplyScalar(overlap * -averageMass1));
+ otherParticle.p.add(this.delta.normalize().multiplyScalar(overlap * averageMass2));
+ this.callback && this.callback(particle, otherParticle);
+ }
+ }
+ }
+ };
+ return Collision;
+ }(Behaviour);
+
+ var CrossZone = /*#__PURE__*/function (_Behaviour) {
+ _inheritsLoose(CrossZone, _Behaviour);
+ /**
+ * Defines what happens if the particles come to the end of the specified zone
+ *
+ * @memberof! Proton#
+ * @augments Proton.Behaviour
+ * @constructor
+ * @alias Proton.CrossZone
+ *
+ * @param {Proton.Zone} zone can be any Proton.Zone - e.g. Proton.RectZone()
+ * @param {String} [crossType=dead] what happens if the particles pass the zone - allowed strings: dead | bound | cross
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ *
+ * @property {String} name The Behaviour name
+ */
+ function CrossZone(zone, crossType, life, easing) {
+ var _this;
+ _this = _Behaviour.call(this, life, easing) || this;
+ _this.reset(zone, crossType);
+ _this.name = "CrossZone";
+ return _this;
+ }
+
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @method reset
+ * @memberof Proton#Proton.CrossZone
+ * @instance
+ *
+ * @param {Proton.Zone} zone can be any Proton.Zone - e.g. Proton.RectZone()
+ * @param {String} [crossType=dead] what happens if the particles pass the zone - allowed strings: dead | bound | cross
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=easeLinear] this behaviour's easing
+ */
+ var _proto = CrossZone.prototype;
+ _proto.reset = function reset(zone, crossType, life, easing) {
+ this.zone = zone;
+ this.zone.crossType = Util.initValue(crossType, "dead");
+ life && _Behaviour.prototype.reset.call(this, life, easing);
+ }
+
+ /**
+ * Apply this behaviour for all particles every time
+ *
+ * @method applyBehaviour
+ * @memberof Proton#Proton.CrossZone
+ * @instance
+ *
+ * @param {Proton.Particle} particle
+ * @param {Number} the integrate time 1/ms
+ * @param {Int} the particle index
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ this.calculate(particle, time, index);
+ this.zone.crossing(particle);
+ };
+ return CrossZone;
+ }(Behaviour);
+
+ /**
+ * Alpha behaviour for controlling particle opacity over time.
+ * @extends Behaviour
+ */
+ var Alpha = /*#__PURE__*/function (_Behaviour) {
+ _inheritsLoose(Alpha, _Behaviour);
+ /**
+ * @type {boolean}
+ * @private
+ */
+
+ /**
+ * @type {Span}
+ * @private
+ */
+
+ /**
+ * @type {Span}
+ * @private
+ */
+
+ /**
+ * @type {string}
+ */
+
+ /**
+ * Creates a new Alpha instance.
+ * @param {number|Span} [a=1] - The initial alpha value or range.
+ * @param {number|Span} [b] - The final alpha value or range. If not provided, it will be the same as 'a'.
+ * @param {number} [life=Infinity] - This behaviour's life.
+ * @param {string} [easing='easeLinear'] - This behaviour's easing function.
+ */
+ function Alpha(a, b, life, easing) {
+ var _this;
+ _this = _Behaviour.call(this, life, easing) || this;
+ _this.same = void 0;
+ _this.a = void 0;
+ _this.b = void 0;
+ _this.name = void 0;
+ _this.reset(a, b);
+ _this.name = "Alpha";
+ return _this;
+ }
+
+ /**
+ * Resets this behaviour's parameters.
+ * @param {number|Span} [a=1] - The initial alpha value or range.
+ * @param {number|Span} [b] - The final alpha value or range. If not provided, it will be the same as 'a'.
+ * @param {number} [life] - This behaviour's life.
+ * @param {string} [easing] - This behaviour's easing function.
+ */
+ var _proto = Alpha.prototype;
+ _proto.reset = function reset(a, b, life, easing) {
+ this.same = b === null || b === undefined;
+ this.a = Span.setSpanValue(Util.initValue(a, 1));
+ this.b = Span.setSpanValue(b);
+ life && _Behaviour.prototype.reset.call(this, life, easing);
+ }
+
+ /**
+ * Initializes the particle's alpha values.
+ * @param {Particle} particle - The particle to initialize.
+ */;
+ _proto.initialize = function initialize(particle) {
+ particle.data.alphaA = this.a.getValue();
+ if (this.same) particle.data.alphaB = particle.data.alphaA;else particle.data.alphaB = this.b.getValue();
+ }
+
+ /**
+ * Applies the alpha behaviour to the particle.
+ * @param {Particle} particle - The particle to apply the behaviour to.
+ * @param {number} time - The current simulation time.
+ * @param {number} index - The index of the particle.
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ this.calculate(particle, time, index);
+ particle.alpha = particle.data.alphaB + (particle.data.alphaA - particle.data.alphaB) * this.energy;
+ if (particle.alpha < 0.001) particle.alpha = 0;
+ };
+ return Alpha;
+ }(Behaviour);
+
+ /**
+ * Scale behaviour for controlling particle size over time.
+ * @extends Behaviour
+ */
+ var Scale = /*#__PURE__*/function (_Behaviour) {
+ _inheritsLoose(Scale, _Behaviour);
+ /**
+ * @type {boolean}
+ * @private
+ */
+
+ /**
+ * @type {string}
+ */
+
+ /**
+ * Creates a new Scale instance.
+ * @param {number|Span} [a=1] - The initial scale value or range.
+ * @param {number|Span} [b] - The final scale value or range. If not provided, it will be the same as 'a'.
+ * @param {number} [life=Infinity] - This behaviour's life.
+ * @param {string} [easing='easeLinear'] - This behaviour's easing function.
+ */
+ function Scale(a, b, life, easing) {
+ var _this;
+ _this = _Behaviour.call(this, life, easing) || this;
+ _this.same = void 0;
+ _this.name = void 0;
+ _this.reset(a, b);
+ _this.name = "Scale";
+ return _this;
+ }
+
+ /**
+ * Resets this behaviour's parameters.
+ * @param {number|Span} a - The initial scale value or range.
+ * @param {number|Span} [b] - The final scale value or range. If not provided, it will be the same as 'a'.
+ * @param {number} [life] - This behaviour's life.
+ * @param {string} [easing] - This behaviour's easing function.
+ */
+ var _proto = Scale.prototype;
+ _proto.reset = function reset(a, b, life, easing) {
+ this.same = b === null || b === undefined;
+ this.a = Span.setSpanValue(Util.initValue(a, 1));
+ this.b = Span.setSpanValue(b);
+ life && _Behaviour.prototype.reset.call(this, life, easing);
+ }
+
+ /**
+ * Initializes the particle's scale values.
+ * @param {Particle} particle - The particle to initialize.
+ */;
+ _proto.initialize = function initialize(particle) {
+ particle.data.scaleA = this.a.getValue();
+ particle.data.oldRadius = particle.radius;
+ particle.data.scaleB = this.same ? particle.data.scaleA : this.b.getValue();
+ }
+
+ /**
+ * Applies the scale behaviour to the particle.
+ * @param {Particle} particle - The particle to apply the behaviour to.
+ * @param {number} time - The current simulation time.
+ * @param {number} index - The index of the particle.
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ this.calculate(particle, time, index);
+ particle.scale = particle.data.scaleB + (particle.data.scaleA - particle.data.scaleB) * this.energy;
+ if (particle.scale < 0.0001) particle.scale = 0;
+ particle.radius = particle.data.oldRadius * particle.scale;
+ };
+ return Scale;
+ }(Behaviour);
+
+ /**
+ * Rotate behaviour for controlling particle rotation.
+ * @extends Behaviour
+ */
+ var Rotate = /*#__PURE__*/function (_Behaviour) {
+ _inheritsLoose(Rotate, _Behaviour);
+ /**
+ * @type {boolean}
+ * @private
+ */
+
+ /**
+ * @type {Span}
+ * @private
+ */
+
+ /**
+ * @type {Span}
+ * @private
+ */
+
+ /**
+ * @type {string}
+ * @private
+ */
+
+ /**
+ * @type {string}
+ */
+
+ /**
+ * Creates a new Rotate instance.
+ * @param {string|number|Span} [influence='Velocity'] - The rotation's influence or initial rotation.
+ * @param {string|number|Span} [b] - The final rotation value or range.
+ * @param {string} [style='to'] - The style of rotation ('to' or 'add').
+ * @param {number} [life=Infinity] - This behaviour's life.
+ * @param {string} [easing='easeLinear'] - This behaviour's easing function.
+ */
+ function Rotate(influence, b, style, life, easing) {
+ var _this;
+ _this = _Behaviour.call(this, life, easing) || this;
+ _this.same = void 0;
+ _this.a = void 0;
+ _this.b = void 0;
+ _this.style = void 0;
+ _this.name = void 0;
+ _this.reset(influence, b, style);
+ _this.name = "Rotate";
+ return _this;
+ }
+
+ /**
+ * Resets this behaviour's parameters.
+ * @param {string|number|Span} [a='Velocity'] - The rotation's influence or initial rotation.
+ * @param {string|number|Span} [b] - The final rotation value or range.
+ * @param {string} [style='to'] - The style of rotation ('to' or 'add').
+ * @param {number} [life] - This behaviour's life.
+ * @param {string} [easing] - This behaviour's easing function.
+ */
+ var _proto = Rotate.prototype;
+ _proto.reset = function reset(a, b, style, life, easing) {
+ this.same = b === null || b === undefined;
+ this.a = Span.setSpanValue(Util.initValue(a, "Velocity"));
+ this.b = Span.setSpanValue(Util.initValue(b, 0));
+ this.style = Util.initValue(style, "to");
+ life && _Behaviour.prototype.reset.call(this, life, easing);
+ }
+
+ /**
+ * Initializes the behaviour's parameters for a particle.
+ * @param {object} particle - The particle to initialize.
+ * @param {number} particle.rotation - The particle's rotation.
+ * @param {object} particle.data - The particle's data object.
+ */;
+ _proto.initialize = function initialize(particle) {
+ particle.rotation = this.a.getValue();
+ particle.data.rotationA = this.a.getValue();
+ if (!this.same) particle.data.rotationB = this.b.getValue();
+ }
+
+ /**
+ * Applies this behaviour to a particle.
+ * @param {object} particle - The particle to apply the behaviour to.
+ * @param {number} time - The integrate time (1/ms).
+ * @param {number} index - The particle index.
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ this.calculate(particle, time, index);
+ if (!this.same) {
+ if (this.style === "to" || this.style === "TO" || this.style === "_") {
+ particle.rotation += particle.data.rotationB + (particle.data.rotationA - particle.data.rotationB) * this.energy;
+ } else {
+ particle.rotation += particle.data.rotationB;
+ }
+ } else if (this.a.a === "V" || this.a.a === "Velocity" || this.a.a === "v") {
+ // beta...
+ particle.rotation = particle.getDirection();
+ }
+ };
+ return Rotate;
+ }(Behaviour);
+
+ var Color = /*#__PURE__*/function (_Behaviour) {
+ _inheritsLoose(Color, _Behaviour);
+ /**
+ * @memberof! Proton#
+ * @augments Proton.Behaviour
+ * @constructor
+ * @alias Proton.Color
+ *
+ * @param {Proton.ArraySpan | String} [a] the string should be a hex e.g. #000000 for black
+ * @param {Proton.ArraySpan | String} [b] the string should be a hex e.g. #000000 for black
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=easeLinear] this behaviour's easing
+ *
+ * @property {String} name The Behaviour name
+ */
+ function Color(a, b, life, easing) {
+ var _this;
+ _this = _Behaviour.call(this, life, easing) || this;
+ _this.reset(a, b);
+ _this.name = "Color";
+ return _this;
+ }
+
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @method reset
+ * @memberof Proton#Proton.Color
+ * @instance
+ *
+ * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black
+ * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=easeLinear] this behaviour's easing
+ */
+ var _proto = Color.prototype;
+ _proto.reset = function reset(a, b, life, easing) {
+ this.a = ArraySpan.createArraySpan(a);
+ this.b = ArraySpan.createArraySpan(b);
+ life && _Behaviour.prototype.reset.call(this, life, easing);
+ }
+
+ /**
+ * Initialize the behaviour's parameters for all particles
+ *
+ * @method initialize
+ * @memberof Proton#Proton.Color
+ * @instance
+ *
+ * @param {Proton.Particle} particle
+ */;
+ _proto.initialize = function initialize(particle) {
+ particle.color = this.a.getValue();
+ particle.data.colorA = ColorUtil.hexToRgb(particle.color);
+ if (this.b) particle.data.colorB = ColorUtil.hexToRgb(this.b.getValue());
+ }
+
+ /**
+ * Apply this behaviour for all particles every time
+ *
+ * @method applyBehaviour
+ * @memberof Proton#Proton.Color
+ * @instance
+ *
+ * @param {Proton.Particle} particle
+ * @param {Number} the integrate time 1/ms
+ * @param {Int} the particle index
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ if (this.b) {
+ this.calculate(particle, time, index);
+ particle.rgb.r = particle.data.colorB.r + (particle.data.colorA.r - particle.data.colorB.r) * this.energy;
+ particle.rgb.g = particle.data.colorB.g + (particle.data.colorA.g - particle.data.colorB.g) * this.energy;
+ particle.rgb.b = particle.data.colorB.b + (particle.data.colorA.b - particle.data.colorB.b) * this.energy;
+ particle.rgb.r = particle.rgb.r << 0;
+ particle.rgb.g = particle.rgb.g << 0;
+ particle.rgb.b = particle.rgb.b << 0;
+ } else {
+ particle.rgb.r = particle.data.colorA.r;
+ particle.rgb.g = particle.data.colorA.g;
+ particle.rgb.b = particle.data.colorA.b;
+ }
+ };
+ return Color;
+ }(Behaviour);
+
+ var CHANGING = "changing";
+ var Cyclone = /*#__PURE__*/function (_Behaviour) {
+ _inheritsLoose(Cyclone, _Behaviour);
+ /**
+ * @memberof! Proton#
+ * @augments Proton.Behaviour
+ * @constructor
+ * @alias Proton.Cyclone
+ *
+ * @param {Number} angle
+ * @param {Number} force
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ *
+ * @property {String} name The Behaviour name
+ */
+ function Cyclone(angle, force, life, easing) {
+ var _this;
+ _this = _Behaviour.call(this, life, easing) || this;
+ _this.setAngleAndForce(angle, force);
+ _this.name = "Cyclone";
+ return _this;
+ }
+ var _proto = Cyclone.prototype;
+ _proto.setAngleAndForce = function setAngleAndForce(angle, force) {
+ this.force = CHANGING;
+ this.angle = MathUtil.PI / 2;
+ if (angle === "right") {
+ this.angle = MathUtil.PI / 2;
+ } else if (angle === "left") {
+ this.angle = -MathUtil.PI / 2;
+ } else if (angle === "random") {
+ this.angle = "random";
+ } else if (angle instanceof Span) {
+ this.angle = "span";
+ this.span = angle;
+ } else if (angle) {
+ this.angle = angle;
+ }
+ if (String(force).toLowerCase() === "changing" || String(force).toLowerCase() === "chang" || String(force).toLowerCase() === "auto") {
+ this.force = CHANGING;
+ } else if (force) {
+ this.force = force;
+ }
+ }
+
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @method reset
+ * @memberof Proton#Proton.Cyclone
+ * @instance
+ *
+ * @param {Number} angle
+ * @param {Number} force
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=ease.easeLinear] this behaviour's easing
+ */;
+ _proto.reset = function reset(angle, force, life, easing) {
+ this.angle = MathUtil.PI / 2;
+ this.setAngleAndForce(angle, force);
+ life && _Behaviour.prototype.reset.call(this, life, easing);
+ };
+ _proto.initialize = function initialize(particle) {
+ if (this.angle === "random") {
+ particle.data.cangle = MathUtil.randomAToB(-MathUtil.PI, MathUtil.PI);
+ } else if (this.angle === "span") {
+ particle.data.cangle = this.span.getValue();
+ }
+ particle.data.cyclone = new Vector2D(0, 0);
+ }
+
+ /**
+ * Apply this behaviour for all particles every time
+ *
+ * @method applyBehaviour
+ * @memberof Proton#Proton.Cyclone
+ * @instance
+ *
+ * @param {Proton.Particle} particle
+ * @param {Number} the integrate time 1/ms
+ * @param {Int} the particle index
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ this.calculate(particle, time, index);
+ var length;
+ var gradient = particle.v.getGradient();
+ if (this.angle === "random" || this.angle === "span") {
+ gradient += particle.data.cangle;
+ } else {
+ gradient += this.angle;
+ }
+ if (this.force === CHANGING) {
+ length = particle.v.length() / 100;
+ } else {
+ length = this.force;
+ }
+ particle.data.cyclone.x = length * Math.cos(gradient);
+ particle.data.cyclone.y = length * Math.sin(gradient);
+ particle.data.cyclone = this.normalizeForce(particle.data.cyclone);
+ particle.a.add(particle.data.cyclone);
+ };
+ return Cyclone;
+ }(Behaviour);
+
+ /**
+ * The opposite of Attraction - turns the force
+ *
+ * @class
+ * @extends Proton.Attraction
+ * @memberof! Proton#
+ * @alias Proton.Repulsion
+ */
+ var Repulsion = /*#__PURE__*/function (_Attraction) {
+ _inheritsLoose(Repulsion, _Attraction);
+ /**
+ * Creates a new Repulsion behaviour instance
+ *
+ * @constructor
+ * @param {Proton.Vector2D} targetPosition - The repulsion point coordinates
+ * @param {number} [force=100] - The strength of the repulsion force
+ * @param {number} [radius=1000] - The radius of influence for the repulsion
+ * @param {number} [life=Infinity] - The behaviour's life
+ * @param {string} [easing='easeLinear'] - The behaviour's easing function
+ */
+ function Repulsion(targetPosition, force, radius, life, easing) {
+ var _this;
+ _this = _Attraction.call(this, targetPosition, force, radius, life, easing) || this;
+
+ /**
+ * The strength of the repulsion force
+ * @type {number}
+ */
+ _this.force *= -1;
+
+ /**
+ * The name of the behaviour
+ * @type {string}
+ */
+ _this.name = "Repulsion";
+ return _this;
+ }
+
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @param {Proton.Vector2D} targetPosition - The new repulsion point coordinates
+ * @param {number} [force=100] - The new strength of the repulsion force
+ * @param {number} [radius=1000] - The new radius of influence for the repulsion
+ * @param {number} [life=Infinity] - The new behaviour's life
+ * @param {string} [easing='easeLinear'] - The new behaviour's easing function
+ */
+ var _proto = Repulsion.prototype;
+ _proto.reset = function reset(targetPosition, force, radius, life, easing) {
+ _Attraction.prototype.reset.call(this, targetPosition, force, radius, life, easing);
+ this.force *= -1;
+ };
+ return Repulsion;
+ }(Attraction);
+
+ var GravityWell = /*#__PURE__*/function (_Behaviour) {
+ _inheritsLoose(GravityWell, _Behaviour);
+ /**
+ * @memberof! Proton#
+ * @augments Behaviour
+ * @constructor
+ * @alias GravityWell
+ *
+ * @param {Vector2D} [centerPoint=new Vector2D] The point in the center
+ * @param {Number} [force=100] The force
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=easeLinear] this behaviour's easing
+ *
+ * @property {String} name The Behaviour name
+ */
+ function GravityWell(centerPoint, force, life, easing) {
+ var _this;
+ _this = _Behaviour.call(this, life, easing) || this;
+ _this.distanceVec = new Vector2D();
+ _this.centerPoint = Util.initValue(centerPoint, new Vector2D());
+ _this.force = Util.initValue(_this.normalizeValue(force), 100);
+ _this.name = "GravityWell";
+ return _this;
+ }
+
+ /**
+ * Reset this behaviour's parameters
+ *
+ * @method reset
+ * @memberof Proton#GravityWell
+ * @instance
+ *
+ * @param {Vector2D} [centerPoint=new Vector2D] The point in the center
+ * @param {Number} [force=100] The force
+ * @param {Number} [life=Infinity] this behaviour's life
+ * @param {String} [easing=easeLinear] this behaviour's easing
+ */
+ var _proto = GravityWell.prototype;
+ _proto.reset = function reset(centerPoint, force, life, easing) {
+ this.distanceVec = new Vector2D();
+ this.centerPoint = Util.initValue(centerPoint, new Vector2D());
+ this.force = Util.initValue(this.normalizeValue(force), 100);
+ life && _Behaviour.prototype.reset.call(this, life, easing);
+ }
+
+ /**
+ * @inheritdoc
+ */;
+ _proto.initialize = function initialize(particle) {}
+
+ /**
+ * Apply this behaviour for all particles every time
+ *
+ * @method applyBehaviour
+ * @memberof Proton#GravityWell
+ * @instance
+ *
+ * @param {Particle} particle
+ * @param {Number} the integrate time 1/ms
+ * @param {Int} the particle index
+ */;
+ _proto.applyBehaviour = function applyBehaviour(particle, time, index) {
+ this.distanceVec.set(this.centerPoint.x - particle.p.x, this.centerPoint.y - particle.p.y);
+ var distanceSq = this.distanceVec.lengthSq();
+ if (distanceSq !== 0) {
+ var distance = this.distanceVec.length();
+ var factor = this.force * time / (distanceSq * distance);
+ particle.v.x += factor * this.distanceVec.x;
+ particle.v.y += factor * this.distanceVec.y;
+ }
+ };
+ return GravityWell;
+ }(Behaviour);
+
+ var InitializeUtil = {
+ initialize: function initialize(emitter, particle, initializes) {
+ var length = initializes.length;
+ var i;
+ for (i = 0; i < length; i++) {
+ if (initializes[i] instanceof Initialize) {
+ initializes[i].init(emitter, particle);
+ } else {
+ this.init(emitter, particle, initializes[i]);
+ }
+ }
+ this.bindEmitter(emitter, particle);
+ },
+ // init
+ init: function init(emitter, particle, initialize) {
+ PropUtil.setProp(particle, initialize);
+ PropUtil.setVectorVal(particle, initialize);
+ },
+ bindEmitter: function bindEmitter(emitter, particle) {
+ if (emitter.bindEmitter) {
+ particle.p.add(emitter.p);
+ particle.v.add(emitter.v);
+ particle.a.add(emitter.a);
+ particle.v.rotate(MathUtil.degreeTransform(emitter.rotation));
+ }
+ }
+ };
+
+ var Emitter = /*#__PURE__*/function (_Particle) {
+ _inheritsLoose(Emitter, _Particle);
+ /**
+ * You can use this emit particles.
+ *
+ * It will dispatch follow events:
+ * PARTICLE_CREATED
+ * PARTICLE_UPDATA
+ * PARTICLE_DEAD
+ *
+ * @class Emitter
+ * @constructor
+ * @param {Object} conf the parameters object;
+ * for example {damping:0.01,bindEmitter:false}
+ */
+ function Emitter(conf) {
+ var _this;
+ if (conf === void 0) {
+ conf = {};
+ }
+ _this = _Particle.call(this, conf) || this;
+ _this.particles = [];
+ _this.behaviours = [];
+ _this.initializes = [];
+ _this.emitTime = 0;
+ _this.emitSpeed = 0;
+ _this.totalTime = -1;
+
+ /**
+ * The friction coefficient for all particle emit by This;
+ * @property damping
+ * @type {Number}
+ * @default 0.006
+ */
+ _this.damping = 0.006;
+
+ /**
+ * If bindEmitter the particles can bind this emitter's property;
+ * @property bindEmitter
+ * @type {Boolean}
+ * @default true
+ */
+ _this.bindEmitter = true;
+
+ /**
+ * The number of particles per second emit (a [particle]/b [s]);
+ * @property rate
+ * @type {Rate}
+ * @default Rate(1, .1)
+ */
+ _this.rate = new Rate(1, 0.1);
+ _this.name = "Emitter";
+ _this.id = Puid.id(_this.name);
+ return _this;
+ }
+
+ /**
+ * start emit particle
+ * @method emit
+ * @param {Number | String} [totalTime] begin emit time;
+ * @param {String | boolean} [life] the life of this emitter
+ */
+ var _proto = Emitter.prototype;
+ _proto.emit = function emit(totalTime, life) {
+ this.stoped = false;
+ this.emitTime = 0;
+ this.totalTime = Util.initValue(totalTime, Infinity);
+ if (life === true || life === "life" || life === "destroy") {
+ this.life = totalTime === "once" ? 1 : this.totalTime;
+ } else if (!isNaN(life)) {
+ this.life = life;
+ }
+ this.rate.init();
+ }
+
+ /**
+ * stop emiting
+ * @method stop
+ */;
+ _proto.stop = function stop() {
+ this.totalTime = -1;
+ this.emitTime = 0;
+ this.stoped = true;
+ };
+ _proto.preEmit = function preEmit(time) {
+ var oldStoped = this.stoped;
+ var oldEmitTime = this.emitTime;
+ var oldTotalTime = this.totalTime;
+ this.stoped = false;
+ this.emitTime = 0;
+ this.totalTime = time;
+ this.rate.init();
+ var step = 0.0167;
+ while (time > step) {
+ time -= step;
+ this.update(step);
+ }
+ this.stoped = oldStoped;
+ this.emitTime = oldEmitTime + Math.max(time, 0);
+ this.totalTime = oldTotalTime;
+ }
+
+ /**
+ * remove current all particles
+ * @method removeAllParticles
+ */;
+ _proto.removeAllParticles = function removeAllParticles() {
+ var i = this.particles.length;
+ while (i--) {
+ this.particles[i].dead = true;
+ }
+ }
+
+ /**
+ * add initialize to this emitter
+ * @method addSelfInitialize
+ */;
+ _proto.addSelfInitialize = function addSelfInitialize(initialize) {
+ if (initialize["init"]) {
+ initialize.init(this);
+ }
+ }
+
+ /**
+ * add the Initialize to particles;
+ *
+ * you can use initializes array:for example emitter.addInitialize(initialize1,initialize2,initialize3);
+ * @method addInitialize
+ * @param {Initialize} initialize like this new Radius(1, 12)
+ */;
+ _proto.addInitialize = function addInitialize() {
+ for (var _len = arguments.length, rest = new Array(_len), _key = 0; _key < _len; _key++) {
+ rest[_key] = arguments[_key];
+ }
+ var i = rest.length;
+ while (i--) {
+ this.initializes.push(rest[i]);
+ }
+ }
+
+ /**
+ * remove the Initialize
+ * @method removeInitialize
+ * @param {Initialize} initialize a initialize
+ */;
+ _proto.removeInitialize = function removeInitialize(initializer) {
+ var index = this.initializes.indexOf(initializer);
+ if (index > -1) this.initializes.splice(index, 1);
+ }
+
+ /**
+ * remove all Initializes
+ * @method removeInitializers
+ */;
+ _proto.removeAllInitializers = function removeAllInitializers() {
+ Util.emptyArray(this.initializes);
+ }
+
+ /**
+ * add the Behaviour to particles;
+ *
+ * you can use Behaviours array:emitter.addBehaviour(Behaviour1,Behaviour2,Behaviour3);
+ * @method addBehaviour
+ * @param {Behaviour} behaviour like this new Color('random')
+ */;
+ _proto.addBehaviour = function addBehaviour() {
+ for (var _len2 = arguments.length, rest = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ rest[_key2] = arguments[_key2];
+ }
+ var i = arguments.length;
+ while (i--) {
+ var behaviour = rest[i];
+ this.behaviours.push(behaviour);
+ if (behaviour.parents) behaviour.parents.push(this);
+ }
+ }
+
+ /**
+ * remove the Behaviour
+ * @method removeBehaviour
+ * @param {Behaviour} behaviour a behaviour
+ */;
+ _proto.removeBehaviour = function removeBehaviour(behaviour) {
+ var index = this.behaviours.indexOf(behaviour);
+ this.behaviours.splice(index, 1);
+ if (behaviour.parents) {
+ index = behaviour.parents.indexOf(behaviour);
+ behaviour.parents.splice(index, 1);
+ }
+ return index;
+ }
+
+ /**
+ * remove all behaviours
+ * @method removeAllBehaviours
+ */;
+ _proto.removeAllBehaviours = function removeAllBehaviours() {
+ Util.emptyArray(this.behaviours);
+ }
+
+ // emitter update
+ ;
+ _proto.update = function update(time) {
+ this.age += time;
+ if (this.age >= this.life || this.dead) this.destroy();
+ this.emitting(time);
+ this.integrate(time);
+ };
+ _proto.integrate = function integrate(time) {
+ if (!this.parent) return;
+ var damping = 1 - this.damping;
+ this.parent.integrator.calculate(this, time, damping);
+ var length = this.particles.length;
+ var i, particle;
+ for (i = length - 1; i >= 0; i--) {
+ particle = this.particles[i];
+
+ // particle update
+ particle.update(time, i);
+ this.parent.integrator.calculate(particle, time, damping);
+ this.dispatch("PARTICLE_UPDATE", particle);
+
+ // check dead
+ if (particle.dead) {
+ this.dispatch("PARTICLE_DEAD", particle);
+ this.parent.pool.expire(particle);
+ this.particles.splice(i, 1);
+ }
+ }
+ };
+ _proto.dispatch = function dispatch(event, target) {
+ this.parent && this.parent.dispatchEvent(event, target);
+ this.bindEvent && this.dispatchEvent(event, target);
+ };
+ _proto.emitting = function emitting(time) {
+ if (this.stoped) return;
+ if (this.totalTime === "none") {
+ this.emitTime += time;
+ } else if (this.totalTime === "once") {
+ var i;
+ var length = this.rate.getValue(99999);
+ if (length > 0) this.emitSpeed = length;
+ for (i = 0; i < length; i++) {
+ this.createParticle();
+ }
+ this.totalTime = "none";
+ } else {
+ this.emitTime += time;
+ if (this.emitTime < this.totalTime) {
+ var _length = this.rate.getValue(time);
+ var _i;
+ if (_length > 0) this.emitSpeed = _length;
+ for (_i = 0; _i < _length; _i++) {
+ this.createParticle();
+ }
+ }
+ }
+ }
+
+ /**
+ * create single particle;
+ *
+ * can use emit({x:10},new Gravity(10),{'particleUpdate',fun}) or emit([{x:10},new Initialize],new Gravity(10),{'particleUpdate',fun})
+ * @method removeAllParticles
+ */;
+ _proto.createParticle = function createParticle(initialize, behaviour) {
+ var particle = this.parent.pool.get(Particle);
+ this.setupParticle(particle, initialize, behaviour);
+ this.dispatch("PARTICLE_CREATED", particle);
+ return particle;
+ };
+ _proto.setupParticle = function setupParticle(particle, initialize, behaviour) {
+ var initializes = this.initializes;
+ var behaviours = this.behaviours;
+ if (initialize) initializes = Util.toArray(initialize);
+ if (behaviour) behaviours = Util.toArray(behaviour);
+ particle.reset();
+ InitializeUtil.initialize(this, particle, initializes);
+ particle.addBehaviours(behaviours);
+ particle.parent = this;
+ this.particles.push(particle);
+ };
+ _proto.remove = function remove() {
+ this.stop();
+ Util.destroyAll(this.particles);
+ }
+
+ /**
+ * Destory this Emitter
+ * @method destroy
+ */;
+ _proto.destroy = function destroy() {
+ this.dead = true;
+ this.remove();
+ this.removeAllInitializers();
+ this.removeAllBehaviours();
+ this.parent && this.parent.removeEmitter(this);
+ this.rate = null;
+ this.old = null;
+ this.rgb = null;
+ this.v = null;
+ this.a = null;
+ this.p = null;
+ };
+ return Emitter;
+ }(Particle);
+ EventDispatcher.bind(Emitter);
+
+ var BehaviourEmitter = /*#__PURE__*/function (_Emitter) {
+ _inheritsLoose(BehaviourEmitter, _Emitter);
+ /**
+ * The BehaviourEmitter class inherits from Proton.Emitter
+ *
+ * use the BehaviourEmitter you can add behaviours to self;
+ * @class Proton.BehaviourEmitter
+ * @constructor
+ * @param {Object} conf the parameters object;
+ */
+ function BehaviourEmitter(conf) {
+ var _this;
+ _this = _Emitter.call(this, conf) || this;
+ _this.selfBehaviours = [];
+ return _this;
+ }
+
+ /**
+ * add the Behaviour to emitter;
+ *
+ * you can use Behaviours array:emitter.addSelfBehaviour(Behaviour1,Behaviour2,Behaviour3);
+ * @method addSelfBehaviour
+ * @param {Proton.Behaviour} behaviour like this new Proton.Color('random')
+ */
+ var _proto = BehaviourEmitter.prototype;
+ _proto.addSelfBehaviour = function addSelfBehaviour() {
+ for (var _len = arguments.length, rest = new Array(_len), _key = 0; _key < _len; _key++) {
+ rest[_key] = arguments[_key];
+ }
+ var i,
+ length = rest.length;
+ for (i = 0; i < length; i++) {
+ var behaviour = rest[i];
+ this.selfBehaviours.push(behaviour);
+ behaviour.initialize(this);
+ }
+ }
+
+ /**
+ * remove the Behaviour for self
+ * @method removeSelfBehaviour
+ * @param {Proton.Behaviour} behaviour a behaviour
+ */;
+ _proto.removeSelfBehaviour = function removeSelfBehaviour(behaviour) {
+ var index = this.selfBehaviours.indexOf(behaviour);
+ if (index > -1) this.selfBehaviours.splice(index, 1);
+ };
+ _proto.update = function update(time) {
+ _Emitter.prototype.update.call(this, time);
+ if (!this.sleep) {
+ var length = this.selfBehaviours.length;
+ var i;
+ for (i = 0; i < length; i++) {
+ this.selfBehaviours[i].applyBehaviour(this, time, i);
+ }
+ }
+ };
+ return BehaviourEmitter;
+ }(Emitter);
+
+ var FollowEmitter = /*#__PURE__*/function (_Emitter) {
+ _inheritsLoose(FollowEmitter, _Emitter);
+ /**
+ * The FollowEmitter class inherits from Proton.Emitter
+ *
+ * use the FollowEmitter will emit particle when mousemoving
+ *
+ * @class Proton.FollowEmitter
+ * @constructor
+ * @param {Element} mouseTarget mouseevent's target;
+ * @param {Number} ease the easing of following speed;
+ * @default 0.7
+ * @param {Object} conf the parameters object;
+ */
+ function FollowEmitter(mouseTarget, ease, conf) {
+ var _this;
+ _this = _Emitter.call(this, conf) || this;
+ _this.mouseTarget = Util.initValue(mouseTarget, window);
+ _this.ease = Util.initValue(ease, 0.7);
+ _this._allowEmitting = false;
+ _this.initEventHandler();
+ return _this;
+ }
+ var _proto = FollowEmitter.prototype;
+ _proto.initEventHandler = function initEventHandler() {
+ var _this2 = this;
+ this.mousemoveHandler = function (e) {
+ return _this2.mousemove.call(_this2, e);
+ };
+ this.mousedownHandler = function (e) {
+ return _this2.mousedown.call(_this2, e);
+ };
+ this.mouseupHandler = function (e) {
+ return _this2.mouseup.call(_this2, e);
+ };
+ this.mouseTarget.addEventListener("mousemove", this.mousemoveHandler, false);
+ }
+
+ /**
+ * start emit particle
+ * @method emit
+ */;
+ _proto.emit = function emit() {
+ this._allowEmitting = true;
+ }
+
+ /**
+ * stop emiting
+ * @method stop
+ */;
+ _proto.stop = function stop() {
+ this._allowEmitting = false;
+ };
+ _proto.mousemove = function mousemove(e) {
+ if (e.layerX || e.layerX === 0) {
+ this.p.x += (e.layerX - this.p.x) * this.ease;
+ this.p.y += (e.layerY - this.p.y) * this.ease;
+ } else if (e.offsetX || e.offsetX === 0) {
+ this.p.x += (e.offsetX - this.p.x) * this.ease;
+ this.p.y += (e.offsetY - this.p.y) * this.ease;
+ }
+ if (this._allowEmitting) _Emitter.prototype.emit.call(this, "once");
+ }
+
+ /**
+ * Destory this Emitter
+ * @method destroy
+ */;
+ _proto.destroy = function destroy() {
+ _Emitter.prototype.destroy.call(this);
+ this.mouseTarget.removeEventListener("mousemove", this.mousemoveHandler, false);
+ };
+ return FollowEmitter;
+ }(Emitter);
+
+ var Types = {
+ /**
+ * Determine whether it is a picture object
+ *
+ * @return {boolean} is or no
+ */
+ isImage: function isImage(obj) {
+ if (!obj) return false;
+ if (obj.__isImage) return true;
+ var tagName = ("" + obj.tagName).toUpperCase();
+ var nodeName = ("" + obj.nodeName).toUpperCase();
+ if (nodeName === "IMG" || tagName === "IMG") {
+ obj.__isImage = true;
+ return true;
+ }
+ return false;
+ },
+ /**
+ * Determine whether it is a string object
+ *
+ * @return {boolean} is or no
+ */
+ isString: function isString(obj) {
+ return typeof obj === "string";
+ }
+ };
+
+ var BaseRenderer = /*#__PURE__*/function () {
+ function BaseRenderer(element, stroke) {
+ this.pool = new Pool();
+ this.element = element;
+ this.stroke = stroke;
+ this.circleConf = {
+ isCircle: true
+ };
+ this.initEventHandler();
+ this.name = "BaseRenderer";
+ }
+ var _proto = BaseRenderer.prototype;
+ _proto.setStroke = function setStroke(color, thinkness) {
+ if (color === void 0) {
+ color = "#000000";
+ }
+ if (thinkness === void 0) {
+ thinkness = 1;
+ }
+ this.stroke = {
+ color: color,
+ thinkness: thinkness
+ };
+ };
+ _proto.initEventHandler = function initEventHandler() {
+ var _this = this;
+ this._protonUpdateHandler = function () {
+ _this.onProtonUpdate.call(_this);
+ };
+ this._protonUpdateAfterHandler = function () {
+ _this.onProtonUpdateAfter.call(_this);
+ };
+ this._emitterAddedHandler = function (emitter) {
+ _this.onEmitterAdded.call(_this, emitter);
+ };
+ this._emitterRemovedHandler = function (emitter) {
+ _this.onEmitterRemoved.call(_this, emitter);
+ };
+ this._particleCreatedHandler = function (particle) {
+ _this.onParticleCreated.call(_this, particle);
+ };
+ this._particleUpdateHandler = function (particle) {
+ _this.onParticleUpdate.call(_this, particle);
+ };
+ this._particleDeadHandler = function (particle) {
+ _this.onParticleDead.call(_this, particle);
+ };
+ };
+ _proto.init = function init(proton) {
+ this.parent = proton;
+ proton.addEventListener("PROTON_UPDATE", this._protonUpdateHandler);
+ proton.addEventListener("PROTON_UPDATE_AFTER", this._protonUpdateAfterHandler);
+ proton.addEventListener("EMITTER_ADDED", this._emitterAddedHandler);
+ proton.addEventListener("EMITTER_REMOVED", this._emitterRemovedHandler);
+ proton.addEventListener("PARTICLE_CREATED", this._particleCreatedHandler);
+ proton.addEventListener("PARTICLE_UPDATE", this._particleUpdateHandler);
+ proton.addEventListener("PARTICLE_DEAD", this._particleDeadHandler);
+ };
+ _proto.resize = function resize(width, height) {};
+ _proto.destroy = function destroy() {
+ this.remove();
+ this.pool.destroy();
+ this.pool = null;
+ this.element = null;
+ this.stroke = null;
+ };
+ _proto.remove = function remove(proton) {
+ this.parent.removeEventListener("PROTON_UPDATE", this._protonUpdateHandler);
+ this.parent.removeEventListener("PROTON_UPDATE_AFTER", this._protonUpdateAfterHandler);
+ this.parent.removeEventListener("EMITTER_ADDED", this._emitterAddedHandler);
+ this.parent.removeEventListener("EMITTER_REMOVED", this._emitterRemovedHandler);
+ this.parent.removeEventListener("PARTICLE_CREATED", this._particleCreatedHandler);
+ this.parent.removeEventListener("PARTICLE_UPDATE", this._particleUpdateHandler);
+ this.parent.removeEventListener("PARTICLE_DEAD", this._particleDeadHandler);
+ this.parent = null;
+ };
+ _proto.onProtonUpdate = function onProtonUpdate() {};
+ _proto.onProtonUpdateAfter = function onProtonUpdateAfter() {};
+ _proto.onEmitterAdded = function onEmitterAdded(emitter) {};
+ _proto.onEmitterRemoved = function onEmitterRemoved(emitter) {};
+ _proto.onParticleCreated = function onParticleCreated(particle) {};
+ _proto.onParticleUpdate = function onParticleUpdate(particle) {};
+ _proto.onParticleDead = function onParticleDead(particle) {};
+ return BaseRenderer;
+ }();
+
+ /**
+ * CanvasRenderer class for rendering particles on a canvas element.
+ * @extends BaseRenderer
+ */
+ var CanvasRenderer = /*#__PURE__*/function (_BaseRenderer) {
+ _inheritsLoose(CanvasRenderer, _BaseRenderer);
+ /**
+ * @type {object|null}
+ * @private
+ */
+
+ /**
+ * @type {CanvasRenderingContext2D}
+ * @private
+ */
+
+ /**
+ * @type {object}
+ * @private
+ */
+
+ /**
+ * @type {string}
+ */
+
+ /**
+ * Creates a new CanvasRenderer instance.
+ * @param {HTMLCanvasElement} element - The canvas element to render on.
+ */
+ function CanvasRenderer(element) {
+ var _this;
+ _this = _BaseRenderer.call(this, element) || this;
+ _this.stroke = void 0;
+ _this.context = void 0;
+ _this.bufferCache = void 0;
+ _this.name = void 0;
+ _this.stroke = null;
+ _this.context = _this.element.getContext("2d");
+ _this.bufferCache = {};
+ _this.name = "CanvasRenderer";
+ return _this;
+ }
+
+ /**
+ * Resizes the canvas element.
+ * @param {number} width - The new width of the canvas.
+ * @param {number} height - The new height of the canvas.
+ */
+ var _proto = CanvasRenderer.prototype;
+ _proto.resize = function resize(width, height) {
+ this.element.width = width;
+ this.element.height = height;
+ }
+
+ /**
+ * Clears the canvas on Proton update.
+ */;
+ _proto.onProtonUpdate = function onProtonUpdate() {
+ this.context.clearRect(0, 0, this.element.width, this.element.height);
+ }
+
+ /**
+ * Handles particle creation.
+ * @param {object} particle - The created particle.
+ */;
+ _proto.onParticleCreated = function onParticleCreated(particle) {
+ if (particle.body) {
+ ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);
+ } else {
+ particle.color = particle.color || "#ff0000";
+ }
+ }
+
+ /**
+ * Handles particle updates.
+ * @param {object} particle - The updated particle.
+ */;
+ _proto.onParticleUpdate = function onParticleUpdate(particle) {
+ if (particle.body) {
+ if (Types.isImage(particle.body)) {
+ this.drawImage(particle);
+ }
+ } else {
+ this.drawCircle(particle);
+ }
+ }
+
+ /**
+ * Handles particle destruction.
+ * @param {object} particle - The destroyed particle.
+ */;
+ _proto.onParticleDead = function onParticleDead(particle) {
+ particle.body = null;
+ }
+
+ /**
+ * Adds an image to the particle body.
+ * @param {HTMLImageElement} img - The image to add.
+ * @param {object} particle - The particle to add the image to.
+ * @private
+ */;
+ _proto.addImg2Body = function addImg2Body(img, particle) {
+ particle.body = img;
+ }
+
+ /**
+ * Draws an image particle.
+ * @param {object} particle - The particle to draw.
+ * @private
+ */;
+ _proto.drawImage = function drawImage(particle) {
+ var w = particle.body.width * particle.scale | 0;
+ var h = particle.body.height * particle.scale | 0;
+ var x = particle.p.x - w / 2;
+ var y = particle.p.y - h / 2;
+ if (!!particle.color) {
+ if (!particle.data["buffer"]) particle.data.buffer = this.createBuffer(particle.body);
+ var bufContext = particle.data.buffer.getContext("2d");
+ bufContext.clearRect(0, 0, particle.data.buffer.width, particle.data.buffer.height);
+ bufContext.globalAlpha = particle.alpha;
+ bufContext.drawImage(particle.body, 0, 0);
+ bufContext.globalCompositeOperation = "source-atop";
+ bufContext.fillStyle = ColorUtil.rgbToHex(particle.rgb);
+ bufContext.fillRect(0, 0, particle.data.buffer.width, particle.data.buffer.height);
+ bufContext.globalCompositeOperation = "source-over";
+ bufContext.globalAlpha = 1;
+ this.context.drawImage(particle.data.buffer, 0, 0, particle.data.buffer.width, particle.data.buffer.height, x, y, w, h);
+ } else {
+ this.context.save();
+ this.context.globalAlpha = particle.alpha;
+ this.context.translate(particle.p.x, particle.p.y);
+ this.context.rotate(MathUtil.degreeTransform(particle.rotation));
+ this.context.translate(-particle.p.x, -particle.p.y);
+ this.context.drawImage(particle.body, 0, 0, particle.body.width, particle.body.height, x, y, w, h);
+ this.context.globalAlpha = 1;
+ this.context.restore();
+ }
+ }
+
+ /**
+ * Draws a circular particle.
+ * @param {object} particle - The particle to draw.
+ * @private
+ */;
+ _proto.drawCircle = function drawCircle(particle) {
+ if (particle.rgb) {
+ this.context.fillStyle = "rgba(" + particle.rgb.r + "," + particle.rgb.g + "," + particle.rgb.b + "," + particle.alpha + ")";
+ } else {
+ this.context.fillStyle = particle.color;
+ }
+ this.context.beginPath();
+ this.context.arc(particle.p.x, particle.p.y, particle.radius, 0, Math.PI * 2, true);
+ if (this.stroke) {
+ this.context.strokeStyle = this.stroke.color;
+ this.context.lineWidth = this.stroke.thinkness;
+ this.context.stroke();
+ }
+ this.context.closePath();
+ this.context.fill();
+ }
+
+ /**
+ * Creates a buffer for image particles.
+ * @param {HTMLImageElement} image - The image to create a buffer for.
+ * @returns {HTMLCanvasElement|undefined} The created buffer canvas.
+ * @private
+ */;
+ _proto.createBuffer = function createBuffer(image) {
+ if (Types.isImage(image)) {
+ var size = image.width + "_" + image.height;
+ var canvas = this.bufferCache[size];
+ if (!canvas) {
+ canvas = document.createElement("canvas");
+ canvas.width = image.width;
+ canvas.height = image.height;
+ this.bufferCache[size] = canvas;
+ }
+ return canvas;
+ }
+ }
+
+ /**
+ * Destroys the renderer and cleans up resources.
+ */;
+ _proto.destroy = function destroy() {
+ _BaseRenderer.prototype.destroy.call(this);
+ this.stroke = null;
+ this.context = null;
+ this.bufferCache = null;
+ };
+ return CanvasRenderer;
+ }(BaseRenderer);
+
+ /**
+ * Represents a DOM-based renderer for particle systems.
+ * @extends BaseRenderer
+ */
+ var DomRenderer = /*#__PURE__*/function (_BaseRenderer) {
+ _inheritsLoose(DomRenderer, _BaseRenderer);
+ /**
+ * Creates a new DomRenderer instance.
+ * @param {HTMLElement} element - The HTML element to render to.
+ */
+ function DomRenderer(element) {
+ var _this;
+ _this = _BaseRenderer.call(this, element) || this;
+ _this.stroke = null;
+ _this.transform3d = false;
+ _this.pool.create = function (body, particle) {
+ return _this.createBody(body, particle);
+ };
+ _this.addImg2Body = _this.addImg2Body.bind(_assertThisInitialized(_this));
+ _this.name = "DomRenderer";
+ return _this;
+ }
+ var _proto = DomRenderer.prototype;
+ _proto.onParticleCreated = function onParticleCreated(particle) {
+ if (particle.body) {
+ ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);
+ } else {
+ particle.body = this.pool.get(this.circleConf, particle);
+ this.element.appendChild(particle.body);
+ }
+ };
+ _proto.onParticleUpdate = function onParticleUpdate(particle) {
+ if (this.bodyReady(particle)) {
+ if (this.transform3d) {
+ DomUtil.transform3d(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);
+ } else {
+ DomUtil.transform(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);
+ }
+ particle.body.style.opacity = particle.alpha;
+ if (particle.body.isCircle) {
+ particle.body.style.backgroundColor = particle.color || "#ff0000";
+ }
+ }
+ };
+ _proto.onParticleDead = function onParticleDead(particle) {
+ if (this.bodyReady(particle)) {
+ this.element.removeChild(particle.body);
+ this.pool.expire(particle.body);
+ particle.body = null;
+ }
+ };
+ _proto.bodyReady = function bodyReady(particle) {
+ return typeof particle.body === "object" && particle.body && !particle.body.isInner;
+ }
+
+ // private method
+ ;
+ _proto.addImg2Body = function addImg2Body(img, particle) {
+ if (particle.dead) return;
+ particle.body = this.pool.get(img, particle);
+ DomUtil.resize(particle.body, img.width, img.height);
+ this.element.appendChild(particle.body);
+ };
+ _proto.createBody = function createBody(body, particle) {
+ if (body.isCircle) return this.createCircle(particle);
+ return this.createSprite(body, particle);
+ }
+
+ // private methods
+ ;
+ _proto.createCircle = function createCircle(particle) {
+ var dom = DomUtil.createDiv(particle.id + "_dom", 2 * particle.radius, 2 * particle.radius);
+ dom.style.borderRadius = particle.radius + "px";
+ if (this.stroke) {
+ dom.style.borderColor = this.stroke.color;
+ dom.style.borderWidth = this.stroke.thinkness + "px";
+ }
+ dom.isCircle = true;
+ return dom;
+ };
+ _proto.createSprite = function createSprite(body, particle) {
+ var url = typeof body === "string" ? body : body.src;
+ var dom = DomUtil.createDiv(particle.id + "_dom", body.width, body.height);
+ dom.style.backgroundImage = "url(" + url + ")";
+ return dom;
+ }
+
+ /**
+ * Destroys the renderer and cleans up resources.
+ */;
+ _proto.destroy = function destroy() {
+ _BaseRenderer.prototype.destroy.call(this);
+ this.stroke = null;
+ };
+ return DomRenderer;
+ }(BaseRenderer);
+
+ var EaselRenderer = /*#__PURE__*/function (_BaseRenderer) {
+ _inheritsLoose(EaselRenderer, _BaseRenderer);
+ function EaselRenderer(element, stroke) {
+ var _this;
+ _this = _BaseRenderer.call(this, element) || this;
+ _this.stroke = stroke;
+ _this.name = "EaselRenderer";
+ return _this;
+ }
+ var _proto = EaselRenderer.prototype;
+ _proto.onParticleCreated = function onParticleCreated(particle) {
+ if (particle.body) {
+ this.createSprite(particle);
+ } else {
+ this.createCircle(particle);
+ }
+ this.element.addChild(particle.body);
+ };
+ _proto.onParticleUpdate = function onParticleUpdate(particle) {
+ if (particle.body) {
+ particle.body.x = particle.p.x;
+ particle.body.y = particle.p.y;
+ particle.body.alpha = particle.alpha;
+ particle.body.scaleX = particle.body.scaleY = particle.scale;
+ particle.body.rotation = particle.rotation;
+ }
+ };
+ _proto.onParticleDead = function onParticleDead(particle) {
+ if (particle.body) {
+ particle.body.parent && particle.body.parent.removeChild(particle.body);
+ this.pool.expire(particle.body);
+ particle.body = null;
+ }
+ if (particle.graphics) this.pool.expire(particle.graphics);
+ }
+
+ // private
+ ;
+ _proto.createSprite = function createSprite(particle) {
+ particle.body = this.pool.get(particle.body);
+ if (particle.body.parent) return;
+ if (particle.body["image"]) {
+ particle.body.regX = particle.body.image.width / 2;
+ particle.body.regY = particle.body.image.height / 2;
+ }
+ };
+ _proto.createCircle = function createCircle(particle) {
+ var graphics = this.pool.get(window.createjs.Graphics);
+ if (this.stroke) {
+ if (Types.isString(this.stroke)) {
+ graphics.beginStroke(this.stroke);
+ } else {
+ graphics.beginStroke("#000000");
+ }
+ }
+ graphics.beginFill(particle.color || "#ff0000").drawCircle(0, 0, particle.radius);
+ var shape = this.pool.get(window.createjs.Shape, [graphics]);
+ particle.body = shape;
+ particle.graphics = graphics;
+ };
+ _proto.destroy = function destroy() {
+ _BaseRenderer.prototype.destroy.call(this);
+ this.stroke = null;
+ };
+ return EaselRenderer;
+ }(BaseRenderer);
+
+ /**
+ * Represents a pixel-based renderer for particle systems.
+ * @extends BaseRenderer
+ */
+ var PixelRenderer = /*#__PURE__*/function (_BaseRenderer) {
+ _inheritsLoose(PixelRenderer, _BaseRenderer);
+ /**
+ * Creates a new PixelRenderer instance.
+ * @param {HTMLCanvasElement} element - The canvas element to render to.
+ * @param {Rectangle} [rectangle] - The rectangle defining the rendering area.
+ */
+ function PixelRenderer(element, rectangle) {
+ var _this;
+ _this = _BaseRenderer.call(this, element) || this;
+ _this.context = _this.element.getContext("2d");
+ _this.imageData = null;
+ _this.rectangle = rectangle;
+ _this.createImageData(rectangle);
+ _this.name = "PixelRenderer";
+ return _this;
+ }
+ var _proto = PixelRenderer.prototype;
+ _proto.resize = function resize(width, height) {
+ this.element.width = width;
+ this.element.height = height;
+ };
+ _proto.createImageData = function createImageData(rectangle) {
+ this.rectangle = rectangle ? rectangle : new Rectangle(0, 0, this.element.width, this.element.height);
+ this.imageData = this.context.createImageData(this.rectangle.width, this.rectangle.height);
+ this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);
+ };
+ _proto.onProtonUpdate = function onProtonUpdate() {
+ this.context.clearRect(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height);
+ this.imageData = this.context.getImageData(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height);
+ };
+ _proto.onProtonUpdateAfter = function onProtonUpdateAfter() {
+ this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);
+ };
+ _proto.onParticleCreated = function onParticleCreated(particle) {};
+ _proto.onParticleUpdate = function onParticleUpdate(particle) {
+ if (this.imageData) {
+ this.setPixel(this.imageData, particle.p.x - this.rectangle.x >> 0, particle.p.y - this.rectangle.y >> 0, particle);
+ }
+ };
+ _proto.setPixel = function setPixel(imagedata, x, y, particle) {
+ var rgb = particle.rgb;
+ if (x < 0 || x > this.element.width || y < 0 || y > this.element.height) return;
+ var i = ((y >> 0) * imagedata.width + (x >> 0)) * 4;
+ imagedata.data[i] = rgb.r;
+ imagedata.data[i + 1] = rgb.g;
+ imagedata.data[i + 2] = rgb.b;
+ imagedata.data[i + 3] = particle.alpha * 255;
+ };
+ _proto.onParticleDead = function onParticleDead(particle) {}
+
+ /**
+ * Destroys the renderer and cleans up resources.
+ */;
+ _proto.destroy = function destroy() {
+ _BaseRenderer.prototype.destroy.call(this);
+ this.stroke = null;
+ this.context = null;
+ this.imageData = null;
+ this.rectangle = null;
+ };
+ return PixelRenderer;
+ }(BaseRenderer);
+
+ var PIXIClass;
+
+ /**
+ * Represents a PIXI-based renderer for particle systems.
+ * @extends BaseRenderer
+ */
+ var PixiRenderer = /*#__PURE__*/function (_BaseRenderer) {
+ _inheritsLoose(PixiRenderer, _BaseRenderer);
+ /**
+ * Creates a new PixiRenderer instance.
+ * @param {PIXI.Container} element - The PIXI container to render to.
+ * @param {string|number} [stroke] - The stroke color for particles.
+ */
+ function PixiRenderer(element, stroke) {
+ var _this;
+ _this = _BaseRenderer.call(this, element) || this;
+ _this.stroke = stroke;
+ _this.color = false;
+ _this.setColor = false;
+ _this.blendMode = null;
+ _this.pool.create = function (body, particle) {
+ return _this.createBody(body, particle);
+ };
+ _this.setPIXI(window.PIXI);
+ _this.name = "PixiRenderer";
+ return _this;
+ }
+ var _proto = PixiRenderer.prototype;
+ _proto.setPIXI = function setPIXI(PIXI) {
+ try {
+ PIXIClass = PIXI || {
+ Sprite: {}
+ };
+ this.createFromImage = PIXIClass.Sprite.from || PIXIClass.Sprite.fromImage;
+ } catch (e) {}
+ };
+ _proto.onProtonUpdate = function onProtonUpdate() {}
+
+ /**
+ * @param particle
+ */;
+ _proto.onParticleCreated = function onParticleCreated(particle) {
+ if (particle.body) {
+ particle.body = this.pool.get(particle.body, particle);
+ } else {
+ particle.body = this.pool.get(this.circleConf, particle);
+ }
+ if (this.blendMode) {
+ particle.body.blendMode = this.blendMode;
+ }
+ this.element.addChild(particle.body);
+ }
+
+ /**
+ * @param particle
+ */;
+ _proto.onParticleUpdate = function onParticleUpdate(particle) {
+ this.transform(particle, particle.body);
+ if (this.setColor === true || this.color === true) {
+ particle.body.tint = ColorUtil.getHex16FromParticle(particle);
+ }
+ }
+
+ /**
+ * @param particle
+ */;
+ _proto.onParticleDead = function onParticleDead(particle) {
+ this.element.removeChild(particle.body);
+ this.pool.expire(particle.body);
+ particle.body = null;
+ };
+ _proto.transform = function transform(particle, target) {
+ target.x = particle.p.x;
+ target.y = particle.p.y;
+ target.alpha = particle.alpha;
+ target.scale.x = particle.scale;
+ target.scale.y = particle.scale;
+
+ // using cached version of MathUtil.PI_180 for slight performance increase.
+ target.rotation = particle.rotation * MathUtil.PI_180; // MathUtil.PI_180;
+ };
+ _proto.createBody = function createBody(body, particle) {
+ if (body.isCircle) return this.createCircle(particle);else return this.createSprite(body);
+ };
+ _proto.createSprite = function createSprite(body) {
+ var sprite = body.isInner ? this.createFromImage(body.src) : new PIXIClass.Sprite(body);
+ sprite.anchor.x = 0.5;
+ sprite.anchor.y = 0.5;
+ return sprite;
+ };
+ _proto.createCircle = function createCircle(particle) {
+ var graphics = new PIXIClass.Graphics();
+ if (this.stroke) {
+ var stroke = Types.isString(this.stroke) ? this.stroke : 0x000000;
+ graphics.beginStroke(stroke);
+ }
+ graphics.beginFill(particle.color || 0x008ced);
+ graphics.drawCircle(0, 0, particle.radius);
+ graphics.endFill();
+ return graphics;
+ }
+
+ /**
+ * Destroys the renderer and cleans up resources.
+ * @param {Array} particles - The particles to clean up.
+ */;
+ _proto.destroy = function destroy(particles) {
+ _BaseRenderer.prototype.destroy.call(this);
+ var i = particles.length;
+ while (i--) {
+ var particle = particles[i];
+ if (particle.body) {
+ this.element.removeChild(particle.body);
+ }
+ }
+ };
+ return PixiRenderer;
+ }(BaseRenderer);
+
+ var MStack = /*#__PURE__*/function () {
+ function MStack() {
+ this.mats = [];
+ this.size = 0;
+ for (var i = 0; i < 20; i++) {
+ this.mats.push(Mat3.create([0, 0, 0, 0, 0, 0, 0, 0, 0]));
+ }
+ }
+ var _proto = MStack.prototype;
+ _proto.set = function set(m, i) {
+ if (i === 0) Mat3.set(m, this.mats[0]);else Mat3.multiply(this.mats[i - 1], m, this.mats[i]);
+ this.size = Math.max(this.size, i + 1);
+ };
+ _proto.push = function push(m) {
+ if (this.size === 0) Mat3.set(m, this.mats[0]);else Mat3.multiply(this.mats[this.size - 1], m, this.mats[this.size]);
+ this.size++;
+ };
+ _proto.pop = function pop() {
+ if (this.size > 0) this.size--;
+ };
+ _proto.top = function top() {
+ return this.mats[this.size - 1];
+ };
+ return MStack;
+ }();
+
+ /**
+ * Represents a WebGL-based renderer for particle systems.
+ * @extends BaseRenderer
+ */
+ var WebGLRenderer = /*#__PURE__*/function (_BaseRenderer) {
+ _inheritsLoose(WebGLRenderer, _BaseRenderer);
+ /**
+ * Creates a new WebGLRenderer instance.
+ * @param {HTMLCanvasElement} element - The canvas element to render to.
+ */
+ function WebGLRenderer(element) {
+ var _this;
+ _this = _BaseRenderer.call(this, element) || this;
+ _this.gl = _this.element.getContext("experimental-webgl", {
+ antialias: true,
+ stencil: false,
+ depth: false
+ });
+ if (!_this.gl) alert("Sorry your browser do not suppest WebGL!");
+ _this.initVar();
+ _this.setMaxRadius();
+ _this.initShaders();
+ _this.initBuffers();
+ _this.gl.blendEquation(_this.gl.FUNC_ADD);
+ _this.gl.blendFunc(_this.gl.SRC_ALPHA, _this.gl.ONE_MINUS_SRC_ALPHA);
+ _this.gl.enable(_this.gl.BLEND);
+ _this.addImg2Body = _this.addImg2Body.bind(_assertThisInitialized(_this));
+ _this.name = "WebGLRenderer";
+ return _this;
+ }
+ var _proto = WebGLRenderer.prototype;
+ _proto.init = function init(proton) {
+ _BaseRenderer.prototype.init.call(this, proton);
+ this.resize(this.element.width, this.element.height);
+ };
+ _proto.resize = function resize(width, height) {
+ this.umat[4] = -2;
+ this.umat[7] = 1;
+ this.smat[0] = 1 / width;
+ this.smat[4] = 1 / height;
+ this.mstack.set(this.umat, 0);
+ this.mstack.set(this.smat, 1);
+ this.gl.viewport(0, 0, width, height);
+ this.element.width = width;
+ this.element.height = height;
+ };
+ _proto.setMaxRadius = function setMaxRadius(radius) {
+ this.circleCanvasURL = this.createCircle(radius);
+ };
+ _proto.getVertexShader = function getVertexShader() {
+ var vsSource = ["uniform vec2 viewport;", "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "uniform mat3 tMat;", "varying vec2 vTextureCoord;", "varying float alpha;", "void main() {", "vec3 v = tMat * vec3(aVertexPosition, 1.0);", "gl_Position = vec4(v.x, v.y, 0, 1);", "vTextureCoord = aTextureCoord;", "alpha = tMat[0][2];", "}"].join("\n");
+ return vsSource;
+ };
+ _proto.getFragmentShader = function getFragmentShader() {
+ var fsSource = ["precision mediump float;", "varying vec2 vTextureCoord;", "varying float alpha;", "uniform sampler2D uSampler;", "uniform vec4 color;", "uniform bool useTexture;", "uniform vec3 uColor;", "void main() {", "vec4 textureColor = texture2D(uSampler, vTextureCoord);", "gl_FragColor = textureColor * vec4(uColor, 1.0);", "gl_FragColor.w *= alpha;", "}"].join("\n");
+ return fsSource;
+ };
+ _proto.initVar = function initVar() {
+ this.mstack = new MStack();
+ this.umat = Mat3.create([2, 0, 1, 0, -2, 0, -1, 1, 1]);
+ this.smat = Mat3.create([1 / 100, 0, 1, 0, 1 / 100, 0, 0, 0, 1]);
+ this.texturebuffers = {};
+ };
+ _proto.blendEquation = function blendEquation(A) {
+ this.gl.blendEquation(this.gl[A]);
+ };
+ _proto.blendFunc = function blendFunc(A, B) {
+ this.gl.blendFunc(this.gl[A], this.gl[B]);
+ };
+ _proto.getShader = function getShader(gl, str, fs) {
+ var shader = fs ? gl.createShader(gl.FRAGMENT_SHADER) : gl.createShader(gl.VERTEX_SHADER);
+ gl.shaderSource(shader, str);
+ gl.compileShader(shader);
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
+ alert(gl.getShaderInfoLog(shader));
+ return null;
+ }
+ return shader;
+ };
+ _proto.initShaders = function initShaders() {
+ var fragmentShader = this.getShader(this.gl, this.getFragmentShader(), true);
+ var vertexShader = this.getShader(this.gl, this.getVertexShader(), false);
+ this.sprogram = this.gl.createProgram();
+ this.gl.attachShader(this.sprogram, vertexShader);
+ this.gl.attachShader(this.sprogram, fragmentShader);
+ this.gl.linkProgram(this.sprogram);
+ if (!this.gl.getProgramParameter(this.sprogram, this.gl.LINK_STATUS)) alert("Could not initialise shaders");
+ this.gl.useProgram(this.sprogram);
+ this.sprogram.vpa = this.gl.getAttribLocation(this.sprogram, "aVertexPosition");
+ this.sprogram.tca = this.gl.getAttribLocation(this.sprogram, "aTextureCoord");
+ this.gl.enableVertexAttribArray(this.sprogram.tca);
+ this.gl.enableVertexAttribArray(this.sprogram.vpa);
+ this.sprogram.tMatUniform = this.gl.getUniformLocation(this.sprogram, "tMat");
+ this.sprogram.samplerUniform = this.gl.getUniformLocation(this.sprogram, "uSampler");
+ this.sprogram.useTex = this.gl.getUniformLocation(this.sprogram, "useTexture");
+ this.sprogram.color = this.gl.getUniformLocation(this.sprogram, "uColor");
+ this.gl.uniform1i(this.sprogram.useTex, 1);
+ };
+ _proto.initBuffers = function initBuffers() {
+ var vs = [0, 3, 1, 0, 2, 3];
+ var idx;
+ this.unitIBuffer = this.gl.createBuffer();
+ this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);
+ this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(vs), this.gl.STATIC_DRAW);
+ var i;
+ var ids = [];
+ for (i = 0; i < 100; i++) {
+ ids.push(i);
+ }
+ idx = new Uint16Array(ids);
+ this.unitI33 = this.gl.createBuffer();
+ this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitI33);
+ this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);
+ ids = [];
+ for (i = 0; i < 100; i++) {
+ ids.push(i, i + 1, i + 2);
+ }
+ idx = new Uint16Array(ids);
+ this.stripBuffer = this.gl.createBuffer();
+ this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.stripBuffer);
+ this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);
+ };
+ _proto.createCircle = function createCircle(raidus) {
+ this.circleCanvasRadius = WebGLUtil.nhpot(Util.initValue(raidus, 32));
+ var canvas = DomUtil.createCanvas("circle_canvas", this.circleCanvasRadius * 2, this.circleCanvasRadius * 2);
+ var context = canvas.getContext("2d");
+ context.beginPath();
+ context.arc(this.circleCanvasRadius, this.circleCanvasRadius, this.circleCanvasRadius, 0, Math.PI * 2, true);
+ context.closePath();
+ context.fillStyle = "#FFF";
+ context.fill();
+ return canvas.toDataURL();
+ };
+ _proto.drawImg2Canvas = function drawImg2Canvas(particle) {
+ var _w = particle.body.width;
+ var _h = particle.body.height;
+ var _width = WebGLUtil.nhpot(particle.body.width);
+ var _height = WebGLUtil.nhpot(particle.body.height);
+ var _scaleX = particle.body.width / _width;
+ var _scaleY = particle.body.height / _height;
+ if (!this.texturebuffers[particle.data.src]) this.texturebuffers[particle.data.src] = [this.gl.createTexture(), this.gl.createBuffer(), this.gl.createBuffer()];
+ particle.data.texture = this.texturebuffers[particle.data.src][0];
+ particle.data.vcBuffer = this.texturebuffers[particle.data.src][1];
+ particle.data.tcBuffer = this.texturebuffers[particle.data.src][2];
+ this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.tcBuffer);
+ this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, _scaleX, 0.0, 0.0, _scaleY, _scaleY, _scaleY]), this.gl.STATIC_DRAW);
+ this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.vcBuffer);
+ this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, _w, 0.0, 0.0, _h, _w, _h]), this.gl.STATIC_DRAW);
+ var context = particle.data.canvas.getContext("2d");
+ var data = context.getImageData(0, 0, _width, _height);
+ this.gl.bindTexture(this.gl.TEXTURE_2D, particle.data.texture);
+ this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, data);
+ this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);
+ this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_NEAREST);
+ this.gl.generateMipmap(this.gl.TEXTURE_2D);
+ particle.data.textureLoaded = true;
+ particle.data.textureWidth = _w;
+ particle.data.textureHeight = _h;
+ };
+ _proto.onProtonUpdate = function onProtonUpdate() {
+ // this.gl.clearColor(0, 0, 0, 1);
+ // this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);
+ };
+ _proto.onParticleCreated = function onParticleCreated(particle) {
+ particle.data.textureLoaded = false;
+ particle.data.tmat = Mat3.create();
+ particle.data.tmat[8] = 1;
+ particle.data.imat = Mat3.create();
+ particle.data.imat[8] = 1;
+ if (particle.body) {
+ ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);
+ } else {
+ ImgUtil.getImgFromCache(this.circleCanvasURL, this.addImg2Body, particle);
+ particle.data.oldScale = particle.radius / this.circleCanvasRadius;
+ }
+ }
+
+ // private
+ ;
+ _proto.addImg2Body = function addImg2Body(img, particle) {
+ if (particle.dead) return;
+ particle.body = img;
+ particle.data.src = img.src;
+ particle.data.canvas = ImgUtil.getCanvasFromCache(img);
+ particle.data.oldScale = 1;
+ this.drawImg2Canvas(particle);
+ };
+ _proto.onParticleUpdate = function onParticleUpdate(particle) {
+ if (particle.data.textureLoaded) {
+ this.updateMatrix(particle);
+ this.gl.uniform3f(this.sprogram.color, particle.rgb.r / 255, particle.rgb.g / 255, particle.rgb.b / 255);
+ this.gl.uniformMatrix3fv(this.sprogram.tMatUniform, false, this.mstack.top());
+ this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.vcBuffer);
+ this.gl.vertexAttribPointer(this.sprogram.vpa, 2, this.gl.FLOAT, false, 0, 0);
+ this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.tcBuffer);
+ this.gl.vertexAttribPointer(this.sprogram.tca, 2, this.gl.FLOAT, false, 0, 0);
+ this.gl.bindTexture(this.gl.TEXTURE_2D, particle.data.texture);
+ this.gl.uniform1i(this.sprogram.samplerUniform, 0);
+ this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);
+ this.gl.drawElements(this.gl.TRIANGLES, 6, this.gl.UNSIGNED_SHORT, 0);
+ this.mstack.pop();
+ }
+ };
+ _proto.onParticleDead = function onParticleDead(particle) {};
+ _proto.updateMatrix = function updateMatrix(particle) {
+ var moveOriginMatrix = WebGLUtil.makeTranslation(-particle.data.textureWidth / 2, -particle.data.textureHeight / 2);
+ var translationMatrix = WebGLUtil.makeTranslation(particle.p.x, particle.p.y);
+ var angel = particle.rotation * MathUtil.PI_180;
+ var rotationMatrix = WebGLUtil.makeRotation(angel);
+ var scale = particle.scale * particle.data.oldScale;
+ var scaleMatrix = WebGLUtil.makeScale(scale, scale);
+ var matrix = WebGLUtil.matrixMultiply(moveOriginMatrix, scaleMatrix);
+ matrix = WebGLUtil.matrixMultiply(matrix, rotationMatrix);
+ matrix = WebGLUtil.matrixMultiply(matrix, translationMatrix);
+ Mat3.inverse(matrix, particle.data.imat);
+ matrix[2] = particle.alpha;
+ this.mstack.push(matrix);
+ };
+ _proto.destroy = function destroy() {
+ _BaseRenderer.prototype.destroy.call(this);
+ this.gl = null;
+ this.mstack = null;
+ this.umat = null;
+ this.smat = null;
+ this.texturebuffers = null;
+ };
+ return WebGLRenderer;
+ }(BaseRenderer);
+
+ /**
+ * Represents a custom renderer that extends the BaseRenderer.
+ * @extends BaseRenderer
+ */
+ var CustomRenderer = /*#__PURE__*/function (_BaseRenderer) {
+ _inheritsLoose(CustomRenderer, _BaseRenderer);
+ /**
+ * Creates a new CustomRenderer instance.
+ * @param {HTMLElement} element - The HTML element to render to.
+ */
+ function CustomRenderer(element) {
+ var _this;
+ _this = _BaseRenderer.call(this, element) || this;
+
+ /**
+ * The name of the renderer.
+ * @type {string}
+ */
+ _this.name = "CustomRenderer";
+ return _this;
+ }
+ return CustomRenderer;
+ }(BaseRenderer);
+
+ /**
+ * Represents a line zone for particle systems.
+ * @extends Zone
+ */
+ var LineZone = /*#__PURE__*/function (_Zone) {
+ _inheritsLoose(LineZone, _Zone);
+ /**
+ * Creates a new LineZone.
+ * @param {number} x1 - The x-coordinate of the first point.
+ * @param {number} y1 - The y-coordinate of the first point.
+ * @param {number} [x2] - The x-coordinate of the second point.
+ * @param {number} [y2] - The y-coordinate of the second point.
+ * @param {string} [direction=">"] - The direction of the line.
+ */
+ function LineZone(x1, y1, x2, y2, direction) {
+ var _this;
+ if (direction === void 0) {
+ direction = ">";
+ }
+ _this = _Zone.call(this) || this;
+ if (x2 - x1 >= 0) {
+ _this.x1 = x1;
+ _this.y1 = y1;
+ _this.x2 = x2;
+ _this.y2 = y2;
+ } else {
+ _this.x1 = x2;
+ _this.y1 = y2;
+ _this.x2 = x1;
+ _this.y2 = y1;
+ }
+ _this.dx = _this.x2 - _this.x1;
+ _this.dy = _this.y2 - _this.y1;
+ _this.minx = Math.min(_this.x1, _this.x2);
+ _this.miny = Math.min(_this.y1, _this.y2);
+ _this.maxx = Math.max(_this.x1, _this.x2);
+ _this.maxy = Math.max(_this.y1, _this.y2);
+ _this.dot = _this.x2 * _this.y1 - _this.x1 * _this.y2;
+ _this.xxyy = _this.dx * _this.dx + _this.dy * _this.dy;
+ _this.gradient = _this.getGradient();
+ _this.length = _this.getLength();
+ _this.direction = Util.initValue(direction, ">");
+ return _this;
+ }
+
+ /**
+ * Gets a random position on the line.
+ * @returns {Vector2D} A vector representing the random position.
+ */
+ var _proto = LineZone.prototype;
+ _proto.getPosition = function getPosition() {
+ this.random = Math.random();
+ this.vector.x = this.x1 + this.random * this.length * Math.cos(this.gradient);
+ this.vector.y = this.y1 + this.random * this.length * Math.sin(this.gradient);
+ return this.vector;
+ }
+
+ /**
+ * Determines which side of the line a point is on.
+ * @param {number} x - The x-coordinate of the point.
+ * @param {number} y - The y-coordinate of the point.
+ * @returns {boolean} True if the point is on the positive side of the line, false otherwise.
+ */;
+ _proto.getDirection = function getDirection(x, y) {
+ var A = this.dy;
+ var B = -this.dx;
+ var C = this.dot;
+ var D = B === 0 ? 1 : B;
+ if ((A * x + B * y + C) * D > 0) return true;else return false;
+ }
+
+ /**
+ * Calculates the distance of a point from the line.
+ * @param {number} x - The x-coordinate of the point.
+ * @param {number} y - The y-coordinate of the point.
+ * @returns {number} The distance from the point to the line.
+ */;
+ _proto.getDistance = function getDistance(x, y) {
+ var A = this.dy;
+ var B = -this.dx;
+ var C = this.dot;
+ var D = A * x + B * y + C;
+ return D / Math.sqrt(this.xxyy);
+ }
+
+ /**
+ * Calculates the symmetric vector of a given vector with respect to the line.
+ * @param {Vector2D} v - The vector to reflect.
+ * @returns {Vector2D} The reflected vector.
+ */;
+ _proto.getSymmetric = function getSymmetric(v) {
+ var tha2 = v.getGradient();
+ var tha1 = this.getGradient();
+ var tha = 2 * (tha1 - tha2);
+ var oldx = v.x;
+ var oldy = v.y;
+ v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);
+ v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);
+ return v;
+ }
+
+ /**
+ * Gets the gradient (angle) of the line.
+ * @returns {number} The gradient of the line in radians.
+ */;
+ _proto.getGradient = function getGradient() {
+ return Math.atan2(this.dy, this.dx);
+ }
+
+ /**
+ * Checks if a particle is outside the range of the line.
+ * @param {Particle} particle - The particle to check.
+ * @returns {boolean} True if the particle is within range, false otherwise.
+ */;
+ _proto.rangeOut = function rangeOut(particle) {
+ var angle = Math.abs(this.getGradient());
+ if (angle <= MathUtil.PI / 4) {
+ if (particle.p.x <= this.maxx && particle.p.x >= this.minx) return true;
+ } else {
+ if (particle.p.y <= this.maxy && particle.p.y >= this.miny) return true;
+ }
+ return false;
+ }
+
+ /**
+ * Gets the length of the line.
+ * @returns {number} The length of the line.
+ */;
+ _proto.getLength = function getLength() {
+ return Math.sqrt(this.dx * this.dx + this.dy * this.dy);
+ }
+
+ /**
+ * Handles particle crossing behavior based on the crossType.
+ * @param {Particle} particle - The particle to check for crossing.
+ */;
+ _proto.crossing = function crossing(particle) {
+ if (this.crossType === "dead") {
+ if (this.direction === ">" || this.direction === "R" || this.direction === "right" || this.direction === "down") {
+ if (!this.rangeOut(particle)) return;
+ if (this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;
+ } else {
+ if (!this.rangeOut(particle)) return;
+ if (!this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;
+ }
+ } else if (this.crossType === "bound") {
+ if (!this.rangeOut(particle)) return;
+ if (this.getDistance(particle.p.x, particle.p.y) <= particle.radius) {
+ if (this.dx === 0) {
+ particle.v.x *= -1;
+ } else if (this.dy === 0) {
+ particle.v.y *= -1;
+ } else {
+ this.getSymmetric(particle.v);
+ }
+ }
+ } else if (this.crossType === "cross") {
+ if (this.alert) {
+ console.error("Sorry, LineZone does not support cross method!");
+ this.alert = false;
+ }
+ }
+ };
+ return LineZone;
+ }(Zone);
+
+ /**
+ * Represents a circular zone in a 2D space.
+ * @extends Zone
+ */
+ var CircleZone = /*#__PURE__*/function (_Zone) {
+ _inheritsLoose(CircleZone, _Zone);
+ /**
+ * Creates a new CircleZone.
+ * @param {number} x - The x-coordinate of the circle's center.
+ * @param {number} y - The y-coordinate of the circle's center.
+ * @param {number} [radius] - The radius of the circle.
+ */
+ function CircleZone(x, y, radius) {
+ var _this;
+ _this = _Zone.call(this) || this;
+ _this.x = x;
+ _this.y = y;
+ _this.radius = radius;
+ _this.angle = 0;
+ _this.center = {
+ x: x,
+ y: y
+ };
+ return _this;
+ }
+
+ /**
+ * Gets a random position within the circle.
+ * @returns {Object} An object with x and y coordinates.
+ */
+ var _proto = CircleZone.prototype;
+ _proto.getPosition = function getPosition() {
+ this.angle = MathUtil.PIx2 * Math.random();
+ this.randomRadius = Math.random() * this.radius;
+ this.vector.x = this.x + this.randomRadius * Math.cos(this.angle);
+ this.vector.y = this.y + this.randomRadius * Math.sin(this.angle);
+ return this.vector;
+ }
+
+ /**
+ * Sets the center of the circle.
+ * @param {number} x - The new x-coordinate of the center.
+ * @param {number} y - The new y-coordinate of the center.
+ */;
+ _proto.setCenter = function setCenter(x, y) {
+ this.center.x = x;
+ this.center.y = y;
+ }
+
+ /**
+ * Handles particle crossing behavior.
+ * @param {Object} particle - The particle to check for crossing.
+ */;
+ _proto.crossing = function crossing(particle) {
+ var d = particle.p.distanceTo(this.center);
+ if (this.crossType === "dead") {
+ if (d - particle.radius > this.radius) particle.dead = true;
+ } else if (this.crossType === "bound") {
+ if (d + particle.radius >= this.radius) this.getSymmetric(particle);
+ } else if (this.crossType === "cross") {
+ if (this.alert) {
+ console.error("Sorry, CircleZone does not support cross method!");
+ this.alert = false;
+ }
+ }
+ }
+
+ /**
+ * Calculates the symmetric position of a particle.
+ * @param {Object} particle - The particle to calculate symmetry for.
+ */;
+ _proto.getSymmetric = function getSymmetric(particle) {
+ var tha2 = particle.v.getGradient();
+ var tha1 = this.getGradient(particle);
+ var tha = 2 * (tha1 - tha2);
+ var oldx = particle.v.x;
+ var oldy = particle.v.y;
+ particle.v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);
+ particle.v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);
+ }
+
+ /**
+ * Calculates the gradient for a particle.
+ * @param {Object} particle - The particle to calculate the gradient for.
+ * @returns {number} The calculated gradient.
+ */;
+ _proto.getGradient = function getGradient(particle) {
+ return -MathUtil.PI_2 + Math.atan2(particle.p.y - this.center.y, particle.p.x - this.center.x);
+ };
+ return CircleZone;
+ }(Zone);
+
+ /**
+ * Represents a rectangular zone for particle systems.
+ * @extends Zone
+ */
+ var RectZone = /*#__PURE__*/function (_Zone) {
+ _inheritsLoose(RectZone, _Zone);
+ /**
+ * Creates a new RectZone.
+ * @param {number} x - The x-coordinate of the top-left corner of the rectangle.
+ * @param {number} y - The y-coordinate of the top-left corner of the rectangle.
+ * @param {number} [width] - The width of the rectangle.
+ * @param {number} [height] - The height of the rectangle.
+ */
+ function RectZone(x, y, width, height) {
+ var _this;
+ if (width === void 0) {
+ width = 200;
+ }
+ if (height === void 0) {
+ height = 200;
+ }
+ _this = _Zone.call(this) || this;
+ _this.x = x;
+ _this.y = y;
+ _this.width = width;
+ _this.height = height;
+ return _this;
+ }
+
+ /**
+ * Gets a random position within the rectangular zone.
+ * @returns {Vector2D} A vector representing the random position.
+ */
+ var _proto = RectZone.prototype;
+ _proto.getPosition = function getPosition() {
+ this.vector.x = this.x + Math.random() * this.width;
+ this.vector.y = this.y + Math.random() * this.height;
+ return this.vector;
+ }
+
+ /**
+ * Handles particle crossing behavior based on the crossType.
+ * @param {Particle} particle - The particle to check for crossing.
+ */;
+ _proto.crossing = function crossing(particle) {
+ // particle dead zone
+ if (this.crossType === "dead") {
+ if (particle.p.x + particle.radius < this.x) particle.dead = true;else if (particle.p.x - particle.radius > this.x + this.width) particle.dead = true;
+ if (particle.p.y + particle.radius < this.y) particle.dead = true;else if (particle.p.y - particle.radius > this.y + this.height) particle.dead = true;
+ }
+
+ // particle bound zone
+ else if (this.crossType === "bound") {
+ if (particle.p.x - particle.radius < this.x) {
+ particle.p.x = this.x + particle.radius;
+ particle.v.x *= -1;
+ } else if (particle.p.x + particle.radius > this.x + this.width) {
+ particle.p.x = this.x + this.width - particle.radius;
+ particle.v.x *= -1;
+ }
+ if (particle.p.y - particle.radius < this.y) {
+ particle.p.y = this.y + particle.radius;
+ particle.v.y *= -1;
+ } else if (particle.p.y + particle.radius > this.y + this.height) {
+ particle.p.y = this.y + this.height - particle.radius;
+ particle.v.y *= -1;
+ }
+ }
+
+ // particle cross zone
+ else if (this.crossType === "cross") {
+ if (particle.p.x + particle.radius < this.x && particle.v.x <= 0) {
+ particle.p.x = this.x + this.width + particle.radius;
+ } else if (particle.p.x - particle.radius > this.x + this.width && particle.v.x >= 0) {
+ particle.p.x = this.x - particle.radius;
+ }
+ if (particle.p.y + particle.radius < this.y && particle.v.y <= 0) {
+ particle.p.y = this.y + this.height + particle.radius;
+ } else if (particle.p.y - particle.radius > this.y + this.height && particle.v.y >= 0) {
+ particle.p.y = this.y - particle.radius;
+ }
+ }
+ };
+ return RectZone;
+ }(Zone);
+
+ /**
+ * Represents a zone based on image data.
+ * @extends Zone
+ */
+ var ImageZone = /*#__PURE__*/function (_Zone) {
+ _inheritsLoose(ImageZone, _Zone);
+ /**
+ * Creates an ImageZone.
+ * @param {ImageData} imageData - The image data to use for the zone.
+ * @param {number} [x=0] - The x-coordinate offset.
+ * @param {number} [y=0] - The y-coordinate offset.
+ * @param {number} [d=2] - The sampling density.
+ */
+ function ImageZone(imageData, x, y, d) {
+ var _this;
+ _this = _Zone.call(this) || this;
+ _this.reset(imageData, x, y, d);
+ return _this;
+ }
+
+ /**
+ * Resets the ImageZone with new parameters.
+ * @param {ImageData} imageData - The image data to use for the zone.
+ * @param {number} [x=0] - The x-coordinate offset.
+ * @param {number} [y=0] - The y-coordinate offset.
+ * @param {number} [d=2] - The sampling density.
+ */
+ var _proto = ImageZone.prototype;
+ _proto.reset = function reset(imageData, x, y, d) {
+ this.imageData = imageData;
+ this.x = Util.initValue(x, 0);
+ this.y = Util.initValue(y, 0);
+ this.d = Util.initValue(d, 2);
+ this.vectors = [];
+ this.setVectors();
+ }
+
+ /**
+ * Sets up vectors based on the image data.
+ * @returns {Object} The vector object.
+ */;
+ _proto.setVectors = function setVectors() {
+ var i, j;
+ var length1 = this.imageData.width;
+ var length2 = this.imageData.height;
+ for (i = 0; i < length1; i += this.d) {
+ for (j = 0; j < length2; j += this.d) {
+ var index = ((j >> 0) * length1 + (i >> 0)) * 4;
+ if (this.imageData.data[index + 3] > 0) {
+ this.vectors.push({
+ x: i + this.x,
+ y: j + this.y
+ });
+ }
+ }
+ }
+ return this.vector;
+ }
+
+ /**
+ * Checks if a point is within the bounds of the image.
+ * @param {number} x - The x-coordinate to check.
+ * @param {number} y - The y-coordinate to check.
+ * @returns {boolean} True if the point is within bounds, false otherwise.
+ */;
+ _proto.getBound = function getBound(x, y) {
+ var index = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;
+ return this.imageData.data[index + 3] > 0;
+ }
+
+ /**
+ * Gets a random position within the image zone.
+ * @returns {Object} A vector representing the position.
+ */;
+ _proto.getPosition = function getPosition() {
+ var vector = Util.getRandFromArray(this.vectors);
+ return this.vector.copy(vector);
+ }
+
+ /**
+ * Gets the color at a specific point in the image.
+ * @param {number} x - The x-coordinate.
+ * @param {number} y - The y-coordinate.
+ * @returns {Object} An object containing r, g, b, and a values.
+ */;
+ _proto.getColor = function getColor(x, y) {
+ x -= this.x;
+ y -= this.y;
+ var i = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;
+ return {
+ r: this.imageData.data[i],
+ g: this.imageData.data[i + 1],
+ b: this.imageData.data[i + 2],
+ a: this.imageData.data[i + 3]
+ };
+ }
+
+ /**
+ * Handles particle crossing behavior.
+ * @param {Object} particle - The particle to check for crossing.
+ */;
+ _proto.crossing = function crossing(particle) {
+ if (this.crossType === "dead") {
+ particle.dead = this.getBound(particle.p.x - this.x, particle.p.y - this.y);
+ } else if (this.crossType === "bound") {
+ if (!this.getBound(particle.p.x - this.x, particle.p.y - this.y)) particle.v.negate();
+ }
+ }
+
+ /**
+ * Destroys the ImageZone and cleans up resources.
+ */;
+ _proto.destroy = function destroy() {
+ _Zone.prototype.destroy.call(this);
+ this.imageData = null;
+ };
+ return ImageZone;
+ }(Zone);
+
+ var Debug = {
+ addEventListener: function addEventListener(proton, func) {
+ proton.addEventListener("PROTON_UPDATE_AFTER", function () {
+ return func();
+ });
+ },
+ getStyle: function getStyle(color) {
+ if (color === void 0) {
+ color = "#ff0000";
+ }
+ var rgb = ColorUtil.hexToRgb(color);
+ return "rgba(" + rgb.r + ", " + rgb.g + ", " + rgb.b + ", 0.5)";
+ },
+ drawZone: function drawZone(proton, canvas, zone, clear) {
+ var context = canvas.getContext("2d");
+ var style = this.getStyle();
+ this.addEventListener(proton, function () {
+ if (clear) context.clearRect(0, 0, canvas.width, canvas.height);
+ if (zone instanceof PointZone) {
+ context.beginPath();
+ context.fillStyle = style;
+ context.arc(zone.x, zone.y, 10, 0, Math.PI * 2, true);
+ context.fill();
+ context.closePath();
+ } else if (zone instanceof LineZone) {
+ context.beginPath();
+ context.strokeStyle = style;
+ context.moveTo(zone.x1, zone.y1);
+ context.lineTo(zone.x2, zone.y2);
+ context.stroke();
+ context.closePath();
+ } else if (zone instanceof RectZone) {
+ context.beginPath();
+ context.strokeStyle = style;
+ context.drawRect(zone.x, zone.y, zone.width, zone.height);
+ context.stroke();
+ context.closePath();
+ } else if (zone instanceof CircleZone) {
+ context.beginPath();
+ context.strokeStyle = style;
+ context.arc(zone.x, zone.y, zone.radius, 0, Math.PI * 2, true);
+ context.stroke();
+ context.closePath();
+ }
+ });
+ },
+ drawEmitter: function drawEmitter(proton, canvas, emitter, clear) {
+ var context = canvas.getContext("2d");
+ var style = this.getStyle();
+ this.addEventListener(proton, function () {
+ if (clear) context.clearRect(0, 0, canvas.width, canvas.height);
+ context.beginPath();
+ context.fillStyle = style;
+ context.arc(emitter.p.x, emitter.p.y, 10, 0, Math.PI * 2, true);
+ context.fill();
+ context.closePath();
+ });
+ }
+ };
+
+ // namespace
+ Proton.Particle = Particle;
+ Proton.Pool = Pool;
+ Proton.Util = Util;
+ Proton.ColorUtil = ColorUtil;
+ Proton.MathUtil = MathUtil;
+ Proton.Vector2D = Proton.Vector = Vector2D;
+ Proton.Polar2D = Proton.Polar = Polar2D;
+ Proton.ArraySpan = ArraySpan;
+ Proton.Rectangle = Rectangle;
+ Proton.Rate = Rate;
+ Proton.ease = ease;
+ Proton.Span = Span;
+ Proton.Mat3 = Mat3;
+ Proton.getSpan = function (a, b, center) {
+ return new Span(a, b, center);
+ };
+ Proton.createArraySpan = ArraySpan.createArraySpan;
+ Proton.Initialize = Proton.Init = Initialize;
+ Proton.Life = Proton.L = Life;
+ Proton.Position = Proton.P = Position;
+ Proton.Velocity = Proton.V = Velocity;
+ Proton.Mass = Proton.M = Mass;
+ Proton.Radius = Proton.R = Radius;
+ Proton.Body = Proton.B = Body;
+ Proton.Behaviour = Behaviour;
+ Proton.Force = Proton.F = Force;
+ Proton.Attraction = Proton.A = Attraction;
+ Proton.RandomDrift = Proton.RD = RandomDrift;
+ Proton.Gravity = Proton.G = Gravity;
+ Proton.Collision = Collision;
+ Proton.CrossZone = CrossZone;
+ Proton.Alpha = Alpha;
+ Proton.Scale = Proton.S = Scale;
+ Proton.Rotate = Rotate;
+ Proton.Color = Color;
+ Proton.Repulsion = Repulsion;
+ Proton.Cyclone = Cyclone;
+ Proton.GravityWell = GravityWell;
+ Proton.Emitter = Emitter;
+ Proton.BehaviourEmitter = BehaviourEmitter;
+ Proton.FollowEmitter = FollowEmitter;
+ Proton.Zone = Zone;
+ Proton.LineZone = LineZone;
+ Proton.CircleZone = CircleZone;
+ Proton.PointZone = PointZone;
+ Proton.RectZone = RectZone;
+ Proton.ImageZone = ImageZone;
+ Proton.CanvasRenderer = CanvasRenderer;
+ Proton.DomRenderer = DomRenderer;
+ Proton.EaselRenderer = EaselRenderer;
+ Proton.PixiRenderer = PixiRenderer;
+ Proton.PixelRenderer = PixelRenderer;
+ Proton.WebGLRenderer = Proton.WebGlRenderer = WebGLRenderer;
+ Proton.CustomRenderer = CustomRenderer;
+ Proton.Debug = Debug;
+ Util.assign(Proton, ease);
+
+ return Proton;
+
+})();
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdG9uLndlYi5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL1dlYkdMVXRpbC5qcyIsIi4uL3NyYy91dGlscy9Eb21VdGlsLmpzIiwiLi4vc3JjL3V0aWxzL0ltZ1V0aWwuanMiLCIuLi9zcmMvdXRpbHMvVXRpbC5qcyIsIi4uL3NyYy91dGlscy9QdWlkLmpzIiwiLi4vc3JjL2NvcmUvUG9vbC5qcyIsIi4uL3NyYy9kZWJ1Zy9TdGF0cy5qcyIsIi4uL3NyYy9ldmVudHMvRXZlbnREaXNwYXRjaGVyLmpzIiwiLi4vc3JjL21hdGgvTWF0aFV0aWwuanMiLCIuLi9zcmMvbWF0aC9JbnRlZ3JhdGlvbi5qcyIsIi4uL3NyYy9jb3JlL1Byb3Rvbi5qcyIsIi4uL3NyYy91dGlscy9SZ2IuanMiLCIuLi9zcmMvbWF0aC9TcGFuLmpzIiwiLi4vc3JjL3V0aWxzL1Byb3BVdGlsLmpzIiwiLi4vc3JjL21hdGgvZWFzZS5qcyIsIi4uL3NyYy9tYXRoL1ZlY3RvcjJELmpzIiwiLi4vc3JjL2NvcmUvUGFydGljbGUuanMiLCIuLi9zcmMvdXRpbHMvQ29sb3JVdGlsLmpzIiwiLi4vc3JjL21hdGgvUG9sYXIyRC5qcyIsIi4uL3NyYy9tYXRoL01hdDMuanMiLCIuLi9zcmMvbWF0aC9BcnJheVNwYW4uanMiLCIuLi9zcmMvbWF0aC9SZWN0YW5nbGUuanMiLCIuLi9zcmMvaW5pdGlhbGl6ZS9SYXRlLmpzIiwiLi4vc3JjL2luaXRpYWxpemUvSW5pdGlhbGl6ZS5qcyIsIi4uL3NyYy9pbml0aWFsaXplL0xpZmUuanMiLCIuLi9zcmMvem9uZS9ab25lLmpzIiwiLi4vc3JjL3pvbmUvUG9pbnRab25lLmpzIiwiLi4vc3JjL2luaXRpYWxpemUvUG9zaXRpb24uanMiLCIuLi9zcmMvaW5pdGlhbGl6ZS9WZWxvY2l0eS5qcyIsIi4uL3NyYy9pbml0aWFsaXplL01hc3MuanMiLCIuLi9zcmMvaW5pdGlhbGl6ZS9SYWRpdXMuanMiLCIuLi9zcmMvaW5pdGlhbGl6ZS9Cb2R5LmpzIiwiLi4vc3JjL2JlaGF2aW91ci9CZWhhdmlvdXIuanMiLCIuLi9zcmMvYmVoYXZpb3VyL0ZvcmNlLmpzIiwiLi4vc3JjL2JlaGF2aW91ci9BdHRyYWN0aW9uLmpzIiwiLi4vc3JjL2JlaGF2aW91ci9SYW5kb21EcmlmdC5qcyIsIi4uL3NyYy9iZWhhdmlvdXIvR3Jhdml0eS5qcyIsIi4uL3NyYy9iZWhhdmlvdXIvQ29sbGlzaW9uLmpzIiwiLi4vc3JjL2JlaGF2aW91ci9Dcm9zc1pvbmUuanMiLCIuLi9zcmMvYmVoYXZpb3VyL0FscGhhLmpzIiwiLi4vc3JjL2JlaGF2aW91ci9TY2FsZS5qcyIsIi4uL3NyYy9iZWhhdmlvdXIvUm90YXRlLmpzIiwiLi4vc3JjL2JlaGF2aW91ci9Db2xvci5qcyIsIi4uL3NyYy9iZWhhdmlvdXIvQ3ljbG9uZS5qcyIsIi4uL3NyYy9iZWhhdmlvdXIvUmVwdWxzaW9uLmpzIiwiLi4vc3JjL2JlaGF2aW91ci9HcmF2aXR5V2VsbC5qcyIsIi4uL3NyYy9pbml0aWFsaXplL0luaXRpYWxpemVVdGlsLmpzIiwiLi4vc3JjL2VtaXR0ZXIvRW1pdHRlci5qcyIsIi4uL3NyYy9lbWl0dGVyL0JlaGF2aW91ckVtaXR0ZXIuanMiLCIuLi9zcmMvZW1pdHRlci9Gb2xsb3dFbWl0dGVyLmpzIiwiLi4vc3JjL3V0aWxzL1R5cGVzLmpzIiwiLi4vc3JjL3JlbmRlci9CYXNlUmVuZGVyZXIuanMiLCIuLi9zcmMvcmVuZGVyL0NhbnZhc1JlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlci9Eb21SZW5kZXJlci5qcyIsIi4uL3NyYy9yZW5kZXIvRWFzZWxSZW5kZXJlci5qcyIsIi4uL3NyYy9yZW5kZXIvUGl4ZWxSZW5kZXJlci5qcyIsIi4uL3NyYy9yZW5kZXIvUGl4aVJlbmRlcmVyLmpzIiwiLi4vc3JjL3V0aWxzL01TdGFjay5qcyIsIi4uL3NyYy9yZW5kZXIvV2ViR0xSZW5kZXJlci5qcyIsIi4uL3NyYy9yZW5kZXIvQ3VzdG9tUmVuZGVyZXIuanMiLCIuLi9zcmMvem9uZS9MaW5lWm9uZS5qcyIsIi4uL3NyYy96b25lL0NpcmNsZVpvbmUuanMiLCIuLi9zcmMvem9uZS9SZWN0Wm9uZS5qcyIsIi4uL3NyYy96b25lL0ltYWdlWm9uZS5qcyIsIi4uL3NyYy9kZWJ1Zy9EZWJ1Zy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5XZWJHTFV0aWxcbiAgICogQG1ldGhvZCBpcG90XG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKiBAdG9kbyBhZGQgbGVuZ3RoIGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBsZW5ndGhcbiAgICpcbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIGlwb3QobGVuZ3RoKSB7XG4gICAgcmV0dXJuIChsZW5ndGggJiAobGVuZ3RoIC0gMSkpID09PSAwO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5XZWJHTFV0aWxcbiAgICogQG1ldGhvZCBuaHBvdFxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gYWRkIGxlbmd0aCBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gbGVuZ3RoXG4gICAqXG4gICAqIEByZXR1cm4ge051bWJlcn1cbiAgICovXG4gIG5ocG90KGxlbmd0aCkge1xuICAgIC0tbGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgMzI7IGkgPDw9IDEpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCB8IChsZW5ndGggPj4gaSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxlbmd0aCArIDE7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLldlYkdMVXRpbFxuICAgKiBAbWV0aG9kIG1ha2VUcmFuc2xhdGlvblxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gYWRkIHR4LCB0eSBkZXNjcmlwdGlvblxuICAgKiBAdG9kbyBhZGQgcmV0dXJuIGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0eCBlaXRoZXIgMCBvciAxXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0eSBlaXRoZXIgMCBvciAxXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIG1ha2VUcmFuc2xhdGlvbih0eCwgdHkpIHtcbiAgICByZXR1cm4gWzEsIDAsIDAsIDAsIDEsIDAsIHR4LCB0eSwgMV07XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLldlYkdMVXRpbFxuICAgKiBAbWV0aG9kIG1ha2VSb3RhdGlvblxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gYWRkIHJldHVybiBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gYW5nbGVJblJhZGlhbnNcbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgbWFrZVJvdGF0aW9uKGFuZ2xlSW5SYWRpYW5zKSB7XG4gICAgbGV0IGMgPSBNYXRoLmNvcyhhbmdsZUluUmFkaWFucyk7XG4gICAgbGV0IHMgPSBNYXRoLnNpbihhbmdsZUluUmFkaWFucyk7XG5cbiAgICByZXR1cm4gW2MsIC1zLCAwLCBzLCBjLCAwLCAwLCAwLCAxXTtcbiAgfSxcblxuICAvKipcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uV2ViR0xVdGlsXG4gICAqIEBtZXRob2QgbWFrZVNjYWxlXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKiBAdG9kbyBhZGQgdHgsIHR5IGRlc2NyaXB0aW9uXG4gICAqIEB0b2RvIGFkZCByZXR1cm4gZGVzY3JpcHRpb25cbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHN4IGVpdGhlciAwIG9yIDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHN5IGVpdGhlciAwIG9yIDFcbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgbWFrZVNjYWxlKHN4LCBzeSkge1xuICAgIHJldHVybiBbc3gsIDAsIDAsIDAsIHN5LCAwLCAwLCAwLCAxXTtcbiAgfSxcblxuICAvKipcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uV2ViR0xVdGlsXG4gICAqIEBtZXRob2QgbWF0cml4TXVsdGlwbHlcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uXG4gICAqIEB0b2RvIGFkZCBhLCBiIGRlc2NyaXB0aW9uXG4gICAqIEB0b2RvIGFkZCByZXR1cm4gZGVzY3JpcHRpb25cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGFcbiAgICogQHBhcmFtIHtPYmplY3R9IGJcbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgbWF0cml4TXVsdGlwbHkoYSwgYikge1xuICAgIGxldCBhMDAgPSBhWzAgKiAzICsgMF07XG4gICAgbGV0IGEwMSA9IGFbMCAqIDMgKyAxXTtcbiAgICBsZXQgYTAyID0gYVswICogMyArIDJdO1xuICAgIGxldCBhMTAgPSBhWzEgKiAzICsgMF07XG4gICAgbGV0IGExMSA9IGFbMSAqIDMgKyAxXTtcbiAgICBsZXQgYTEyID0gYVsxICogMyArIDJdO1xuICAgIGxldCBhMjAgPSBhWzIgKiAzICsgMF07XG4gICAgbGV0IGEyMSA9IGFbMiAqIDMgKyAxXTtcbiAgICBsZXQgYTIyID0gYVsyICogMyArIDJdO1xuICAgIGxldCBiMDAgPSBiWzAgKiAzICsgMF07XG4gICAgbGV0IGIwMSA9IGJbMCAqIDMgKyAxXTtcbiAgICBsZXQgYjAyID0gYlswICogMyArIDJdO1xuICAgIGxldCBiMTAgPSBiWzEgKiAzICsgMF07XG4gICAgbGV0IGIxMSA9IGJbMSAqIDMgKyAxXTtcbiAgICBsZXQgYjEyID0gYlsxICogMyArIDJdO1xuICAgIGxldCBiMjAgPSBiWzIgKiAzICsgMF07XG4gICAgbGV0IGIyMSA9IGJbMiAqIDMgKyAxXTtcbiAgICBsZXQgYjIyID0gYlsyICogMyArIDJdO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIGEwMCAqIGIwMCArIGEwMSAqIGIxMCArIGEwMiAqIGIyMCxcbiAgICAgIGEwMCAqIGIwMSArIGEwMSAqIGIxMSArIGEwMiAqIGIyMSxcbiAgICAgIGEwMCAqIGIwMiArIGEwMSAqIGIxMiArIGEwMiAqIGIyMixcbiAgICAgIGExMCAqIGIwMCArIGExMSAqIGIxMCArIGExMiAqIGIyMCxcbiAgICAgIGExMCAqIGIwMSArIGExMSAqIGIxMSArIGExMiAqIGIyMSxcbiAgICAgIGExMCAqIGIwMiArIGExMSAqIGIxMiArIGExMiAqIGIyMixcbiAgICAgIGEyMCAqIGIwMCArIGEyMSAqIGIxMCArIGEyMiAqIGIyMCxcbiAgICAgIGEyMCAqIGIwMSArIGEyMSAqIGIxMSArIGEyMiAqIGIyMSxcbiAgICAgIGEyMCAqIGIwMiArIGEyMSAqIGIxMiArIGEyMiAqIGIyMlxuICAgIF07XG4gIH1cbn07XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGNhbnZhcy4gVGhlIG9wYWNpdHkgaXMgYnkgZGVmYXVsdCBzZXQgdG8gMFxuICAgKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Eb21VdGlsXG4gICAqIEBtZXRob2QgY3JlYXRlQ2FudmFzXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSAkaWQgdGhlIGNhbnZhcycgaWRcbiAgICogQHBhcmFtIHtOdW1iZXJ9ICR3aWR0aCB0aGUgY2FudmFzJyB3aWR0aFxuICAgKiBAcGFyYW0ge051bWJlcn0gJGhlaWdodCB0aGUgY2FudmFzJyBoZWlnaHRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFskcG9zaXRpb249YWJzb2x1dGVdIHRoZSBjYW52YXMnIHBvc2l0aW9uLCBkZWZhdWx0IGlzICdhYnNvbHV0ZSdcbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgY3JlYXRlQ2FudmFzKGlkLCB3aWR0aCwgaGVpZ2h0LCBwb3NpdGlvbiA9IFwiYWJzb2x1dGVcIikge1xuICAgIGNvbnN0IGRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG5cbiAgICBkb20uaWQgPSBpZDtcbiAgICBkb20ud2lkdGggPSB3aWR0aDtcbiAgICBkb20uaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGRvbS5zdHlsZS5vcGFjaXR5ID0gMDtcbiAgICBkb20uc3R5bGUucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICB0aGlzLnRyYW5zZm9ybShkb20sIC01MDAsIC01MDAsIDAsIDApO1xuXG4gICAgcmV0dXJuIGRvbTtcbiAgfSxcblxuICBjcmVhdGVEaXYoaWQsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBjb25zdCBkb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG4gICAgZG9tLmlkID0gaWQ7XG4gICAgZG9tLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgIHRoaXMucmVzaXplKGRvbSwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICByZXR1cm4gZG9tO1xuICB9LFxuXG4gIHJlc2l6ZShkb20sIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBkb20uc3R5bGUud2lkdGggPSB3aWR0aCArIFwicHhcIjtcbiAgICBkb20uc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgXCJweFwiO1xuICAgIGRvbS5zdHlsZS5tYXJnaW5MZWZ0ID0gLXdpZHRoIC8gMiArIFwicHhcIjtcbiAgICBkb20uc3R5bGUubWFyZ2luVG9wID0gLWhlaWdodCAvIDIgKyBcInB4XCI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEFkZHMgYSB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgpLCBzY2FsZSgpLCByb3RhdGUoKSB0byBhIGdpdmVuIGRpdiBkb20gZm9yIGFsbCBicm93c2Vyc1xuICAgKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Eb21VdGlsXG4gICAqIEBtZXRob2QgdHJhbnNmb3JtXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTERpdkVsZW1lbnR9IGRpdlxuICAgKiBAcGFyYW0ge051bWJlcn0gJHhcbiAgICogQHBhcmFtIHtOdW1iZXJ9ICR5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSAkc2NhbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9ICRyb3RhdGVcbiAgICovXG4gIHRyYW5zZm9ybShkaXYsIHgsIHksIHNjYWxlLCByb3RhdGUpIHtcbiAgICBkaXYuc3R5bGUud2lsbENoYW5nZSA9IFwidHJhbnNmb3JtXCI7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke3h9cHgsICR7eX1weCkgc2NhbGUoJHtzY2FsZX0pIHJvdGF0ZSgke3JvdGF0ZX1kZWcpYDtcbiAgICB0aGlzLmNzczMoZGl2LCBcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0pO1xuICB9LFxuXG4gIHRyYW5zZm9ybTNkKGRpdiwgeCwgeSwgc2NhbGUsIHJvdGF0ZSkge1xuICAgIGRpdi5zdHlsZS53aWxsQ2hhbmdlID0gXCJ0cmFuc2Zvcm1cIjtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBgdHJhbnNsYXRlM2QoJHt4fXB4LCAke3l9cHgsIDApIHNjYWxlKCR7c2NhbGV9KSByb3RhdGUoJHtyb3RhdGV9ZGVnKWA7XG4gICAgdGhpcy5jc3MzKGRpdiwgXCJiYWNrZmFjZVZpc2liaWxpdHlcIiwgXCJoaWRkZW5cIik7XG4gICAgdGhpcy5jc3MzKGRpdiwgXCJ0cmFuc2Zvcm1cIiwgdHJhbnNmb3JtKTtcbiAgfSxcblxuICBjc3MzKGRpdiwga2V5LCB2YWwpIHtcbiAgICBjb25zdCBia2V5ID0ga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnN1YnN0cigxKTtcblxuICAgIGRpdi5zdHlsZVtgV2Via2l0JHtia2V5fWBdID0gdmFsO1xuICAgIGRpdi5zdHlsZVtgTW96JHtia2V5fWBdID0gdmFsO1xuICAgIGRpdi5zdHlsZVtgTyR7YmtleX1gXSA9IHZhbDtcbiAgICBkaXYuc3R5bGVbYG1zJHtia2V5fWBdID0gdmFsO1xuICAgIGRpdi5zdHlsZVtgJHtrZXl9YF0gPSB2YWw7XG4gIH1cbn07XG4iLCJpbXBvcnQgV2ViR0xVdGlsIGZyb20gXCIuL1dlYkdMVXRpbFwiO1xuaW1wb3J0IERvbVV0aWwgZnJvbSBcIi4vRG9tVXRpbFwiO1xuXG5jb25zdCBpbWdzQ2FjaGUgPSB7fTtcbmNvbnN0IGNhbnZhc0NhY2hlID0ge307XG5sZXQgY2FudmFzSWQgPSAwO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBUaGlzIHdpbGwgZ2V0IHRoZSBpbWFnZSBkYXRhLiBJdCBjb3VsZCBiZSBuZWNlc3NhcnkgdG8gY3JlYXRlIGEgUHJvdG9uLlpvbmUuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBnZXRJbWFnZURhdGFcbiAgICpcbiAgICogQHBhcmFtIHtIVE1MQ2FudmFzRWxlbWVudH0gICBjb250ZXh0IGFueSBjYW52YXMsIG11c3QgYmUgYSAyZENvbnRleHQgJ2NhbnZhcy5nZXRDb250ZXh0KCcyZCcpJ1xuICAgKiBAcGFyYW0ge09iamVjdH0gICAgICAgICAgICAgIGltYWdlICAgY291bGQgYmUgYW55IGRvbSBpbWFnZSwgZS5nLiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhpc0lzQW5JbWdUYWcnKTtcbiAgICogQHBhcmFtIHtQcm90b24uUmVjdGFuZ2xlfSAgICByZWN0XG4gICAqL1xuICBnZXRJbWFnZURhdGEoY29udGV4dCwgaW1hZ2UsIHJlY3QpIHtcbiAgICBjb250ZXh0LmRyYXdJbWFnZShpbWFnZSwgcmVjdC54LCByZWN0LnkpO1xuICAgIGNvbnN0IGltYWdlZGF0YSA9IGNvbnRleHQuZ2V0SW1hZ2VEYXRhKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7XG4gICAgY29udGV4dC5jbGVhclJlY3QocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTtcblxuICAgIHJldHVybiBpbWFnZWRhdGE7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBnZXRJbWdGcm9tQ2FjaGVcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uXG4gICAqIEB0b2RvIGRlc2NyaWJlIGZ1bmNcbiAgICpcbiAgICogQHBhcmFtIHtNaXhlZH0gICAgICAgICAgICAgICBpbWdcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9ICAgICBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59ICAgICAgICAgICAgIGRyYXdDYW52YXMgIHNldCB0byB0cnVlIGlmIGEgY2FudmFzIHNob3VsZCBiZSBzYXZlZCBpbnRvIHBhcnRpY2xlLmRhdGEuY2FudmFzXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gICAgICAgICAgICAgZnVuY1xuICAgKi9cbiAgZ2V0SW1nRnJvbUNhY2hlKGltZywgY2FsbGJhY2ssIHBhcmFtKSB7XG4gICAgY29uc3Qgc3JjID0gdHlwZW9mIGltZyA9PT0gXCJzdHJpbmdcIiA/IGltZyA6IGltZy5zcmM7XG5cbiAgICBpZiAoaW1nc0NhY2hlW3NyY10pIHtcbiAgICAgIGNhbGxiYWNrKGltZ3NDYWNoZVtzcmNdLCBwYXJhbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICBpbWFnZS5vbmxvYWQgPSBlID0+IHtcbiAgICAgICAgaW1nc0NhY2hlW3NyY10gPSBlLnRhcmdldDtcbiAgICAgICAgY2FsbGJhY2soaW1nc0NhY2hlW3NyY10sIHBhcmFtKTtcbiAgICAgIH07XG5cbiAgICAgIGltYWdlLnNyYyA9IHNyYztcbiAgICB9XG4gIH0sXG5cbiAgZ2V0Q2FudmFzRnJvbUNhY2hlKGltZywgY2FsbGJhY2ssIHBhcmFtKSB7XG4gICAgY29uc3Qgc3JjID0gaW1nLnNyYztcblxuICAgIGlmICghY2FudmFzQ2FjaGVbc3JjXSkge1xuICAgICAgY29uc3Qgd2lkdGggPSBXZWJHTFV0aWwubmhwb3QoaW1nLndpZHRoKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IFdlYkdMVXRpbC5uaHBvdChpbWcuaGVpZ2h0KTtcblxuICAgICAgY29uc3QgY2FudmFzID0gRG9tVXRpbC5jcmVhdGVDYW52YXMoYHByb3Rvbl9jYW52YXNfY2FjaGVfJHsrK2NhbnZhc0lkfWAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIDAsIDAsIGltZy53aWR0aCwgaW1nLmhlaWdodCk7XG5cbiAgICAgIGNhbnZhc0NhY2hlW3NyY10gPSBjYW52YXM7XG4gICAgfVxuXG4gICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soY2FudmFzQ2FjaGVbc3JjXSwgcGFyYW0pO1xuXG4gICAgcmV0dXJuIGNhbnZhc0NhY2hlW3NyY107XG4gIH1cbn07XG4iLCJpbXBvcnQgSW1nVXRpbCBmcm9tIFwiLi9JbWdVdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRlZmF1bHQgaWYgdGhlIHZhbHVlIGlzIG51bGwgb3IgdW5kZWZpbmVkXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBpbml0VmFsdWVcbiAgICpcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWUgYSBzcGVjaWZpYyB2YWx1ZSwgY291bGQgYmUgZXZlcnl0aGluZyBidXQgbnVsbCBvciB1bmRlZmluZWRcbiAgICogQHBhcmFtIHtNaXhlZH0gZGVmYXVsdHMgdGhlIGRlZmF1bHQgaWYgdGhlIHZhbHVlIGlzIG51bGwgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBpbml0VmFsdWUodmFsdWUsIGRlZmF1bHRzKSB7XG4gICAgdmFsdWUgPSB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBkZWZhdWx0cztcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgdmFsdWUgaXMgYSB2YWxpZCBhcnJheVxuICAgKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5VdGlsXG4gICAqIEBtZXRob2QgaXNBcnJheVxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZSBBbnkgYXJyYXlcbiAgICpcbiAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAqL1xuICBpc0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09IFwiW29iamVjdCBBcnJheV1cIjtcbiAgfSxcblxuICAvKipcbiAgICogRGVzdHJveWVzIHRoZSBnaXZlbiBhcnJheVxuICAgKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5VdGlsXG4gICAqIEBtZXRob2QgZW1wdHlBcnJheVxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBBbnkgYXJyYXlcbiAgICovXG4gIGVtcHR5QXJyYXkoYXJyKSB7XG4gICAgaWYgKGFycikgYXJyLmxlbmd0aCA9IDA7XG4gIH0sXG5cbiAgdG9BcnJheShhcnIpIHtcbiAgICByZXR1cm4gdGhpcy5pc0FycmF5KGFycikgPyBhcnIgOiBbYXJyXTtcbiAgfSxcblxuICBzbGljZUFycmF5KGFycjEsIGluZGV4LCBhcnIyKSB7XG4gICAgdGhpcy5lbXB0eUFycmF5KGFycjIpO1xuICAgIGZvciAobGV0IGkgPSBpbmRleDsgaSA8IGFycjEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFycjIucHVzaChhcnIxW2ldKTtcbiAgICB9XG4gIH0sXG5cbiAgZ2V0UmFuZEZyb21BcnJheShhcnIpIHtcbiAgICBpZiAoIWFycikgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGFycltNYXRoLmZsb29yKGFyci5sZW5ndGggKiBNYXRoLnJhbmRvbSgpKV07XG4gIH0sXG5cbiAgLyoqXG4gICAqIERlc3Ryb3llcyB0aGUgZ2l2ZW4gb2JqZWN0XG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBlbXB0eU9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIEFueSBvYmplY3RcbiAgICovXG4gIGVtcHR5T2JqZWN0KG9iaiwgaWdub3JlID0gbnVsbCkge1xuICAgIGZvciAobGV0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChpZ25vcmUgJiYgaWdub3JlLmluZGV4T2Yoa2V5KSA+IC0xKSBjb250aW51ZTtcbiAgICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIE1ha2VzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgYW5kIGJpbmRzIHRoZSBnaXZlbiBhcnJheVxuICAgKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5VdGlsXG4gICAqIEBtZXRob2QgY2xhc3NBcHBseVxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb25zdHJ1Y3RvciBBIGNsYXNzIHRvIG1ha2UgYW4gaW5zdGFuY2UgZnJvbVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnc10gQW55IGFycmF5IHRvIGJpbmQgaXQgdG8gdGhlIGNvbnN0cnVjdG9yXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGluc3RhbmNlIG9mIGNvbnN0cnVjdG9yLCBvcHRpb25hbGx5IGJpbmQgd2l0aCBhcmdzXG4gICAqL1xuICBjbGFzc0FwcGx5KGNvbnN0cnVjdG9yLCBhcmdzID0gbnVsbCkge1xuICAgIGlmICghYXJncykge1xuICAgICAgcmV0dXJuIG5ldyBjb25zdHJ1Y3RvcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBGYWN0b3J5RnVuYyA9IGNvbnN0cnVjdG9yLmJpbmQuYXBwbHkoY29uc3RydWN0b3IsIFtudWxsXS5jb25jYXQoYXJncykpO1xuICAgICAgcmV0dXJuIG5ldyBGYWN0b3J5RnVuYygpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogVGhpcyB3aWxsIGdldCB0aGUgaW1hZ2UgZGF0YS4gSXQgY291bGQgYmUgbmVjZXNzYXJ5IHRvIGNyZWF0ZSBhIFByb3Rvbi5ab25lLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5VdGlsXG4gICAqIEBtZXRob2QgZ2V0SW1hZ2VEYXRhXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9ICAgY29udGV4dCBhbnkgY2FudmFzLCBtdXN0IGJlIGEgMmRDb250ZXh0ICdjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSdcbiAgICogQHBhcmFtIHtPYmplY3R9ICAgICAgICAgICAgICBpbWFnZSAgIGNvdWxkIGJlIGFueSBkb20gaW1hZ2UsIGUuZy4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoaXNJc0FuSW1nVGFnJyk7XG4gICAqIEBwYXJhbSB7UHJvdG9uLlJlY3RhbmdsZX0gICAgcmVjdFxuICAgKi9cbiAgZ2V0SW1hZ2VEYXRhKGNvbnRleHQsIGltYWdlLCByZWN0KSB7XG4gICAgcmV0dXJuIEltZ1V0aWwuZ2V0SW1hZ2VEYXRhKGNvbnRleHQsIGltYWdlLCByZWN0KTtcbiAgfSxcblxuICBkZXN0cm95QWxsKGFyciwgcGFyYW0gPSBudWxsKSB7XG4gICAgbGV0IGkgPSBhcnIubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXJyW2ldLmRlc3Ryb3kocGFyYW0pO1xuICAgICAgfSBjYXRjaCAoZSkge31cblxuICAgICAgZGVsZXRlIGFycltpXTtcbiAgICB9XG5cbiAgICBhcnIubGVuZ3RoID0gMDtcbiAgfSxcblxuICBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpIHtcbiAgICBpZiAodHlwZW9mIE9iamVjdC5hc3NpZ24gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgZm9yIChsZXQga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UpO1xuICAgIH1cbiAgfVxufTtcbiIsImNvbnN0IGlkc01hcCA9IHt9O1xuXG5jb25zdCBQdWlkID0ge1xuICBfaW5kZXg6IDAsXG4gIF9jYWNoZToge30sXG5cbiAgaWQodHlwZSkge1xuICAgIGlmIChpZHNNYXBbdHlwZV0gPT09IHVuZGVmaW5lZCB8fCBpZHNNYXBbdHlwZV0gPT09IG51bGwpIGlkc01hcFt0eXBlXSA9IDA7XG4gICAgcmV0dXJuIGAke3R5cGV9XyR7aWRzTWFwW3R5cGVdKyt9YDtcbiAgfSxcblxuICBnZXRJZCh0YXJnZXQpIHtcbiAgICBsZXQgdWlkID0gdGhpcy5nZXRJZEZyb21DYWNoZSh0YXJnZXQpO1xuICAgIGlmICh1aWQpIHJldHVybiB1aWQ7XG5cbiAgICB1aWQgPSBgUFVJRF8ke3RoaXMuX2luZGV4Kyt9YDtcbiAgICB0aGlzLl9jYWNoZVt1aWRdID0gdGFyZ2V0O1xuICAgIHJldHVybiB1aWQ7XG4gIH0sXG5cbiAgZ2V0SWRGcm9tQ2FjaGUodGFyZ2V0KSB7XG4gICAgbGV0IG9iaiwgaWQ7XG5cbiAgICBmb3IgKGlkIGluIHRoaXMuX2NhY2hlKSB7XG4gICAgICBvYmogPSB0aGlzLl9jYWNoZVtpZF07XG5cbiAgICAgIGlmIChvYmogPT09IHRhcmdldCkgcmV0dXJuIGlkO1xuICAgICAgaWYgKHRoaXMuaXNCb2R5KG9iaiwgdGFyZ2V0KSAmJiBvYmouc3JjID09PSB0YXJnZXQuc3JjKSByZXR1cm4gaWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG5cbiAgaXNCb2R5KG9iaiwgdGFyZ2V0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIiAmJiBvYmouaXNJbm5lciAmJiB0YXJnZXQuaXNJbm5lcjtcbiAgfSxcblxuICBnZXRUYXJnZXQodWlkKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlW3VpZF07XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFB1aWQ7XG4iLCIvKipcbiAqIFBvb2wgaXMgdGhlIGNhY2hlIHBvb2wgb2YgdGhlIHByb3RvbiBlbmdpbmUsIGl0IGlzIHZlcnkgaW1wb3J0YW50LlxuICpcbiAqIGdldCh0YXJnZXQsIHBhcmFtcywgdWlkKVxuICogIENsYXNzXG4gKiAgICB1aWQgPSBQdWlkLmdldElkIC0+IFB1aWQgc2F2ZSB0YXJnZXQgY2FjaGVcbiAqICAgIHRhcmdldC5fX3B1aWQgPSB1aWRcbiAqXG4gKiAgYm9keVxuICogICAgdWlkID0gUHVpZC5nZXRJZCAtPiBQdWlkIHNhdmUgdGFyZ2V0IGNhY2hlXG4gKlxuICpcbiAqIGV4cGlyZSh0YXJnZXQpXG4gKiAgY2FjaGVbdGFyZ2V0Ll9fcHVpZF0gcHVzaCB0YXJnZXRcbiAqXG4gKi9cbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgUHVpZCBmcm9tIFwiLi4vdXRpbHMvUHVpZFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQb29sIHtcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIFByb3Rvbi5Qb29sXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gb2YgcHJvcGVydGllc1xuICAgKlxuICAgKiBAcHJvcGVydHkge051bWJlcn0gdG90YWxcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IGNhY2hlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihudW0pIHtcbiAgICB0aGlzLnRvdGFsID0gMDtcbiAgICB0aGlzLmNhY2hlID0ge307XG4gIH1cblxuICAvKipcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEBtZXRob2QgZ2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlBvb2xcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R8RnVuY3Rpb259IHRhcmdldFxuICAgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10ganVzdCBhZGQgaWYgYHRhcmdldGAgaXMgYSBmdW5jdGlvblxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBnZXQodGFyZ2V0LCBwYXJhbXMsIHVpZCkge1xuICAgIGxldCBwO1xuICAgIHVpZCA9IHVpZCB8fCB0YXJnZXQuX19wdWlkIHx8IFB1aWQuZ2V0SWQodGFyZ2V0KTtcblxuICAgIGlmICh0aGlzLmNhY2hlW3VpZF0gJiYgdGhpcy5jYWNoZVt1aWRdLmxlbmd0aCA+IDApIHtcbiAgICAgIHAgPSB0aGlzLmNhY2hlW3VpZF0ucG9wKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHAgPSB0aGlzLmNyZWF0ZU9yQ2xvbmUodGFyZ2V0LCBwYXJhbXMpO1xuICAgIH1cblxuICAgIHAuX19wdWlkID0gdGFyZ2V0Ll9fcHVpZCB8fCB1aWQ7XG4gICAgcmV0dXJuIHA7XG4gIH1cblxuICAvKipcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEBtZXRob2Qgc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlBvb2xcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldFxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBleHBpcmUodGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2FjaGUodGFyZ2V0Ll9fcHVpZCkucHVzaCh0YXJnZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgY2xhc3MgaW5zdGFuY2VcbiAgICpcbiAgICogQHRvZG8gYWRkIG1vcmUgZG9jdW1lbnRhdGlvblxuICAgKlxuICAgKiBAbWV0aG9kIGNyZWF0ZVxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Qb29sXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXQgYW55IE9iamVjdCBvciBGdW5jdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10ganVzdCBhZGQgaWYgYHRhcmdldGAgaXMgYSBmdW5jdGlvblxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBjcmVhdGVPckNsb25lKHRhcmdldCwgcGFyYW1zKSB7XG4gICAgdGhpcy50b3RhbCsrO1xuXG4gICAgaWYgKHRoaXMuY3JlYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGUodGFyZ2V0LCBwYXJhbXMpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gVXRpbC5jbGFzc0FwcGx5KHRhcmdldCwgcGFyYW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRhcmdldC5jbG9uZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gLSB3aGF0IGlzIGluIHRoZSBjYWNoZT9cbiAgICpcbiAgICogQG1ldGhvZCBnZXRDb3VudFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Qb29sXG4gICAqXG4gICAqIEByZXR1cm4ge051bWJlcn1cbiAgICovXG4gIGdldENvdW50KCkge1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgZm9yIChsZXQgaWQgaW4gdGhpcy5jYWNoZSkgY291bnQgKz0gdGhpcy5jYWNoZVtpZF0ubGVuZ3RoO1xuICAgIHJldHVybiBjb3VudCsrO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3llcyBhbGwgaXRlbXMgZnJvbSBQb29sLmNhY2hlXG4gICAqXG4gICAqIEBtZXRob2QgZGVzdHJveVxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Qb29sXG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIGZvciAobGV0IGlkIGluIHRoaXMuY2FjaGUpIHtcbiAgICAgIHRoaXMuY2FjaGVbaWRdLmxlbmd0aCA9IDA7XG4gICAgICBkZWxldGUgdGhpcy5jYWNoZVtpZF07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgUG9vbC5jYWNoZVxuICAgKlxuICAgKiBAbWV0aG9kIGdldENhY2hlXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlBvb2xcbiAgICogQHByaXZhdGVcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHVpZCB0aGUgdW5pcXVlIGlkXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIGdldENhY2hlKHVpZCA9IFwiZGVmYXVsdFwiKSB7XG4gICAgaWYgKCF0aGlzLmNhY2hlW3VpZF0pIHRoaXMuY2FjaGVbdWlkXSA9IFtdO1xuICAgIHJldHVybiB0aGlzLmNhY2hlW3VpZF07XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0YXRzIHtcbiAgY29uc3RydWN0b3IocHJvdG9uKSB7XG4gICAgdGhpcy5wcm90b24gPSBwcm90b247XG4gICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xuICAgIHRoaXMudHlwZSA9IDE7XG5cbiAgICB0aGlzLmVtaXR0ZXJJbmRleCA9IDA7XG4gICAgdGhpcy5yZW5kZXJlckluZGV4ID0gMDtcbiAgfVxuXG4gIHVwZGF0ZShzdHlsZSwgYm9keSkge1xuICAgIHRoaXMuYWRkKHN0eWxlLCBib2R5KTtcblxuICAgIGNvbnN0IGVtaXR0ZXIgPSB0aGlzLmdldEVtaXR0ZXIoKTtcbiAgICBjb25zdCByZW5kZXJlciA9IHRoaXMuZ2V0UmVuZGVyZXIoKTtcbiAgICBsZXQgc3RyID0gXCJcIjtcblxuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHN0ciArPSBcImVtaXR0ZXI6XCIgKyB0aGlzLnByb3Rvbi5lbWl0dGVycy5sZW5ndGggKyBcIjxicj5cIjtcbiAgICAgICAgaWYgKGVtaXR0ZXIpIHN0ciArPSBcImVtIHNwZWVkOlwiICsgZW1pdHRlci5lbWl0U3BlZWQgKyBcIjxicj5cIjtcbiAgICAgICAgaWYgKGVtaXR0ZXIpIHN0ciArPSBcInBvczpcIiArIHRoaXMuZ2V0RW1pdHRlclBvcyhlbWl0dGVyKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMzpcbiAgICAgICAgaWYgKGVtaXR0ZXIpIHN0ciArPSBcImluaXRpYWxpemVzOlwiICsgZW1pdHRlci5pbml0aWFsaXplcy5sZW5ndGggKyBcIjxicj5cIjtcbiAgICAgICAgaWYgKGVtaXR0ZXIpXG4gICAgICAgICAgc3RyICs9ICc8c3BhbiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO1wiPicgKyB0aGlzLmNvbmNhdEFycihlbWl0dGVyLmluaXRpYWxpemVzKSArIFwiPC9zcGFuPjxicj5cIjtcbiAgICAgICAgaWYgKGVtaXR0ZXIpIHN0ciArPSBcImJlaGF2aW91cnM6XCIgKyBlbWl0dGVyLmJlaGF2aW91cnMubGVuZ3RoICsgXCI8YnI+XCI7XG4gICAgICAgIGlmIChlbWl0dGVyKSBzdHIgKz0gJzxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7XCI+JyArIHRoaXMuY29uY2F0QXJyKGVtaXR0ZXIuYmVoYXZpb3VycykgKyBcIjwvc3Bhbj48YnI+XCI7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDQ6XG4gICAgICAgIGlmIChyZW5kZXJlcikgc3RyICs9IHJlbmRlcmVyLm5hbWUgKyBcIjxicj5cIjtcbiAgICAgICAgaWYgKHJlbmRlcmVyKSBzdHIgKz0gXCJib2R5OlwiICsgdGhpcy5nZXRDcmVhdGVkTnVtYmVyKHJlbmRlcmVyKSArIFwiPGJyPlwiO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgc3RyICs9IFwicGFydGljbGVzOlwiICsgdGhpcy5wcm90b24uZ2V0Q291bnQoKSArIFwiPGJyPlwiO1xuICAgICAgICBzdHIgKz0gXCJwb29sOlwiICsgdGhpcy5wcm90b24ucG9vbC5nZXRDb3VudCgpICsgXCI8YnI+XCI7XG4gICAgICAgIHN0ciArPSBcInRvdGFsOlwiICsgdGhpcy5wcm90b24ucG9vbC50b3RhbDtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRhaW5lci5pbm5lckhUTUwgPSBzdHI7XG4gIH1cblxuICBhZGQoc3R5bGUsIGJvZHkpIHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyKSB7XG4gICAgICB0aGlzLnR5cGUgPSAxO1xuXG4gICAgICB0aGlzLmNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gW1xuICAgICAgICBcInBvc2l0aW9uOmFic29sdXRlO2JvdHRvbTowcHg7bGVmdDowO2N1cnNvcjpwb2ludGVyO1wiLFxuICAgICAgICBcIm9wYWNpdHk6MC45O3otaW5kZXg6MTAwMDA7cGFkZGluZzoxMHB4O2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OkhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmO1wiLFxuICAgICAgICBcIndpZHRoOjEyMHB4O2hlaWdodDo1MHB4O2JhY2tncm91bmQtY29sb3I6IzAwMjtjb2xvcjojMGZmO1wiXG4gICAgICBdLmpvaW4oXCJcIik7XG5cbiAgICAgIHRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgIFwiY2xpY2tcIixcbiAgICAgICAgZSA9PiB7XG4gICAgICAgICAgdGhpcy50eXBlKys7XG4gICAgICAgICAgaWYgKHRoaXMudHlwZSA+IDQpIHRoaXMudHlwZSA9IDE7XG4gICAgICAgIH0sXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuXG4gICAgICBsZXQgYmcsIGNvbG9yO1xuICAgICAgc3dpdGNoIChzdHlsZSkge1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgYmcgPSBcIiMyMDFcIjtcbiAgICAgICAgICBjb2xvciA9IFwiI2YwOFwiO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBiZyA9IFwiIzAyMFwiO1xuICAgICAgICAgIGNvbG9yID0gXCIjMGYwXCI7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBiZyA9IFwiIzAwMlwiO1xuICAgICAgICAgIGNvbG9yID0gXCIjMGZmXCI7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlW1wiYmFja2dyb3VuZC1jb2xvclwiXSA9IGJnO1xuICAgICAgdGhpcy5jb250YWluZXIuc3R5bGVbXCJjb2xvclwiXSA9IGNvbG9yO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jb250YWluZXIucGFyZW50Tm9kZSkge1xuICAgICAgYm9keSA9IGJvZHkgfHwgdGhpcy5ib2R5IHx8IGRvY3VtZW50LmJvZHk7XG4gICAgICBib2R5LmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgICB9XG4gIH1cblxuICBnZXRFbWl0dGVyKCkge1xuICAgIHJldHVybiB0aGlzLnByb3Rvbi5lbWl0dGVyc1t0aGlzLmVtaXR0ZXJJbmRleF07XG4gIH1cblxuICBnZXRSZW5kZXJlcigpIHtcbiAgICByZXR1cm4gdGhpcy5wcm90b24ucmVuZGVyZXJzW3RoaXMucmVuZGVyZXJJbmRleF07XG4gIH1cblxuICBjb25jYXRBcnIoYXJyKSB7XG4gICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgaWYgKCFhcnIgfHwgIWFyci5sZW5ndGgpIHJldHVybiByZXN1bHQ7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0ICs9IChhcnJbaV0ubmFtZSB8fCBcIlwiKS5zdWJzdHIoMCwgMSkgKyBcIi5cIjtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZ2V0Q3JlYXRlZE51bWJlcihyZW5kZXJlcikge1xuICAgIHJldHVybiByZW5kZXJlci5wb29sLnRvdGFsIHx8IChyZW5kZXJlci5jcG9vbCAmJiByZW5kZXJlci5jcG9vbC50b3RhbCkgfHwgMDtcbiAgfVxuXG4gIGdldEVtaXR0ZXJQb3MoZSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKGUucC54KSArIFwiLFwiICsgTWF0aC5yb3VuZChlLnAueSk7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLmNvbnRhaW5lciAmJiB0aGlzLmNvbnRhaW5lci5wYXJlbnROb2RlKSB7XG4gICAgICBjb25zdCBib2R5ID0gdGhpcy5ib2R5IHx8IGRvY3VtZW50LmJvZHk7XG4gICAgICBib2R5LnJlbW92ZUNoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgICB9XG5cbiAgICB0aGlzLnByb3RvbiA9IG51bGw7XG4gICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xuICB9XG59XG4iLCIvKlxuICogRXZlbnREaXNwYXRjaGVyXG4gKiBUaGlzIGNvZGUgcmVmZXJlbmNlIHNpbmNlIGh0dHA6Ly9jcmVhdGVqcy5jb20vLlxuICpcbiAqKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXZlbnREaXNwYXRjaGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fbGlzdGVuZXJzID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBiaW5kKHRhcmdldCkge1xuICAgIHRhcmdldC5wcm90b3R5cGUuZGlzcGF0Y2hFdmVudCA9IEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUuZGlzcGF0Y2hFdmVudDtcbiAgICB0YXJnZXQucHJvdG90eXBlLmhhc0V2ZW50TGlzdGVuZXIgPSBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLmhhc0V2ZW50TGlzdGVuZXI7XG4gICAgdGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyO1xuICAgIHRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lcjtcbiAgICB0YXJnZXQucHJvdG90eXBlLnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzID0gRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZS5yZW1vdmVBbGxFdmVudExpc3RlbmVycztcbiAgfVxuXG4gIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICBpZiAoIXRoaXMuX2xpc3RlbmVycykge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzID0ge307XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnNbdHlwZV0pIHRoaXMuX2xpc3RlbmVyc1t0eXBlXSA9IFtdO1xuICAgIHRoaXMuX2xpc3RlbmVyc1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcblxuICAgIHJldHVybiBsaXN0ZW5lcjtcbiAgfVxuXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICBpZiAoIXRoaXMuX2xpc3RlbmVycykgcmV0dXJuO1xuICAgIGlmICghdGhpcy5fbGlzdGVuZXJzW3R5cGVdKSByZXR1cm47XG5cbiAgICBjb25zdCBhcnIgPSB0aGlzLl9saXN0ZW5lcnNbdHlwZV07XG4gICAgY29uc3QgbGVuZ3RoID0gYXJyLmxlbmd0aDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhcnJbaV0gPT09IGxpc3RlbmVyKSB7XG4gICAgICAgIGlmIChsZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5fbGlzdGVuZXJzW3R5cGVdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWxsb3dzIGZvciBmYXN0ZXIgY2hlY2tzLlxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBhcnIuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnModHlwZSkge1xuICAgIGlmICghdHlwZSkgdGhpcy5fbGlzdGVuZXJzID0gbnVsbDtcbiAgICBlbHNlIGlmICh0aGlzLl9saXN0ZW5lcnMpIGRlbGV0ZSB0aGlzLl9saXN0ZW5lcnNbdHlwZV07XG4gIH1cblxuICBkaXNwYXRjaEV2ZW50KHR5cGUsIGFyZ3MpIHtcbiAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuXG4gICAgaWYgKHR5cGUgJiYgbGlzdGVuZXJzKSB7XG4gICAgICBsZXQgYXJyID0gbGlzdGVuZXJzW3R5cGVdO1xuICAgICAgaWYgKCFhcnIpIHJldHVybiByZXN1bHQ7XG5cbiAgICAgIC8vIGFyciA9IGFyci5zbGljZSgpO1xuICAgICAgLy8gdG8gYXZvaWQgaXNzdWVzIHdpdGggaXRlbXMgYmVpbmcgcmVtb3ZlZCBvciBhZGRlZCBkdXJpbmcgdGhlIGRpc3BhdGNoXG5cbiAgICAgIGxldCBoYW5kbGVyO1xuICAgICAgbGV0IGkgPSBhcnIubGVuZ3RoO1xuICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICBoYW5kbGVyID0gYXJyW2ldO1xuICAgICAgICByZXN1bHQgPSByZXN1bHQgfHwgaGFuZGxlcihhcmdzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gISFyZXN1bHQ7XG4gIH1cblxuICBoYXNFdmVudExpc3RlbmVyKHR5cGUpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XG4gICAgcmV0dXJuICEhKGxpc3RlbmVycyAmJiBsaXN0ZW5lcnNbdHlwZV0pO1xuICB9XG59XG4iLCJjb25zdCBQSSA9IDMuMTQxNTkyNjtcbmNvbnN0IElORklOSVRZID0gSW5maW5pdHk7XG5cbmNvbnN0IE1hdGhVdGlsID0ge1xuICBQSTogUEksXG4gIFBJeDI6IFBJICogMixcbiAgUElfMjogUEkgLyAyLFxuICBQSV8xODA6IFBJIC8gMTgwLFxuICBOMTgwX1BJOiAxODAgLyBQSSxcbiAgSW5maW5pdHk6IC05OTksXG5cbiAgaXNJbmZpbml0eShudW0pIHtcbiAgICByZXR1cm4gbnVtID09PSB0aGlzLkluZmluaXR5IHx8IG51bSA9PT0gSU5GSU5JVFk7XG4gIH0sXG5cbiAgcmFuZG9tQVRvQihhLCBiLCBpc0ludCA9IGZhbHNlKSB7XG4gICAgaWYgKCFpc0ludCkgcmV0dXJuIGEgKyBNYXRoLnJhbmRvbSgpICogKGIgLSBhKTtcbiAgICBlbHNlIHJldHVybiAoKE1hdGgucmFuZG9tKCkgKiAoYiAtIGEpKSA+PiAwKSArIGE7XG4gIH0sXG5cbiAgcmFuZG9tRmxvYXRpbmcoY2VudGVyLCBmLCBpc0ludCkge1xuICAgIHJldHVybiB0aGlzLnJhbmRvbUFUb0IoY2VudGVyIC0gZiwgY2VudGVyICsgZiwgaXNJbnQpO1xuICB9LFxuXG4gIHJhbmRvbUNvbG9yKCkge1xuICAgIHJldHVybiBcIiNcIiArIChcIjAwMDAwXCIgKyAoKE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDApIDw8IDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTYpO1xuICB9LFxuXG4gIHJhbmRvbVpvbmUoZGlzcGxheSkge30sXG5cbiAgZmxvb3IobnVtLCBrID0gNCkge1xuICAgIGNvbnN0IGRpZ2l0cyA9IE1hdGgucG93KDEwLCBrKTtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihudW0gKiBkaWdpdHMpIC8gZGlnaXRzO1xuICB9LFxuXG4gIGRlZ3JlZVRyYW5zZm9ybShhKSB7XG4gICAgcmV0dXJuIChhICogUEkpIC8gMTgwO1xuICB9LFxuXG4gIHRvQ29sb3IxNihudW0pIHtcbiAgICByZXR1cm4gYCMke251bS50b1N0cmluZygxNil9YDtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTWF0aFV0aWw7XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBJbnRlZ3JhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHR5cGUpIHtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICB9XG5cbiAgY2FsY3VsYXRlKHBhcnRpY2xlcywgdGltZSwgZGFtcGluZykge1xuICAgIHRoaXMuZXVsZXJJbnRlZ3JhdGUocGFydGljbGVzLCB0aW1lLCBkYW1waW5nKTtcbiAgfVxuXG4gIC8vIEV1bGVyIEludGVncmF0ZVxuICAvLyBodHRwczovL3Jvc2V0dGFjb2RlLm9yZy93aWtpL0V1bGVyX21ldGhvZFxuICBldWxlckludGVncmF0ZShwYXJ0aWNsZSwgdGltZSwgZGFtcGluZykge1xuICAgIGlmICghcGFydGljbGUuc2xlZXApIHtcbiAgICAgIHBhcnRpY2xlLm9sZC5wLmNvcHkocGFydGljbGUucCk7XG4gICAgICBwYXJ0aWNsZS5vbGQudi5jb3B5KHBhcnRpY2xlLnYpO1xuXG4gICAgICBwYXJ0aWNsZS5hLm11bHRpcGx5U2NhbGFyKDEgLyBwYXJ0aWNsZS5tYXNzKTtcbiAgICAgIHBhcnRpY2xlLnYuYWRkKHBhcnRpY2xlLmEubXVsdGlwbHlTY2FsYXIodGltZSkpO1xuICAgICAgcGFydGljbGUucC5hZGQocGFydGljbGUub2xkLnYubXVsdGlwbHlTY2FsYXIodGltZSkpO1xuXG4gICAgICBpZiAoZGFtcGluZykgcGFydGljbGUudi5tdWx0aXBseVNjYWxhcihkYW1waW5nKTtcblxuICAgICAgcGFydGljbGUuYS5jbGVhcigpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IFBvb2wgZnJvbSBcIi4vUG9vbFwiO1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBTdGF0cyBmcm9tIFwiLi4vZGVidWcvU3RhdHNcIjtcbmltcG9ydCBFdmVudERpc3BhdGNoZXIgZnJvbSBcIi4uL2V2ZW50cy9FdmVudERpc3BhdGNoZXJcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuaW1wb3J0IEludGVncmF0aW9uIGZyb20gXCIuLi9tYXRoL0ludGVncmF0aW9uXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb3RvbiB7XG4gIHN0YXRpYyBVU0VfQ0xPQ0sgPSBmYWxzZTtcblxuICAvLyBtZWFzdXJlIDE6MTAwXG4gIHN0YXRpYyBNRUFTVVJFID0gMTAwO1xuICBzdGF0aWMgRVVMRVIgPSBcImV1bGVyXCI7XG4gIHN0YXRpYyBSSzIgPSBcInJ1bmdlLWt1dHRhMlwiO1xuXG4gIC8vIGV2ZW50IG5hbWVcbiAgc3RhdGljIFBBUlRJQ0xFX0NSRUFURUQgPSBcIlBBUlRJQ0xFX0NSRUFURURcIjtcbiAgc3RhdGljIFBBUlRJQ0xFX1VQREFURSA9IFwiUEFSVElDTEVfVVBEQVRFXCI7XG4gIHN0YXRpYyBQQVJUSUNMRV9TTEVFUCA9IFwiUEFSVElDTEVfU0xFRVBcIjtcbiAgc3RhdGljIFBBUlRJQ0xFX0RFQUQgPSBcIlBBUlRJQ0xFX0RFQURcIjtcblxuICBzdGF0aWMgRU1JVFRFUl9BRERFRCA9IFwiRU1JVFRFUl9BRERFRFwiO1xuICBzdGF0aWMgRU1JVFRFUl9SRU1PVkVEID0gXCJFTUlUVEVSX1JFTU9WRURcIjtcblxuICBzdGF0aWMgUFJPVE9OX1VQREFURSA9IFwiUFJPVE9OX1VQREFURVwiO1xuICBzdGF0aWMgUFJPVE9OX1VQREFURV9BRlRFUiA9IFwiUFJPVE9OX1VQREFURV9BRlRFUlwiO1xuICBzdGF0aWMgREVGQVVMVF9JTlRFUlZBTCA9IDAuMDE2NztcblxuICBzdGF0aWMgYW1lbmRDaGFuZ2VUYWJzQnVnID0gdHJ1ZTtcblxuICAvKipcbiAgICogVGhlIGNvbnN0cnVjdG9yIHRvIGFkZCBlbWl0dGVyc1xuICAgKlxuICAgKiBAY29uc3RydWN0b3IgUHJvdG9uXG4gICAqXG4gICAqIEB0b2RvIGFkZCBtb3JlIGRvY3VtZW50YXRpb24gb2YgdGhlIHNpbmdsZSBwcm9wZXJ0aWVzIGFuZCBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgdW5kZWZpbmVkfSBbaW50ZWdyYXRpb25UeXBlPVByb3Rvbi5FVUxFUl1cbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IFtpbnRlZ3JhdGlvblR5cGU9UHJvdG9uLkVVTEVSXVxuICAgKiBAcHJvcGVydHkge0FycmF5fSBlbWl0dGVycyAgIEFsbCBhZGRlZCBlbWl0dGVyXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXl9IHJlbmRlcmVycyAgQWxsIGFkZGVkIHJlbmRlcmVyXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSB0aW1lICAgICAgVGhlIGFjdGl2ZSB0aW1lXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBvbGR0aW1lICAgVGhlIG9sZCB0aW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihpbnRlZ3JhdGlvblR5cGUpIHtcbiAgICB0aGlzLmVtaXR0ZXJzID0gW107XG4gICAgdGhpcy5yZW5kZXJlcnMgPSBbXTtcblxuICAgIHRoaXMudGltZSA9IDA7XG4gICAgdGhpcy5ub3cgPSAwO1xuICAgIHRoaXMudGhlbiA9IDA7XG4gICAgdGhpcy5lbGFwc2VkID0gMDtcblxuICAgIHRoaXMuc3RhdHMgPSBuZXcgU3RhdHModGhpcyk7XG4gICAgdGhpcy5wb29sID0gbmV3IFBvb2woODApO1xuXG4gICAgdGhpcy5pbnRlZ3JhdGlvblR5cGUgPSBVdGlsLmluaXRWYWx1ZShpbnRlZ3JhdGlvblR5cGUsIFByb3Rvbi5FVUxFUik7XG4gICAgdGhpcy5pbnRlZ3JhdG9yID0gbmV3IEludGVncmF0aW9uKHRoaXMuaW50ZWdyYXRpb25UeXBlKTtcblxuICAgIHRoaXMuX2ZwcyA9IFwiYXV0b1wiO1xuICAgIHRoaXMuX2ludGVydmFsID0gUHJvdG9uLkRFRkFVTFRfSU5URVJWQUw7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZnJhbWVzIHBlciBzZWNvbmQgKEZQUykgZm9yIHRoZSBQcm90b24gc3lzdGVtLlxuICAgKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IGZwcyAtIFRoZSBkZXNpcmVkIEZQUy4gVXNlIFwiYXV0b1wiIGZvciBkZWZhdWx0IGJlaGF2aW9yLCBvciBhIG51bWJlciBmb3IgYSBzcGVjaWZpYyBGUFMuXG4gICAqL1xuICBzZXQgZnBzKGZwcykge1xuICAgIHRoaXMuX2ZwcyA9IGZwcztcbiAgICB0aGlzLl9pbnRlcnZhbCA9IGZwcyA9PT0gXCJhdXRvXCIgPyBQcm90b24uREVGQVVMVF9JTlRFUlZBTCA6IE1hdGhVdGlsLmZsb29yKDEgLyBmcHMsIDcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgZnJhbWVzIHBlciBzZWNvbmQgKEZQUykgc2V0dGluZy5cbiAgICogQHJldHVybnMge251bWJlcnxzdHJpbmd9IFRoZSBjdXJyZW50IEZQUyBzZXR0aW5nLiBSZXR1cm5zIFwiYXV0b1wiIGlmIHNldCB0byBkZWZhdWx0LCBvciBhIG51bWJlciByZXByZXNlbnRpbmcgdGhlIHNwZWNpZmljIEZQUy5cbiAgICovXG4gIGdldCBmcHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZwcztcbiAgfVxuXG4gIC8qKlxuICAgKiBhZGQgYSB0eXBlIG9mIFJlbmRlcmVyXG4gICAqXG4gICAqIEBtZXRob2QgYWRkUmVuZGVyZXJcbiAgICogQG1lbWJlcm9mIFByb3RvblxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtSZW5kZXJlcn0gcmVuZGVyXG4gICAqL1xuICBhZGRSZW5kZXJlcihyZW5kZXIpIHtcbiAgICByZW5kZXIuaW5pdCh0aGlzKTtcbiAgICB0aGlzLnJlbmRlcmVycy5wdXNoKHJlbmRlcik7XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgYWRkIGEgdHlwZSBvZiBSZW5kZXJlclxuICAgKlxuICAgKiBAbWV0aG9kIGFkZFJlbmRlcmVyXG4gICAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlclxuICAgKi9cbiAgcmVtb3ZlUmVuZGVyZXIocmVuZGVyKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnJlbmRlcmVycy5pbmRleE9mKHJlbmRlcik7XG4gICAgdGhpcy5yZW5kZXJlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICByZW5kZXIucmVtb3ZlKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZCB0aGUgRW1pdHRlclxuICAgKlxuICAgKiBAbWV0aG9kIGFkZEVtaXR0ZXJcbiAgICogQG1lbWJlcm9mIFByb3RvblxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtFbWl0dGVyfSBlbWl0dGVyXG4gICAqL1xuICBhZGRFbWl0dGVyKGVtaXR0ZXIpIHtcbiAgICB0aGlzLmVtaXR0ZXJzLnB1c2goZW1pdHRlcik7XG4gICAgZW1pdHRlci5wYXJlbnQgPSB0aGlzO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFByb3Rvbi5FTUlUVEVSX0FEREVELCBlbWl0dGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIEVtaXR0ZXJcbiAgICpcbiAgICogQG1ldGhvZCByZW1vdmVFbWl0dGVyXG4gICAqIEBtZW1iZXJvZiBQcm90b25cbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLkVtaXR0ZXJ9IGVtaXR0ZXJcbiAgICovXG4gIHJlbW92ZUVtaXR0ZXIoZW1pdHRlcikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5lbWl0dGVycy5pbmRleE9mKGVtaXR0ZXIpO1xuICAgIHRoaXMuZW1pdHRlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBlbWl0dGVyLnBhcmVudCA9IG51bGw7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoUHJvdG9uLkVNSVRURVJfUkVNT1ZFRCwgZW1pdHRlcik7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBhbGwgYWRkZWQgZW1pdHRlcnNcbiAgICpcbiAgICogQG1ldGhvZCB1cGRhdGVcbiAgICogQG1lbWJlcm9mIFByb3RvblxuICAgKiBAaW5zdGFuY2VcbiAgICovXG4gIHVwZGF0ZSgpIHtcbiAgICAvLyAnYXV0bycgaXMgdGhlIGRlZmF1bHQgYnJvd3NlciByZWZyZXNoIHJhdGUsIHRoZSB2YXN0IG1ham9yaXR5IGlzIDYwZnBzXG4gICAgaWYgKHRoaXMuX2ZwcyA9PT0gXCJhdXRvXCIpIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChQcm90b24uUFJPVE9OX1VQREFURSk7XG5cbiAgICAgIGlmIChQcm90b24uVVNFX0NMT0NLKSB7XG4gICAgICAgIGlmICghdGhpcy50aGVuKSB0aGlzLnRoZW4gPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgdGhpcy5ub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgdGhpcy5lbGFwc2VkID0gKHRoaXMubm93IC0gdGhpcy50aGVuKSAqIDAuMDAxO1xuICAgICAgICAvLyBGaXggYnVncyBzdWNoIGFzIGNocm9tZSBicm93c2VyIHN3aXRjaGluZyB0YWJzIGNhdXNpbmcgZXhjZXNzaXZlIHRpbWUgZGlmZmVyZW5jZVxuICAgICAgICB0aGlzLmFtZW5kQ2hhbmdlVGFic0J1ZygpO1xuXG4gICAgICAgIGlmICh0aGlzLmVsYXBzZWQgPiAwKSB0aGlzLmVtaXR0ZXJzVXBkYXRlKHRoaXMuZWxhcHNlZCk7XG4gICAgICAgIHRoaXMudGhlbiA9IHRoaXMubm93O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbWl0dGVyc1VwZGF0ZShQcm90b24uREVGQVVMVF9JTlRFUlZBTCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChQcm90b24uUFJPVE9OX1VQREFURV9BRlRFUik7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGZwcyBmcmFtZSByYXRlIGlzIHNldFxuICAgIGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLnRoZW4pIHRoaXMudGhlbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgdGhpcy5ub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgIHRoaXMuZWxhcHNlZCA9ICh0aGlzLm5vdyAtIHRoaXMudGhlbikgKiAwLjAwMTtcblxuICAgICAgaWYgKHRoaXMuZWxhcHNlZCA+IHRoaXMuX2ludGVydmFsKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChQcm90b24uUFJPVE9OX1VQREFURSk7XG4gICAgICAgIHRoaXMuZW1pdHRlcnNVcGRhdGUodGhpcy5faW50ZXJ2YWwpO1xuICAgICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xOTc2NDAxOC9jb250cm9sbGluZy1mcHMtd2l0aC1yZXF1ZXN0YW5pbWF0aW9uZnJhbWVcbiAgICAgICAgdGhpcy50aGVuID0gdGhpcy5ub3cgLSAodGhpcy5lbGFwc2VkICUgdGhpcy5faW50ZXJ2YWwpICogMTAwMDtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFByb3Rvbi5QUk9UT05fVVBEQVRFX0FGVEVSKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBlbWl0dGVyc1VwZGF0ZShlbGFwc2VkKSB7XG4gICAgbGV0IGkgPSB0aGlzLmVtaXR0ZXJzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB0aGlzLmVtaXR0ZXJzW2ldLnVwZGF0ZShlbGFwc2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICpcbiAgICogQG1ldGhvZCBhbWVuZENoYW5nZVRhYnNCdWdcbiAgICogQG1lbWJlcm9mIFByb3RvblxuICAgKiBAaW5zdGFuY2VcbiAgICovXG4gIGFtZW5kQ2hhbmdlVGFic0J1ZygpIHtcbiAgICBpZiAoIVByb3Rvbi5hbWVuZENoYW5nZVRhYnNCdWcpIHJldHVybjtcbiAgICBpZiAodGhpcy5lbGFwc2VkID4gMC41KSB7XG4gICAgICB0aGlzLnRoZW4gPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgIHRoaXMuZWxhcHNlZCA9IDA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvdW50cyBhbGwgcGFydGljbGVzIGZyb20gYWxsIGVtaXR0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgZ2V0Q291bnRcbiAgICogQG1lbWJlcm9mIFByb3RvblxuICAgKiBAaW5zdGFuY2VcbiAgICovXG4gIGdldENvdW50KCkge1xuICAgIGxldCB0b3RhbCA9IDA7XG4gICAgbGV0IGkgPSB0aGlzLmVtaXR0ZXJzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHRvdGFsICs9IHRoaXMuZW1pdHRlcnNbaV0ucGFydGljbGVzLmxlbmd0aDtcbiAgICByZXR1cm4gdG90YWw7XG4gIH1cblxuICBnZXRBbGxQYXJ0aWNsZXMoKSB7XG4gICAgbGV0IHBhcnRpY2xlcyA9IFtdO1xuICAgIGxldCBpID0gdGhpcy5lbWl0dGVycy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaS0tKSBwYXJ0aWNsZXMgPSBwYXJ0aWNsZXMuY29uY2F0KHRoaXMuZW1pdHRlcnNbaV0ucGFydGljbGVzKTtcbiAgICByZXR1cm4gcGFydGljbGVzO1xuICB9XG5cbiAgZGVzdHJveUFsbEVtaXR0ZXJzKCkge1xuICAgIFV0aWwuZGVzdHJveUFsbCh0aGlzLmVtaXR0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyBldmVyeXRoaW5nIHJlbGF0ZWQgdG8gdGhpcyBQcm90b24gaW5zdGFuY2UuIFRoaXMgaW5jbHVkZXMgYWxsIGVtaXR0ZXJzLCBhbmQgYWxsIHByb3BlcnRpZXNcbiAgICpcbiAgICogQG1ldGhvZCBkZXN0cm95XG4gICAqIEBtZW1iZXJvZiBQcm90b25cbiAgICogQGluc3RhbmNlXG4gICAqL1xuICBkZXN0cm95KHJlbW92ZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgZGVzdHJveU90aGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy50aW1lID0gMDtcbiAgICAgIHRoaXMudGhlbiA9IDA7XG4gICAgICB0aGlzLnBvb2wuZGVzdHJveSgpO1xuICAgICAgdGhpcy5zdGF0cy5kZXN0cm95KCk7XG5cbiAgICAgIFV0aWwuZGVzdHJveUFsbCh0aGlzLmVtaXR0ZXJzKTtcbiAgICAgIFV0aWwuZGVzdHJveUFsbCh0aGlzLnJlbmRlcmVycywgdGhpcy5nZXRBbGxQYXJ0aWNsZXMoKSk7XG5cbiAgICAgIHRoaXMuaW50ZWdyYXRvciA9IG51bGw7XG4gICAgICB0aGlzLnJlbmRlcmVycyA9IG51bGw7XG4gICAgICB0aGlzLmVtaXR0ZXJzID0gbnVsbDtcbiAgICAgIHRoaXMuc3RhdHMgPSBudWxsO1xuICAgICAgdGhpcy5wb29sID0gbnVsbDtcbiAgICB9O1xuXG4gICAgaWYgKHJlbW92ZSkge1xuICAgICAgc2V0VGltZW91dChkZXN0cm95T3RoZXIsIDIwMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc3Ryb3lPdGhlcigpO1xuICAgIH1cbiAgfVxufVxuXG5FdmVudERpc3BhdGNoZXIuYmluZChQcm90b24pO1xuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmdiIHtcbiAgY29uc3RydWN0b3IociA9IDI1NSwgZyA9IDI1NSwgYiA9IDI1NSkge1xuICAgIHRoaXMuciA9IHI7XG4gICAgdGhpcy5nID0gZztcbiAgICB0aGlzLmIgPSBiO1xuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5yID0gMjU1O1xuICAgIHRoaXMuZyA9IDI1NTtcbiAgICB0aGlzLmIgPSAyNTU7XG4gIH1cbn1cbiIsImltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgc3BhbiBvZiB2YWx1ZXMgb3IgYW4gYXJyYXkuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNwYW4ge1xuICAvKipcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0FycmF5O1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7bnVtYmVyfG51bWJlcltdfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYTtcblxuICAvKipcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGI7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2VudGVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFNwYW4gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfG51bWJlcltdfSBhIC0gVGhlIGZpcnN0IHZhbHVlIG9yIGFuIGFycmF5IG9mIHZhbHVlcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtiXSAtIFRoZSBzZWNvbmQgdmFsdWUgKGlmIGEgaXMgbm90IGFuIGFycmF5KS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbY2VudGVyPWZhbHNlXSAtIFdoZXRoZXIgdG8gdXNlIGNlbnRlci1iYXNlZCBjYWxjdWxhdGlvbi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGEsIGIsIGNlbnRlcikge1xuICAgIGlmIChVdGlsLmlzQXJyYXkoYSkpIHtcbiAgICAgIHRoaXMuaXNBcnJheSA9IHRydWU7XG4gICAgICB0aGlzLmEgPSBhO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzQXJyYXkgPSBmYWxzZTtcbiAgICAgIHRoaXMuYSA9IFV0aWwuaW5pdFZhbHVlKGEsIDEpO1xuICAgICAgdGhpcy5iID0gVXRpbC5pbml0VmFsdWUoYiwgdGhpcy5hKTtcbiAgICAgIHRoaXMuY2VudGVyID0gVXRpbC5pbml0VmFsdWUoY2VudGVyLCBmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSB2YWx1ZSBmcm9tIHRoZSBzcGFuLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0ludD1mYWxzZV0gLSBXaGV0aGVyIHRvIHJldHVybiBhbiBpbnRlZ2VyIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBBIHJhbmRvbSB2YWx1ZSBmcm9tIHRoZSBzcGFuLlxuICAgKi9cbiAgZ2V0VmFsdWUoaXNJbnQgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmlzQXJyYXkpIHtcbiAgICAgIHJldHVybiBVdGlsLmdldFJhbmRGcm9tQXJyYXkodGhpcy5hKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLmNlbnRlcikge1xuICAgICAgICByZXR1cm4gTWF0aFV0aWwucmFuZG9tQVRvQih0aGlzLmEsIHRoaXMuYiwgaXNJbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE1hdGhVdGlsLnJhbmRvbUZsb2F0aW5nKHRoaXMuYSwgdGhpcy5iLCBpc0ludCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBuZXcgU3BhbiBvYmplY3QuXG4gICAqIEBwYXJhbSB7KnxTcGFufSBhIC0gVGhlIGZpcnN0IHZhbHVlIG9yIGEgU3BhbiBvYmplY3QuXG4gICAqIEBwYXJhbSB7Kn0gW2JdIC0gVGhlIHNlY29uZCB2YWx1ZS5cbiAgICogQHBhcmFtIHsqfSBbY10gLSBUaGUgdGhpcmQgdmFsdWUuXG4gICAqIEByZXR1cm5zIHtTcGFufSBBIG5ldyBTcGFuIGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIHNldFNwYW5WYWx1ZShhLCBiLCBjKSB7XG4gICAgaWYgKGEgaW5zdGFuY2VvZiBTcGFuKSB7XG4gICAgICByZXR1cm4gYTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbmV3IFNwYW4oYSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoYyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbmV3IFNwYW4oYSwgYik7XG4gICAgICAgIGVsc2UgcmV0dXJuIG5ldyBTcGFuKGEsIGIsIGMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmcm9tIGEgU3BhbiwgaWYgdGhlIHBhcmFtIGlzIG5vdCBhIFNwYW4gaXQgd2lsbCByZXR1cm4gdGhlIGdpdmVuIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHsqfFNwYW59IHBhbiAtIFRoZSB2YWx1ZSBvciBTcGFuIHRvIGdldCB0aGUgdmFsdWUgZnJvbS5cbiAgICogQHJldHVybnMgeyp9IFRoZSB2YWx1ZSBvZiBTcGFuIE9SIHRoZSBwYXJhbWV0ZXIgaWYgaXQgaXMgbm90IGEgU3Bhbi5cbiAgICovXG4gIHN0YXRpYyBnZXRTcGFuVmFsdWUocGFuKSB7XG4gICAgcmV0dXJuIHBhbiBpbnN0YW5jZW9mIFNwYW4gPyBwYW4uZ2V0VmFsdWUoKSA6IHBhbjtcbiAgfVxufVxuIiwiaW1wb3J0IFNwYW4gZnJvbSBcIi4uL21hdGgvU3BhblwiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGhhc1Byb3AodGFyZ2V0LCBrZXkpIHtcbiAgICBpZiAoIXRhcmdldCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIC8vIHJldHVybiBvYmouaGFzT3duUHJvcGVydHkoa2V5KTtcbiAgfSxcblxuICAvKipcbiAgICogc2V0IHRoZSBwcm90b3R5cGUgaW4gYSBnaXZlbiBwcm90b3R5cGVPYmplY3RcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIHNldFByb3BcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciBwYXJhbSBgdGFyZ2V0YFxuICAgKiBAdG9kbyB0cmFuc2xhdGUgZGVzcmlwdGlvbiBmcm9tIGNoaW5lc2UgdG8gZW5nbGlzaFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGVPYmplY3QgQW4gb2JqZWN0IG9mIHNpbmdsZSBwcm90b3R5cGVzXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH0gdGFyZ2V0XG4gICAqL1xuICBzZXRQcm9wKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKGxldCBwcm9wIGluIHByb3BzKSB7XG4gICAgICBpZiAodGFyZ2V0Lmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgIHRhcmdldFtwcm9wXSA9IFNwYW4uZ2V0U3BhblZhbHVlKHByb3BzW3Byb3BdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5VdGlsXG4gICAqIEBtZXRob2Qgc2V0VmVjdG9yVmFsXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiBmb3IgcGFyYW0gYHRhcmdldGBcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciBwYXJhbSBgY29uZmBcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciBmdW5jdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb25mXG4gICAqL1xuICBzZXRWZWN0b3JWYWwocGFydGljbGUsIGNvbmYgPSBudWxsKSB7XG4gICAgaWYgKCFjb25mKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwieFwiKSkgcGFydGljbGUucC54ID0gY29uZltcInhcIl07XG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcInlcIikpIHBhcnRpY2xlLnAueSA9IGNvbmZbXCJ5XCJdO1xuXG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcInZ4XCIpKSBwYXJ0aWNsZS52LnggPSBjb25mW1widnhcIl07XG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcInZ5XCIpKSBwYXJ0aWNsZS52LnkgPSBjb25mW1widnlcIl07XG5cbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwiYXhcIikpIHBhcnRpY2xlLmEueCA9IGNvbmZbXCJheFwiXTtcbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwiYXlcIikpIHBhcnRpY2xlLmEueSA9IGNvbmZbXCJheVwiXTtcblxuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJwXCIpKSBwYXJ0aWNsZS5wLmNvcHkoY29uZltcInBcIl0pO1xuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJ2XCIpKSBwYXJ0aWNsZS52LmNvcHkoY29uZltcInZcIl0pO1xuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJhXCIpKSBwYXJ0aWNsZS5hLmNvcHkoY29uZltcImFcIl0pO1xuXG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcInBvc2l0aW9uXCIpKSBwYXJ0aWNsZS5wLmNvcHkoY29uZltcInBvc2l0aW9uXCJdKTtcbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwidmVsb2NpdHlcIikpIHBhcnRpY2xlLnYuY29weShjb25mW1widmVsb2NpdHlcIl0pO1xuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJhY2NlbGVyYXRlXCIpKSBwYXJ0aWNsZS5hLmNvcHkoY29uZltcImFjY2VsZXJhdGVcIl0pO1xuICB9XG59O1xuIiwiaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuL01hdGhVdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZWFzZUxpbmVhcih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcblxuICBlYXNlSW5RdWFkKHZhbHVlKSB7XG4gICAgcmV0dXJuIE1hdGgucG93KHZhbHVlLCAyKTtcbiAgfSxcblxuICBlYXNlT3V0UXVhZCh2YWx1ZSkge1xuICAgIHJldHVybiAtKE1hdGgucG93KHZhbHVlIC0gMSwgMikgLSAxKTtcbiAgfSxcblxuICBlYXNlSW5PdXRRdWFkKHZhbHVlKSB7XG4gICAgaWYgKCh2YWx1ZSAvPSAwLjUpIDwgMSkgcmV0dXJuIDAuNSAqIE1hdGgucG93KHZhbHVlLCAyKTtcblxuICAgIHJldHVybiAtMC41ICogKCh2YWx1ZSAtPSAyKSAqIHZhbHVlIC0gMik7XG4gIH0sXG5cbiAgZWFzZUluQ3ViaWModmFsdWUpIHtcbiAgICByZXR1cm4gTWF0aC5wb3codmFsdWUsIDMpO1xuICB9LFxuXG4gIGVhc2VPdXRDdWJpYyh2YWx1ZSkge1xuICAgIHJldHVybiBNYXRoLnBvdyh2YWx1ZSAtIDEsIDMpICsgMTtcbiAgfSxcblxuICBlYXNlSW5PdXRDdWJpYyh2YWx1ZSkge1xuICAgIGlmICgodmFsdWUgLz0gMC41KSA8IDEpIHJldHVybiAwLjUgKiBNYXRoLnBvdyh2YWx1ZSwgMyk7XG5cbiAgICByZXR1cm4gMC41ICogKE1hdGgucG93KHZhbHVlIC0gMiwgMykgKyAyKTtcbiAgfSxcblxuICBlYXNlSW5RdWFydCh2YWx1ZSkge1xuICAgIHJldHVybiBNYXRoLnBvdyh2YWx1ZSwgNCk7XG4gIH0sXG5cbiAgZWFzZU91dFF1YXJ0KHZhbHVlKSB7XG4gICAgcmV0dXJuIC0oTWF0aC5wb3codmFsdWUgLSAxLCA0KSAtIDEpO1xuICB9LFxuXG4gIGVhc2VJbk91dFF1YXJ0KHZhbHVlKSB7XG4gICAgaWYgKCh2YWx1ZSAvPSAwLjUpIDwgMSkgcmV0dXJuIDAuNSAqIE1hdGgucG93KHZhbHVlLCA0KTtcblxuICAgIHJldHVybiAtMC41ICogKCh2YWx1ZSAtPSAyKSAqIE1hdGgucG93KHZhbHVlLCAzKSAtIDIpO1xuICB9LFxuXG4gIGVhc2VJblNpbmUodmFsdWUpIHtcbiAgICByZXR1cm4gLU1hdGguY29zKHZhbHVlICogTWF0aFV0aWwuUElfMikgKyAxO1xuICB9LFxuXG4gIGVhc2VPdXRTaW5lKHZhbHVlKSB7XG4gICAgcmV0dXJuIE1hdGguc2luKHZhbHVlICogTWF0aFV0aWwuUElfMik7XG4gIH0sXG5cbiAgZWFzZUluT3V0U2luZSh2YWx1ZSkge1xuICAgIHJldHVybiAtMC41ICogKE1hdGguY29zKE1hdGguUEkgKiB2YWx1ZSkgLSAxKTtcbiAgfSxcblxuICBlYXNlSW5FeHBvKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gMCA6IE1hdGgucG93KDIsIDEwICogKHZhbHVlIC0gMSkpO1xuICB9LFxuXG4gIGVhc2VPdXRFeHBvKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAxID8gMSA6IC1NYXRoLnBvdygyLCAtMTAgKiB2YWx1ZSkgKyAxO1xuICB9LFxuXG4gIGVhc2VJbk91dEV4cG8odmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IDApIHJldHVybiAwO1xuXG4gICAgaWYgKHZhbHVlID09PSAxKSByZXR1cm4gMTtcblxuICAgIGlmICgodmFsdWUgLz0gMC41KSA8IDEpIHJldHVybiAwLjUgKiBNYXRoLnBvdygyLCAxMCAqICh2YWx1ZSAtIDEpKTtcblxuICAgIHJldHVybiAwLjUgKiAoLU1hdGgucG93KDIsIC0xMCAqIC0tdmFsdWUpICsgMik7XG4gIH0sXG5cbiAgZWFzZUluQ2lyYyh2YWx1ZSkge1xuICAgIHJldHVybiAtKE1hdGguc3FydCgxIC0gdmFsdWUgKiB2YWx1ZSkgLSAxKTtcbiAgfSxcblxuICBlYXNlT3V0Q2lyYyh2YWx1ZSkge1xuICAgIHJldHVybiBNYXRoLnNxcnQoMSAtIE1hdGgucG93KHZhbHVlIC0gMSwgMikpO1xuICB9LFxuXG4gIGVhc2VJbk91dENpcmModmFsdWUpIHtcbiAgICBpZiAoKHZhbHVlIC89IDAuNSkgPCAxKSByZXR1cm4gLTAuNSAqIChNYXRoLnNxcnQoMSAtIHZhbHVlICogdmFsdWUpIC0gMSk7XG4gICAgcmV0dXJuIDAuNSAqIChNYXRoLnNxcnQoMSAtICh2YWx1ZSAtPSAyKSAqIHZhbHVlKSArIDEpO1xuICB9LFxuXG4gIGVhc2VJbkJhY2sodmFsdWUpIHtcbiAgICBsZXQgcyA9IDEuNzAxNTg7XG4gICAgcmV0dXJuIHZhbHVlICogdmFsdWUgKiAoKHMgKyAxKSAqIHZhbHVlIC0gcyk7XG4gIH0sXG5cbiAgZWFzZU91dEJhY2sodmFsdWUpIHtcbiAgICBsZXQgcyA9IDEuNzAxNTg7XG4gICAgcmV0dXJuICh2YWx1ZSA9IHZhbHVlIC0gMSkgKiB2YWx1ZSAqICgocyArIDEpICogdmFsdWUgKyBzKSArIDE7XG4gIH0sXG5cbiAgZWFzZUluT3V0QmFjayh2YWx1ZSkge1xuICAgIGxldCBzID0gMS43MDE1ODtcbiAgICBpZiAoKHZhbHVlIC89IDAuNSkgPCAxKSByZXR1cm4gMC41ICogKHZhbHVlICogdmFsdWUgKiAoKChzICo9IDEuNTI1KSArIDEpICogdmFsdWUgLSBzKSk7XG4gICAgcmV0dXJuIDAuNSAqICgodmFsdWUgLT0gMikgKiB2YWx1ZSAqICgoKHMgKj0gMS41MjUpICsgMSkgKiB2YWx1ZSArIHMpICsgMik7XG4gIH0sXG5cbiAgZ2V0RWFzaW5nKGVhc2UpIHtcbiAgICBpZiAodHlwZW9mIGVhc2UgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGVhc2U7XG4gICAgZWxzZSByZXR1cm4gdGhpc1tlYXNlXSB8fCB0aGlzLmVhc2VMaW5lYXI7XG4gIH1cbn07XG4iLCJpbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVjdG9yMkQge1xuICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgeDtcblxuICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgeTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBWZWN0b3IyRCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIHggY29vcmRpbmF0ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIHkgY29vcmRpbmF0ZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHgsIHkpIHtcbiAgICB0aGlzLnggPSB4IHx8IDA7XG4gICAgdGhpcy55ID0geSB8fCAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHggYW5kIHkgY29tcG9uZW50cyBvZiB0aGlzIHZlY3Rvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlLlxuICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUuXG4gICAqIEByZXR1cm5zIHtWZWN0b3IyRH0gVGhpcyB2ZWN0b3IuXG4gICAqL1xuICBzZXQoeCwgeSkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB4IGNvbXBvbmVudCBvZiB0aGlzIHZlY3Rvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlLlxuICAgKiBAcmV0dXJucyB7VmVjdG9yMkR9IFRoaXMgdmVjdG9yLlxuICAgKi9cbiAgc2V0WCh4KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB5IGNvbXBvbmVudCBvZiB0aGlzIHZlY3Rvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlLlxuICAgKiBAcmV0dXJucyB7VmVjdG9yMkR9IFRoaXMgdmVjdG9yLlxuICAgKi9cbiAgc2V0WSh5KSB7XG4gICAgdGhpcy55ID0geTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBncmFkaWVudCAoYW5nbGUpIG9mIHRoaXMgdmVjdG9yLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgZ3JhZGllbnQgaW4gcmFkaWFucy5cbiAgICovXG4gIGdldEdyYWRpZW50KCkge1xuICAgIGlmICh0aGlzLnggIT09IDApIHJldHVybiBNYXRoLmF0YW4yKHRoaXMueSwgdGhpcy54KTtcbiAgICBlbHNlIGlmICh0aGlzLnkgPiAwKSByZXR1cm4gTWF0aFV0aWwuUElfMjtcbiAgICBlbHNlIGlmICh0aGlzLnkgPCAwKSByZXR1cm4gLU1hdGhVdGlsLlBJXzI7XG4gIH1cblxuICAvKipcbiAgICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgYW5vdGhlciB2ZWN0b3IgdG8gdGhpcyBvbmUuXG4gICAqIEBwYXJhbSB7VmVjdG9yMkR9IHYgLSBUaGUgdmVjdG9yIHRvIGNvcHkgZnJvbS5cbiAgICogQHJldHVybnMge1ZlY3RvcjJEfSBUaGlzIHZlY3Rvci5cbiAgICovXG4gIGNvcHkodikge1xuICAgIHRoaXMueCA9IHYueDtcbiAgICB0aGlzLnkgPSB2Lnk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFub3RoZXIgdmVjdG9yIHRvIHRoaXMgb25lLlxuICAgKiBAcGFyYW0ge1ZlY3RvcjJEfSB2IC0gVGhlIHZlY3RvciB0byBhZGQuXG4gICAqIEBwYXJhbSB7VmVjdG9yMkR9IFt3XSAtIEFuIG9wdGlvbmFsIHNlY29uZCB2ZWN0b3IgdG8gYWRkLlxuICAgKiBAcmV0dXJucyB7VmVjdG9yMkR9IFRoaXMgdmVjdG9yLlxuICAgKi9cbiAgYWRkKHYsIHcpIHtcbiAgICBpZiAodyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGRWZWN0b3JzKHYsIHcpO1xuICAgIH1cblxuICAgIHRoaXMueCArPSB2Lng7XG4gICAgdGhpcy55ICs9IHYueTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgc2NhbGFyIHZhbHVlcyB0byB0aGlzIHZlY3RvcidzIGNvbXBvbmVudHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhIC0gVmFsdWUgdG8gYWRkIHRvIHguXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gVmFsdWUgdG8gYWRkIHRvIHkuXG4gICAqIEByZXR1cm5zIHtWZWN0b3IyRH0gVGhpcyB2ZWN0b3IuXG4gICAqL1xuICBhZGRYWShhLCBiKSB7XG4gICAgdGhpcy54ICs9IGE7XG4gICAgdGhpcy55ICs9IGI7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHR3byB2ZWN0b3JzIGFuZCBzZXRzIHRoZSByZXN1bHQgdG8gdGhpcyB2ZWN0b3IuXG4gICAqIEBwYXJhbSB7VmVjdG9yMkR9IGEgLSBUaGUgZmlyc3QgdmVjdG9yIHRvIGFkZC5cbiAgICogQHBhcmFtIHtWZWN0b3IyRH0gYiAtIFRoZSBzZWNvbmQgdmVjdG9yIHRvIGFkZC5cbiAgICogQHJldHVybnMge1ZlY3RvcjJEfSBUaGlzIHZlY3Rvci5cbiAgICovXG4gIGFkZFZlY3RvcnMoYSwgYikge1xuICAgIHRoaXMueCA9IGEueCArIGIueDtcbiAgICB0aGlzLnkgPSBhLnkgKyBiLnk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJ0cmFjdHMgYW5vdGhlciB2ZWN0b3IgZnJvbSB0aGlzIG9uZS5cbiAgICogQHBhcmFtIHtWZWN0b3IyRH0gdiAtIFRoZSB2ZWN0b3IgdG8gc3VidHJhY3QuXG4gICAqIEBwYXJhbSB7VmVjdG9yMkR9IFt3XSAtIEFuIG9wdGlvbmFsIHNlY29uZCB2ZWN0b3IgdG8gc3VidHJhY3QuXG4gICAqIEByZXR1cm5zIHtWZWN0b3IyRH0gVGhpcyB2ZWN0b3IuXG4gICAqL1xuICBzdWIodiwgdykge1xuICAgIGlmICh3ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnN1YlZlY3RvcnModiwgdyk7XG4gICAgfVxuXG4gICAgdGhpcy54IC09IHYueDtcbiAgICB0aGlzLnkgLT0gdi55O1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU3VidHJhY3RzIG9uZSB2ZWN0b3IgZnJvbSBhbm90aGVyIGFuZCBzZXRzIHRoZSByZXN1bHQgdG8gdGhpcyB2ZWN0b3IuXG4gICAqIEBwYXJhbSB7VmVjdG9yMkR9IGEgLSBUaGUgdmVjdG9yIHRvIHN1YnRyYWN0IGZyb20uXG4gICAqIEBwYXJhbSB7VmVjdG9yMkR9IGIgLSBUaGUgdmVjdG9yIHRvIHN1YnRyYWN0LlxuICAgKiBAcmV0dXJucyB7VmVjdG9yMkR9IFRoaXMgdmVjdG9yLlxuICAgKi9cbiAgc3ViVmVjdG9ycyhhLCBiKSB7XG4gICAgdGhpcy54ID0gYS54IC0gYi54O1xuICAgIHRoaXMueSA9IGEueSAtIGIueTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpdmlkZXMgdGhpcyB2ZWN0b3IgYnkgYSBzY2FsYXIuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzIC0gVGhlIHNjYWxhciB0byBkaXZpZGUgYnkuXG4gICAqIEByZXR1cm5zIHtWZWN0b3IyRH0gVGhpcyB2ZWN0b3IuXG4gICAqL1xuICBkaXZpZGVTY2FsYXIocykge1xuICAgIGlmIChzICE9PSAwKSB7XG4gICAgICB0aGlzLnggLz0gcztcbiAgICAgIHRoaXMueSAvPSBzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldCgwLCAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNdWx0aXBsaWVzIHRoaXMgdmVjdG9yIGJ5IGEgc2NhbGFyLlxuICAgKiBAcGFyYW0ge251bWJlcn0gcyAtIFRoZSBzY2FsYXIgdG8gbXVsdGlwbHkgYnkuXG4gICAqIEByZXR1cm5zIHtWZWN0b3IyRH0gVGhpcyB2ZWN0b3IuXG4gICAqL1xuICBtdWx0aXBseVNjYWxhcihzKSB7XG4gICAgdGhpcy54ICo9IHM7XG4gICAgdGhpcy55ICo9IHM7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBOZWdhdGVzIHRoaXMgdmVjdG9yIChpbnZlcnRzIGl0cyBkaXJlY3Rpb24pLlxuICAgKiBAcmV0dXJucyB7VmVjdG9yMkR9IFRoaXMgdmVjdG9yLlxuICAgKi9cbiAgbmVnYXRlKCkge1xuICAgIHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKC0xKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0aGlzIHZlY3RvciB3aXRoIGFub3RoZXIuXG4gICAqIEBwYXJhbSB7VmVjdG9yMkR9IHYgLSBUaGUgb3RoZXIgdmVjdG9yLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgZG90IHByb2R1Y3QuXG4gICAqL1xuICBkb3Qodikge1xuICAgIHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2Lnk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgdGhpcyB2ZWN0b3IuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBzcXVhcmVkIGxlbmd0aC5cbiAgICovXG4gIGxlbmd0aFNxKCkge1xuICAgIHJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIHRoaXMgdmVjdG9yLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbGVuZ3RoLlxuICAgKi9cbiAgbGVuZ3RoKCkge1xuICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIHRoaXMgdmVjdG9yIChtYWtlcyBpdCB1bml0IGxlbmd0aCkuXG4gICAqIEByZXR1cm5zIHtWZWN0b3IyRH0gVGhpcyB2ZWN0b3IuXG4gICAqL1xuICBub3JtYWxpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIGRpc3RhbmNlIHRvIGFub3RoZXIgdmVjdG9yLlxuICAgKiBAcGFyYW0ge1ZlY3RvcjJEfSB2IC0gVGhlIG90aGVyIHZlY3Rvci5cbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIGRpc3RhbmNlLlxuICAgKi9cbiAgZGlzdGFuY2VUbyh2KSB7XG4gICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKHYpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3RhdGVzIHRoaXMgdmVjdG9yIGJ5IGFuIGFuZ2xlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGhhIC0gVGhlIGFuZ2xlIHRvIHJvdGF0ZSBieSAoaW4gcmFkaWFucykuXG4gICAqIEByZXR1cm5zIHtWZWN0b3IyRH0gVGhpcyB2ZWN0b3IuXG4gICAqL1xuICByb3RhdGUodGhhKSB7XG4gICAgY29uc3QgeCA9IHRoaXMueDtcbiAgICBjb25zdCB5ID0gdGhpcy55O1xuXG4gICAgdGhpcy54ID0geCAqIE1hdGguY29zKHRoYSkgKyB5ICogTWF0aC5zaW4odGhhKTtcbiAgICB0aGlzLnkgPSAteCAqIE1hdGguc2luKHRoYSkgKyB5ICogTWF0aC5jb3ModGhhKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgZGlzdGFuY2UgdG8gYW5vdGhlciB2ZWN0b3IuXG4gICAqIEBwYXJhbSB7VmVjdG9yMkR9IHYgLSBUaGUgb3RoZXIgdmVjdG9yLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgc3F1YXJlZCBkaXN0YW5jZS5cbiAgICovXG4gIGRpc3RhbmNlVG9TcXVhcmVkKHYpIHtcbiAgICBjb25zdCBkeCA9IHRoaXMueCAtIHYueDtcbiAgICBjb25zdCBkeSA9IHRoaXMueSAtIHYueTtcblxuICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaW5lYXJseSBpbnRlcnBvbGF0ZXMgdGhpcyB2ZWN0b3IgdG93YXJkIGFub3RoZXIgdmVjdG9yLlxuICAgKiBAcGFyYW0ge1ZlY3RvcjJEfSB2IC0gVGhlIHRhcmdldCB2ZWN0b3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAtIFRoZSBpbnRlcnBvbGF0aW9uIGZhY3RvciAoMC0xKS5cbiAgICogQHJldHVybnMge1ZlY3RvcjJEfSBUaGlzIHZlY3Rvci5cbiAgICovXG4gIGxlcnAodiwgYWxwaGEpIHtcbiAgICB0aGlzLnggKz0gKHYueCAtIHRoaXMueCkgKiBhbHBoYTtcbiAgICB0aGlzLnkgKz0gKHYueSAtIHRoaXMueSkgKiBhbHBoYTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGlzIHZlY3RvciBpcyBlcXVhbCB0byBhbm90aGVyIHZlY3Rvci5cbiAgICogQHBhcmFtIHtWZWN0b3IyRH0gdiAtIFRoZSBvdGhlciB2ZWN0b3IuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgZXF1YWxzKHYpIHtcbiAgICByZXR1cm4gdi54ID09PSB0aGlzLnggJiYgdi55ID09PSB0aGlzLnk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGlzIHZlY3RvciB0byB6ZXJvLlxuICAgKiBAcmV0dXJucyB7VmVjdG9yMkR9IFRoaXMgdmVjdG9yLlxuICAgKi9cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy54ID0gMC4wO1xuICAgIHRoaXMueSA9IDAuMDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHZlY3RvciB3aXRoIHRoZSBzYW1lIHggYW5kIHkgdmFsdWVzIGFzIHRoaXMgb25lLlxuICAgKiBAcmV0dXJucyB7VmVjdG9yMkR9IEEgbmV3IFZlY3RvcjJEIGluc3RhbmNlLlxuICAgKi9cbiAgY2xvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBWZWN0b3IyRCh0aGlzLngsIHRoaXMueSk7XG4gIH1cbn1cbiIsImltcG9ydCBSZ2IgZnJvbSBcIi4uL3V0aWxzL1JnYlwiO1xuaW1wb3J0IFB1aWQgZnJvbSBcIi4uL3V0aWxzL1B1aWRcIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgUHJvcFV0aWwgZnJvbSBcIi4uL3V0aWxzL1Byb3BVdGlsXCI7XG5pbXBvcnQgZWFzZSBmcm9tIFwiLi4vbWF0aC9lYXNlXCI7XG5pbXBvcnQgVmVjdG9yMkQgZnJvbSBcIi4uL21hdGgvVmVjdG9yMkRcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBwYXJ0aWNsZSBpbiBhIHBhcnRpY2xlIHN5c3RlbS5cbiAqIEBjbGFzcyBQYXJ0aWNsZVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXJ0aWNsZSB7XG4gIC8qKiBAdHlwZSB7c3RyaW5nfSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHBhcnRpY2xlICovXG4gIGlkID0gXCJcIjtcblxuICAvKiogQHR5cGUge3twOlZlY3RvcjJELHY6VmVjdG9yMkQsYTpWZWN0b3IyRH19IE9sZCBzdGF0ZSBvZiB0aGUgcGFydGljbGUgKi9cbiAgb2xkID0gbnVsbDtcblxuICAvKiogQHR5cGUge29iamVjdH0gQ3VzdG9tIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJ0aWNsZSAqL1xuICBkYXRhID0gbnVsbDtcblxuICAvKiogQHR5cGUge0JlaGF2aW91cltdfSBBcnJheSBvZiBiZWhhdmlvdXJzIGFwcGxpZWQgdG8gdGhlIHBhcnRpY2xlICovXG4gIGJlaGF2aW91cnMgPSBudWxsO1xuXG4gIC8qKiBAdHlwZSB7VmVjdG9yMkR9IEN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHBhcnRpY2xlICovXG4gIHAgPSBudWxsO1xuXG4gIC8qKiBAdHlwZSB7VmVjdG9yMkR9IEN1cnJlbnQgdmVsb2NpdHkgb2YgdGhlIHBhcnRpY2xlICovXG4gIHYgPSBudWxsO1xuXG4gIC8qKiBAdHlwZSB7VmVjdG9yMkR9IEN1cnJlbnQgYWNjZWxlcmF0aW9uIG9mIHRoZSBwYXJ0aWNsZSAqL1xuICBhID0gbnVsbDtcblxuICAvKiogQHR5cGUge1JnYn0gQ29sb3Igb2YgdGhlIHBhcnRpY2xlICovXG4gIHJnYiA9IG51bGw7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgUGFydGljbGUgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbY29uZl0gQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIHRoZSBwYXJ0aWNsZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZikge1xuICAgIHRoaXMubmFtZSA9IFwiUGFydGljbGVcIjtcbiAgICB0aGlzLmlkID0gUHVpZC5pZCh0aGlzLm5hbWUpO1xuICAgIHRoaXMub2xkID0ge307XG4gICAgdGhpcy5kYXRhID0ge307XG4gICAgdGhpcy5iZWhhdmlvdXJzID0gW107XG5cbiAgICB0aGlzLnAgPSBuZXcgVmVjdG9yMkQoKTtcbiAgICB0aGlzLnYgPSBuZXcgVmVjdG9yMkQoKTtcbiAgICB0aGlzLmEgPSBuZXcgVmVjdG9yMkQoKTtcbiAgICB0aGlzLm9sZC5wID0gbmV3IFZlY3RvcjJEKCk7XG4gICAgdGhpcy5vbGQudiA9IG5ldyBWZWN0b3IyRCgpO1xuICAgIHRoaXMub2xkLmEgPSBuZXcgVmVjdG9yMkQoKTtcblxuICAgIHRoaXMucmdiID0gbmV3IFJnYigpO1xuICAgIHRoaXMucmVzZXQoKTtcbiAgICBjb25mICYmIFByb3BVdGlsLnNldFByb3AodGhpcywgY29uZik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBwYXJ0aWNsZSdzIG1vdmVtZW50IGluIGRlZ3JlZXMuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBkaXJlY3Rpb24gaW4gZGVncmVlc1xuICAgKi9cbiAgZ2V0RGlyZWN0aW9uKCkge1xuICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMudi54LCAtdGhpcy52LnkpICogTWF0aFV0aWwuTjE4MF9QSTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHBhcnRpY2xlIHRvIGl0cyBpbml0aWFsIHN0YXRlLlxuICAgKiBAcmV0dXJucyB7UGFydGljbGV9IFRoZSBwYXJ0aWNsZSBpbnN0YW5jZVxuICAgKi9cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5saWZlID0gSW5maW5pdHk7XG4gICAgdGhpcy5hZ2UgPSAwO1xuXG4gICAgdGhpcy5kZWFkID0gZmFsc2U7XG4gICAgdGhpcy5zbGVlcCA9IGZhbHNlO1xuICAgIHRoaXMuYm9keSA9IG51bGw7XG4gICAgdGhpcy5zcHJpdGUgPSBudWxsO1xuICAgIHRoaXMucGFyZW50ID0gbnVsbDtcblxuICAgIHRoaXMuZW5lcmd5ID0gMTsgLy8gRW5lcmd5IExvc3NcbiAgICB0aGlzLm1hc3MgPSAxO1xuICAgIHRoaXMucmFkaXVzID0gMTA7XG4gICAgdGhpcy5hbHBoYSA9IDE7XG4gICAgdGhpcy5zY2FsZSA9IDE7XG4gICAgdGhpcy5yb3RhdGlvbiA9IDA7XG4gICAgdGhpcy5jb2xvciA9IG51bGw7XG5cbiAgICB0aGlzLnAuc2V0KDAsIDApO1xuICAgIHRoaXMudi5zZXQoMCwgMCk7XG4gICAgdGhpcy5hLnNldCgwLCAwKTtcbiAgICB0aGlzLm9sZC5wLnNldCgwLCAwKTtcbiAgICB0aGlzLm9sZC52LnNldCgwLCAwKTtcbiAgICB0aGlzLm9sZC5hLnNldCgwLCAwKTtcbiAgICB0aGlzLmVhc2luZyA9IGVhc2UuZWFzZUxpbmVhcjtcblxuICAgIHRoaXMucmdiLnJlc2V0KCk7XG4gICAgVXRpbC5lbXB0eU9iamVjdCh0aGlzLmRhdGEpO1xuICAgIHRoaXMucmVtb3ZlQWxsQmVoYXZpb3VycygpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgcGFydGljbGUncyBzdGF0ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgVGhlIHRpbWUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB1cGRhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgcGFydGljbGUgaW4gaXRzIHBhcmVudCBzeXN0ZW1cbiAgICovXG4gIHVwZGF0ZSh0aW1lLCBpbmRleCkge1xuICAgIGlmICghdGhpcy5zbGVlcCkge1xuICAgICAgdGhpcy5hZ2UgKz0gdGltZTtcbiAgICAgIHRoaXMuYXBwbHlCZWhhdmlvdXJzKHRpbWUsIGluZGV4KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hZ2UgPCB0aGlzLmxpZmUpIHtcbiAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy5lYXNpbmcodGhpcy5hZ2UgLyB0aGlzLmxpZmUpO1xuICAgICAgdGhpcy5lbmVyZ3kgPSBNYXRoLm1heCgxIC0gc2NhbGUsIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBhbGwgYmVoYXZpb3VycyBhdHRhY2hlZCB0byB0aGUgcGFydGljbGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIFRoZSB0aW1lIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgdXBkYXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHBhcnRpY2xlIGluIGl0cyBwYXJlbnQgc3lzdGVtXG4gICAqL1xuICBhcHBseUJlaGF2aW91cnModGltZSwgaW5kZXgpIHtcbiAgICBjb25zdCBsZW5ndGggPSB0aGlzLmJlaGF2aW91cnMubGVuZ3RoO1xuICAgIGxldCBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmJlaGF2aW91cnNbaV0gJiYgdGhpcy5iZWhhdmlvdXJzW2ldLmFwcGx5QmVoYXZpb3VyKHRoaXMsIHRpbWUsIGluZGV4KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGJlaGF2aW91ciB0byB0aGUgcGFydGljbGUuXG4gICAqIEBwYXJhbSB7QmVoYXZpb3VyfSBiZWhhdmlvdXIgVGhlIGJlaGF2aW91ciB0byBhZGRcbiAgICovXG4gIGFkZEJlaGF2aW91cihiZWhhdmlvdXIpIHtcbiAgICB0aGlzLmJlaGF2aW91cnMucHVzaChiZWhhdmlvdXIpO1xuXG4gICAgaWYgKGJlaGF2aW91ci5oYXNPd25Qcm9wZXJ0eShcInBhcmVudHNcIikpIGJlaGF2aW91ci5wYXJlbnRzLnB1c2godGhpcyk7XG4gICAgYmVoYXZpb3VyLmluaXRpYWxpemUodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBtdWx0aXBsZSBiZWhhdmlvdXJzIHRvIHRoZSBwYXJ0aWNsZS5cbiAgICogQHBhcmFtIHtCZWhhdmlvdXJbXX0gYmVoYXZpb3VycyBBbiBhcnJheSBvZiBiZWhhdmlvdXJzIHRvIGFkZFxuICAgKi9cbiAgYWRkQmVoYXZpb3VycyhiZWhhdmlvdXJzKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gYmVoYXZpb3Vycy5sZW5ndGg7XG4gICAgbGV0IGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuYWRkQmVoYXZpb3VyKGJlaGF2aW91cnNbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgc3BlY2lmaWMgYmVoYXZpb3VyIGZyb20gdGhlIHBhcnRpY2xlLlxuICAgKiBAcGFyYW0ge0JlaGF2aW91cn0gYmVoYXZpb3VyIFRoZSBiZWhhdmlvdXIgdG8gcmVtb3ZlXG4gICAqL1xuICByZW1vdmVCZWhhdmlvdXIoYmVoYXZpb3VyKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmJlaGF2aW91cnMuaW5kZXhPZihiZWhhdmlvdXIpO1xuXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIGNvbnN0IGJlaGF2aW91ciA9IHRoaXMuYmVoYXZpb3Vycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgYmVoYXZpb3VyLnBhcmVudHMgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBiZWhhdmlvdXJzIGZyb20gdGhlIHBhcnRpY2xlLlxuICAgKi9cbiAgcmVtb3ZlQWxsQmVoYXZpb3VycygpIHtcbiAgICBVdGlsLmVtcHR5QXJyYXkodGhpcy5iZWhhdmlvdXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGUgcGFydGljbGUsIHJlbW92aW5nIGFsbCBiZWhhdmlvdXJzIGFuZCBzZXR0aW5nIGl0IGFzIGRlYWQuXG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHRoaXMucmVtb3ZlQWxsQmVoYXZpb3VycygpO1xuICAgIHRoaXMuZW5lcmd5ID0gMDtcbiAgICB0aGlzLmRlYWQgPSB0cnVlO1xuICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogQHR5cGVkZWYgIHtPYmplY3R9IHJnYk9iamVjdFxuICAgKiBAcHJvcGVydHkge051bWJlcn0gciByZWQgdmFsdWVcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IGcgZ3JlZW4gdmFsdWVcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IGIgYmx1ZSB2YWx1ZVxuICAgKi9cbiAgLyoqXG4gICAqIGNvbnZlcnRzIGEgaGV4IHZhbHVlIHRvIGEgcmdiIG9iamVjdFxuICAgKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5VdGlsXG4gICAqIEBtZXRob2QgaGV4VG9SZ2JcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGggYW55IGhleCB2YWx1ZSwgZS5nLiAjMDAwMDAwIG9yIDAwMDAwMCBmb3IgYmxhY2tcbiAgICpcbiAgICogQHJldHVybiB7cmdiT2JqZWN0fVxuICAgKi9cbiAgaGV4VG9SZ2IoaCkge1xuICAgIGNvbnN0IGhleDE2ID0gaC5jaGFyQXQoMCkgPT09IFwiI1wiID8gaC5zdWJzdHJpbmcoMSwgNykgOiBoO1xuICAgIGNvbnN0IHIgPSBwYXJzZUludChoZXgxNi5zdWJzdHJpbmcoMCwgMiksIDE2KTtcbiAgICBjb25zdCBnID0gcGFyc2VJbnQoaGV4MTYuc3Vic3RyaW5nKDIsIDQpLCAxNik7XG4gICAgY29uc3QgYiA9IHBhcnNlSW50KGhleDE2LnN1YnN0cmluZyg0LCA2KSwgMTYpO1xuXG4gICAgcmV0dXJuIHsgciwgZywgYiB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBjb252ZXJ0cyBhIHJnYiB2YWx1ZSB0byBhIHJnYiBzdHJpbmdcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIHJnYlRvSGV4XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0IHwgUHJvdG9uLmhleFRvUmdifSByZ2IgYSByZ2Igb2JqZWN0IGxpa2UgaW4ge0BsaW5rIFByb3RvbiNQcm90b24ufVxuICAgKlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IHJnYigpXG4gICAqL1xuICByZ2JUb0hleChyYmcpIHtcbiAgICByZXR1cm4gYHJnYigke3JiZy5yfSwgJHtyYmcuZ30sICR7cmJnLmJ9KWA7XG4gIH0sXG5cbiAgZ2V0SGV4MTZGcm9tUGFydGljbGUocCkge1xuICAgIHJldHVybiBOdW1iZXIocC5yZ2IucikgKiA2NTUzNiArIE51bWJlcihwLnJnYi5nKSAqIDI1NiArIE51bWJlcihwLnJnYi5iKTtcbiAgfVxufTtcbiIsImltcG9ydCBWZWN0b3IyRCBmcm9tIFwiLi9WZWN0b3IyRFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQb2xhcjJEIHtcbiAgY29uc3RydWN0b3IociwgdGhhKSB7XG4gICAgdGhpcy5yID0gTWF0aC5hYnMocikgfHwgMDtcbiAgICB0aGlzLnRoYSA9IHRoYSB8fCAwO1xuICB9XG5cbiAgc2V0KHIsIHRoYSkge1xuICAgIHRoaXMuciA9IHI7XG4gICAgdGhpcy50aGEgPSB0aGE7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRSKHIpIHtcbiAgICB0aGlzLnIgPSByO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0VGhhKHRoYSkge1xuICAgIHRoaXMudGhhID0gdGhhO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY29weShwKSB7XG4gICAgdGhpcy5yID0gcC5yO1xuICAgIHRoaXMudGhhID0gcC50aGE7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0b1ZlY3RvcigpIHtcbiAgICByZXR1cm4gbmV3IFZlY3RvcjJEKHRoaXMuZ2V0WCgpLCB0aGlzLmdldFkoKSk7XG4gIH1cblxuICBnZXRYKCkge1xuICAgIHJldHVybiB0aGlzLnIgKiBNYXRoLnNpbih0aGlzLnRoYSk7XG4gIH1cblxuICBnZXRZKCkge1xuICAgIHJldHVybiAtdGhpcy5yICogTWF0aC5jb3ModGhpcy50aGEpO1xuICB9XG5cbiAgbm9ybWFsaXplKCkge1xuICAgIHRoaXMuciA9IDE7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBlcXVhbHModikge1xuICAgIHJldHVybiB2LnIgPT09IHRoaXMuciAmJiB2LnRoYSA9PT0gdGhpcy50aGE7XG4gIH1cblxuICBjbGVhcigpIHtcbiAgICB0aGlzLnIgPSAwLjA7XG4gICAgdGhpcy50aGEgPSAwLjA7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IFBvbGFyMkQodGhpcy5yLCB0aGlzLnRoYSk7XG4gIH1cbn1cbiIsImNvbnN0IE1hdDMgPSB7XG4gIGNyZWF0ZShtYXQzKSB7XG4gICAgY29uc3QgbWF0ID0gbmV3IEZsb2F0MzJBcnJheSg5KTtcbiAgICBpZiAobWF0MykgdGhpcy5zZXQobWF0MywgbWF0KTtcblxuICAgIHJldHVybiBtYXQ7XG4gIH0sXG5cbiAgc2V0KG1hdDEsIG1hdDIpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDk7IGkrKykgbWF0MltpXSA9IG1hdDFbaV07XG5cbiAgICByZXR1cm4gbWF0MjtcbiAgfSxcblxuICBtdWx0aXBseShtYXQsIG1hdDIsIG1hdDMpIHtcbiAgICBsZXQgYTAwID0gbWF0WzBdLFxuICAgICAgYTAxID0gbWF0WzFdLFxuICAgICAgYTAyID0gbWF0WzJdLFxuICAgICAgYTEwID0gbWF0WzNdLFxuICAgICAgYTExID0gbWF0WzRdLFxuICAgICAgYTIwID0gbWF0WzZdLFxuICAgICAgYTIxID0gbWF0WzddLFxuICAgICAgYjAwID0gbWF0MlswXSxcbiAgICAgIGIwMSA9IG1hdDJbMV0sXG4gICAgICBiMDIgPSBtYXQyWzJdLFxuICAgICAgYjEwID0gbWF0MlszXSxcbiAgICAgIGIxMSA9IG1hdDJbNF0sXG4gICAgICBiMjAgPSBtYXQyWzZdLFxuICAgICAgYjIxID0gbWF0Mls3XTtcblxuICAgIG1hdDNbMF0gPSBiMDAgKiBhMDAgKyBiMDEgKiBhMTA7XG4gICAgbWF0M1sxXSA9IGIwMCAqIGEwMSArIGIwMSAqIGExMTtcbiAgICBtYXQzWzJdID0gYTAyICogYjAyO1xuICAgIG1hdDNbM10gPSBiMTAgKiBhMDAgKyBiMTEgKiBhMTA7XG4gICAgbWF0M1s0XSA9IGIxMCAqIGEwMSArIGIxMSAqIGExMTtcbiAgICBtYXQzWzZdID0gYjIwICogYTAwICsgYjIxICogYTEwICsgYTIwO1xuICAgIG1hdDNbN10gPSBiMjAgKiBhMDEgKyBiMjEgKiBhMTEgKyBhMjE7XG5cbiAgICByZXR1cm4gbWF0MztcbiAgfSxcblxuICBpbnZlcnNlKG1hdCwgbWF0Mykge1xuICAgIGxldCBhMDAgPSBtYXRbMF0sXG4gICAgICBhMDEgPSBtYXRbMV0sXG4gICAgICBhMTAgPSBtYXRbM10sXG4gICAgICBhMTEgPSBtYXRbNF0sXG4gICAgICBhMjAgPSBtYXRbNl0sXG4gICAgICBhMjEgPSBtYXRbN10sXG4gICAgICBiMDEgPSBhMTEsXG4gICAgICBiMTEgPSAtYTEwLFxuICAgICAgYjIxID0gYTIxICogYTEwIC0gYTExICogYTIwLFxuICAgICAgZCA9IGEwMCAqIGIwMSArIGEwMSAqIGIxMSxcbiAgICAgIGlkO1xuXG4gICAgaWQgPSAxIC8gZDtcbiAgICBtYXQzWzBdID0gYjAxICogaWQ7XG4gICAgbWF0M1sxXSA9IC1hMDEgKiBpZDtcbiAgICBtYXQzWzNdID0gYjExICogaWQ7XG4gICAgbWF0M1s0XSA9IGEwMCAqIGlkO1xuICAgIG1hdDNbNl0gPSBiMjEgKiBpZDtcbiAgICBtYXQzWzddID0gKC1hMjEgKiBhMDAgKyBhMDEgKiBhMjApICogaWQ7XG5cbiAgICByZXR1cm4gbWF0MztcbiAgfSxcblxuICBtdWx0aXBseVZlYzIobSwgdmVjLCBtYXQzKSB7XG4gICAgbGV0IHggPSB2ZWNbMF0sXG4gICAgICB5ID0gdmVjWzFdO1xuXG4gICAgbWF0M1swXSA9IHggKiBtWzBdICsgeSAqIG1bM10gKyBtWzZdO1xuICAgIG1hdDNbMV0gPSB4ICogbVsxXSArIHkgKiBtWzRdICsgbVs3XTtcblxuICAgIHJldHVybiBtYXQzO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNYXQzO1xuIiwiaW1wb3J0IFNwYW4gZnJvbSBcIi4vU3BhblwiO1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi9NYXRoVXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcnJheVNwYW4gZXh0ZW5kcyBTcGFuIHtcbiAgY29uc3RydWN0b3IoY29sb3IpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2FyciA9IFV0aWwudG9BcnJheShjb2xvcik7XG4gIH1cblxuICBnZXRWYWx1ZSgpIHtcbiAgICBjb25zdCB2YWwgPSBVdGlsLmdldFJhbmRGcm9tQXJyYXkodGhpcy5fYXJyKTtcbiAgICByZXR1cm4gdmFsID09PSBcInJhbmRvbVwiIHx8IHZhbCA9PT0gXCJSYW5kb21cIiA/IE1hdGhVdGlsLnJhbmRvbUNvbG9yKCkgOiB2YWw7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBzdXJlIHRoYXQgdGhlIGNvbG9yIGlzIGFuIGluc3RhbmNlIG9mIFByb3Rvbi5BcnJheVNwYW4sIGlmIG5vdCBpdCBtYWtlcyBhIG5ldyBpbnN0YW5jZVxuICAgKlxuICAgKiBAbWV0aG9kIHNldFNwYW5WYWx1ZVxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Db2xvclxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBzdGF0aWMgY3JlYXRlQXJyYXlTcGFuKGFycikge1xuICAgIGlmICghYXJyKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChhcnIgaW5zdGFuY2VvZiBBcnJheVNwYW4pIHJldHVybiBhcnI7XG4gICAgZWxzZSByZXR1cm4gbmV3IEFycmF5U3BhbihhcnIpO1xuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBSZWN0YW5nbGUge1xuICBjb25zdHJ1Y3Rvcih4LCB5LCB3LCBoKSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuXG4gICAgdGhpcy53aWR0aCA9IHc7XG4gICAgdGhpcy5oZWlnaHQgPSBoO1xuXG4gICAgdGhpcy5ib3R0b20gPSB0aGlzLnkgKyB0aGlzLmhlaWdodDtcbiAgICB0aGlzLnJpZ2h0ID0gdGhpcy54ICsgdGhpcy53aWR0aDtcbiAgfVxuXG4gIGNvbnRhaW5zKHgsIHkpIHtcbiAgICBpZiAoeCA8PSB0aGlzLnJpZ2h0ICYmIHggPj0gdGhpcy54ICYmIHkgPD0gdGhpcy5ib3R0b20gJiYgeSA+PSB0aGlzLnkpIHJldHVybiB0cnVlO1xuICAgIGVsc2UgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCJpbXBvcnQgU3BhbiBmcm9tIFwiLi4vbWF0aC9TcGFuXCI7XG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuXG4vKipcbiAqIFJhdGUgY2xhc3MgZm9yIGNvbnRyb2xsaW5nIHBhcnRpY2xlIGVtaXNzaW9uIHJhdGUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJhdGUge1xuICAvKipcbiAgICogQHR5cGUge1NwYW59XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBudW1QYW47XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTcGFufVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdGltZVBhbjtcblxuICAvKipcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXJ0VGltZTtcblxuICAvKipcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIG5leHRUaW1lO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFJhdGUgaW5zdGFuY2UuXG4gICAqIFRoZSBudW1iZXIgb2YgcGFydGljbGVzIHBlciBzZWNvbmQgZW1pc3Npb24gKGEgW3BhcnRpY2xlXS9iIFtzXSkuXG4gICAqIEBwYXJhbSB7QXJyYXl8bnVtYmVyfFNwYW59IFtudW1wYW49MV0gLSBUaGUgbnVtYmVyIG9mIHBhcnRpY2xlcyBmb3IgZWFjaCBlbWlzc2lvbi5cbiAgICogQHBhcmFtIHtBcnJheXxudW1iZXJ8U3Bhbn0gW3RpbWVwYW49MV0gLSBUaGUgdGltZSBpbnRlcnZhbCBiZXR3ZWVuIGVhY2ggZW1pc3Npb24uXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIENyZWF0ZSBhIHJhdGUgb2YgMTAtMjAgcGFydGljbGVzIGV2ZXJ5IDAuMS0wLjI1IHNlY29uZHNcbiAgICogbmV3IFJhdGUobmV3IFNwYW4oMTAsIDIwKSwgbmV3IFNwYW4oMC4xLCAwLjI1KSk7XG4gICAqL1xuICBjb25zdHJ1Y3RvcihudW1wYW4sIHRpbWVwYW4pIHtcbiAgICB0aGlzLm51bVBhbiA9IFNwYW4uc2V0U3BhblZhbHVlKFV0aWwuaW5pdFZhbHVlKG51bXBhbiwgMSkpO1xuICAgIHRoaXMudGltZVBhbiA9IFNwYW4uc2V0U3BhblZhbHVlKFV0aWwuaW5pdFZhbHVlKHRpbWVwYW4sIDEpKTtcblxuICAgIHRoaXMuc3RhcnRUaW1lID0gMDtcbiAgICB0aGlzLm5leHRUaW1lID0gMDtcbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcmF0ZS5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGluaXQoKSB7XG4gICAgdGhpcy5zdGFydFRpbWUgPSAwO1xuICAgIHRoaXMubmV4dFRpbWUgPSB0aGlzLnRpbWVQYW4uZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgcGFydGljbGVzIHRvIGVtaXQgYmFzZWQgb24gdGhlIGVsYXBzZWQgdGltZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgLSBUaGUgZWxhcHNlZCB0aW1lIHNpbmNlIHRoZSBsYXN0IHVwZGF0ZS5cbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIG51bWJlciBvZiBwYXJ0aWNsZXMgdG8gZW1pdC5cbiAgICovXG4gIGdldFZhbHVlKHRpbWUpIHtcbiAgICB0aGlzLnN0YXJ0VGltZSArPSB0aW1lO1xuXG4gICAgaWYgKHRoaXMuc3RhcnRUaW1lID49IHRoaXMubmV4dFRpbWUpIHtcbiAgICAgIHRoaXMuc3RhcnRUaW1lID0gMDtcbiAgICAgIHRoaXMubmV4dFRpbWUgPSB0aGlzLnRpbWVQYW4uZ2V0VmFsdWUoKTtcblxuICAgICAgaWYgKHRoaXMubnVtUGFuLmIgPT09IDEpIHtcbiAgICAgICAgaWYgKHRoaXMubnVtUGFuLmdldFZhbHVlKGZhbHNlKSA+IDAuNSkgcmV0dXJuIDE7XG4gICAgICAgIGVsc2UgcmV0dXJuIDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5udW1QYW4uZ2V0VmFsdWUodHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEluaXRpYWxpemUge1xuICByZXNldCgpIHt9XG5cbiAgaW5pdChlbWl0dGVyLCBwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZSkge1xuICAgICAgdGhpcy5pbml0aWFsaXplKHBhcnRpY2xlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbml0aWFsaXplKGVtaXR0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHN1YiBjbGFzcyBpbml0XG4gIGluaXRpYWxpemUodGFyZ2V0KSB7fVxufVxuIiwiaW1wb3J0IFNwYW4gZnJvbSBcIi4uL21hdGgvU3BhblwiO1xuaW1wb3J0IEluaXRpYWxpemUgZnJvbSBcIi4vSW5pdGlhbGl6ZVwiO1xuXG4vKipcbiAqIExpZmUgY2xhc3MgZm9yIGluaXRpYWxpemluZyBwYXJ0aWNsZSBsaWZldGltZS5cbiAqIEBleHRlbmRzIEluaXRpYWxpemVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlmZSBleHRlbmRzIEluaXRpYWxpemUge1xuICAvKipcbiAgICogQHR5cGUge1NwYW59XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBsaWZlUGFuO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgbmFtZTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBMaWZlIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge251bWJlcnxTcGFufSBhIC0gVGhlIGxpZmV0aW1lIHZhbHVlIG9yIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgbGlmZXRpbWUgcmFuZ2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYl0gLSBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIGxpZmV0aW1lIHJhbmdlIChpZiBhIGlzIGEgbnVtYmVyKS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbY10gLSBXaGV0aGVyIHRvIHVzZSBjZW50ZXItYmFzZWQgY2FsY3VsYXRpb24gKGlmIGEgYW5kIGIgYXJlIG51bWJlcnMpLlxuICAgKi9cbiAgY29uc3RydWN0b3IoYSwgYiwgYykge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmxpZmVQYW4gPSBTcGFuLnNldFNwYW5WYWx1ZShhLCBiLCBjKTtcbiAgICB0aGlzLm5hbWUgPSBcIkxpZmVcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgbGlmZXRpbWUgb2YgYSB0YXJnZXQgcGFydGljbGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHBhcnRpY2xlIHRvIGluaXRpYWxpemUuXG4gICAqL1xuICBpbml0aWFsaXplKHRhcmdldCkge1xuICAgIGlmICh0aGlzLmxpZmVQYW4uYSA9PT0gSW5maW5pdHkpIHRhcmdldC5saWZlID0gSW5maW5pdHk7XG4gICAgZWxzZSB0YXJnZXQubGlmZSA9IHRoaXMubGlmZVBhbi5nZXRWYWx1ZSgpO1xuICB9XG59XG4iLCJpbXBvcnQgVmVjdG9yMkQgZnJvbSBcIi4uL21hdGgvVmVjdG9yMkRcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgWm9uZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudmVjdG9yID0gbmV3IFZlY3RvcjJEKDAsIDApO1xuICAgIHRoaXMucmFuZG9tID0gMDtcbiAgICB0aGlzLmNyb3NzVHlwZSA9IFwiZGVhZFwiO1xuICAgIHRoaXMuYWxlcnQgPSB0cnVlO1xuICB9XG5cbiAgZ2V0UG9zaXRpb24oKSB7fVxuXG4gIGNyb3NzaW5nKHBhcnRpY2xlKSB7fVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy52ZWN0b3IgPSBudWxsO1xuICB9XG59XG4iLCJpbXBvcnQgWm9uZSBmcm9tIFwiLi9ab25lXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHBvaW50IHpvbmUgaW4gYSAyRCBzcGFjZS5cbiAqIEBleHRlbmRzIFpvbmVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9pbnRab25lIGV4dGVuZHMgWm9uZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFBvaW50Wm9uZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBwb2ludC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBwb2ludC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHgsIHkpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnggPSB4O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnkgPSB5O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBwb2ludC5cbiAgICogQHJldHVybnMge09iamVjdH0gQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcG9zaXRpb24gdmVjdG9yLlxuICAgKi9cbiAgZ2V0UG9zaXRpb24oKSB7XG4gICAgdGhpcy52ZWN0b3IueCA9IHRoaXMueDtcbiAgICB0aGlzLnZlY3Rvci55ID0gdGhpcy55O1xuXG4gICAgcmV0dXJuIHRoaXMudmVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFBvaW50Wm9uZS5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcnRpY2xlIC0gVGhlIHBhcnRpY2xlIG9iamVjdCAodW51c2VkKS5cbiAgICovXG4gIGNyb3NzaW5nKHBhcnRpY2xlKSB7XG4gICAgaWYgKHRoaXMuYWxlcnQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJTb3JyeSwgUG9pbnRab25lIGRvZXMgbm90IHN1cHBvcnQgY3Jvc3NpbmcgbWV0aG9kIVwiKTtcbiAgICAgIHRoaXMuYWxlcnQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgUG9pbnRab25lIGZyb20gXCIuLi96b25lL1BvaW50Wm9uZVwiO1xuaW1wb3J0IEluaXRpYWxpemUgZnJvbSBcIi4vSW5pdGlhbGl6ZVwiO1xuXG4vKipcbiAqIFBvc2l0aW9uIGNsYXNzIGZvciBpbml0aWFsaXppbmcgcGFydGljbGUgcG9zaXRpb25zLlxuICogQGV4dGVuZHMgSW5pdGlhbGl6ZVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQb3NpdGlvbiBleHRlbmRzIEluaXRpYWxpemUge1xuICAvKipcbiAgICogQHR5cGUge1BvaW50Wm9uZXxhbnl9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB6b25lO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgbmFtZTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBQb3NpdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtQb2ludFpvbmV8YW55fSBbem9uZV0gLSBUaGUgem9uZSB0byB1c2UgZm9yIHBvc2l0aW9uaW5nLiBEZWZhdWx0cyB0byBhIG5ldyBQb2ludFpvbmUgaWYgbm90IHByb3ZpZGVkLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioem9uZSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy56b25lID0gVXRpbC5pbml0VmFsdWUoem9uZSwgbmV3IFBvaW50Wm9uZSgpKTtcbiAgICB0aGlzLm5hbWUgPSBcIlBvc2l0aW9uXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoaXMgaW5pdGlhbGl6ZXIncyBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge1BvaW50Wm9uZXxhbnl9IFt6b25lXSAtIFRoZSBuZXcgem9uZSB0byB1c2UgZm9yIHBvc2l0aW9uaW5nLiBEZWZhdWx0cyB0byBhIG5ldyBQb2ludFpvbmUgaWYgbm90IHByb3ZpZGVkLlxuICAgKi9cbiAgcmVzZXQoem9uZSkge1xuICAgIHRoaXMuem9uZSA9IFV0aWwuaW5pdFZhbHVlKHpvbmUsIG5ldyBQb2ludFpvbmUoKSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHBhcnRpY2xlJ3MgcG9zaXRpb24uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXQgLSBUaGUgcGFydGljbGUgdG8gaW5pdGlhbGl6ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IHRhcmdldC5wIC0gVGhlIHBhcnRpY2xlJ3MgcG9zaXRpb24gb2JqZWN0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGFyZ2V0LnAueCAtIFRoZSBwYXJ0aWNsZSdzIHggY29vcmRpbmF0ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHRhcmdldC5wLnkgLSBUaGUgcGFydGljbGUncyB5IGNvb3JkaW5hdGUuXG4gICAqL1xuICBpbml0aWFsaXplKHRhcmdldCkge1xuICAgIHRoaXMuem9uZS5nZXRQb3NpdGlvbigpO1xuXG4gICAgdGFyZ2V0LnAueCA9IHRoaXMuem9uZS52ZWN0b3IueDtcbiAgICB0YXJnZXQucC55ID0gdGhpcy56b25lLnZlY3Rvci55O1xuICB9XG59XG4iLCJpbXBvcnQgUHJvdG9uIGZyb20gXCIuLi9jb3JlL1Byb3RvblwiO1xuaW1wb3J0IFNwYW4gZnJvbSBcIi4uL21hdGgvU3BhblwiO1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBJbml0aWFsaXplIGZyb20gXCIuL0luaXRpYWxpemVcIjtcbmltcG9ydCBQb2xhcjJEIGZyb20gXCIuLi9tYXRoL1BvbGFyMkRcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuXG4vKipcbiAqIFZlbG9jaXR5IGNsYXNzIGZvciBpbml0aWFsaXppbmcgcGFydGljbGUgdmVsb2NpdGllcy5cbiAqIEBleHRlbmRzIEluaXRpYWxpemVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2NpdHkgZXh0ZW5kcyBJbml0aWFsaXplIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtTcGFufVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgclBhbjtcblxuICAvKipcbiAgICogQHR5cGUge1NwYW59XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0aGFQYW47XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBuYW1lO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFZlbG9jaXR5IGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge251bWJlcnxTcGFufSBbcnBhbl0gLSBUaGUgcmFkaWFsIGNvbXBvbmVudCBvZiB0aGUgdmVsb2NpdHkgb3IgaXRzIHJhbmdlLlxuICAgKiBAcGFyYW0ge251bWJlcnxTcGFufSBbdGhhcGFuXSAtIFRoZSBhbmd1bGFyIGNvbXBvbmVudCBvZiB0aGUgdmVsb2NpdHkgb3IgaXRzIHJhbmdlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3R5cGU9J3ZlY3RvciddIC0gVGhlIHR5cGUgb2YgdmVsb2NpdHkgKCd2ZWN0b3InIG9yICdwb2xhcicpLlxuICAgKi9cbiAgY29uc3RydWN0b3IocnBhbiwgdGhhcGFuLCB0eXBlKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuclBhbiA9IFNwYW4uc2V0U3BhblZhbHVlKHJwYW4pO1xuICAgIHRoaXMudGhhUGFuID0gU3Bhbi5zZXRTcGFuVmFsdWUodGhhcGFuKTtcbiAgICB0aGlzLnR5cGUgPSBVdGlsLmluaXRWYWx1ZSh0eXBlLCBcInZlY3RvclwiKTtcblxuICAgIHRoaXMubmFtZSA9IFwiVmVsb2NpdHlcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHZlbG9jaXR5IHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfFNwYW59IFtycGFuXSAtIFRoZSByYWRpYWwgY29tcG9uZW50IG9mIHRoZSB2ZWxvY2l0eSBvciBpdHMgcmFuZ2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfFNwYW59IFt0aGFwYW5dIC0gVGhlIGFuZ3VsYXIgY29tcG9uZW50IG9mIHRoZSB2ZWxvY2l0eSBvciBpdHMgcmFuZ2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZT0ndmVjdG9yJ10gLSBUaGUgdHlwZSBvZiB2ZWxvY2l0eSAoJ3ZlY3Rvcicgb3IgJ3BvbGFyJykuXG4gICAqL1xuICByZXNldChycGFuLCB0aGFwYW4sIHR5cGUpIHtcbiAgICB0aGlzLnJQYW4gPSBTcGFuLnNldFNwYW5WYWx1ZShycGFuKTtcbiAgICB0aGlzLnRoYVBhbiA9IFNwYW4uc2V0U3BhblZhbHVlKHRoYXBhbik7XG4gICAgdGhpcy50eXBlID0gVXRpbC5pbml0VmFsdWUodHlwZSwgXCJ2ZWN0b3JcIik7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyB0aGUgdmVsb2NpdHkgdmFsdWUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2ciAtIFRoZSB2ZWxvY2l0eSB2YWx1ZSB0byBub3JtYWxpemUuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBub3JtYWxpemVkIHZlbG9jaXR5IHZhbHVlLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbm9ybWFsaXplVmVsb2NpdHkodnIpIHtcbiAgICByZXR1cm4gdnIgKiBQcm90b24uTUVBU1VSRTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGFydGljbGUncyB2ZWxvY2l0eS5cbiAgICogQHBhcmFtIHtvYmplY3R9IHRhcmdldCAtIFRoZSBwYXJ0aWNsZSB0byBpbml0aWFsaXplLlxuICAgKi9cbiAgaW5pdGlhbGl6ZSh0YXJnZXQpIHtcbiAgICBpZiAodGhpcy50eXBlID09PSBcInBcIiB8fCB0aGlzLnR5cGUgPT09IFwiUFwiIHx8IHRoaXMudHlwZSA9PT0gXCJwb2xhclwiKSB7XG4gICAgICBjb25zdCBwb2xhcjJkID0gbmV3IFBvbGFyMkQoXG4gICAgICAgIHRoaXMubm9ybWFsaXplVmVsb2NpdHkodGhpcy5yUGFuLmdldFZhbHVlKCkpLFxuICAgICAgICB0aGlzLnRoYVBhbi5nZXRWYWx1ZSgpICogTWF0aFV0aWwuUElfMTgwXG4gICAgICApO1xuXG4gICAgICB0YXJnZXQudi54ID0gcG9sYXIyZC5nZXRYKCk7XG4gICAgICB0YXJnZXQudi55ID0gcG9sYXIyZC5nZXRZKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC52LnggPSB0aGlzLm5vcm1hbGl6ZVZlbG9jaXR5KHRoaXMuclBhbi5nZXRWYWx1ZSgpKTtcbiAgICAgIHRhcmdldC52LnkgPSB0aGlzLm5vcm1hbGl6ZVZlbG9jaXR5KHRoaXMudGhhUGFuLmdldFZhbHVlKCkpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IFNwYW4gZnJvbSBcIi4uL21hdGgvU3BhblwiO1xuaW1wb3J0IEluaXRpYWxpemUgZnJvbSBcIi4vSW5pdGlhbGl6ZVwiO1xuXG4vKipcbiAqIE1hc3MgY2xhc3MgZm9yIGluaXRpYWxpemluZyBwYXJ0aWNsZSBtYXNzLlxuICogQGV4dGVuZHMgSW5pdGlhbGl6ZVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYXNzIGV4dGVuZHMgSW5pdGlhbGl6ZSB7XG4gIC8qKlxuICAgKiBAdHlwZSB7U3Bhbn1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIG1hc3NQYW47XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBuYW1lO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IE1hc3MgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfFNwYW59IGEgLSBUaGUgbWFzcyB2YWx1ZSBvciB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIG1hc3MgcmFuZ2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYl0gLSBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIG1hc3MgcmFuZ2UgKGlmIGEgaXMgYSBudW1iZXIpLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjXSAtIFdoZXRoZXIgdG8gdXNlIGNlbnRlci1iYXNlZCBjYWxjdWxhdGlvbiAoaWYgYSBhbmQgYiBhcmUgbnVtYmVycykuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhLCBiLCBjKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm1hc3NQYW4gPSBTcGFuLnNldFNwYW5WYWx1ZShhLCBiLCBjKTtcbiAgICB0aGlzLm5hbWUgPSBcIk1hc3NcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgbWFzcyBvZiBhIHRhcmdldCBwYXJ0aWNsZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IHRhcmdldCAtIFRoZSB0YXJnZXQgcGFydGljbGUgdG8gaW5pdGlhbGl6ZS5cbiAgICovXG4gIGluaXRpYWxpemUodGFyZ2V0KSB7XG4gICAgdGFyZ2V0Lm1hc3MgPSB0aGlzLm1hc3NQYW4uZ2V0VmFsdWUoKTtcbiAgfVxufVxuIiwiaW1wb3J0IFNwYW4gZnJvbSBcIi4uL21hdGgvU3BhblwiO1xuaW1wb3J0IEluaXRpYWxpemUgZnJvbSBcIi4vSW5pdGlhbGl6ZVwiO1xuXG4vKipcbiAqIFJhZGl1cyBjbGFzcyBmb3IgaW5pdGlhbGl6aW5nIHBhcnRpY2xlIHJhZGl1cy5cbiAqIEBleHRlbmRzIEluaXRpYWxpemVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmFkaXVzIGV4dGVuZHMgSW5pdGlhbGl6ZSB7XG4gIC8qKlxuICAgKiBAdHlwZSB7U3Bhbn1cbiAgICovXG4gIHJhZGl1cztcblxuICAvKipcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIG5hbWU7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgUmFkaXVzIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge251bWJlcnxTcGFufSBhIC0gVGhlIHJhZGl1cyB2YWx1ZSBvciB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIHJhZGl1cyByYW5nZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtiXSAtIFRoZSB1cHBlciBib3VuZCBvZiB0aGUgcmFkaXVzIHJhbmdlIChpZiBhIGlzIGEgbnVtYmVyKS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbY10gLSBXaGV0aGVyIHRvIHVzZSBjZW50ZXItYmFzZWQgY2FsY3VsYXRpb24gKGlmIGEgYW5kIGIgYXJlIG51bWJlcnMpLlxuICAgKi9cbiAgY29uc3RydWN0b3IoYSwgYiwgYykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5yYWRpdXMgPSBTcGFuLnNldFNwYW5WYWx1ZShhLCBiLCBjKTtcbiAgICB0aGlzLm5hbWUgPSBcIlJhZGl1c1wiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGlzIGluaXRpYWxpemVyJ3MgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtudW1iZXJ8U3Bhbn0gYSAtIFRoZSByYWRpdXMgdmFsdWUgb3IgdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSByYWRpdXMgcmFuZ2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYl0gLSBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIHJhZGl1cyByYW5nZSAoaWYgYSBpcyBhIG51bWJlcikuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NdIC0gV2hldGhlciB0byB1c2UgY2VudGVyLWJhc2VkIGNhbGN1bGF0aW9uIChpZiBhIGFuZCBiIGFyZSBudW1iZXJzKS5cbiAgICovXG4gIHJlc2V0KGEsIGIsIGMpIHtcbiAgICB0aGlzLnJhZGl1cyA9IFNwYW4uc2V0U3BhblZhbHVlKGEsIGIsIGMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBwYXJ0aWNsZSdzIHJhZGl1cy5cbiAgICogQHBhcmFtIHtQYXJ0aWNsZX0gcGFydGljbGUgLSBUaGUgcGFydGljbGUgdG8gaW5pdGlhbGl6ZS5cbiAgICovXG4gIGluaXRpYWxpemUocGFydGljbGUpIHtcbiAgICBwYXJ0aWNsZS5yYWRpdXMgPSB0aGlzLnJhZGl1cy5nZXRWYWx1ZSgpO1xuICAgIHBhcnRpY2xlLmRhdGEub2xkUmFkaXVzID0gcGFydGljbGUucmFkaXVzO1xuICB9XG59XG4iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IEFycmF5U3BhbiBmcm9tIFwiLi4vbWF0aC9BcnJheVNwYW5cIjtcbmltcG9ydCBJbml0aWFsaXplIGZyb20gXCIuL0luaXRpYWxpemVcIjtcblxuLyoqXG4gKiBCb2R5IGNsYXNzIGZvciBpbml0aWFsaXppbmcgcGFydGljbGUgYm9kaWVzLlxuICogQGV4dGVuZHMgSW5pdGlhbGl6ZVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCb2R5IGV4dGVuZHMgSW5pdGlhbGl6ZSB7XG4gIC8qKlxuICAgKiBAdHlwZSB7QXJyYXlTcGFufVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaW1hZ2U7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBuYW1lO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEJvZHkgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdHxBcnJheVNwYW59IGltYWdlIC0gVGhlIGltYWdlIHNvdXJjZSBvciBvYmplY3QgdG8gdXNlIGZvciB0aGUgcGFydGljbGUgYm9keS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFt3PTIwXSAtIFRoZSB3aWR0aCBvZiB0aGUgcGFydGljbGUgYm9keS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtoXSAtIFRoZSBoZWlnaHQgb2YgdGhlIHBhcnRpY2xlIGJvZHkuIERlZmF1bHRzIHRvIHRoZSB3aWR0aCBpZiBub3QgcHJvdmlkZWQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihpbWFnZSwgdywgaCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmltYWdlID0gdGhpcy5zZXRTcGFuVmFsdWUoaW1hZ2UpO1xuICAgIHRoaXMudyA9IFV0aWwuaW5pdFZhbHVlKHcsIDIwKTtcbiAgICB0aGlzLmggPSBVdGlsLmluaXRWYWx1ZShoLCB0aGlzLncpO1xuICAgIHRoaXMubmFtZSA9IFwiQm9keVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBwYXJ0aWNsZSdzIGJvZHkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJ0aWNsZSAtIFRoZSBwYXJ0aWNsZSB0byBpbml0aWFsaXplLlxuICAgKi9cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIGNvbnN0IGltYWdlVGFyZ2V0ID0gdGhpcy5pbWFnZS5nZXRWYWx1ZSgpO1xuXG4gICAgaWYgKHR5cGVvZiBpbWFnZVRhcmdldCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcGFydGljbGUuYm9keSA9IHtcbiAgICAgICAgd2lkdGg6IHRoaXMudyxcbiAgICAgICAgaGVpZ2h0OiB0aGlzLmgsXG4gICAgICAgIHNyYzogaW1hZ2VUYXJnZXQsXG4gICAgICAgIGlzSW5uZXI6IHRydWUsXG4gICAgICAgIGlubmVyOiB0cnVlXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5ID0gaW1hZ2VUYXJnZXQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHNwYW4gdmFsdWUgZm9yIHRoZSBpbWFnZS5cbiAgICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fEFycmF5U3Bhbn0gaW1hZ2UgLSBUaGUgaW1hZ2Ugc291cmNlIG9yIG9iamVjdCB0byBzZXQgYXMgc3BhbiB2YWx1ZS5cbiAgICogQHJldHVybnMge0FycmF5U3Bhbn0gVGhlIEFycmF5U3BhbiBpbnN0YW5jZS5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNldFNwYW5WYWx1ZShpbWFnZSkge1xuICAgIHJldHVybiBpbWFnZSBpbnN0YW5jZW9mIEFycmF5U3BhbiA/IGltYWdlIDogbmV3IEFycmF5U3BhbihpbWFnZSk7XG4gIH1cbn1cbiIsImltcG9ydCBQcm90b24gZnJvbSBcIi4uL2NvcmUvUHJvdG9uXCI7XG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IGVhc2UgZnJvbSBcIi4uL21hdGgvZWFzZVwiO1xuXG4vKipcbiAqIFRoZSBCZWhhdmlvdXIgY2xhc3MgaXMgdGhlIGJhc2UgZm9yIHRoZSBvdGhlciBCZWhhdmlvdXJcbiAqIEBjbGFzc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCZWhhdmlvdXIge1xuICBzdGF0aWMgaWQgPSAwO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgQmVoYXZpb3VyIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gLSBUaGUgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Vhc2luZz0nZWFzZUxpbmVhciddIC0gVGhlIGJlaGF2aW91cidzIGRlY2F5aW5nIHRyZW5kLCBmb3IgZXhhbXBsZSBlYXNlLmVhc2VPdXRRdWFydFxuICAgKi9cbiAgY29uc3RydWN0b3IobGlmZSwgZWFzaW5nKSB7XG4gICAgLyoqXG4gICAgICogVGhlIGJlaGF2aW91cidzIGxpZmVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMubGlmZSA9IFV0aWwuaW5pdFZhbHVlKGxpZmUsIEluZmluaXR5KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiZWhhdmlvdXIncyBlYXNpbmcgZnVuY3Rpb25cbiAgICAgKiBAdHlwZSB7ZnVuY3Rpb259XG4gICAgICovXG4gICAgdGhpcy5lYXNpbmcgPSBlYXNlLmdldEVhc2luZyhlYXNpbmcpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJlaGF2aW91cidzIGN1cnJlbnQgYWdlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLmFnZSA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmVoYXZpb3VyJ3MgY3VycmVudCBlbmVyZ3lcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuZW5lcmd5ID0gMTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGJlaGF2aW91ciBpcyBkZWFkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5kZWFkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmVoYXZpb3VyJ3MgcGFyZW50IGVtaXR0ZXJzXG4gICAgICogQHR5cGUge0FycmF5fVxuICAgICAqL1xuICAgIHRoaXMucGFyZW50cyA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJlaGF2aW91cidzIHVuaXF1ZSBpZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5pZCA9IGBCZWhhdmlvdXJfJHtCZWhhdmlvdXIuaWQrK31gO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJlaGF2aW91cidzIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMubmFtZSA9IFwiQmVoYXZpb3VyXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gLSBUaGlzIGJlaGF2aW91cidzIG5ldyBsaWZlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZWFzaW5nPSdlYXNlTGluZWFyJ10gLSBUaGlzIGJlaGF2aW91cidzIG5ldyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMubGlmZSA9IFV0aWwuaW5pdFZhbHVlKGxpZmUsIEluZmluaXR5KTtcbiAgICB0aGlzLmVhc2luZyA9IGVhc2UuZ2V0RWFzaW5nKGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplIGEgZm9yY2UgYnkgMToxMDBcbiAgICogQHBhcmFtIHtQcm90b24uVmVjdG9yMkR9IGZvcmNlIC0gVGhlIGZvcmNlIHRvIG5vcm1hbGl6ZVxuICAgKiBAcmV0dXJucyB7UHJvdG9uLlZlY3RvcjJEfSBUaGUgbm9ybWFsaXplZCBmb3JjZVxuICAgKi9cbiAgbm9ybWFsaXplRm9yY2UoZm9yY2UpIHtcbiAgICByZXR1cm4gZm9yY2UubXVsdGlwbHlTY2FsYXIoUHJvdG9uLk1FQVNVUkUpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSBhIHZhbHVlIGJ5IDE6MTAwXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBub3JtYWxpemVcbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIG5vcm1hbGl6ZWQgdmFsdWVcbiAgICovXG4gIG5vcm1hbGl6ZVZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICogUHJvdG9uLk1FQVNVUkU7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgYmVoYXZpb3VyJ3MgcGFyYW1ldGVycyBmb3IgYSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGUgLSBUaGUgcGFydGljbGUgdG8gaW5pdGlhbGl6ZVxuICAgKi9cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge31cblxuICAvKipcbiAgICogQ29tcHV0ZSB0aGUgYmVoYXZpb3VyJ3MgbGlmZSBjeWNsZVxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGUgLSBUaGUgcGFydGljbGUgdG8gY2FsY3VsYXRlIGZvclxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIHRoaXMuYWdlICs9IHRpbWU7XG5cbiAgICBpZiAodGhpcy5hZ2UgPj0gdGhpcy5saWZlIHx8IHRoaXMuZGVhZCkge1xuICAgICAgdGhpcy5lbmVyZ3kgPSAwO1xuICAgICAgdGhpcy5kZWFkID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzY2FsZSA9IHRoaXMuZWFzaW5nKHBhcnRpY2xlLmFnZSAvIHBhcnRpY2xlLmxpZmUpO1xuICAgICAgdGhpcy5lbmVyZ3kgPSBNYXRoLm1heCgxIC0gc2NhbGUsIDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGlzIGJlaGF2aW91ciB0byBhIHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZSAtIFRoZSBwYXJ0aWNsZSB0byBhcHBseSB0aGUgYmVoYXZpb3VyIHRvXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gVGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhpcyBiZWhhdmlvdXJcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgbGV0IGkgPSB0aGlzLnBhcmVudHMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHRoaXMucGFyZW50c1tpXS5yZW1vdmVCZWhhdmlvdXIodGhpcyk7XG4gICAgfVxuXG4gICAgdGhpcy5wYXJlbnRzLmxlbmd0aCA9IDA7XG4gIH1cbn1cbiIsImltcG9ydCBWZWN0b3IyRCBmcm9tIFwiLi4vbWF0aC9WZWN0b3IyRFwiO1xuaW1wb3J0IEJlaGF2aW91ciBmcm9tIFwiLi9CZWhhdmlvdXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRm9yY2UgZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUHJvdG9uLkZvcmNlXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBmeFxuICAgKiBAcGFyYW0ge051bWJlcn0gZnlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IoZngsIGZ5LCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcpO1xuXG4gICAgdGhpcy5mb3JjZSA9IHRoaXMubm9ybWFsaXplRm9yY2UobmV3IFZlY3RvcjJEKGZ4LCBmeSkpO1xuICAgIHRoaXMubmFtZSA9IFwiRm9yY2VcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQG1ldGhvZCByZXNldFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Gb3JjZVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGZ4XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBmeVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KGZ4LCBmeSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy5mb3JjZSA9IHRoaXMubm9ybWFsaXplRm9yY2UobmV3IFZlY3RvcjJEKGZ4LCBmeSkpO1xuXG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoaXMgYmVoYXZpb3VyIGZvciBhbGwgcGFydGljbGVzIGV2ZXJ5IHRpbWVcbiAgICpcbiAgICogQG1ldGhvZCBhcHBseUJlaGF2aW91clxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Gb3JjZVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuICAgIHBhcnRpY2xlLmEuYWRkKHRoaXMuZm9yY2UpO1xuICB9XG59XG4iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjJEXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG4vKipcbiAqIEF0dHJhY3Rpb24gYmVoYXZpb3IgZm9yIHBhcnRpY2xlcy5cbiAqIFRoaXMgYmVoYXZpb3VyIG1ha2VzIHBhcnRpY2xlcyBmb2xsb3cgYSBzcGVjaWZpYyB0YXJnZXQgcG9zaXRpb24uXG4gKiBAZXh0ZW5kcyBCZWhhdmlvdXJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXR0cmFjdGlvbiBleHRlbmRzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEF0dHJhY3Rpb24uXG4gICAqIEBwYXJhbSB7VmVjdG9yMkR9IHRhcmdldFBvc2l0aW9uIC0gVGhlIGF0dHJhY3Rpb24gcG9pbnQgY29vcmRpbmF0ZXMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZm9yY2U9MTAwXSAtIFRoZSBzdHJlbmd0aCBvZiB0aGUgYXR0cmFjdGlvbiBmb3JjZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MTAwMF0gLSBUaGUgcmFkaXVzIG9mIGluZmx1ZW5jZSBmb3IgdGhlIGF0dHJhY3Rpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gLSBUaGUgbGlmZSBzcGFuIG9mIHRoaXMgYmVoYXZpb3VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Vhc2luZz0nZWFzZS5lYXNlTGluZWFyJ10gLSBUaGUgZWFzaW5nIGZ1bmN0aW9uIGZvciB0aGlzIGJlaGF2aW91ci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHRhcmdldFBvc2l0aW9uLCBmb3JjZSwgcmFkaXVzLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRhcmdldCBwb3NpdGlvbiBmb3IgYXR0cmFjdGlvbi5cbiAgICAgKiBAdHlwZSB7VmVjdG9yMkR9XG4gICAgICovXG4gICAgdGhpcy50YXJnZXRQb3NpdGlvbiA9IFV0aWwuaW5pdFZhbHVlKHRhcmdldFBvc2l0aW9uLCBuZXcgVmVjdG9yMkQoKSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcmFkaXVzIG9mIGluZmx1ZW5jZSBmb3IgdGhlIGF0dHJhY3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnJhZGl1cyA9IFV0aWwuaW5pdFZhbHVlKHJhZGl1cywgMTAwMCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RyZW5ndGggb2YgdGhlIGF0dHJhY3Rpb24gZm9yY2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLmZvcmNlID0gVXRpbC5pbml0VmFsdWUodGhpcy5ub3JtYWxpemVWYWx1ZShmb3JjZSksIDEwMCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3F1YXJlZCByYWRpdXMgKGZvciBvcHRpbWl6YXRpb24pLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5yYWRpdXNTcSA9IHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXM7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYXR0cmFjdGlvbiBmb3JjZSB2ZWN0b3IuXG4gICAgICogQHR5cGUge1ZlY3RvcjJEfVxuICAgICAqL1xuICAgIHRoaXMuYXR0cmFjdGlvbkZvcmNlID0gbmV3IFZlY3RvcjJEKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3F1YXJlZCBsZW5ndGggb2YgdGhlIGF0dHJhY3Rpb24gZm9yY2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLmxlbmd0aFNxID0gMDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiZWhhdmlvdXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLm5hbWUgPSBcIkF0dHJhY3Rpb25cIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGJlaGF2aW91cidzIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB7VmVjdG9yMkR9IHRhcmdldFBvc2l0aW9uIC0gVGhlIG5ldyBhdHRyYWN0aW9uIHBvaW50IGNvb3JkaW5hdGVzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2ZvcmNlPTEwMF0gLSBUaGUgbmV3IHN0cmVuZ3RoIG9mIHRoZSBhdHRyYWN0aW9uIGZvcmNlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1cz0xMDAwXSAtIFRoZSBuZXcgcmFkaXVzIG9mIGluZmx1ZW5jZSBmb3IgdGhlIGF0dHJhY3Rpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gLSBUaGUgbmV3IGxpZmUgc3BhbiBvZiB0aGlzIGJlaGF2aW91ci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtlYXNpbmc9J2Vhc2UuZWFzZUxpbmVhciddIC0gVGhlIG5ldyBlYXNpbmcgZnVuY3Rpb24gZm9yIHRoaXMgYmVoYXZpb3VyLlxuICAgKi9cbiAgcmVzZXQodGFyZ2V0UG9zaXRpb24sIGZvcmNlLCByYWRpdXMsIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMudGFyZ2V0UG9zaXRpb24gPSBVdGlsLmluaXRWYWx1ZSh0YXJnZXRQb3NpdGlvbiwgbmV3IFZlY3RvcjJEKCkpO1xuICAgIHRoaXMucmFkaXVzID0gVXRpbC5pbml0VmFsdWUocmFkaXVzLCAxMDAwKTtcbiAgICB0aGlzLmZvcmNlID0gVXRpbC5pbml0VmFsdWUodGhpcy5ub3JtYWxpemVWYWx1ZShmb3JjZSksIDEwMCk7XG4gICAgdGhpcy5yYWRpdXNTcSA9IHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXM7XG4gICAgdGhpcy5hdHRyYWN0aW9uRm9yY2UgPSBuZXcgVmVjdG9yMkQoKTtcbiAgICB0aGlzLmxlbmd0aFNxID0gMDtcblxuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoaXMgYmVoYXZpb3VyIHRvIGEgcGFydGljbGUuXG4gICAqIEBwYXJhbSB7UGFydGljbGV9IHBhcnRpY2xlIC0gVGhlIHBhcnRpY2xlIHRvIGFwcGx5IHRoZSBiZWhhdmlvdXIgdG8uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gVGhlIGN1cnJlbnQgc2ltdWxhdGlvbiB0aW1lLlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIHBhcnRpY2xlLlxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgdGhpcy5jYWxjdWxhdGUocGFydGljbGUsIHRpbWUsIGluZGV4KTtcblxuICAgIHRoaXMuYXR0cmFjdGlvbkZvcmNlLmNvcHkodGhpcy50YXJnZXRQb3NpdGlvbik7XG4gICAgdGhpcy5hdHRyYWN0aW9uRm9yY2Uuc3ViKHBhcnRpY2xlLnApO1xuICAgIHRoaXMubGVuZ3RoU3EgPSB0aGlzLmF0dHJhY3Rpb25Gb3JjZS5sZW5ndGhTcSgpO1xuXG4gICAgaWYgKHRoaXMubGVuZ3RoU3EgPiAwLjAwMDA0ICYmIHRoaXMubGVuZ3RoU3EgPCB0aGlzLnJhZGl1c1NxKSB7XG4gICAgICB0aGlzLmF0dHJhY3Rpb25Gb3JjZS5ub3JtYWxpemUoKTtcbiAgICAgIHRoaXMuYXR0cmFjdGlvbkZvcmNlLm11bHRpcGx5U2NhbGFyKDEgLSB0aGlzLmxlbmd0aFNxIC8gdGhpcy5yYWRpdXNTcSk7XG4gICAgICB0aGlzLmF0dHJhY3Rpb25Gb3JjZS5tdWx0aXBseVNjYWxhcih0aGlzLmZvcmNlKTtcblxuICAgICAgcGFydGljbGUuYS5hZGQodGhpcy5hdHRyYWN0aW9uRm9yY2UpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjJEXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vQmVoYXZpb3VyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJhbmRvbURyaWZ0IGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAYXVnbWVudHMgQmVoYXZpb3VyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUmFuZG9tRHJpZnRcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRyaWZ0WCBcdFx0XHRcdFggdmFsdWUgb2YgdGhlIG5ldyBWZWN0b3IyRFxuICAgKiBAcGFyYW0ge051bWJlcn0gZHJpZnRZICBcdFx0XHRcdFkgdmFsdWUgb2YgdGhlIG5ldyBWZWN0b3IyRFxuICAgKiBAcGFyYW0ge051bWJlcn0gZGVsYXkgXHRcdFx0XHRIb3cgbXVjaCBkZWxheSB0aGUgZHJpZnQgc2hvdWxkIGhhdmVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICpcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHRpbWUgVGhlIHRpbWUgb2YgdGhlIGRyaWZ0XG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IoZHJpZnRYLCBkcmlmdFksIGRlbGF5LCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcpO1xuXG4gICAgdGhpcy5yZXNldChkcmlmdFgsIGRyaWZ0WSwgZGVsYXkpO1xuICAgIHRoaXMudGltZSA9IDA7XG4gICAgdGhpcy5uYW1lID0gXCJSYW5kb21EcmlmdFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUmFuZG9tRHJpZnRcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkcmlmdFggXHRcdFx0XHRYIHZhbHVlIG9mIHRoZSBuZXcgVmVjdG9yMkRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRyaWZ0WSAgXHRcdFx0XHRZIHZhbHVlIG9mIHRoZSBuZXcgVmVjdG9yMkRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbGF5IFx0XHRcdFx0SG93IG11Y2ggZGVsYXkgdGhlIGRyaWZ0IHNob3VsZCBoYXZlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChkcmlmdFgsIGRyaWZ0WSwgZGVsYXksIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMucGFuRm9jZSA9IG5ldyBWZWN0b3IyRChkcmlmdFgsIGRyaWZ0WSk7XG4gICAgdGhpcy5wYW5Gb2NlID0gdGhpcy5ub3JtYWxpemVGb3JjZSh0aGlzLnBhbkZvY2UpO1xuICAgIHRoaXMuZGVsYXkgPSBkZWxheTtcblxuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIGluaXRpYWxpemUocGFydGljbGUpIHtcbiAgICBwYXJ0aWNsZS5kYXRhLnRpbWUgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoaXMgYmVoYXZpb3VyIGZvciBhbGwgcGFydGljbGVzIGV2ZXJ5IHRpbWVcbiAgICpcbiAgICogQG1ldGhvZCBhcHBseUJlaGF2aW91clxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1JhbmRvbURyaWZ0XG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gXHRcdFx0dGltZSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gXHRcdFx0aW5kZXggdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuICAgIHBhcnRpY2xlLmRhdGEudGltZSArPSB0aW1lO1xuXG4gICAgaWYgKHBhcnRpY2xlLmRhdGEudGltZSA+PSB0aGlzLmRlbGF5KSB7XG4gICAgICBwYXJ0aWNsZS5hLmFkZFhZKFxuICAgICAgICBNYXRoVXRpbC5yYW5kb21BVG9CKC10aGlzLnBhbkZvY2UueCwgdGhpcy5wYW5Gb2NlLngpLFxuICAgICAgICBNYXRoVXRpbC5yYW5kb21BVG9CKC10aGlzLnBhbkZvY2UueSwgdGhpcy5wYW5Gb2NlLnkpXG4gICAgICApO1xuXG4gICAgICBwYXJ0aWNsZS5kYXRhLnRpbWUgPSAwO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IEZvcmNlIGZyb20gXCIuL0ZvcmNlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdyYXZpdHkgZXh0ZW5kcyBGb3JjZSB7XG4gIC8qKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIFByb3RvbiNQcm90b24uRm9yY2VcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBQcm90b24uR3Jhdml0eVxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gZyBcdFx0XHRcdFx0XHRcdEdyYXZpdHlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIEJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihnLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcigwLCBnLCBsaWZlLCBlYXNpbmcpO1xuICAgIHRoaXMubmFtZSA9IFwiR3Jhdml0eVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkdyYXZpdHlcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBnIFx0XHRcdFx0XHRcdFx0R3Jhdml0eVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKi9cbiAgcmVzZXQoZywgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIucmVzZXQoMCwgZywgbGlmZSwgZWFzaW5nKTtcbiAgfVxufVxuIiwiaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBWZWN0b3IyRCBmcm9tIFwiLi4vbWF0aC9WZWN0b3IyRFwiO1xuaW1wb3J0IEJlaGF2aW91ciBmcm9tIFwiLi9CZWhhdmlvdXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29sbGlzaW9uIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIFRoZSBjYWxsYmFjayBhZnRlciBjb2xsaXNpb25cbiAgICpcbiAgICogQGNhbGxiYWNrIENhbGxiYWNrXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJpdGNsZX0gb3RoZXJQYXJ0aWNsZVxuICAgKi9cbiAgLyoqXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAYXVnbWVudHMgUHJvdG9uLkJlaGF2aW91clxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIFByb3Rvbi5Db2xsaXNpb25cbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIHRvIG1hc3NcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uRW1pdHRlcn0gXHRbZW1pdHRlcj1udWxsXSBcdFx0dGhlIGF0dHJhY3Rpb24gcG9pbnQgY29vcmRpbmF0ZXNcbiAgICogQHBhcmFtIHtCb29sZWFufSBcdFx0W21hc3M9dHJ1ZV1cbiAgICogQHBhcmFtIHtDYWxsYmFja31cdCBcdFtjYWxsYmFjaz1udWxsXVx0XHR0aGUgY2FsbGJhY2sgYWZ0ZXIgdGhlIGNvbGxpc2lvblxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGVtaXR0ZXIsIG1hc3MsIGNhbGxiYWNrLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcpO1xuICAgIHRoaXMucmVzZXQoZW1pdHRlciwgbWFzcywgY2FsbGJhY2spO1xuICAgIHRoaXMubmV3UG9vbCA9IFtdO1xuICAgIHRoaXMucG9vbCA9IFtdO1xuICAgIHRoaXMubmFtZSA9IFwiQ29sbGlzaW9uXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkNvbGxpc2lvblxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gdG8gbWFzc1xuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5FbWl0dGVyfSBcdFtlbWl0dGVyPW51bGxdIFx0XHR0aGUgYXR0cmFjdGlvbiBwb2ludCBjb29yZGluYXRlc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFx0XHRbbWFzcz10cnVlXVxuICAgKiBAcGFyYW0ge0NhbGxiYWNrfVx0IFx0W2NhbGxiYWNrPW51bGxdXHRcdHRoZSBjYWxsYmFjayBhZnRlciB0aGUgY29sbGlzaW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBcdFx0XHRbbGlmZT1JbmZpbml0eV0gXHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChlbWl0dGVyLCBtYXNzLCBjYWxsYmFjaywgbGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy5lbWl0dGVyID0gVXRpbC5pbml0VmFsdWUoZW1pdHRlciwgbnVsbCk7XG4gICAgdGhpcy5tYXNzID0gVXRpbC5pbml0VmFsdWUobWFzcywgdHJ1ZSk7XG4gICAgdGhpcy5jYWxsYmFjayA9IFV0aWwuaW5pdFZhbHVlKGNhbGxiYWNrLCBudWxsKTtcblxuICAgIHRoaXMuY29sbGlzaW9uUG9vbCA9IFtdO1xuICAgIHRoaXMuZGVsdGEgPSBuZXcgVmVjdG9yMkQoKTtcblxuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGlzIGJlaGF2aW91ciBmb3IgYWxsIHBhcnRpY2xlcyBldmVyeSB0aW1lXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkNvbGxpc2lvblxuICAgKiBAbWV0aG9kIGFwcGx5QmVoYXZpb3VyXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFx0XHRcdHRpbWUgdGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtJbnR9IFx0XHRcdGluZGV4IHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgaWYgKHRoaXMuZW1pdHRlcikge1xuICAgICAgVXRpbC5zbGljZUFycmF5KHRoaXMuZW1pdHRlci5wYXJ0aWNsZXMsIGluZGV4LCB0aGlzLm5ld1Bvb2wpO1xuICAgIH0gZWxzZSB7XG4gICAgICBVdGlsLnNsaWNlQXJyYXkodGhpcy5wb29sLCBpbmRleCwgdGhpcy5uZXdQb29sKTtcbiAgICB9XG5cbiAgICBjb25zdCBsZW5ndGggPSB0aGlzLm5ld1Bvb2wubGVuZ3RoO1xuICAgIGxldCBvdGhlclBhcnRpY2xlO1xuICAgIGxldCBsZW5ndGhTcTtcbiAgICBsZXQgb3ZlcmxhcDtcbiAgICBsZXQgdG90YWxNYXNzO1xuICAgIGxldCBhdmVyYWdlTWFzczEsIGF2ZXJhZ2VNYXNzMjtcbiAgICBsZXQgaTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgb3RoZXJQYXJ0aWNsZSA9IHRoaXMubmV3UG9vbFtpXTtcblxuICAgICAgaWYgKG90aGVyUGFydGljbGUgIT09IHBhcnRpY2xlKSB7XG4gICAgICAgIHRoaXMuZGVsdGEuY29weShvdGhlclBhcnRpY2xlLnApO1xuICAgICAgICB0aGlzLmRlbHRhLnN1YihwYXJ0aWNsZS5wKTtcblxuICAgICAgICBsZW5ndGhTcSA9IHRoaXMuZGVsdGEubGVuZ3RoU3EoKTtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBwYXJ0aWNsZS5yYWRpdXMgKyBvdGhlclBhcnRpY2xlLnJhZGl1cztcblxuICAgICAgICBpZiAobGVuZ3RoU3EgPD0gZGlzdGFuY2UgKiBkaXN0YW5jZSkge1xuICAgICAgICAgIG92ZXJsYXAgPSBkaXN0YW5jZSAtIE1hdGguc3FydChsZW5ndGhTcSk7XG4gICAgICAgICAgb3ZlcmxhcCArPSAwLjU7XG5cbiAgICAgICAgICB0b3RhbE1hc3MgPSBwYXJ0aWNsZS5tYXNzICsgb3RoZXJQYXJ0aWNsZS5tYXNzO1xuICAgICAgICAgIGF2ZXJhZ2VNYXNzMSA9IHRoaXMubWFzcyA/IG90aGVyUGFydGljbGUubWFzcyAvIHRvdGFsTWFzcyA6IDAuNTtcbiAgICAgICAgICBhdmVyYWdlTWFzczIgPSB0aGlzLm1hc3MgPyBwYXJ0aWNsZS5tYXNzIC8gdG90YWxNYXNzIDogMC41O1xuXG4gICAgICAgICAgcGFydGljbGUucC5hZGQoXG4gICAgICAgICAgICB0aGlzLmRlbHRhXG4gICAgICAgICAgICAgIC5jbG9uZSgpXG4gICAgICAgICAgICAgIC5ub3JtYWxpemUoKVxuICAgICAgICAgICAgICAubXVsdGlwbHlTY2FsYXIob3ZlcmxhcCAqIC1hdmVyYWdlTWFzczEpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBvdGhlclBhcnRpY2xlLnAuYWRkKHRoaXMuZGVsdGEubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIob3ZlcmxhcCAqIGF2ZXJhZ2VNYXNzMikpO1xuXG4gICAgICAgICAgdGhpcy5jYWxsYmFjayAmJiB0aGlzLmNhbGxiYWNrKHBhcnRpY2xlLCBvdGhlclBhcnRpY2xlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vQmVoYXZpb3VyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENyb3NzWm9uZSBleHRlbmRzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBEZWZpbmVzIHdoYXQgaGFwcGVucyBpZiB0aGUgcGFydGljbGVzIGNvbWUgdG8gdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIHpvbmVcbiAgICpcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUHJvdG9uLkNyb3NzWm9uZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5ab25lfSB6b25lIFx0XHRcdFx0XHRcdGNhbiBiZSBhbnkgUHJvdG9uLlpvbmUgLSBlLmcuIFByb3Rvbi5SZWN0Wm9uZSgpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBcdFx0W2Nyb3NzVHlwZT1kZWFkXSBcdFx0XHR3aGF0IGhhcHBlbnMgaWYgdGhlIHBhcnRpY2xlcyBwYXNzIHRoZSB6b25lIC0gYWxsb3dlZCBzdHJpbmdzOiBkZWFkIHwgYm91bmQgfCBjcm9zc1xuICAgKiBAcGFyYW0ge051bWJlcn0gXHRcdFtsaWZlPUluZmluaXR5XSBcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFx0XHRbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKHpvbmUsIGNyb3NzVHlwZSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcblxuICAgIHRoaXMucmVzZXQoem9uZSwgY3Jvc3NUeXBlKTtcbiAgICB0aGlzLm5hbWUgPSBcIkNyb3NzWm9uZVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkNyb3NzWm9uZVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uWm9uZX0gem9uZSBcdFx0XHRcdGNhbiBiZSBhbnkgUHJvdG9uLlpvbmUgLSBlLmcuIFByb3Rvbi5SZWN0Wm9uZSgpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBcdFx0W2Nyb3NzVHlwZT1kZWFkXSBcdHdoYXQgaGFwcGVucyBpZiB0aGUgcGFydGljbGVzIHBhc3MgdGhlIHpvbmUgLSBhbGxvd2VkIHN0cmluZ3M6IGRlYWQgfCBib3VuZCB8IGNyb3NzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBcdFx0W2xpZmU9SW5maW5pdHldIFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBcdFx0W2Vhc2luZz1lYXNlTGluZWFyXVx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KHpvbmUsIGNyb3NzVHlwZSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy56b25lID0gem9uZTtcbiAgICB0aGlzLnpvbmUuY3Jvc3NUeXBlID0gVXRpbC5pbml0VmFsdWUoY3Jvc3NUeXBlLCBcImRlYWRcIik7XG5cbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGhpcyBiZWhhdmlvdXIgZm9yIGFsbCBwYXJ0aWNsZXMgZXZlcnkgdGltZVxuICAgKlxuICAgKiBAbWV0aG9kIGFwcGx5QmVoYXZpb3VyXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkNyb3NzWm9uZVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuICAgIHRoaXMuem9uZS5jcm9zc2luZyhwYXJ0aWNsZSk7XG4gIH1cbn1cbiIsImltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgU3BhbiBmcm9tIFwiLi4vbWF0aC9TcGFuXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG4vKipcbiAqIEFscGhhIGJlaGF2aW91ciBmb3IgY29udHJvbGxpbmcgcGFydGljbGUgb3BhY2l0eSBvdmVyIHRpbWUuXG4gKiBAZXh0ZW5kcyBCZWhhdmlvdXJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWxwaGEgZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzYW1lO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7U3Bhbn1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGE7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTcGFufVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYjtcblxuICAvKipcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIG5hbWU7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQWxwaGEgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfFNwYW59IFthPTFdIC0gVGhlIGluaXRpYWwgYWxwaGEgdmFsdWUgb3IgcmFuZ2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfFNwYW59IFtiXSAtIFRoZSBmaW5hbCBhbHBoYSB2YWx1ZSBvciByYW5nZS4gSWYgbm90IHByb3ZpZGVkLCBpdCB3aWxsIGJlIHRoZSBzYW1lIGFzICdhJy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtsaWZlPUluZmluaXR5XSAtIFRoaXMgYmVoYXZpb3VyJ3MgbGlmZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtlYXNpbmc9J2Vhc2VMaW5lYXInXSAtIFRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nIGZ1bmN0aW9uLlxuICAgKi9cbiAgY29uc3RydWN0b3IoYSwgYiwgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcblxuICAgIHRoaXMucmVzZXQoYSwgYik7XG4gICAgdGhpcy5uYW1lID0gXCJBbHBoYVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfFNwYW59IFthPTFdIC0gVGhlIGluaXRpYWwgYWxwaGEgdmFsdWUgb3IgcmFuZ2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfFNwYW59IFtiXSAtIFRoZSBmaW5hbCBhbHBoYSB2YWx1ZSBvciByYW5nZS4gSWYgbm90IHByb3ZpZGVkLCBpdCB3aWxsIGJlIHRoZSBzYW1lIGFzICdhJy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtsaWZlXSAtIFRoaXMgYmVoYXZpb3VyJ3MgbGlmZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtlYXNpbmddIC0gVGhpcyBiZWhhdmlvdXIncyBlYXNpbmcgZnVuY3Rpb24uXG4gICAqL1xuICByZXNldChhLCBiLCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLnNhbWUgPSBiID09PSBudWxsIHx8IGIgPT09IHVuZGVmaW5lZDtcbiAgICB0aGlzLmEgPSBTcGFuLnNldFNwYW5WYWx1ZShVdGlsLmluaXRWYWx1ZShhLCAxKSk7XG4gICAgdGhpcy5iID0gU3Bhbi5zZXRTcGFuVmFsdWUoYik7XG5cbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHBhcnRpY2xlJ3MgYWxwaGEgdmFsdWVzLlxuICAgKiBAcGFyYW0ge1BhcnRpY2xlfSBwYXJ0aWNsZSAtIFRoZSBwYXJ0aWNsZSB0byBpbml0aWFsaXplLlxuICAgKi9cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLmRhdGEuYWxwaGFBID0gdGhpcy5hLmdldFZhbHVlKCk7XG5cbiAgICBpZiAodGhpcy5zYW1lKSBwYXJ0aWNsZS5kYXRhLmFscGhhQiA9IHBhcnRpY2xlLmRhdGEuYWxwaGFBO1xuICAgIGVsc2UgcGFydGljbGUuZGF0YS5hbHBoYUIgPSB0aGlzLmIuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSBhbHBoYSBiZWhhdmlvdXIgdG8gdGhlIHBhcnRpY2xlLlxuICAgKiBAcGFyYW0ge1BhcnRpY2xlfSBwYXJ0aWNsZSAtIFRoZSBwYXJ0aWNsZSB0byBhcHBseSB0aGUgYmVoYXZpb3VyIHRvLlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRoZSBjdXJyZW50IHNpbXVsYXRpb24gdGltZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBwYXJ0aWNsZS5cbiAgICovXG4gIGFwcGx5QmVoYXZpb3VyKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIHRoaXMuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBpbmRleCk7XG5cbiAgICBwYXJ0aWNsZS5hbHBoYSA9IHBhcnRpY2xlLmRhdGEuYWxwaGFCICsgKHBhcnRpY2xlLmRhdGEuYWxwaGFBIC0gcGFydGljbGUuZGF0YS5hbHBoYUIpICogdGhpcy5lbmVyZ3k7XG5cbiAgICBpZiAocGFydGljbGUuYWxwaGEgPCAwLjAwMSkgcGFydGljbGUuYWxwaGEgPSAwO1xuICB9XG59XG4iLCJpbXBvcnQgU3BhbiBmcm9tIFwiLi4vbWF0aC9TcGFuXCI7XG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IEJlaGF2aW91ciBmcm9tIFwiLi9CZWhhdmlvdXJcIjtcblxuLyoqXG4gKiBTY2FsZSBiZWhhdmlvdXIgZm9yIGNvbnRyb2xsaW5nIHBhcnRpY2xlIHNpemUgb3ZlciB0aW1lLlxuICogQGV4dGVuZHMgQmVoYXZpb3VyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjYWxlIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2FtZTtcblxuICAvKipcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIG5hbWU7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgU2NhbGUgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfFNwYW59IFthPTFdIC0gVGhlIGluaXRpYWwgc2NhbGUgdmFsdWUgb3IgcmFuZ2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfFNwYW59IFtiXSAtIFRoZSBmaW5hbCBzY2FsZSB2YWx1ZSBvciByYW5nZS4gSWYgbm90IHByb3ZpZGVkLCBpdCB3aWxsIGJlIHRoZSBzYW1lIGFzICdhJy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtsaWZlPUluZmluaXR5XSAtIFRoaXMgYmVoYXZpb3VyJ3MgbGlmZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtlYXNpbmc9J2Vhc2VMaW5lYXInXSAtIFRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nIGZ1bmN0aW9uLlxuICAgKi9cbiAgY29uc3RydWN0b3IoYSwgYiwgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcblxuICAgIHRoaXMucmVzZXQoYSwgYik7XG4gICAgdGhpcy5uYW1lID0gXCJTY2FsZVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfFNwYW59IGEgLSBUaGUgaW5pdGlhbCBzY2FsZSB2YWx1ZSBvciByYW5nZS5cbiAgICogQHBhcmFtIHtudW1iZXJ8U3Bhbn0gW2JdIC0gVGhlIGZpbmFsIHNjYWxlIHZhbHVlIG9yIHJhbmdlLiBJZiBub3QgcHJvdmlkZWQsIGl0IHdpbGwgYmUgdGhlIHNhbWUgYXMgJ2EnLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2xpZmVdIC0gVGhpcyBiZWhhdmlvdXIncyBsaWZlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Vhc2luZ10gLSBUaGlzIGJlaGF2aW91cidzIGVhc2luZyBmdW5jdGlvbi5cbiAgICovXG4gIHJlc2V0KGEsIGIsIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMuc2FtZSA9IGIgPT09IG51bGwgfHwgYiA9PT0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYSA9IFNwYW4uc2V0U3BhblZhbHVlKFV0aWwuaW5pdFZhbHVlKGEsIDEpKTtcbiAgICB0aGlzLmIgPSBTcGFuLnNldFNwYW5WYWx1ZShiKTtcblxuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGFydGljbGUncyBzY2FsZSB2YWx1ZXMuXG4gICAqIEBwYXJhbSB7UGFydGljbGV9IHBhcnRpY2xlIC0gVGhlIHBhcnRpY2xlIHRvIGluaXRpYWxpemUuXG4gICAqL1xuICBpbml0aWFsaXplKHBhcnRpY2xlKSB7XG4gICAgcGFydGljbGUuZGF0YS5zY2FsZUEgPSB0aGlzLmEuZ2V0VmFsdWUoKTtcbiAgICBwYXJ0aWNsZS5kYXRhLm9sZFJhZGl1cyA9IHBhcnRpY2xlLnJhZGl1cztcbiAgICBwYXJ0aWNsZS5kYXRhLnNjYWxlQiA9IHRoaXMuc2FtZSA/IHBhcnRpY2xlLmRhdGEuc2NhbGVBIDogdGhpcy5iLmdldFZhbHVlKCk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyB0aGUgc2NhbGUgYmVoYXZpb3VyIHRvIHRoZSBwYXJ0aWNsZS5cbiAgICogQHBhcmFtIHtQYXJ0aWNsZX0gcGFydGljbGUgLSBUaGUgcGFydGljbGUgdG8gYXBwbHkgdGhlIGJlaGF2aW91ciB0by5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgLSBUaGUgY3VycmVudCBzaW11bGF0aW9uIHRpbWUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgcGFydGljbGUuXG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuICAgIHBhcnRpY2xlLnNjYWxlID0gcGFydGljbGUuZGF0YS5zY2FsZUIgKyAocGFydGljbGUuZGF0YS5zY2FsZUEgLSBwYXJ0aWNsZS5kYXRhLnNjYWxlQikgKiB0aGlzLmVuZXJneTtcblxuICAgIGlmIChwYXJ0aWNsZS5zY2FsZSA8IDAuMDAwMSkgcGFydGljbGUuc2NhbGUgPSAwO1xuICAgIHBhcnRpY2xlLnJhZGl1cyA9IHBhcnRpY2xlLmRhdGEub2xkUmFkaXVzICogcGFydGljbGUuc2NhbGU7XG4gIH1cbn1cbiIsImltcG9ydCBTcGFuIGZyb20gXCIuLi9tYXRoL1NwYW5cIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG4vKipcbiAqIFJvdGF0ZSBiZWhhdmlvdXIgZm9yIGNvbnRyb2xsaW5nIHBhcnRpY2xlIHJvdGF0aW9uLlxuICogQGV4dGVuZHMgQmVoYXZpb3VyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvdGF0ZSBleHRlbmRzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNhbWU7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTcGFufVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYTtcblxuICAvKipcbiAgICogQHR5cGUge1NwYW59XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBiO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3R5bGU7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBuYW1lO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFJvdGF0ZSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfFNwYW59IFtpbmZsdWVuY2U9J1ZlbG9jaXR5J10gLSBUaGUgcm90YXRpb24ncyBpbmZsdWVuY2Ugb3IgaW5pdGlhbCByb3RhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfFNwYW59IFtiXSAtIFRoZSBmaW5hbCByb3RhdGlvbiB2YWx1ZSBvciByYW5nZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHlsZT0ndG8nXSAtIFRoZSBzdHlsZSBvZiByb3RhdGlvbiAoJ3RvJyBvciAnYWRkJykuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gLSBUaGlzIGJlaGF2aW91cidzIGxpZmUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZWFzaW5nPSdlYXNlTGluZWFyJ10gLSBUaGlzIGJlaGF2aW91cidzIGVhc2luZyBmdW5jdGlvbi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGluZmx1ZW5jZSwgYiwgc3R5bGUsIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZyk7XG5cbiAgICB0aGlzLnJlc2V0KGluZmx1ZW5jZSwgYiwgc3R5bGUpO1xuICAgIHRoaXMubmFtZSA9IFwiUm90YXRlXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfFNwYW59IFthPSdWZWxvY2l0eSddIC0gVGhlIHJvdGF0aW9uJ3MgaW5mbHVlbmNlIG9yIGluaXRpYWwgcm90YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxTcGFufSBbYl0gLSBUaGUgZmluYWwgcm90YXRpb24gdmFsdWUgb3IgcmFuZ2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc3R5bGU9J3RvJ10gLSBUaGUgc3R5bGUgb2Ygcm90YXRpb24gKCd0bycgb3IgJ2FkZCcpLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2xpZmVdIC0gVGhpcyBiZWhhdmlvdXIncyBsaWZlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Vhc2luZ10gLSBUaGlzIGJlaGF2aW91cidzIGVhc2luZyBmdW5jdGlvbi5cbiAgICovXG4gIHJlc2V0KGEsIGIsIHN0eWxlLCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLnNhbWUgPSBiID09PSBudWxsIHx8IGIgPT09IHVuZGVmaW5lZDtcblxuICAgIHRoaXMuYSA9IFNwYW4uc2V0U3BhblZhbHVlKFV0aWwuaW5pdFZhbHVlKGEsIFwiVmVsb2NpdHlcIikpO1xuICAgIHRoaXMuYiA9IFNwYW4uc2V0U3BhblZhbHVlKFV0aWwuaW5pdFZhbHVlKGIsIDApKTtcbiAgICB0aGlzLnN0eWxlID0gVXRpbC5pbml0VmFsdWUoc3R5bGUsIFwidG9cIik7XG5cbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGJlaGF2aW91cidzIHBhcmFtZXRlcnMgZm9yIGEgcGFydGljbGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJ0aWNsZSAtIFRoZSBwYXJ0aWNsZSB0byBpbml0aWFsaXplLlxuICAgKiBAcGFyYW0ge251bWJlcn0gcGFydGljbGUucm90YXRpb24gLSBUaGUgcGFydGljbGUncyByb3RhdGlvbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcnRpY2xlLmRhdGEgLSBUaGUgcGFydGljbGUncyBkYXRhIG9iamVjdC5cbiAgICovXG4gIGluaXRpYWxpemUocGFydGljbGUpIHtcbiAgICBwYXJ0aWNsZS5yb3RhdGlvbiA9IHRoaXMuYS5nZXRWYWx1ZSgpO1xuICAgIHBhcnRpY2xlLmRhdGEucm90YXRpb25BID0gdGhpcy5hLmdldFZhbHVlKCk7XG5cbiAgICBpZiAoIXRoaXMuc2FtZSkgcGFydGljbGUuZGF0YS5yb3RhdGlvbkIgPSB0aGlzLmIuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoaXMgYmVoYXZpb3VyIHRvIGEgcGFydGljbGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJ0aWNsZSAtIFRoZSBwYXJ0aWNsZSB0byBhcHBseSB0aGUgYmVoYXZpb3VyIHRvLlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRoZSBpbnRlZ3JhdGUgdGltZSAoMS9tcykuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBwYXJ0aWNsZSBpbmRleC5cbiAgICovXG4gIGFwcGx5QmVoYXZpb3VyKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIHRoaXMuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBpbmRleCk7XG5cbiAgICBpZiAoIXRoaXMuc2FtZSkge1xuICAgICAgaWYgKHRoaXMuc3R5bGUgPT09IFwidG9cIiB8fCB0aGlzLnN0eWxlID09PSBcIlRPXCIgfHwgdGhpcy5zdHlsZSA9PT0gXCJfXCIpIHtcbiAgICAgICAgcGFydGljbGUucm90YXRpb24gKz1cbiAgICAgICAgICBwYXJ0aWNsZS5kYXRhLnJvdGF0aW9uQiArIChwYXJ0aWNsZS5kYXRhLnJvdGF0aW9uQSAtIHBhcnRpY2xlLmRhdGEucm90YXRpb25CKSAqIHRoaXMuZW5lcmd5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFydGljbGUucm90YXRpb24gKz0gcGFydGljbGUuZGF0YS5yb3RhdGlvbkI7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmEuYSA9PT0gXCJWXCIgfHwgdGhpcy5hLmEgPT09IFwiVmVsb2NpdHlcIiB8fCB0aGlzLmEuYSA9PT0gXCJ2XCIpIHtcbiAgICAgIC8vIGJldGEuLi5cbiAgICAgIHBhcnRpY2xlLnJvdGF0aW9uID0gcGFydGljbGUuZ2V0RGlyZWN0aW9uKCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgQ29sb3JVdGlsIGZyb20gXCIuLi91dGlscy9Db2xvclV0aWxcIjtcbmltcG9ydCBBcnJheVNwYW4gZnJvbSBcIi4uL21hdGgvQXJyYXlTcGFuXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb2xvciBleHRlbmRzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBQcm90b24uQ29sb3JcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uQXJyYXlTcGFuIHwgU3RyaW5nfSBbYV0gdGhlIHN0cmluZyBzaG91bGQgYmUgYSBoZXggZS5nLiAjMDAwMDAwIGZvciBibGFja1xuICAgKiBAcGFyYW0ge1Byb3Rvbi5BcnJheVNwYW4gfCBTdHJpbmd9IFtiXSB0aGUgc3RyaW5nIHNob3VsZCBiZSBhIGhleCBlLmcuICMwMDAwMDAgZm9yIGJsYWNrXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGEsIGIsIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZyk7XG5cbiAgICB0aGlzLnJlc2V0KGEsIGIpO1xuICAgIHRoaXMubmFtZSA9IFwiQ29sb3JcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQG1ldGhvZCByZXNldFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Db2xvclxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uQXJyYXlTcGFuIHwgU3RyaW5nfSBhIHRoZSBzdHJpbmcgc2hvdWxkIGJlIGEgaGV4IGUuZy4gIzAwMDAwMCBmb3IgYmxhY2tcbiAgICogQHBhcmFtIHtQcm90b24uQXJyYXlTcGFuIHwgU3RyaW5nfSBiIHRoZSBzdHJpbmcgc2hvdWxkIGJlIGEgaGV4IGUuZy4gIzAwMDAwMCBmb3IgYmxhY2tcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChhLCBiLCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLmEgPSBBcnJheVNwYW4uY3JlYXRlQXJyYXlTcGFuKGEpO1xuICAgIHRoaXMuYiA9IEFycmF5U3Bhbi5jcmVhdGVBcnJheVNwYW4oYik7XG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGJlaGF2aW91cidzIHBhcmFtZXRlcnMgZm9yIGFsbCBwYXJ0aWNsZXNcbiAgICpcbiAgICogQG1ldGhvZCBpbml0aWFsaXplXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkNvbG9yXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICovXG4gIGluaXRpYWxpemUocGFydGljbGUpIHtcbiAgICBwYXJ0aWNsZS5jb2xvciA9IHRoaXMuYS5nZXRWYWx1ZSgpO1xuICAgIHBhcnRpY2xlLmRhdGEuY29sb3JBID0gQ29sb3JVdGlsLmhleFRvUmdiKHBhcnRpY2xlLmNvbG9yKTtcblxuICAgIGlmICh0aGlzLmIpIHBhcnRpY2xlLmRhdGEuY29sb3JCID0gQ29sb3JVdGlsLmhleFRvUmdiKHRoaXMuYi5nZXRWYWx1ZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGlzIGJlaGF2aW91ciBmb3IgYWxsIHBhcnRpY2xlcyBldmVyeSB0aW1lXG4gICAqXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQ29sb3JcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gdGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtJbnR9IHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgaWYgKHRoaXMuYikge1xuICAgICAgdGhpcy5jYWxjdWxhdGUocGFydGljbGUsIHRpbWUsIGluZGV4KTtcblxuICAgICAgcGFydGljbGUucmdiLnIgPSBwYXJ0aWNsZS5kYXRhLmNvbG9yQi5yICsgKHBhcnRpY2xlLmRhdGEuY29sb3JBLnIgLSBwYXJ0aWNsZS5kYXRhLmNvbG9yQi5yKSAqIHRoaXMuZW5lcmd5O1xuICAgICAgcGFydGljbGUucmdiLmcgPSBwYXJ0aWNsZS5kYXRhLmNvbG9yQi5nICsgKHBhcnRpY2xlLmRhdGEuY29sb3JBLmcgLSBwYXJ0aWNsZS5kYXRhLmNvbG9yQi5nKSAqIHRoaXMuZW5lcmd5O1xuICAgICAgcGFydGljbGUucmdiLmIgPSBwYXJ0aWNsZS5kYXRhLmNvbG9yQi5iICsgKHBhcnRpY2xlLmRhdGEuY29sb3JBLmIgLSBwYXJ0aWNsZS5kYXRhLmNvbG9yQi5iKSAqIHRoaXMuZW5lcmd5O1xuXG4gICAgICBwYXJ0aWNsZS5yZ2IuciA9IHBhcnRpY2xlLnJnYi5yIDw8IDA7XG4gICAgICBwYXJ0aWNsZS5yZ2IuZyA9IHBhcnRpY2xlLnJnYi5nIDw8IDA7XG4gICAgICBwYXJ0aWNsZS5yZ2IuYiA9IHBhcnRpY2xlLnJnYi5iIDw8IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnRpY2xlLnJnYi5yID0gcGFydGljbGUuZGF0YS5jb2xvckEucjtcbiAgICAgIHBhcnRpY2xlLnJnYi5nID0gcGFydGljbGUuZGF0YS5jb2xvckEuZztcbiAgICAgIHBhcnRpY2xlLnJnYi5iID0gcGFydGljbGUuZGF0YS5jb2xvckEuYjtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjJEXCI7XG5pbXBvcnQgU3BhbiBmcm9tIFwiLi4vbWF0aC9TcGFuXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG5jb25zdCBDSEFOR0lORyA9IFwiY2hhbmdpbmdcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3ljbG9uZSBleHRlbmRzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBQcm90b24uQ3ljbG9uZVxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gYW5nbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGZvcmNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGFuZ2xlLCBmb3JjZSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcbiAgICB0aGlzLnNldEFuZ2xlQW5kRm9yY2UoYW5nbGUsIGZvcmNlKTtcbiAgICB0aGlzLm5hbWUgPSBcIkN5Y2xvbmVcIjtcbiAgfVxuXG4gIHNldEFuZ2xlQW5kRm9yY2UoYW5nbGUsIGZvcmNlKSB7XG4gICAgdGhpcy5mb3JjZSA9IENIQU5HSU5HO1xuICAgIHRoaXMuYW5nbGUgPSBNYXRoVXRpbC5QSSAvIDI7XG5cbiAgICBpZiAoYW5nbGUgPT09IFwicmlnaHRcIikge1xuICAgICAgdGhpcy5hbmdsZSA9IE1hdGhVdGlsLlBJIC8gMjtcbiAgICB9IGVsc2UgaWYgKGFuZ2xlID09PSBcImxlZnRcIikge1xuICAgICAgdGhpcy5hbmdsZSA9IC1NYXRoVXRpbC5QSSAvIDI7XG4gICAgfSBlbHNlIGlmIChhbmdsZSA9PT0gXCJyYW5kb21cIikge1xuICAgICAgdGhpcy5hbmdsZSA9IFwicmFuZG9tXCI7XG4gICAgfSBlbHNlIGlmIChhbmdsZSBpbnN0YW5jZW9mIFNwYW4pIHtcbiAgICAgIHRoaXMuYW5nbGUgPSBcInNwYW5cIjtcbiAgICAgIHRoaXMuc3BhbiA9IGFuZ2xlO1xuICAgIH0gZWxzZSBpZiAoYW5nbGUpIHtcbiAgICAgIHRoaXMuYW5nbGUgPSBhbmdsZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBTdHJpbmcoZm9yY2UpLnRvTG93ZXJDYXNlKCkgPT09IFwiY2hhbmdpbmdcIiB8fFxuICAgICAgU3RyaW5nKGZvcmNlKS50b0xvd2VyQ2FzZSgpID09PSBcImNoYW5nXCIgfHxcbiAgICAgIFN0cmluZyhmb3JjZSkudG9Mb3dlckNhc2UoKSA9PT0gXCJhdXRvXCJcbiAgICApIHtcbiAgICAgIHRoaXMuZm9yY2UgPSBDSEFOR0lORztcbiAgICB9IGVsc2UgaWYgKGZvcmNlKSB7XG4gICAgICB0aGlzLmZvcmNlID0gZm9yY2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkN5Y2xvbmVcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBhbmdsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gZm9yY2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChhbmdsZSwgZm9yY2UsIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMuYW5nbGUgPSBNYXRoVXRpbC5QSSAvIDI7XG4gICAgdGhpcy5zZXRBbmdsZUFuZEZvcmNlKGFuZ2xlLCBmb3JjZSk7XG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIGlmICh0aGlzLmFuZ2xlID09PSBcInJhbmRvbVwiKSB7XG4gICAgICBwYXJ0aWNsZS5kYXRhLmNhbmdsZSA9IE1hdGhVdGlsLnJhbmRvbUFUb0IoLU1hdGhVdGlsLlBJLCBNYXRoVXRpbC5QSSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFuZ2xlID09PSBcInNwYW5cIikge1xuICAgICAgcGFydGljbGUuZGF0YS5jYW5nbGUgPSB0aGlzLnNwYW4uZ2V0VmFsdWUoKTtcbiAgICB9XG5cbiAgICBwYXJ0aWNsZS5kYXRhLmN5Y2xvbmUgPSBuZXcgVmVjdG9yMkQoMCwgMCk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGhpcyBiZWhhdmlvdXIgZm9yIGFsbCBwYXJ0aWNsZXMgZXZlcnkgdGltZVxuICAgKlxuICAgKiBAbWV0aG9kIGFwcGx5QmVoYXZpb3VyXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkN5Y2xvbmVcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gdGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtJbnR9IHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgdGhpcy5jYWxjdWxhdGUocGFydGljbGUsIHRpbWUsIGluZGV4KTtcblxuICAgIGxldCBsZW5ndGg7XG4gICAgbGV0IGdyYWRpZW50ID0gcGFydGljbGUudi5nZXRHcmFkaWVudCgpO1xuICAgIGlmICh0aGlzLmFuZ2xlID09PSBcInJhbmRvbVwiIHx8IHRoaXMuYW5nbGUgPT09IFwic3BhblwiKSB7XG4gICAgICBncmFkaWVudCArPSBwYXJ0aWNsZS5kYXRhLmNhbmdsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JhZGllbnQgKz0gdGhpcy5hbmdsZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mb3JjZSA9PT0gQ0hBTkdJTkcpIHtcbiAgICAgIGxlbmd0aCA9IHBhcnRpY2xlLnYubGVuZ3RoKCkgLyAxMDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlbmd0aCA9IHRoaXMuZm9yY2U7XG4gICAgfVxuXG4gICAgcGFydGljbGUuZGF0YS5jeWNsb25lLnggPSBsZW5ndGggKiBNYXRoLmNvcyhncmFkaWVudCk7XG4gICAgcGFydGljbGUuZGF0YS5jeWNsb25lLnkgPSBsZW5ndGggKiBNYXRoLnNpbihncmFkaWVudCk7XG4gICAgcGFydGljbGUuZGF0YS5jeWNsb25lID0gdGhpcy5ub3JtYWxpemVGb3JjZShwYXJ0aWNsZS5kYXRhLmN5Y2xvbmUpO1xuICAgIHBhcnRpY2xlLmEuYWRkKHBhcnRpY2xlLmRhdGEuY3ljbG9uZSk7XG4gIH1cbn1cbiIsImltcG9ydCBBdHRyYWN0aW9uIGZyb20gXCIuL0F0dHJhY3Rpb25cIjtcblxuLyoqXG4gKiBUaGUgb3Bwb3NpdGUgb2YgQXR0cmFjdGlvbiAtIHR1cm5zIHRoZSBmb3JjZVxuICpcbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgUHJvdG9uLkF0dHJhY3Rpb25cbiAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICogQGFsaWFzIFByb3Rvbi5SZXB1bHNpb25cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVwdWxzaW9uIGV4dGVuZHMgQXR0cmFjdGlvbiB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFJlcHVsc2lvbiBiZWhhdmlvdXIgaW5zdGFuY2VcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UHJvdG9uLlZlY3RvcjJEfSB0YXJnZXRQb3NpdGlvbiAtIFRoZSByZXB1bHNpb24gcG9pbnQgY29vcmRpbmF0ZXNcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtmb3JjZT0xMDBdIC0gVGhlIHN0cmVuZ3RoIG9mIHRoZSByZXB1bHNpb24gZm9yY2VcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MTAwMF0gLSBUaGUgcmFkaXVzIG9mIGluZmx1ZW5jZSBmb3IgdGhlIHJlcHVsc2lvblxuICAgKiBAcGFyYW0ge251bWJlcn0gW2xpZmU9SW5maW5pdHldIC0gVGhlIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtlYXNpbmc9J2Vhc2VMaW5lYXInXSAtIFRoZSBiZWhhdmlvdXIncyBlYXNpbmcgZnVuY3Rpb25cbiAgICovXG4gIGNvbnN0cnVjdG9yKHRhcmdldFBvc2l0aW9uLCBmb3JjZSwgcmFkaXVzLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcih0YXJnZXRQb3NpdGlvbiwgZm9yY2UsIHJhZGl1cywgbGlmZSwgZWFzaW5nKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzdHJlbmd0aCBvZiB0aGUgcmVwdWxzaW9uIGZvcmNlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLmZvcmNlICo9IC0xO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJlaGF2aW91clxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5uYW1lID0gXCJSZXB1bHNpb25cIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uVmVjdG9yMkR9IHRhcmdldFBvc2l0aW9uIC0gVGhlIG5ldyByZXB1bHNpb24gcG9pbnQgY29vcmRpbmF0ZXNcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtmb3JjZT0xMDBdIC0gVGhlIG5ldyBzdHJlbmd0aCBvZiB0aGUgcmVwdWxzaW9uIGZvcmNlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPTEwMDBdIC0gVGhlIG5ldyByYWRpdXMgb2YgaW5mbHVlbmNlIGZvciB0aGUgcmVwdWxzaW9uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gLSBUaGUgbmV3IGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtlYXNpbmc9J2Vhc2VMaW5lYXInXSAtIFRoZSBuZXcgYmVoYXZpb3VyJ3MgZWFzaW5nIGZ1bmN0aW9uXG4gICAqL1xuICByZXNldCh0YXJnZXRQb3NpdGlvbiwgZm9yY2UsIHJhZGl1cywgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIucmVzZXQodGFyZ2V0UG9zaXRpb24sIGZvcmNlLCByYWRpdXMsIGxpZmUsIGVhc2luZyk7XG4gICAgdGhpcy5mb3JjZSAqPSAtMTtcbiAgfVxufVxuIiwiaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBWZWN0b3IyRCBmcm9tIFwiLi4vbWF0aC9WZWN0b3IyRFwiO1xuaW1wb3J0IEJlaGF2aW91ciBmcm9tIFwiLi9CZWhhdmlvdXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR3Jhdml0eVdlbGwgZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBCZWhhdmlvdXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBHcmF2aXR5V2VsbFxuICAgKlxuICAgKiBAcGFyYW0ge1ZlY3RvcjJEfSBbY2VudGVyUG9pbnQ9bmV3IFZlY3RvcjJEXSBUaGUgcG9pbnQgaW4gdGhlIGNlbnRlclxuICAgKiBAcGFyYW0ge051bWJlcn0gW2ZvcmNlPTEwMF1cdFx0XHRcdFx0VGhlIGZvcmNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV1cdFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlTGluZWFyXVx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIEJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjZW50ZXJQb2ludCwgZm9yY2UsIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZyk7XG5cbiAgICB0aGlzLmRpc3RhbmNlVmVjID0gbmV3IFZlY3RvcjJEKCk7XG4gICAgdGhpcy5jZW50ZXJQb2ludCA9IFV0aWwuaW5pdFZhbHVlKGNlbnRlclBvaW50LCBuZXcgVmVjdG9yMkQoKSk7XG4gICAgdGhpcy5mb3JjZSA9IFV0aWwuaW5pdFZhbHVlKHRoaXMubm9ybWFsaXplVmFsdWUoZm9yY2UpLCAxMDApO1xuXG4gICAgdGhpcy5uYW1lID0gXCJHcmF2aXR5V2VsbFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jR3Jhdml0eVdlbGxcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7VmVjdG9yMkR9IFtjZW50ZXJQb2ludD1uZXcgVmVjdG9yMkRdIFRoZSBwb2ludCBpbiB0aGUgY2VudGVyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbZm9yY2U9MTAwXVx0XHRcdFx0XHRUaGUgZm9yY2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XVx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2VMaW5lYXJdXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKi9cbiAgcmVzZXQoY2VudGVyUG9pbnQsIGZvcmNlLCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLmRpc3RhbmNlVmVjID0gbmV3IFZlY3RvcjJEKCk7XG4gICAgdGhpcy5jZW50ZXJQb2ludCA9IFV0aWwuaW5pdFZhbHVlKGNlbnRlclBvaW50LCBuZXcgVmVjdG9yMkQoKSk7XG4gICAgdGhpcy5mb3JjZSA9IFV0aWwuaW5pdFZhbHVlKHRoaXMubm9ybWFsaXplVmFsdWUoZm9yY2UpLCAxMDApO1xuXG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBpbml0aWFsaXplKHBhcnRpY2xlKSB7fVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGlzIGJlaGF2aW91ciBmb3IgYWxsIHBhcnRpY2xlcyBldmVyeSB0aW1lXG4gICAqXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQG1lbWJlcm9mIFByb3RvbiNHcmF2aXR5V2VsbFxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7SW50fSB0aGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIGFwcGx5QmVoYXZpb3VyKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIHRoaXMuZGlzdGFuY2VWZWMuc2V0KHRoaXMuY2VudGVyUG9pbnQueCAtIHBhcnRpY2xlLnAueCwgdGhpcy5jZW50ZXJQb2ludC55IC0gcGFydGljbGUucC55KTtcbiAgICBjb25zdCBkaXN0YW5jZVNxID0gdGhpcy5kaXN0YW5jZVZlYy5sZW5ndGhTcSgpO1xuXG4gICAgaWYgKGRpc3RhbmNlU3EgIT09IDApIHtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gdGhpcy5kaXN0YW5jZVZlYy5sZW5ndGgoKTtcbiAgICAgIGNvbnN0IGZhY3RvciA9ICh0aGlzLmZvcmNlICogdGltZSkgLyAoZGlzdGFuY2VTcSAqIGRpc3RhbmNlKTtcblxuICAgICAgcGFydGljbGUudi54ICs9IGZhY3RvciAqIHRoaXMuZGlzdGFuY2VWZWMueDtcbiAgICAgIHBhcnRpY2xlLnYueSArPSBmYWN0b3IgKiB0aGlzLmRpc3RhbmNlVmVjLnk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgUHJvcFV0aWwgZnJvbSBcIi4uL3V0aWxzL1Byb3BVdGlsXCI7XG5pbXBvcnQgSW5pdGlhbGl6ZSBmcm9tIFwiLi9Jbml0aWFsaXplXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0aWFsaXplKGVtaXR0ZXIsIHBhcnRpY2xlLCBpbml0aWFsaXplcykge1xuICAgIGNvbnN0IGxlbmd0aCA9IGluaXRpYWxpemVzLmxlbmd0aDtcbiAgICBsZXQgaTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGluaXRpYWxpemVzW2ldIGluc3RhbmNlb2YgSW5pdGlhbGl6ZSkge1xuICAgICAgICBpbml0aWFsaXplc1tpXS5pbml0KGVtaXR0ZXIsIHBhcnRpY2xlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaW5pdChlbWl0dGVyLCBwYXJ0aWNsZSwgaW5pdGlhbGl6ZXNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuYmluZEVtaXR0ZXIoZW1pdHRlciwgcGFydGljbGUpO1xuICB9LFxuXG4gIC8vIGluaXRcbiAgaW5pdChlbWl0dGVyLCBwYXJ0aWNsZSwgaW5pdGlhbGl6ZSkge1xuICAgIFByb3BVdGlsLnNldFByb3AocGFydGljbGUsIGluaXRpYWxpemUpO1xuICAgIFByb3BVdGlsLnNldFZlY3RvclZhbChwYXJ0aWNsZSwgaW5pdGlhbGl6ZSk7XG4gIH0sXG5cbiAgYmluZEVtaXR0ZXIoZW1pdHRlciwgcGFydGljbGUpIHtcbiAgICBpZiAoZW1pdHRlci5iaW5kRW1pdHRlcikge1xuICAgICAgcGFydGljbGUucC5hZGQoZW1pdHRlci5wKTtcbiAgICAgIHBhcnRpY2xlLnYuYWRkKGVtaXR0ZXIudik7XG4gICAgICBwYXJ0aWNsZS5hLmFkZChlbWl0dGVyLmEpO1xuICAgICAgcGFydGljbGUudi5yb3RhdGUoTWF0aFV0aWwuZGVncmVlVHJhbnNmb3JtKGVtaXR0ZXIucm90YXRpb24pKTtcbiAgICB9XG4gIH1cbn07XG4iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IFB1aWQgZnJvbSBcIi4uL3V0aWxzL1B1aWRcIjtcbmltcG9ydCBQYXJ0aWNsZSBmcm9tIFwiLi4vY29yZS9QYXJ0aWNsZVwiO1xuaW1wb3J0IEV2ZW50RGlzcGF0Y2hlciBmcm9tIFwiLi4vZXZlbnRzL0V2ZW50RGlzcGF0Y2hlclwiO1xuXG5pbXBvcnQgUmF0ZSBmcm9tIFwiLi4vaW5pdGlhbGl6ZS9SYXRlXCI7XG5pbXBvcnQgSW5pdGlhbGl6ZVV0aWwgZnJvbSBcIi4uL2luaXRpYWxpemUvSW5pdGlhbGl6ZVV0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW1pdHRlciBleHRlbmRzIFBhcnRpY2xlIHtcbiAgLyoqXG4gICAqIFlvdSBjYW4gdXNlIHRoaXMgZW1pdCBwYXJ0aWNsZXMuXG4gICAqXG4gICAqIEl0IHdpbGwgZGlzcGF0Y2ggZm9sbG93IGV2ZW50czpcbiAgICogUEFSVElDTEVfQ1JFQVRFRFxuICAgKiBQQVJUSUNMRV9VUERBVEFcbiAgICogUEFSVElDTEVfREVBRFxuICAgKlxuICAgKiBAY2xhc3MgRW1pdHRlclxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbmYgdGhlIHBhcmFtZXRlcnMgb2JqZWN0O1xuICAgKiBmb3IgZXhhbXBsZSB7ZGFtcGluZzowLjAxLGJpbmRFbWl0dGVyOmZhbHNlfVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZiA9IHt9KSB7XG4gICAgc3VwZXIoY29uZik7XG5cbiAgICB0aGlzLnBhcnRpY2xlcyA9IFtdO1xuICAgIHRoaXMuYmVoYXZpb3VycyA9IFtdO1xuICAgIHRoaXMuaW5pdGlhbGl6ZXMgPSBbXTtcblxuICAgIHRoaXMuZW1pdFRpbWUgPSAwO1xuICAgIHRoaXMuZW1pdFNwZWVkID0gMDtcbiAgICB0aGlzLnRvdGFsVGltZSA9IC0xO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZyaWN0aW9uIGNvZWZmaWNpZW50IGZvciBhbGwgcGFydGljbGUgZW1pdCBieSBUaGlzO1xuICAgICAqIEBwcm9wZXJ0eSBkYW1waW5nXG4gICAgICogQHR5cGUge051bWJlcn1cbiAgICAgKiBAZGVmYXVsdCAwLjAwNlxuICAgICAqL1xuICAgIHRoaXMuZGFtcGluZyA9IDAuMDA2O1xuXG4gICAgLyoqXG4gICAgICogSWYgYmluZEVtaXR0ZXIgdGhlIHBhcnRpY2xlcyBjYW4gYmluZCB0aGlzIGVtaXR0ZXIncyBwcm9wZXJ0eTtcbiAgICAgKiBAcHJvcGVydHkgYmluZEVtaXR0ZXJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgdGhpcy5iaW5kRW1pdHRlciA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHBhcnRpY2xlcyBwZXIgc2Vjb25kIGVtaXQgKGEgW3BhcnRpY2xlXS9iIFtzXSk7XG4gICAgICogQHByb3BlcnR5IHJhdGVcbiAgICAgKiBAdHlwZSB7UmF0ZX1cbiAgICAgKiBAZGVmYXVsdCBSYXRlKDEsIC4xKVxuICAgICAqL1xuICAgIHRoaXMucmF0ZSA9IG5ldyBSYXRlKDEsIDAuMSk7XG5cbiAgICB0aGlzLm5hbWUgPSBcIkVtaXR0ZXJcIjtcbiAgICB0aGlzLmlkID0gUHVpZC5pZCh0aGlzLm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIHN0YXJ0IGVtaXQgcGFydGljbGVcbiAgICogQG1ldGhvZCBlbWl0XG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBbdG90YWxUaW1lXSBiZWdpbiBlbWl0IHRpbWU7XG4gICAqIEBwYXJhbSB7U3RyaW5nIHwgYm9vbGVhbn0gW2xpZmVdIHRoZSBsaWZlIG9mIHRoaXMgZW1pdHRlclxuICAgKi9cbiAgZW1pdCh0b3RhbFRpbWUsIGxpZmUpIHtcbiAgICB0aGlzLnN0b3BlZCA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdFRpbWUgPSAwO1xuICAgIHRoaXMudG90YWxUaW1lID0gVXRpbC5pbml0VmFsdWUodG90YWxUaW1lLCBJbmZpbml0eSk7XG5cbiAgICBpZiAobGlmZSA9PT0gdHJ1ZSB8fCBsaWZlID09PSBcImxpZmVcIiB8fCBsaWZlID09PSBcImRlc3Ryb3lcIikge1xuICAgICAgdGhpcy5saWZlID0gdG90YWxUaW1lID09PSBcIm9uY2VcIiA/IDEgOiB0aGlzLnRvdGFsVGltZTtcbiAgICB9IGVsc2UgaWYgKCFpc05hTihsaWZlKSkge1xuICAgICAgdGhpcy5saWZlID0gbGlmZTtcbiAgICB9XG4gICAgdGhpcy5yYXRlLmluaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzdG9wIGVtaXRpbmdcbiAgICogQG1ldGhvZCBzdG9wXG4gICAqL1xuICBzdG9wKCkge1xuICAgIHRoaXMudG90YWxUaW1lID0gLTE7XG4gICAgdGhpcy5lbWl0VGltZSA9IDA7XG4gICAgdGhpcy5zdG9wZWQgPSB0cnVlO1xuICB9XG5cbiAgcHJlRW1pdCh0aW1lKSB7XG4gICAgbGV0IG9sZFN0b3BlZCA9IHRoaXMuc3RvcGVkO1xuICAgIGxldCBvbGRFbWl0VGltZSA9IHRoaXMuZW1pdFRpbWU7XG4gICAgbGV0IG9sZFRvdGFsVGltZSA9IHRoaXMudG90YWxUaW1lO1xuXG4gICAgdGhpcy5zdG9wZWQgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXRUaW1lID0gMDtcbiAgICB0aGlzLnRvdGFsVGltZSA9IHRpbWU7XG4gICAgdGhpcy5yYXRlLmluaXQoKTtcblxuICAgIGNvbnN0IHN0ZXAgPSAwLjAxNjc7XG4gICAgd2hpbGUgKHRpbWUgPiBzdGVwKSB7XG4gICAgICB0aW1lIC09IHN0ZXA7XG4gICAgICB0aGlzLnVwZGF0ZShzdGVwKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0b3BlZCA9IG9sZFN0b3BlZDtcbiAgICB0aGlzLmVtaXRUaW1lID0gb2xkRW1pdFRpbWUgKyBNYXRoLm1heCh0aW1lLCAwKTtcbiAgICB0aGlzLnRvdGFsVGltZSA9IG9sZFRvdGFsVGltZTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmUgY3VycmVudCBhbGwgcGFydGljbGVzXG4gICAqIEBtZXRob2QgcmVtb3ZlQWxsUGFydGljbGVzXG4gICAqL1xuICByZW1vdmVBbGxQYXJ0aWNsZXMoKSB7XG4gICAgbGV0IGkgPSB0aGlzLnBhcnRpY2xlcy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkgdGhpcy5wYXJ0aWNsZXNbaV0uZGVhZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogYWRkIGluaXRpYWxpemUgdG8gdGhpcyBlbWl0dGVyXG4gICAqIEBtZXRob2QgYWRkU2VsZkluaXRpYWxpemVcbiAgICovXG4gIGFkZFNlbGZJbml0aWFsaXplKGluaXRpYWxpemUpIHtcbiAgICBpZiAoaW5pdGlhbGl6ZVtcImluaXRcIl0pIHtcbiAgICAgIGluaXRpYWxpemUuaW5pdCh0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhpcy5pbml0QWxsKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGFkZCB0aGUgSW5pdGlhbGl6ZSB0byBwYXJ0aWNsZXM7XG4gICAqXG4gICAqIHlvdSBjYW4gdXNlIGluaXRpYWxpemVzIGFycmF5OmZvciBleGFtcGxlIGVtaXR0ZXIuYWRkSW5pdGlhbGl6ZShpbml0aWFsaXplMSxpbml0aWFsaXplMixpbml0aWFsaXplMyk7XG4gICAqIEBtZXRob2QgYWRkSW5pdGlhbGl6ZVxuICAgKiBAcGFyYW0ge0luaXRpYWxpemV9IGluaXRpYWxpemUgbGlrZSB0aGlzIG5ldyBSYWRpdXMoMSwgMTIpXG4gICAqL1xuICBhZGRJbml0aWFsaXplKC4uLnJlc3QpIHtcbiAgICBsZXQgaSA9IHJlc3QubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHRoaXMuaW5pdGlhbGl6ZXMucHVzaChyZXN0W2ldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmUgdGhlIEluaXRpYWxpemVcbiAgICogQG1ldGhvZCByZW1vdmVJbml0aWFsaXplXG4gICAqIEBwYXJhbSB7SW5pdGlhbGl6ZX0gaW5pdGlhbGl6ZSBhIGluaXRpYWxpemVcbiAgICovXG4gIHJlbW92ZUluaXRpYWxpemUoaW5pdGlhbGl6ZXIpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5pdGlhbGl6ZXMuaW5kZXhPZihpbml0aWFsaXplcik7XG4gICAgaWYgKGluZGV4ID4gLTEpIHRoaXMuaW5pdGlhbGl6ZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmUgYWxsIEluaXRpYWxpemVzXG4gICAqIEBtZXRob2QgcmVtb3ZlSW5pdGlhbGl6ZXJzXG4gICAqL1xuICByZW1vdmVBbGxJbml0aWFsaXplcnMoKSB7XG4gICAgVXRpbC5lbXB0eUFycmF5KHRoaXMuaW5pdGlhbGl6ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZCB0aGUgQmVoYXZpb3VyIHRvIHBhcnRpY2xlcztcbiAgICpcbiAgICogeW91IGNhbiB1c2UgQmVoYXZpb3VycyBhcnJheTplbWl0dGVyLmFkZEJlaGF2aW91cihCZWhhdmlvdXIxLEJlaGF2aW91cjIsQmVoYXZpb3VyMyk7XG4gICAqIEBtZXRob2QgYWRkQmVoYXZpb3VyXG4gICAqIEBwYXJhbSB7QmVoYXZpb3VyfSBiZWhhdmlvdXIgbGlrZSB0aGlzIG5ldyBDb2xvcigncmFuZG9tJylcbiAgICovXG4gIGFkZEJlaGF2aW91ciguLi5yZXN0KSB7XG4gICAgbGV0IGkgPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGxldCBiZWhhdmlvdXIgPSByZXN0W2ldO1xuICAgICAgdGhpcy5iZWhhdmlvdXJzLnB1c2goYmVoYXZpb3VyKTtcbiAgICAgIGlmIChiZWhhdmlvdXIucGFyZW50cykgYmVoYXZpb3VyLnBhcmVudHMucHVzaCh0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlIHRoZSBCZWhhdmlvdXJcbiAgICogQG1ldGhvZCByZW1vdmVCZWhhdmlvdXJcbiAgICogQHBhcmFtIHtCZWhhdmlvdXJ9IGJlaGF2aW91ciBhIGJlaGF2aW91clxuICAgKi9cbiAgcmVtb3ZlQmVoYXZpb3VyKGJlaGF2aW91cikge1xuICAgIGxldCBpbmRleCA9IHRoaXMuYmVoYXZpb3Vycy5pbmRleE9mKGJlaGF2aW91cik7XG4gICAgdGhpcy5iZWhhdmlvdXJzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICBpZiAoYmVoYXZpb3VyLnBhcmVudHMpIHtcbiAgICAgIGluZGV4ID0gYmVoYXZpb3VyLnBhcmVudHMuaW5kZXhPZihiZWhhdmlvdXIpO1xuICAgICAgYmVoYXZpb3VyLnBhcmVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlIGFsbCBiZWhhdmlvdXJzXG4gICAqIEBtZXRob2QgcmVtb3ZlQWxsQmVoYXZpb3Vyc1xuICAgKi9cbiAgcmVtb3ZlQWxsQmVoYXZpb3VycygpIHtcbiAgICBVdGlsLmVtcHR5QXJyYXkodGhpcy5iZWhhdmlvdXJzKTtcbiAgfVxuXG4gIC8vIGVtaXR0ZXIgdXBkYXRlXG4gIHVwZGF0ZSh0aW1lKSB7XG4gICAgdGhpcy5hZ2UgKz0gdGltZTtcbiAgICBpZiAodGhpcy5hZ2UgPj0gdGhpcy5saWZlIHx8IHRoaXMuZGVhZCkgdGhpcy5kZXN0cm95KCk7XG5cbiAgICB0aGlzLmVtaXR0aW5nKHRpbWUpO1xuICAgIHRoaXMuaW50ZWdyYXRlKHRpbWUpO1xuICB9XG5cbiAgaW50ZWdyYXRlKHRpbWUpIHtcbiAgICBpZiAoIXRoaXMucGFyZW50KSByZXR1cm47XG5cbiAgICBjb25zdCBkYW1waW5nID0gMSAtIHRoaXMuZGFtcGluZztcbiAgICB0aGlzLnBhcmVudC5pbnRlZ3JhdG9yLmNhbGN1bGF0ZSh0aGlzLCB0aW1lLCBkYW1waW5nKTtcblxuICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMucGFydGljbGVzLmxlbmd0aDtcbiAgICBsZXQgaSwgcGFydGljbGU7XG5cbiAgICBmb3IgKGkgPSBsZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgcGFydGljbGUgPSB0aGlzLnBhcnRpY2xlc1tpXTtcblxuICAgICAgLy8gcGFydGljbGUgdXBkYXRlXG4gICAgICBwYXJ0aWNsZS51cGRhdGUodGltZSwgaSk7XG4gICAgICB0aGlzLnBhcmVudC5pbnRlZ3JhdG9yLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgZGFtcGluZyk7XG4gICAgICB0aGlzLmRpc3BhdGNoKFwiUEFSVElDTEVfVVBEQVRFXCIsIHBhcnRpY2xlKTtcblxuICAgICAgLy8gY2hlY2sgZGVhZFxuICAgICAgaWYgKHBhcnRpY2xlLmRlYWQpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaChcIlBBUlRJQ0xFX0RFQURcIiwgcGFydGljbGUpO1xuXG4gICAgICAgIHRoaXMucGFyZW50LnBvb2wuZXhwaXJlKHBhcnRpY2xlKTtcbiAgICAgICAgdGhpcy5wYXJ0aWNsZXMuc3BsaWNlKGksIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRpc3BhdGNoKGV2ZW50LCB0YXJnZXQpIHtcbiAgICB0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5kaXNwYXRjaEV2ZW50KGV2ZW50LCB0YXJnZXQpO1xuICAgIHRoaXMuYmluZEV2ZW50ICYmIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCwgdGFyZ2V0KTtcbiAgfVxuXG4gIGVtaXR0aW5nKHRpbWUpIHtcbiAgICBpZiAodGhpcy5zdG9wZWQpIHJldHVybjtcblxuICAgIGlmICh0aGlzLnRvdGFsVGltZSA9PT0gXCJub25lXCIpIHtcbiAgICAgIHRoaXMuZW1pdFRpbWUgKz0gdGltZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudG90YWxUaW1lID09PSBcIm9uY2VcIikge1xuICAgICAgbGV0IGk7XG4gICAgICBjb25zdCBsZW5ndGggPSB0aGlzLnJhdGUuZ2V0VmFsdWUoOTk5OTkpO1xuXG4gICAgICBpZiAobGVuZ3RoID4gMCkgdGhpcy5lbWl0U3BlZWQgPSBsZW5ndGg7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHRoaXMuY3JlYXRlUGFydGljbGUoKTtcbiAgICAgIHRoaXMudG90YWxUaW1lID0gXCJub25lXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdFRpbWUgKz0gdGltZTtcblxuICAgICAgaWYgKHRoaXMuZW1pdFRpbWUgPCB0aGlzLnRvdGFsVGltZSkge1xuICAgICAgICBjb25zdCBsZW5ndGggPSB0aGlzLnJhdGUuZ2V0VmFsdWUodGltZSk7XG4gICAgICAgIGxldCBpO1xuXG4gICAgICAgIGlmIChsZW5ndGggPiAwKSB0aGlzLmVtaXRTcGVlZCA9IGxlbmd0aDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB0aGlzLmNyZWF0ZVBhcnRpY2xlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGNyZWF0ZSBzaW5nbGUgcGFydGljbGU7XG4gICAqXG4gICAqIGNhbiB1c2UgZW1pdCh7eDoxMH0sbmV3IEdyYXZpdHkoMTApLHsncGFydGljbGVVcGRhdGUnLGZ1bn0pIG9yIGVtaXQoW3t4OjEwfSxuZXcgSW5pdGlhbGl6ZV0sbmV3IEdyYXZpdHkoMTApLHsncGFydGljbGVVcGRhdGUnLGZ1bn0pXG4gICAqIEBtZXRob2QgcmVtb3ZlQWxsUGFydGljbGVzXG4gICAqL1xuICBjcmVhdGVQYXJ0aWNsZShpbml0aWFsaXplLCBiZWhhdmlvdXIpIHtcbiAgICBjb25zdCBwYXJ0aWNsZSA9IHRoaXMucGFyZW50LnBvb2wuZ2V0KFBhcnRpY2xlKTtcbiAgICB0aGlzLnNldHVwUGFydGljbGUocGFydGljbGUsIGluaXRpYWxpemUsIGJlaGF2aW91cik7XG4gICAgdGhpcy5kaXNwYXRjaChcIlBBUlRJQ0xFX0NSRUFURURcIiwgcGFydGljbGUpO1xuXG4gICAgcmV0dXJuIHBhcnRpY2xlO1xuICB9XG5cbiAgc2V0dXBQYXJ0aWNsZShwYXJ0aWNsZSwgaW5pdGlhbGl6ZSwgYmVoYXZpb3VyKSB7XG4gICAgbGV0IGluaXRpYWxpemVzID0gdGhpcy5pbml0aWFsaXplcztcbiAgICBsZXQgYmVoYXZpb3VycyA9IHRoaXMuYmVoYXZpb3VycztcblxuICAgIGlmIChpbml0aWFsaXplKSBpbml0aWFsaXplcyA9IFV0aWwudG9BcnJheShpbml0aWFsaXplKTtcbiAgICBpZiAoYmVoYXZpb3VyKSBiZWhhdmlvdXJzID0gVXRpbC50b0FycmF5KGJlaGF2aW91cik7XG5cbiAgICBwYXJ0aWNsZS5yZXNldCgpO1xuICAgIEluaXRpYWxpemVVdGlsLmluaXRpYWxpemUodGhpcywgcGFydGljbGUsIGluaXRpYWxpemVzKTtcbiAgICBwYXJ0aWNsZS5hZGRCZWhhdmlvdXJzKGJlaGF2aW91cnMpO1xuICAgIHBhcnRpY2xlLnBhcmVudCA9IHRoaXM7XG5cbiAgICB0aGlzLnBhcnRpY2xlcy5wdXNoKHBhcnRpY2xlKTtcbiAgfVxuXG4gIHJlbW92ZSgpIHtcbiAgICB0aGlzLnN0b3AoKTtcbiAgICBVdGlsLmRlc3Ryb3lBbGwodGhpcy5wYXJ0aWNsZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3RvcnkgdGhpcyBFbWl0dGVyXG4gICAqIEBtZXRob2QgZGVzdHJveVxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLmRlYWQgPSB0cnVlO1xuICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgdGhpcy5yZW1vdmVBbGxJbml0aWFsaXplcnMoKTtcbiAgICB0aGlzLnJlbW92ZUFsbEJlaGF2aW91cnMoKTtcbiAgICB0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5yZW1vdmVFbWl0dGVyKHRoaXMpO1xuXG4gICAgdGhpcy5yYXRlID0gbnVsbDtcbiAgICB0aGlzLm9sZCA9IG51bGw7XG4gICAgdGhpcy5yZ2IgPSBudWxsO1xuICAgIHRoaXMudiA9IG51bGw7XG4gICAgdGhpcy5hID0gbnVsbDtcbiAgICB0aGlzLnAgPSBudWxsO1xuICB9XG59XG5cbkV2ZW50RGlzcGF0Y2hlci5iaW5kKEVtaXR0ZXIpO1xuIiwiaW1wb3J0IEVtaXR0ZXIgZnJvbSBcIi4vRW1pdHRlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCZWhhdmlvdXJFbWl0dGVyIGV4dGVuZHMgRW1pdHRlciB7XG4gIC8qKlxuICAgKiBUaGUgQmVoYXZpb3VyRW1pdHRlciBjbGFzcyBpbmhlcml0cyBmcm9tIFByb3Rvbi5FbWl0dGVyXG4gICAqXG4gICAqIHVzZSB0aGUgQmVoYXZpb3VyRW1pdHRlciB5b3UgY2FuIGFkZCBiZWhhdmlvdXJzIHRvIHNlbGY7XG4gICAqIEBjbGFzcyBQcm90b24uQmVoYXZpb3VyRW1pdHRlclxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbmYgdGhlIHBhcmFtZXRlcnMgb2JqZWN0O1xuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZikge1xuICAgIHN1cGVyKGNvbmYpO1xuXG4gICAgdGhpcy5zZWxmQmVoYXZpb3VycyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZCB0aGUgQmVoYXZpb3VyIHRvIGVtaXR0ZXI7XG4gICAqXG4gICAqIHlvdSBjYW4gdXNlIEJlaGF2aW91cnMgYXJyYXk6ZW1pdHRlci5hZGRTZWxmQmVoYXZpb3VyKEJlaGF2aW91cjEsQmVoYXZpb3VyMixCZWhhdmlvdXIzKTtcbiAgICogQG1ldGhvZCBhZGRTZWxmQmVoYXZpb3VyXG4gICAqIEBwYXJhbSB7UHJvdG9uLkJlaGF2aW91cn0gYmVoYXZpb3VyIGxpa2UgdGhpcyBuZXcgUHJvdG9uLkNvbG9yKCdyYW5kb20nKVxuICAgKi9cbiAgYWRkU2VsZkJlaGF2aW91ciguLi5yZXN0KSB7XG4gICAgbGV0IGksXG4gICAgICBsZW5ndGggPSByZXN0Lmxlbmd0aDtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGJlaGF2aW91ciA9IHJlc3RbaV07XG4gICAgICB0aGlzLnNlbGZCZWhhdmlvdXJzLnB1c2goYmVoYXZpb3VyKTtcbiAgICAgIGJlaGF2aW91ci5pbml0aWFsaXplKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmUgdGhlIEJlaGF2aW91ciBmb3Igc2VsZlxuICAgKiBAbWV0aG9kIHJlbW92ZVNlbGZCZWhhdmlvdXJcbiAgICogQHBhcmFtIHtQcm90b24uQmVoYXZpb3VyfSBiZWhhdmlvdXIgYSBiZWhhdmlvdXJcbiAgICovXG4gIHJlbW92ZVNlbGZCZWhhdmlvdXIoYmVoYXZpb3VyKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnNlbGZCZWhhdmlvdXJzLmluZGV4T2YoYmVoYXZpb3VyKTtcbiAgICBpZiAoaW5kZXggPiAtMSkgdGhpcy5zZWxmQmVoYXZpb3Vycy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgdXBkYXRlKHRpbWUpIHtcbiAgICBzdXBlci51cGRhdGUodGltZSk7XG5cbiAgICBpZiAoIXRoaXMuc2xlZXApIHtcbiAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuc2VsZkJlaGF2aW91cnMubGVuZ3RoO1xuICAgICAgbGV0IGk7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLnNlbGZCZWhhdmlvdXJzW2ldLmFwcGx5QmVoYXZpb3VyKHRoaXMsIHRpbWUsIGkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBFbWl0dGVyIGZyb20gXCIuL0VtaXR0ZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRm9sbG93RW1pdHRlciBleHRlbmRzIEVtaXR0ZXIge1xuICAvKipcbiAgICogVGhlIEZvbGxvd0VtaXR0ZXIgY2xhc3MgaW5oZXJpdHMgZnJvbSBQcm90b24uRW1pdHRlclxuICAgKlxuICAgKiB1c2UgdGhlIEZvbGxvd0VtaXR0ZXIgd2lsbCBlbWl0IHBhcnRpY2xlIHdoZW4gbW91c2Vtb3ZpbmdcbiAgICpcbiAgICogQGNsYXNzIFByb3Rvbi5Gb2xsb3dFbWl0dGVyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1vdXNlVGFyZ2V0IG1vdXNlZXZlbnQncyB0YXJnZXQ7XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBlYXNlIHRoZSBlYXNpbmcgb2YgZm9sbG93aW5nIHNwZWVkO1xuICAgKiBAZGVmYXVsdCAwLjdcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbmYgdGhlIHBhcmFtZXRlcnMgb2JqZWN0O1xuICAgKi9cbiAgY29uc3RydWN0b3IobW91c2VUYXJnZXQsIGVhc2UsIGNvbmYpIHtcbiAgICBzdXBlcihjb25mKTtcblxuICAgIHRoaXMubW91c2VUYXJnZXQgPSBVdGlsLmluaXRWYWx1ZShtb3VzZVRhcmdldCwgd2luZG93KTtcbiAgICB0aGlzLmVhc2UgPSBVdGlsLmluaXRWYWx1ZShlYXNlLCAwLjcpO1xuXG4gICAgdGhpcy5fYWxsb3dFbWl0dGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaW5pdEV2ZW50SGFuZGxlcigpO1xuICB9XG5cbiAgaW5pdEV2ZW50SGFuZGxlcigpIHtcbiAgICB0aGlzLm1vdXNlbW92ZUhhbmRsZXIgPSBlID0+IHRoaXMubW91c2Vtb3ZlLmNhbGwodGhpcywgZSk7XG4gICAgdGhpcy5tb3VzZWRvd25IYW5kbGVyID0gZSA9PiB0aGlzLm1vdXNlZG93bi5jYWxsKHRoaXMsIGUpO1xuICAgIHRoaXMubW91c2V1cEhhbmRsZXIgPSBlID0+IHRoaXMubW91c2V1cC5jYWxsKHRoaXMsIGUpO1xuICAgIHRoaXMubW91c2VUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm1vdXNlbW92ZUhhbmRsZXIsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzdGFydCBlbWl0IHBhcnRpY2xlXG4gICAqIEBtZXRob2QgZW1pdFxuICAgKi9cbiAgZW1pdCgpIHtcbiAgICB0aGlzLl9hbGxvd0VtaXR0aW5nID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzdG9wIGVtaXRpbmdcbiAgICogQG1ldGhvZCBzdG9wXG4gICAqL1xuICBzdG9wKCkge1xuICAgIHRoaXMuX2FsbG93RW1pdHRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIG1vdXNlbW92ZShlKSB7XG4gICAgaWYgKGUubGF5ZXJYIHx8IGUubGF5ZXJYID09PSAwKSB7XG4gICAgICB0aGlzLnAueCArPSAoZS5sYXllclggLSB0aGlzLnAueCkgKiB0aGlzLmVhc2U7XG4gICAgICB0aGlzLnAueSArPSAoZS5sYXllclkgLSB0aGlzLnAueSkgKiB0aGlzLmVhc2U7XG4gICAgfSBlbHNlIGlmIChlLm9mZnNldFggfHwgZS5vZmZzZXRYID09PSAwKSB7XG4gICAgICB0aGlzLnAueCArPSAoZS5vZmZzZXRYIC0gdGhpcy5wLngpICogdGhpcy5lYXNlO1xuICAgICAgdGhpcy5wLnkgKz0gKGUub2Zmc2V0WSAtIHRoaXMucC55KSAqIHRoaXMuZWFzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fYWxsb3dFbWl0dGluZykgc3VwZXIuZW1pdChcIm9uY2VcIik7XG4gIH1cblxuICAvKipcbiAgICogRGVzdG9yeSB0aGlzIEVtaXR0ZXJcbiAgICogQG1ldGhvZCBkZXN0cm95XG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLm1vdXNlVGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5tb3VzZW1vdmVIYW5kbGVyLCBmYWxzZSk7XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIERldGVybWluZSB3aGV0aGVyIGl0IGlzIGEgcGljdHVyZSBvYmplY3RcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gaXMgb3Igbm9cbiAgICovXG4gIGlzSW1hZ2Uob2JqKSB7XG4gICAgaWYgKCFvYmopIHJldHVybiBmYWxzZTtcbiAgICBpZiAob2JqLl9faXNJbWFnZSkgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCB0YWdOYW1lID0gYCR7b2JqLnRhZ05hbWV9YC50b1VwcGVyQ2FzZSgpO1xuICAgIGNvbnN0IG5vZGVOYW1lID0gYCR7b2JqLm5vZGVOYW1lfWAudG9VcHBlckNhc2UoKTtcbiAgICBpZiAobm9kZU5hbWUgPT09IFwiSU1HXCIgfHwgdGFnTmFtZSA9PT0gXCJJTUdcIikge1xuICAgICAgb2JqLl9faXNJbWFnZSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIERldGVybWluZSB3aGV0aGVyIGl0IGlzIGEgc3RyaW5nIG9iamVjdFxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBpcyBvciBub1xuICAgKi9cbiAgaXNTdHJpbmcob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwic3RyaW5nXCI7XG4gIH1cbn07XG4iLCJpbXBvcnQgUG9vbCBmcm9tIFwiLi4vY29yZS9Qb29sXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VSZW5kZXJlciB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIHN0cm9rZSkge1xuICAgIHRoaXMucG9vbCA9IG5ldyBQb29sKCk7XG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLnN0cm9rZSA9IHN0cm9rZTtcbiAgICB0aGlzLmNpcmNsZUNvbmYgPSB7IGlzQ2lyY2xlOiB0cnVlIH07XG5cbiAgICB0aGlzLmluaXRFdmVudEhhbmRsZXIoKTtcbiAgICB0aGlzLm5hbWUgPSBcIkJhc2VSZW5kZXJlclwiO1xuICB9XG5cbiAgc2V0U3Ryb2tlKGNvbG9yID0gXCIjMDAwMDAwXCIsIHRoaW5rbmVzcyA9IDEpIHtcbiAgICB0aGlzLnN0cm9rZSA9IHsgY29sb3IsIHRoaW5rbmVzcyB9O1xuICB9XG5cbiAgaW5pdEV2ZW50SGFuZGxlcigpIHtcbiAgICB0aGlzLl9wcm90b25VcGRhdGVIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5vblByb3RvblVwZGF0ZS5jYWxsKHRoaXMpO1xuICAgIH07XG5cbiAgICB0aGlzLl9wcm90b25VcGRhdGVBZnRlckhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLm9uUHJvdG9uVXBkYXRlQWZ0ZXIuY2FsbCh0aGlzKTtcbiAgICB9O1xuXG4gICAgdGhpcy5fZW1pdHRlckFkZGVkSGFuZGxlciA9IGVtaXR0ZXIgPT4ge1xuICAgICAgdGhpcy5vbkVtaXR0ZXJBZGRlZC5jYWxsKHRoaXMsIGVtaXR0ZXIpO1xuICAgIH07XG5cbiAgICB0aGlzLl9lbWl0dGVyUmVtb3ZlZEhhbmRsZXIgPSBlbWl0dGVyID0+IHtcbiAgICAgIHRoaXMub25FbWl0dGVyUmVtb3ZlZC5jYWxsKHRoaXMsIGVtaXR0ZXIpO1xuICAgIH07XG5cbiAgICB0aGlzLl9wYXJ0aWNsZUNyZWF0ZWRIYW5kbGVyID0gcGFydGljbGUgPT4ge1xuICAgICAgdGhpcy5vblBhcnRpY2xlQ3JlYXRlZC5jYWxsKHRoaXMsIHBhcnRpY2xlKTtcbiAgICB9O1xuXG4gICAgdGhpcy5fcGFydGljbGVVcGRhdGVIYW5kbGVyID0gcGFydGljbGUgPT4ge1xuICAgICAgdGhpcy5vblBhcnRpY2xlVXBkYXRlLmNhbGwodGhpcywgcGFydGljbGUpO1xuICAgIH07XG5cbiAgICB0aGlzLl9wYXJ0aWNsZURlYWRIYW5kbGVyID0gcGFydGljbGUgPT4ge1xuICAgICAgdGhpcy5vblBhcnRpY2xlRGVhZC5jYWxsKHRoaXMsIHBhcnRpY2xlKTtcbiAgICB9O1xuICB9XG5cbiAgaW5pdChwcm90b24pIHtcbiAgICB0aGlzLnBhcmVudCA9IHByb3RvbjtcblxuICAgIHByb3Rvbi5hZGRFdmVudExpc3RlbmVyKFwiUFJPVE9OX1VQREFURVwiLCB0aGlzLl9wcm90b25VcGRhdGVIYW5kbGVyKTtcbiAgICBwcm90b24uYWRkRXZlbnRMaXN0ZW5lcihcIlBST1RPTl9VUERBVEVfQUZURVJcIiwgdGhpcy5fcHJvdG9uVXBkYXRlQWZ0ZXJIYW5kbGVyKTtcblxuICAgIHByb3Rvbi5hZGRFdmVudExpc3RlbmVyKFwiRU1JVFRFUl9BRERFRFwiLCB0aGlzLl9lbWl0dGVyQWRkZWRIYW5kbGVyKTtcbiAgICBwcm90b24uYWRkRXZlbnRMaXN0ZW5lcihcIkVNSVRURVJfUkVNT1ZFRFwiLCB0aGlzLl9lbWl0dGVyUmVtb3ZlZEhhbmRsZXIpO1xuXG4gICAgcHJvdG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJQQVJUSUNMRV9DUkVBVEVEXCIsIHRoaXMuX3BhcnRpY2xlQ3JlYXRlZEhhbmRsZXIpO1xuICAgIHByb3Rvbi5hZGRFdmVudExpc3RlbmVyKFwiUEFSVElDTEVfVVBEQVRFXCIsIHRoaXMuX3BhcnRpY2xlVXBkYXRlSGFuZGxlcik7XG4gICAgcHJvdG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJQQVJUSUNMRV9ERUFEXCIsIHRoaXMuX3BhcnRpY2xlRGVhZEhhbmRsZXIpO1xuICB9XG5cbiAgcmVzaXplKHdpZHRoLCBoZWlnaHQpIHt9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnJlbW92ZSgpO1xuICAgIHRoaXMucG9vbC5kZXN0cm95KCk7XG4gICAgdGhpcy5wb29sID0gbnVsbDtcbiAgICB0aGlzLmVsZW1lbnQgPSBudWxsO1xuICAgIHRoaXMuc3Ryb2tlID0gbnVsbDtcbiAgfVxuXG4gIHJlbW92ZShwcm90b24pIHtcbiAgICB0aGlzLnBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiUFJPVE9OX1VQREFURVwiLCB0aGlzLl9wcm90b25VcGRhdGVIYW5kbGVyKTtcbiAgICB0aGlzLnBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiUFJPVE9OX1VQREFURV9BRlRFUlwiLCB0aGlzLl9wcm90b25VcGRhdGVBZnRlckhhbmRsZXIpO1xuXG4gICAgdGhpcy5wYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkVNSVRURVJfQURERURcIiwgdGhpcy5fZW1pdHRlckFkZGVkSGFuZGxlcik7XG4gICAgdGhpcy5wYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkVNSVRURVJfUkVNT1ZFRFwiLCB0aGlzLl9lbWl0dGVyUmVtb3ZlZEhhbmRsZXIpO1xuXG4gICAgdGhpcy5wYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIlBBUlRJQ0xFX0NSRUFURURcIiwgdGhpcy5fcGFydGljbGVDcmVhdGVkSGFuZGxlcik7XG4gICAgdGhpcy5wYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIlBBUlRJQ0xFX1VQREFURVwiLCB0aGlzLl9wYXJ0aWNsZVVwZGF0ZUhhbmRsZXIpO1xuICAgIHRoaXMucGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJQQVJUSUNMRV9ERUFEXCIsIHRoaXMuX3BhcnRpY2xlRGVhZEhhbmRsZXIpO1xuXG4gICAgdGhpcy5wYXJlbnQgPSBudWxsO1xuICB9XG5cbiAgb25Qcm90b25VcGRhdGUoKSB7fVxuICBvblByb3RvblVwZGF0ZUFmdGVyKCkge31cblxuICBvbkVtaXR0ZXJBZGRlZChlbWl0dGVyKSB7fVxuICBvbkVtaXR0ZXJSZW1vdmVkKGVtaXR0ZXIpIHt9XG5cbiAgb25QYXJ0aWNsZUNyZWF0ZWQocGFydGljbGUpIHt9XG4gIG9uUGFydGljbGVVcGRhdGUocGFydGljbGUpIHt9XG4gIG9uUGFydGljbGVEZWFkKHBhcnRpY2xlKSB7fVxufVxuIiwiaW1wb3J0IFR5cGVzIGZyb20gXCIuLi91dGlscy9UeXBlc1wiO1xuaW1wb3J0IEltZ1V0aWwgZnJvbSBcIi4uL3V0aWxzL0ltZ1V0aWxcIjtcbmltcG9ydCBDb2xvclV0aWwgZnJvbSBcIi4uL3V0aWxzL0NvbG9yVXRpbFwiO1xuaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuLi9tYXRoL01hdGhVdGlsXCI7XG5pbXBvcnQgQmFzZVJlbmRlcmVyIGZyb20gXCIuL0Jhc2VSZW5kZXJlclwiO1xuXG4vKipcbiAqIENhbnZhc1JlbmRlcmVyIGNsYXNzIGZvciByZW5kZXJpbmcgcGFydGljbGVzIG9uIGEgY2FudmFzIGVsZW1lbnQuXG4gKiBAZXh0ZW5kcyBCYXNlUmVuZGVyZXJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FudmFzUmVuZGVyZXIgZXh0ZW5kcyBCYXNlUmVuZGVyZXIge1xuICAvKipcbiAgICogQHR5cGUge29iamVjdHxudWxsfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3Ryb2tlO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29udGV4dDtcblxuICAvKipcbiAgICogQHR5cGUge29iamVjdH1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGJ1ZmZlckNhY2hlO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgbmFtZTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBDYW52YXNSZW5kZXJlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtIVE1MQ2FudmFzRWxlbWVudH0gZWxlbWVudCAtIFRoZSBjYW52YXMgZWxlbWVudCB0byByZW5kZXIgb24uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlbGVtZW50KSB7XG4gICAgc3VwZXIoZWxlbWVudCk7XG5cbiAgICB0aGlzLnN0cm9rZSA9IG51bGw7XG4gICAgdGhpcy5jb250ZXh0ID0gdGhpcy5lbGVtZW50LmdldENvbnRleHQoXCIyZFwiKTtcbiAgICB0aGlzLmJ1ZmZlckNhY2hlID0ge307XG4gICAgdGhpcy5uYW1lID0gXCJDYW52YXNSZW5kZXJlclwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2l6ZXMgdGhlIGNhbnZhcyBlbGVtZW50LlxuICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgbmV3IHdpZHRoIG9mIHRoZSBjYW52YXMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgbmV3IGhlaWdodCBvZiB0aGUgY2FudmFzLlxuICAgKi9cbiAgcmVzaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB0aGlzLmVsZW1lbnQud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmVsZW1lbnQuaGVpZ2h0ID0gaGVpZ2h0O1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgY2FudmFzIG9uIFByb3RvbiB1cGRhdGUuXG4gICAqL1xuICBvblByb3RvblVwZGF0ZSgpIHtcbiAgICB0aGlzLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHRoaXMuZWxlbWVudC53aWR0aCwgdGhpcy5lbGVtZW50LmhlaWdodCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBwYXJ0aWNsZSBjcmVhdGlvbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcnRpY2xlIC0gVGhlIGNyZWF0ZWQgcGFydGljbGUuXG4gICAqL1xuICBvblBhcnRpY2xlQ3JlYXRlZChwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZS5ib2R5KSB7XG4gICAgICBJbWdVdGlsLmdldEltZ0Zyb21DYWNoZShwYXJ0aWNsZS5ib2R5LCB0aGlzLmFkZEltZzJCb2R5LCBwYXJ0aWNsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnRpY2xlLmNvbG9yID0gcGFydGljbGUuY29sb3IgfHwgXCIjZmYwMDAwXCI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgcGFydGljbGUgdXBkYXRlcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcnRpY2xlIC0gVGhlIHVwZGF0ZWQgcGFydGljbGUuXG4gICAqL1xuICBvblBhcnRpY2xlVXBkYXRlKHBhcnRpY2xlKSB7XG4gICAgaWYgKHBhcnRpY2xlLmJvZHkpIHtcbiAgICAgIGlmIChUeXBlcy5pc0ltYWdlKHBhcnRpY2xlLmJvZHkpKSB7XG4gICAgICAgIHRoaXMuZHJhd0ltYWdlKHBhcnRpY2xlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kcmF3Q2lyY2xlKHBhcnRpY2xlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBwYXJ0aWNsZSBkZXN0cnVjdGlvbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcnRpY2xlIC0gVGhlIGRlc3Ryb3llZCBwYXJ0aWNsZS5cbiAgICovXG4gIG9uUGFydGljbGVEZWFkKHBhcnRpY2xlKSB7XG4gICAgcGFydGljbGUuYm9keSA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBpbWFnZSB0byB0aGUgcGFydGljbGUgYm9keS5cbiAgICogQHBhcmFtIHtIVE1MSW1hZ2VFbGVtZW50fSBpbWcgLSBUaGUgaW1hZ2UgdG8gYWRkLlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGljbGUgLSBUaGUgcGFydGljbGUgdG8gYWRkIHRoZSBpbWFnZSB0by5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFkZEltZzJCb2R5KGltZywgcGFydGljbGUpIHtcbiAgICBwYXJ0aWNsZS5ib2R5ID0gaW1nO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXdzIGFuIGltYWdlIHBhcnRpY2xlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGljbGUgLSBUaGUgcGFydGljbGUgdG8gZHJhdy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRyYXdJbWFnZShwYXJ0aWNsZSkge1xuICAgIGNvbnN0IHcgPSAocGFydGljbGUuYm9keS53aWR0aCAqIHBhcnRpY2xlLnNjYWxlKSB8IDA7XG4gICAgY29uc3QgaCA9IChwYXJ0aWNsZS5ib2R5LmhlaWdodCAqIHBhcnRpY2xlLnNjYWxlKSB8IDA7XG4gICAgY29uc3QgeCA9IHBhcnRpY2xlLnAueCAtIHcgLyAyO1xuICAgIGNvbnN0IHkgPSBwYXJ0aWNsZS5wLnkgLSBoIC8gMjtcblxuICAgIGlmICghIXBhcnRpY2xlLmNvbG9yKSB7XG4gICAgICBpZiAoIXBhcnRpY2xlLmRhdGFbXCJidWZmZXJcIl0pIHBhcnRpY2xlLmRhdGEuYnVmZmVyID0gdGhpcy5jcmVhdGVCdWZmZXIocGFydGljbGUuYm9keSk7XG5cbiAgICAgIGNvbnN0IGJ1ZkNvbnRleHQgPSBwYXJ0aWNsZS5kYXRhLmJ1ZmZlci5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICBidWZDb250ZXh0LmNsZWFyUmVjdCgwLCAwLCBwYXJ0aWNsZS5kYXRhLmJ1ZmZlci53aWR0aCwgcGFydGljbGUuZGF0YS5idWZmZXIuaGVpZ2h0KTtcbiAgICAgIGJ1ZkNvbnRleHQuZ2xvYmFsQWxwaGEgPSBwYXJ0aWNsZS5hbHBoYTtcbiAgICAgIGJ1ZkNvbnRleHQuZHJhd0ltYWdlKHBhcnRpY2xlLmJvZHksIDAsIDApO1xuXG4gICAgICBidWZDb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwic291cmNlLWF0b3BcIjtcbiAgICAgIGJ1ZkNvbnRleHQuZmlsbFN0eWxlID0gQ29sb3JVdGlsLnJnYlRvSGV4KHBhcnRpY2xlLnJnYik7XG4gICAgICBidWZDb250ZXh0LmZpbGxSZWN0KDAsIDAsIHBhcnRpY2xlLmRhdGEuYnVmZmVyLndpZHRoLCBwYXJ0aWNsZS5kYXRhLmJ1ZmZlci5oZWlnaHQpO1xuICAgICAgYnVmQ29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1vdmVyXCI7XG4gICAgICBidWZDb250ZXh0Lmdsb2JhbEFscGhhID0gMTtcblxuICAgICAgdGhpcy5jb250ZXh0LmRyYXdJbWFnZShcbiAgICAgICAgcGFydGljbGUuZGF0YS5idWZmZXIsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIHBhcnRpY2xlLmRhdGEuYnVmZmVyLndpZHRoLFxuICAgICAgICBwYXJ0aWNsZS5kYXRhLmJ1ZmZlci5oZWlnaHQsXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHcsXG4gICAgICAgIGhcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGV4dC5zYXZlKCk7XG5cbiAgICAgIHRoaXMuY29udGV4dC5nbG9iYWxBbHBoYSA9IHBhcnRpY2xlLmFscGhhO1xuICAgICAgdGhpcy5jb250ZXh0LnRyYW5zbGF0ZShwYXJ0aWNsZS5wLngsIHBhcnRpY2xlLnAueSk7XG4gICAgICB0aGlzLmNvbnRleHQucm90YXRlKE1hdGhVdGlsLmRlZ3JlZVRyYW5zZm9ybShwYXJ0aWNsZS5yb3RhdGlvbikpO1xuICAgICAgdGhpcy5jb250ZXh0LnRyYW5zbGF0ZSgtcGFydGljbGUucC54LCAtcGFydGljbGUucC55KTtcbiAgICAgIHRoaXMuY29udGV4dC5kcmF3SW1hZ2UocGFydGljbGUuYm9keSwgMCwgMCwgcGFydGljbGUuYm9keS53aWR0aCwgcGFydGljbGUuYm9keS5oZWlnaHQsIHgsIHksIHcsIGgpO1xuXG4gICAgICB0aGlzLmNvbnRleHQuZ2xvYmFsQWxwaGEgPSAxO1xuICAgICAgdGhpcy5jb250ZXh0LnJlc3RvcmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgYSBjaXJjdWxhciBwYXJ0aWNsZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcnRpY2xlIC0gVGhlIHBhcnRpY2xlIHRvIGRyYXcuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkcmF3Q2lyY2xlKHBhcnRpY2xlKSB7XG4gICAgaWYgKHBhcnRpY2xlLnJnYikge1xuICAgICAgdGhpcy5jb250ZXh0LmZpbGxTdHlsZSA9IGByZ2JhKCR7cGFydGljbGUucmdiLnJ9LCR7cGFydGljbGUucmdiLmd9LCR7cGFydGljbGUucmdiLmJ9LCR7cGFydGljbGUuYWxwaGF9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGV4dC5maWxsU3R5bGUgPSBwYXJ0aWNsZS5jb2xvcjtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgdGhpcy5jb250ZXh0LmFyYyhwYXJ0aWNsZS5wLngsIHBhcnRpY2xlLnAueSwgcGFydGljbGUucmFkaXVzLCAwLCBNYXRoLlBJICogMiwgdHJ1ZSk7XG5cbiAgICBpZiAodGhpcy5zdHJva2UpIHtcbiAgICAgIHRoaXMuY29udGV4dC5zdHJva2VTdHlsZSA9IHRoaXMuc3Ryb2tlLmNvbG9yO1xuICAgICAgdGhpcy5jb250ZXh0LmxpbmVXaWR0aCA9IHRoaXMuc3Ryb2tlLnRoaW5rbmVzcztcbiAgICAgIHRoaXMuY29udGV4dC5zdHJva2UoKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5jb250ZXh0LmZpbGwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgYnVmZmVyIGZvciBpbWFnZSBwYXJ0aWNsZXMuXG4gICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudH0gaW1hZ2UgLSBUaGUgaW1hZ2UgdG8gY3JlYXRlIGEgYnVmZmVyIGZvci5cbiAgICogQHJldHVybnMge0hUTUxDYW52YXNFbGVtZW50fHVuZGVmaW5lZH0gVGhlIGNyZWF0ZWQgYnVmZmVyIGNhbnZhcy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNyZWF0ZUJ1ZmZlcihpbWFnZSkge1xuICAgIGlmIChUeXBlcy5pc0ltYWdlKGltYWdlKSkge1xuICAgICAgY29uc3Qgc2l6ZSA9IGltYWdlLndpZHRoICsgXCJfXCIgKyBpbWFnZS5oZWlnaHQ7XG4gICAgICBsZXQgY2FudmFzID0gdGhpcy5idWZmZXJDYWNoZVtzaXplXTtcblxuICAgICAgaWYgKCFjYW52YXMpIHtcbiAgICAgICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgICAgY2FudmFzLndpZHRoID0gaW1hZ2Uud2lkdGg7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbWFnZS5oZWlnaHQ7XG4gICAgICAgIHRoaXMuYnVmZmVyQ2FjaGVbc2l6ZV0gPSBjYW52YXM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjYW52YXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSByZW5kZXJlciBhbmQgY2xlYW5zIHVwIHJlc291cmNlcy5cbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuc3Ryb2tlID0gbnVsbDtcbiAgICB0aGlzLmNvbnRleHQgPSBudWxsO1xuICAgIHRoaXMuYnVmZmVyQ2FjaGUgPSBudWxsO1xuICB9XG59XG4iLCJpbXBvcnQgRG9tVXRpbCBmcm9tIFwiLi4vdXRpbHMvRG9tVXRpbFwiO1xuaW1wb3J0IEltZ1V0aWwgZnJvbSBcIi4uL3V0aWxzL0ltZ1V0aWxcIjtcbmltcG9ydCBCYXNlUmVuZGVyZXIgZnJvbSBcIi4vQmFzZVJlbmRlcmVyXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIERPTS1iYXNlZCByZW5kZXJlciBmb3IgcGFydGljbGUgc3lzdGVtcy5cbiAqIEBleHRlbmRzIEJhc2VSZW5kZXJlclxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb21SZW5kZXJlciBleHRlbmRzIEJhc2VSZW5kZXJlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IERvbVJlbmRlcmVyIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIEhUTUwgZWxlbWVudCB0byByZW5kZXIgdG8uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlbGVtZW50KSB7XG4gICAgc3VwZXIoZWxlbWVudCk7XG5cbiAgICB0aGlzLnN0cm9rZSA9IG51bGw7XG4gICAgdGhpcy50cmFuc2Zvcm0zZCA9IGZhbHNlO1xuICAgIHRoaXMucG9vbC5jcmVhdGUgPSAoYm9keSwgcGFydGljbGUpID0+IHRoaXMuY3JlYXRlQm9keShib2R5LCBwYXJ0aWNsZSk7XG4gICAgdGhpcy5hZGRJbWcyQm9keSA9IHRoaXMuYWRkSW1nMkJvZHkuYmluZCh0aGlzKTtcblxuICAgIHRoaXMubmFtZSA9IFwiRG9tUmVuZGVyZXJcIjtcbiAgfVxuXG4gIG9uUGFydGljbGVDcmVhdGVkKHBhcnRpY2xlKSB7XG4gICAgaWYgKHBhcnRpY2xlLmJvZHkpIHtcbiAgICAgIEltZ1V0aWwuZ2V0SW1nRnJvbUNhY2hlKHBhcnRpY2xlLmJvZHksIHRoaXMuYWRkSW1nMkJvZHksIHBhcnRpY2xlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFydGljbGUuYm9keSA9IHRoaXMucG9vbC5nZXQodGhpcy5jaXJjbGVDb25mLCBwYXJ0aWNsZSk7XG4gICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQocGFydGljbGUuYm9keSk7XG4gICAgfVxuICB9XG5cbiAgb25QYXJ0aWNsZVVwZGF0ZShwYXJ0aWNsZSkge1xuICAgIGlmICh0aGlzLmJvZHlSZWFkeShwYXJ0aWNsZSkpIHtcbiAgICAgIGlmICh0aGlzLnRyYW5zZm9ybTNkKSB7XG4gICAgICAgIERvbVV0aWwudHJhbnNmb3JtM2QocGFydGljbGUuYm9keSwgcGFydGljbGUucC54LCBwYXJ0aWNsZS5wLnksIHBhcnRpY2xlLnNjYWxlLCBwYXJ0aWNsZS5yb3RhdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBEb21VdGlsLnRyYW5zZm9ybShwYXJ0aWNsZS5ib2R5LCBwYXJ0aWNsZS5wLngsIHBhcnRpY2xlLnAueSwgcGFydGljbGUuc2NhbGUsIHBhcnRpY2xlLnJvdGF0aW9uKTtcbiAgICAgIH1cblxuICAgICAgcGFydGljbGUuYm9keS5zdHlsZS5vcGFjaXR5ID0gcGFydGljbGUuYWxwaGE7XG5cbiAgICAgIGlmIChwYXJ0aWNsZS5ib2R5LmlzQ2lyY2xlKSB7XG4gICAgICAgIHBhcnRpY2xlLmJvZHkuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gcGFydGljbGUuY29sb3IgfHwgXCIjZmYwMDAwXCI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25QYXJ0aWNsZURlYWQocGFydGljbGUpIHtcbiAgICBpZiAodGhpcy5ib2R5UmVhZHkocGFydGljbGUpKSB7XG4gICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2hpbGQocGFydGljbGUuYm9keSk7XG4gICAgICB0aGlzLnBvb2wuZXhwaXJlKHBhcnRpY2xlLmJvZHkpO1xuICAgICAgcGFydGljbGUuYm9keSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgYm9keVJlYWR5KHBhcnRpY2xlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBwYXJ0aWNsZS5ib2R5ID09PSBcIm9iamVjdFwiICYmIHBhcnRpY2xlLmJvZHkgJiYgIXBhcnRpY2xlLmJvZHkuaXNJbm5lcjtcbiAgfVxuXG4gIC8vIHByaXZhdGUgbWV0aG9kXG4gIGFkZEltZzJCb2R5KGltZywgcGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUuZGVhZCkgcmV0dXJuO1xuICAgIHBhcnRpY2xlLmJvZHkgPSB0aGlzLnBvb2wuZ2V0KGltZywgcGFydGljbGUpO1xuICAgIERvbVV0aWwucmVzaXplKHBhcnRpY2xlLmJvZHksIGltZy53aWR0aCwgaW1nLmhlaWdodCk7XG5cbiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQocGFydGljbGUuYm9keSk7XG4gIH1cblxuICBjcmVhdGVCb2R5KGJvZHksIHBhcnRpY2xlKSB7XG4gICAgaWYgKGJvZHkuaXNDaXJjbGUpIHJldHVybiB0aGlzLmNyZWF0ZUNpcmNsZShwYXJ0aWNsZSk7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlU3ByaXRlKGJvZHksIHBhcnRpY2xlKTtcbiAgfVxuXG4gIC8vIHByaXZhdGUgbWV0aG9kc1xuICBjcmVhdGVDaXJjbGUocGFydGljbGUpIHtcbiAgICBjb25zdCBkb20gPSBEb21VdGlsLmNyZWF0ZURpdihgJHtwYXJ0aWNsZS5pZH1fZG9tYCwgMiAqIHBhcnRpY2xlLnJhZGl1cywgMiAqIHBhcnRpY2xlLnJhZGl1cyk7XG4gICAgZG9tLnN0eWxlLmJvcmRlclJhZGl1cyA9IGAke3BhcnRpY2xlLnJhZGl1c31weGA7XG5cbiAgICBpZiAodGhpcy5zdHJva2UpIHtcbiAgICAgIGRvbS5zdHlsZS5ib3JkZXJDb2xvciA9IHRoaXMuc3Ryb2tlLmNvbG9yO1xuICAgICAgZG9tLnN0eWxlLmJvcmRlcldpZHRoID0gYCR7dGhpcy5zdHJva2UudGhpbmtuZXNzfXB4YDtcbiAgICB9XG4gICAgZG9tLmlzQ2lyY2xlID0gdHJ1ZTtcblxuICAgIHJldHVybiBkb207XG4gIH1cblxuICBjcmVhdGVTcHJpdGUoYm9keSwgcGFydGljbGUpIHtcbiAgICBjb25zdCB1cmwgPSB0eXBlb2YgYm9keSA9PT0gXCJzdHJpbmdcIiA/IGJvZHkgOiBib2R5LnNyYztcbiAgICBjb25zdCBkb20gPSBEb21VdGlsLmNyZWF0ZURpdihgJHtwYXJ0aWNsZS5pZH1fZG9tYCwgYm9keS53aWR0aCwgYm9keS5oZWlnaHQpO1xuICAgIGRvbS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBgdXJsKCR7dXJsfSlgO1xuXG4gICAgcmV0dXJuIGRvbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGUgcmVuZGVyZXIgYW5kIGNsZWFucyB1cCByZXNvdXJjZXMuXG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLnN0cm9rZSA9IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCBUeXBlcyBmcm9tIFwiLi4vdXRpbHMvVHlwZXNcIjtcbmltcG9ydCBCYXNlUmVuZGVyZXIgZnJvbSBcIi4vQmFzZVJlbmRlcmVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVhc2VsUmVuZGVyZXIgZXh0ZW5kcyBCYXNlUmVuZGVyZXIge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBzdHJva2UpIHtcbiAgICBzdXBlcihlbGVtZW50KTtcblxuICAgIHRoaXMuc3Ryb2tlID0gc3Ryb2tlO1xuICAgIHRoaXMubmFtZSA9IFwiRWFzZWxSZW5kZXJlclwiO1xuICB9XG5cbiAgb25QYXJ0aWNsZUNyZWF0ZWQocGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUuYm9keSkge1xuICAgICAgdGhpcy5jcmVhdGVTcHJpdGUocGFydGljbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNyZWF0ZUNpcmNsZShwYXJ0aWNsZSk7XG4gICAgfVxuXG4gICAgdGhpcy5lbGVtZW50LmFkZENoaWxkKHBhcnRpY2xlLmJvZHkpO1xuICB9XG5cbiAgb25QYXJ0aWNsZVVwZGF0ZShwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZS5ib2R5KSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5LnggPSBwYXJ0aWNsZS5wLng7XG4gICAgICBwYXJ0aWNsZS5ib2R5LnkgPSBwYXJ0aWNsZS5wLnk7XG5cbiAgICAgIHBhcnRpY2xlLmJvZHkuYWxwaGEgPSBwYXJ0aWNsZS5hbHBoYTtcbiAgICAgIHBhcnRpY2xlLmJvZHkuc2NhbGVYID0gcGFydGljbGUuYm9keS5zY2FsZVkgPSBwYXJ0aWNsZS5zY2FsZTtcbiAgICAgIHBhcnRpY2xlLmJvZHkucm90YXRpb24gPSBwYXJ0aWNsZS5yb3RhdGlvbjtcbiAgICB9XG4gIH1cblxuICBvblBhcnRpY2xlRGVhZChwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZS5ib2R5KSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5LnBhcmVudCAmJiBwYXJ0aWNsZS5ib2R5LnBhcmVudC5yZW1vdmVDaGlsZChwYXJ0aWNsZS5ib2R5KTtcbiAgICAgIHRoaXMucG9vbC5leHBpcmUocGFydGljbGUuYm9keSk7XG4gICAgICBwYXJ0aWNsZS5ib2R5ID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocGFydGljbGUuZ3JhcGhpY3MpIHRoaXMucG9vbC5leHBpcmUocGFydGljbGUuZ3JhcGhpY3MpO1xuICB9XG5cbiAgLy8gcHJpdmF0ZVxuICBjcmVhdGVTcHJpdGUocGFydGljbGUpIHtcbiAgICBwYXJ0aWNsZS5ib2R5ID0gdGhpcy5wb29sLmdldChwYXJ0aWNsZS5ib2R5KTtcblxuICAgIGlmIChwYXJ0aWNsZS5ib2R5LnBhcmVudCkgcmV0dXJuO1xuICAgIGlmIChwYXJ0aWNsZS5ib2R5W1wiaW1hZ2VcIl0pIHtcbiAgICAgIHBhcnRpY2xlLmJvZHkucmVnWCA9IHBhcnRpY2xlLmJvZHkuaW1hZ2Uud2lkdGggLyAyO1xuICAgICAgcGFydGljbGUuYm9keS5yZWdZID0gcGFydGljbGUuYm9keS5pbWFnZS5oZWlnaHQgLyAyO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUNpcmNsZShwYXJ0aWNsZSkge1xuICAgIGNvbnN0IGdyYXBoaWNzID0gdGhpcy5wb29sLmdldCh3aW5kb3cuY3JlYXRlanMuR3JhcGhpY3MpO1xuXG4gICAgaWYgKHRoaXMuc3Ryb2tlKSB7XG4gICAgICBpZiAoVHlwZXMuaXNTdHJpbmcodGhpcy5zdHJva2UpKSB7XG4gICAgICAgIGdyYXBoaWNzLmJlZ2luU3Ryb2tlKHRoaXMuc3Ryb2tlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdyYXBoaWNzLmJlZ2luU3Ryb2tlKFwiIzAwMDAwMFwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ3JhcGhpY3MuYmVnaW5GaWxsKHBhcnRpY2xlLmNvbG9yIHx8IFwiI2ZmMDAwMFwiKS5kcmF3Q2lyY2xlKDAsIDAsIHBhcnRpY2xlLnJhZGl1cyk7XG4gICAgY29uc3Qgc2hhcGUgPSB0aGlzLnBvb2wuZ2V0KHdpbmRvdy5jcmVhdGVqcy5TaGFwZSwgW2dyYXBoaWNzXSk7XG5cbiAgICBwYXJ0aWNsZS5ib2R5ID0gc2hhcGU7XG4gICAgcGFydGljbGUuZ3JhcGhpY3MgPSBncmFwaGljcztcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuc3Ryb2tlID0gbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0IFJlY3RhbmdsZSBmcm9tIFwiLi4vbWF0aC9SZWN0YW5nbGVcIjtcbmltcG9ydCBCYXNlUmVuZGVyZXIgZnJvbSBcIi4vQmFzZVJlbmRlcmVyXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHBpeGVsLWJhc2VkIHJlbmRlcmVyIGZvciBwYXJ0aWNsZSBzeXN0ZW1zLlxuICogQGV4dGVuZHMgQmFzZVJlbmRlcmVyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBpeGVsUmVuZGVyZXIgZXh0ZW5kcyBCYXNlUmVuZGVyZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBQaXhlbFJlbmRlcmVyIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBlbGVtZW50IC0gVGhlIGNhbnZhcyBlbGVtZW50IHRvIHJlbmRlciB0by5cbiAgICogQHBhcmFtIHtSZWN0YW5nbGV9IFtyZWN0YW5nbGVdIC0gVGhlIHJlY3RhbmdsZSBkZWZpbmluZyB0aGUgcmVuZGVyaW5nIGFyZWEuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCByZWN0YW5nbGUpIHtcbiAgICBzdXBlcihlbGVtZW50KTtcblxuICAgIHRoaXMuY29udGV4dCA9IHRoaXMuZWxlbWVudC5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgdGhpcy5pbWFnZURhdGEgPSBudWxsO1xuICAgIHRoaXMucmVjdGFuZ2xlID0gcmVjdGFuZ2xlO1xuICAgIHRoaXMuY3JlYXRlSW1hZ2VEYXRhKHJlY3RhbmdsZSk7XG5cbiAgICB0aGlzLm5hbWUgPSBcIlBpeGVsUmVuZGVyZXJcIjtcbiAgfVxuXG4gIHJlc2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdGhpcy5lbGVtZW50LndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5lbGVtZW50LmhlaWdodCA9IGhlaWdodDtcbiAgfVxuXG4gIGNyZWF0ZUltYWdlRGF0YShyZWN0YW5nbGUpIHtcbiAgICB0aGlzLnJlY3RhbmdsZSA9IHJlY3RhbmdsZSA/IHJlY3RhbmdsZSA6IG5ldyBSZWN0YW5nbGUoMCwgMCwgdGhpcy5lbGVtZW50LndpZHRoLCB0aGlzLmVsZW1lbnQuaGVpZ2h0KTtcbiAgICB0aGlzLmltYWdlRGF0YSA9IHRoaXMuY29udGV4dC5jcmVhdGVJbWFnZURhdGEodGhpcy5yZWN0YW5nbGUud2lkdGgsIHRoaXMucmVjdGFuZ2xlLmhlaWdodCk7XG4gICAgdGhpcy5jb250ZXh0LnB1dEltYWdlRGF0YSh0aGlzLmltYWdlRGF0YSwgdGhpcy5yZWN0YW5nbGUueCwgdGhpcy5yZWN0YW5nbGUueSk7XG4gIH1cblxuICBvblByb3RvblVwZGF0ZSgpIHtcbiAgICB0aGlzLmNvbnRleHQuY2xlYXJSZWN0KHRoaXMucmVjdGFuZ2xlLngsIHRoaXMucmVjdGFuZ2xlLnksIHRoaXMucmVjdGFuZ2xlLndpZHRoLCB0aGlzLnJlY3RhbmdsZS5oZWlnaHQpO1xuICAgIHRoaXMuaW1hZ2VEYXRhID0gdGhpcy5jb250ZXh0LmdldEltYWdlRGF0YShcbiAgICAgIHRoaXMucmVjdGFuZ2xlLngsXG4gICAgICB0aGlzLnJlY3RhbmdsZS55LFxuICAgICAgdGhpcy5yZWN0YW5nbGUud2lkdGgsXG4gICAgICB0aGlzLnJlY3RhbmdsZS5oZWlnaHRcbiAgICApO1xuICB9XG5cbiAgb25Qcm90b25VcGRhdGVBZnRlcigpIHtcbiAgICB0aGlzLmNvbnRleHQucHV0SW1hZ2VEYXRhKHRoaXMuaW1hZ2VEYXRhLCB0aGlzLnJlY3RhbmdsZS54LCB0aGlzLnJlY3RhbmdsZS55KTtcbiAgfVxuXG4gIG9uUGFydGljbGVDcmVhdGVkKHBhcnRpY2xlKSB7fVxuXG4gIG9uUGFydGljbGVVcGRhdGUocGFydGljbGUpIHtcbiAgICBpZiAodGhpcy5pbWFnZURhdGEpIHtcbiAgICAgIHRoaXMuc2V0UGl4ZWwoXG4gICAgICAgIHRoaXMuaW1hZ2VEYXRhLFxuICAgICAgICAocGFydGljbGUucC54IC0gdGhpcy5yZWN0YW5nbGUueCkgPj4gMCxcbiAgICAgICAgKHBhcnRpY2xlLnAueSAtIHRoaXMucmVjdGFuZ2xlLnkpID4+IDAsXG4gICAgICAgIHBhcnRpY2xlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHNldFBpeGVsKGltYWdlZGF0YSwgeCwgeSwgcGFydGljbGUpIHtcbiAgICBjb25zdCByZ2IgPSBwYXJ0aWNsZS5yZ2I7XG4gICAgaWYgKHggPCAwIHx8IHggPiB0aGlzLmVsZW1lbnQud2lkdGggfHwgeSA8IDAgfHwgeSA+IHRoaXMuZWxlbWVudC5oZWlnaHQpIHJldHVybjtcblxuICAgIGNvbnN0IGkgPSAoKHkgPj4gMCkgKiBpbWFnZWRhdGEud2lkdGggKyAoeCA+PiAwKSkgKiA0O1xuICAgIGltYWdlZGF0YS5kYXRhW2ldID0gcmdiLnI7XG4gICAgaW1hZ2VkYXRhLmRhdGFbaSArIDFdID0gcmdiLmc7XG4gICAgaW1hZ2VkYXRhLmRhdGFbaSArIDJdID0gcmdiLmI7XG4gICAgaW1hZ2VkYXRhLmRhdGFbaSArIDNdID0gcGFydGljbGUuYWxwaGEgKiAyNTU7XG4gIH1cblxuICBvblBhcnRpY2xlRGVhZChwYXJ0aWNsZSkge31cblxuICAvKipcbiAgICogRGVzdHJveXMgdGhlIHJlbmRlcmVyIGFuZCBjbGVhbnMgdXAgcmVzb3VyY2VzLlxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5zdHJva2UgPSBudWxsO1xuICAgIHRoaXMuY29udGV4dCA9IG51bGw7XG4gICAgdGhpcy5pbWFnZURhdGEgPSBudWxsO1xuICAgIHRoaXMucmVjdGFuZ2xlID0gbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0IFR5cGVzIGZyb20gXCIuLi91dGlscy9UeXBlc1wiO1xuaW1wb3J0IENvbG9yVXRpbCBmcm9tIFwiLi4vdXRpbHMvQ29sb3JVdGlsXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcbmltcG9ydCBCYXNlUmVuZGVyZXIgZnJvbSBcIi4vQmFzZVJlbmRlcmVyXCI7XG5cbmxldCBQSVhJQ2xhc3M7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIFBJWEktYmFzZWQgcmVuZGVyZXIgZm9yIHBhcnRpY2xlIHN5c3RlbXMuXG4gKiBAZXh0ZW5kcyBCYXNlUmVuZGVyZXJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGl4aVJlbmRlcmVyIGV4dGVuZHMgQmFzZVJlbmRlcmVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgUGl4aVJlbmRlcmVyIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge1BJWEkuQ29udGFpbmVyfSBlbGVtZW50IC0gVGhlIFBJWEkgY29udGFpbmVyIHRvIHJlbmRlciB0by5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbc3Ryb2tlXSAtIFRoZSBzdHJva2UgY29sb3IgZm9yIHBhcnRpY2xlcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIHN0cm9rZSkge1xuICAgIHN1cGVyKGVsZW1lbnQpO1xuXG4gICAgdGhpcy5zdHJva2UgPSBzdHJva2U7XG4gICAgdGhpcy5jb2xvciA9IGZhbHNlO1xuICAgIHRoaXMuc2V0Q29sb3IgPSBmYWxzZTtcbiAgICB0aGlzLmJsZW5kTW9kZSA9IG51bGw7XG4gICAgdGhpcy5wb29sLmNyZWF0ZSA9IChib2R5LCBwYXJ0aWNsZSkgPT4gdGhpcy5jcmVhdGVCb2R5KGJvZHksIHBhcnRpY2xlKTtcbiAgICB0aGlzLnNldFBJWEkod2luZG93LlBJWEkpO1xuXG4gICAgdGhpcy5uYW1lID0gXCJQaXhpUmVuZGVyZXJcIjtcbiAgfVxuXG4gIHNldFBJWEkoUElYSSkge1xuICAgIHRyeSB7XG4gICAgICBQSVhJQ2xhc3MgPSBQSVhJIHx8IHsgU3ByaXRlOiB7fSB9O1xuICAgICAgdGhpcy5jcmVhdGVGcm9tSW1hZ2UgPSBQSVhJQ2xhc3MuU3ByaXRlLmZyb20gfHwgUElYSUNsYXNzLlNwcml0ZS5mcm9tSW1hZ2U7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuXG4gIG9uUHJvdG9uVXBkYXRlKCkge31cblxuICAvKipcbiAgICogQHBhcmFtIHBhcnRpY2xlXG4gICAqL1xuICBvblBhcnRpY2xlQ3JlYXRlZChwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZS5ib2R5KSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5ID0gdGhpcy5wb29sLmdldChwYXJ0aWNsZS5ib2R5LCBwYXJ0aWNsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnRpY2xlLmJvZHkgPSB0aGlzLnBvb2wuZ2V0KHRoaXMuY2lyY2xlQ29uZiwgcGFydGljbGUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJsZW5kTW9kZSkge1xuICAgICAgcGFydGljbGUuYm9keS5ibGVuZE1vZGUgPSB0aGlzLmJsZW5kTW9kZTtcbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnQuYWRkQ2hpbGQocGFydGljbGUuYm9keSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHBhcnRpY2xlXG4gICAqL1xuICBvblBhcnRpY2xlVXBkYXRlKHBhcnRpY2xlKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0ocGFydGljbGUsIHBhcnRpY2xlLmJvZHkpO1xuXG4gICAgaWYgKHRoaXMuc2V0Q29sb3IgPT09IHRydWUgfHwgdGhpcy5jb2xvciA9PT0gdHJ1ZSkge1xuICAgICAgcGFydGljbGUuYm9keS50aW50ID0gQ29sb3JVdGlsLmdldEhleDE2RnJvbVBhcnRpY2xlKHBhcnRpY2xlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHBhcnRpY2xlXG4gICAqL1xuICBvblBhcnRpY2xlRGVhZChwYXJ0aWNsZSkge1xuICAgIHRoaXMuZWxlbWVudC5yZW1vdmVDaGlsZChwYXJ0aWNsZS5ib2R5KTtcbiAgICB0aGlzLnBvb2wuZXhwaXJlKHBhcnRpY2xlLmJvZHkpO1xuICAgIHBhcnRpY2xlLmJvZHkgPSBudWxsO1xuICB9XG5cbiAgdHJhbnNmb3JtKHBhcnRpY2xlLCB0YXJnZXQpIHtcbiAgICB0YXJnZXQueCA9IHBhcnRpY2xlLnAueDtcbiAgICB0YXJnZXQueSA9IHBhcnRpY2xlLnAueTtcblxuICAgIHRhcmdldC5hbHBoYSA9IHBhcnRpY2xlLmFscGhhO1xuXG4gICAgdGFyZ2V0LnNjYWxlLnggPSBwYXJ0aWNsZS5zY2FsZTtcbiAgICB0YXJnZXQuc2NhbGUueSA9IHBhcnRpY2xlLnNjYWxlO1xuXG4gICAgLy8gdXNpbmcgY2FjaGVkIHZlcnNpb24gb2YgTWF0aFV0aWwuUElfMTgwIGZvciBzbGlnaHQgcGVyZm9ybWFuY2UgaW5jcmVhc2UuXG4gICAgdGFyZ2V0LnJvdGF0aW9uID0gcGFydGljbGUucm90YXRpb24gKiBNYXRoVXRpbC5QSV8xODA7IC8vIE1hdGhVdGlsLlBJXzE4MDtcbiAgfVxuXG4gIGNyZWF0ZUJvZHkoYm9keSwgcGFydGljbGUpIHtcbiAgICBpZiAoYm9keS5pc0NpcmNsZSkgcmV0dXJuIHRoaXMuY3JlYXRlQ2lyY2xlKHBhcnRpY2xlKTtcbiAgICBlbHNlIHJldHVybiB0aGlzLmNyZWF0ZVNwcml0ZShib2R5KTtcbiAgfVxuXG4gIGNyZWF0ZVNwcml0ZShib2R5KSB7XG4gICAgY29uc3Qgc3ByaXRlID0gYm9keS5pc0lubmVyID8gdGhpcy5jcmVhdGVGcm9tSW1hZ2UoYm9keS5zcmMpIDogbmV3IFBJWElDbGFzcy5TcHJpdGUoYm9keSk7XG5cbiAgICBzcHJpdGUuYW5jaG9yLnggPSAwLjU7XG4gICAgc3ByaXRlLmFuY2hvci55ID0gMC41O1xuXG4gICAgcmV0dXJuIHNwcml0ZTtcbiAgfVxuXG4gIGNyZWF0ZUNpcmNsZShwYXJ0aWNsZSkge1xuICAgIGNvbnN0IGdyYXBoaWNzID0gbmV3IFBJWElDbGFzcy5HcmFwaGljcygpO1xuXG4gICAgaWYgKHRoaXMuc3Ryb2tlKSB7XG4gICAgICBjb25zdCBzdHJva2UgPSBUeXBlcy5pc1N0cmluZyh0aGlzLnN0cm9rZSkgPyB0aGlzLnN0cm9rZSA6IDB4MDAwMDAwO1xuICAgICAgZ3JhcGhpY3MuYmVnaW5TdHJva2Uoc3Ryb2tlKTtcbiAgICB9XG5cbiAgICBncmFwaGljcy5iZWdpbkZpbGwocGFydGljbGUuY29sb3IgfHwgMHgwMDhjZWQpO1xuICAgIGdyYXBoaWNzLmRyYXdDaXJjbGUoMCwgMCwgcGFydGljbGUucmFkaXVzKTtcbiAgICBncmFwaGljcy5lbmRGaWxsKCk7XG5cbiAgICByZXR1cm4gZ3JhcGhpY3M7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveXMgdGhlIHJlbmRlcmVyIGFuZCBjbGVhbnMgdXAgcmVzb3VyY2VzLlxuICAgKiBAcGFyYW0ge0FycmF5PFBhcnRpY2xlPn0gcGFydGljbGVzIC0gVGhlIHBhcnRpY2xlcyB0byBjbGVhbiB1cC5cbiAgICovXG4gIGRlc3Ryb3kocGFydGljbGVzKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuXG4gICAgbGV0IGkgPSBwYXJ0aWNsZXMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGxldCBwYXJ0aWNsZSA9IHBhcnRpY2xlc1tpXTtcbiAgICAgIGlmIChwYXJ0aWNsZS5ib2R5KSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVDaGlsZChwYXJ0aWNsZS5ib2R5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBNYXQzIGZyb20gXCIuLi9tYXRoL01hdDNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTVN0YWNrIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5tYXRzID0gW107XG4gICAgdGhpcy5zaXplID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjA7IGkrKykgdGhpcy5tYXRzLnB1c2goTWF0My5jcmVhdGUoWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdKSk7XG4gIH1cblxuICBzZXQobSwgaSkge1xuICAgIGlmIChpID09PSAwKSBNYXQzLnNldChtLCB0aGlzLm1hdHNbMF0pO1xuICAgIGVsc2UgTWF0My5tdWx0aXBseSh0aGlzLm1hdHNbaSAtIDFdLCBtLCB0aGlzLm1hdHNbaV0pO1xuXG4gICAgdGhpcy5zaXplID0gTWF0aC5tYXgodGhpcy5zaXplLCBpICsgMSk7XG4gIH1cblxuICBwdXNoKG0pIHtcbiAgICBpZiAodGhpcy5zaXplID09PSAwKSBNYXQzLnNldChtLCB0aGlzLm1hdHNbMF0pO1xuICAgIGVsc2UgTWF0My5tdWx0aXBseSh0aGlzLm1hdHNbdGhpcy5zaXplIC0gMV0sIG0sIHRoaXMubWF0c1t0aGlzLnNpemVdKTtcblxuICAgIHRoaXMuc2l6ZSsrO1xuICB9XG5cbiAgcG9wKCkge1xuICAgIGlmICh0aGlzLnNpemUgPiAwKSB0aGlzLnNpemUtLTtcbiAgfVxuXG4gIHRvcCgpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRzW3RoaXMuc2l6ZSAtIDFdO1xuICB9XG59XG4iLCJpbXBvcnQgTWF0MyBmcm9tIFwiLi4vbWF0aC9NYXQzXCI7XG5pbXBvcnQgQmFzZVJlbmRlcmVyIGZyb20gXCIuL0Jhc2VSZW5kZXJlclwiO1xuXG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IEltZ1V0aWwgZnJvbSBcIi4uL3V0aWxzL0ltZ1V0aWxcIjtcbmltcG9ydCBNU3RhY2sgZnJvbSBcIi4uL3V0aWxzL01TdGFja1wiO1xuaW1wb3J0IERvbVV0aWwgZnJvbSBcIi4uL3V0aWxzL0RvbVV0aWxcIjtcbmltcG9ydCBXZWJHTFV0aWwgZnJvbSBcIi4uL3V0aWxzL1dlYkdMVXRpbFwiO1xuaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuLi9tYXRoL01hdGhVdGlsXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIFdlYkdMLWJhc2VkIHJlbmRlcmVyIGZvciBwYXJ0aWNsZSBzeXN0ZW1zLlxuICogQGV4dGVuZHMgQmFzZVJlbmRlcmVyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdlYkdMUmVuZGVyZXIgZXh0ZW5kcyBCYXNlUmVuZGVyZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBXZWJHTFJlbmRlcmVyIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBlbGVtZW50IC0gVGhlIGNhbnZhcyBlbGVtZW50IHRvIHJlbmRlciB0by5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQpIHtcbiAgICBzdXBlcihlbGVtZW50KTtcblxuICAgIHRoaXMuZ2wgPSB0aGlzLmVsZW1lbnQuZ2V0Q29udGV4dChcImV4cGVyaW1lbnRhbC13ZWJnbFwiLCB7IGFudGlhbGlhczogdHJ1ZSwgc3RlbmNpbDogZmFsc2UsIGRlcHRoOiBmYWxzZSB9KTtcbiAgICBpZiAoIXRoaXMuZ2wpIGFsZXJ0KFwiU29ycnkgeW91ciBicm93c2VyIGRvIG5vdCBzdXBwZXN0IFdlYkdMIVwiKTtcblxuICAgIHRoaXMuaW5pdFZhcigpO1xuICAgIHRoaXMuc2V0TWF4UmFkaXVzKCk7XG4gICAgdGhpcy5pbml0U2hhZGVycygpO1xuICAgIHRoaXMuaW5pdEJ1ZmZlcnMoKTtcblxuICAgIHRoaXMuZ2wuYmxlbmRFcXVhdGlvbih0aGlzLmdsLkZVTkNfQUREKTtcbiAgICB0aGlzLmdsLmJsZW5kRnVuYyh0aGlzLmdsLlNSQ19BTFBIQSwgdGhpcy5nbC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcbiAgICB0aGlzLmdsLmVuYWJsZSh0aGlzLmdsLkJMRU5EKTtcbiAgICB0aGlzLmFkZEltZzJCb2R5ID0gdGhpcy5hZGRJbWcyQm9keS5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5uYW1lID0gXCJXZWJHTFJlbmRlcmVyXCI7XG4gIH1cblxuICBpbml0KHByb3Rvbikge1xuICAgIHN1cGVyLmluaXQocHJvdG9uKTtcbiAgICB0aGlzLnJlc2l6ZSh0aGlzLmVsZW1lbnQud2lkdGgsIHRoaXMuZWxlbWVudC5oZWlnaHQpO1xuICB9XG5cbiAgcmVzaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB0aGlzLnVtYXRbNF0gPSAtMjtcbiAgICB0aGlzLnVtYXRbN10gPSAxO1xuXG4gICAgdGhpcy5zbWF0WzBdID0gMSAvIHdpZHRoO1xuICAgIHRoaXMuc21hdFs0XSA9IDEgLyBoZWlnaHQ7XG5cbiAgICB0aGlzLm1zdGFjay5zZXQodGhpcy51bWF0LCAwKTtcbiAgICB0aGlzLm1zdGFjay5zZXQodGhpcy5zbWF0LCAxKTtcblxuICAgIHRoaXMuZ2wudmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgdGhpcy5lbGVtZW50LndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5lbGVtZW50LmhlaWdodCA9IGhlaWdodDtcbiAgfVxuXG4gIHNldE1heFJhZGl1cyhyYWRpdXMpIHtcbiAgICB0aGlzLmNpcmNsZUNhbnZhc1VSTCA9IHRoaXMuY3JlYXRlQ2lyY2xlKHJhZGl1cyk7XG4gIH1cblxuICBnZXRWZXJ0ZXhTaGFkZXIoKSB7XG4gICAgY29uc3QgdnNTb3VyY2UgPSBbXG4gICAgICBcInVuaWZvcm0gdmVjMiB2aWV3cG9ydDtcIixcbiAgICAgIFwiYXR0cmlidXRlIHZlYzIgYVZlcnRleFBvc2l0aW9uO1wiLFxuICAgICAgXCJhdHRyaWJ1dGUgdmVjMiBhVGV4dHVyZUNvb3JkO1wiLFxuICAgICAgXCJ1bmlmb3JtIG1hdDMgdE1hdDtcIixcbiAgICAgIFwidmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XCIsXG4gICAgICBcInZhcnlpbmcgZmxvYXQgYWxwaGE7XCIsXG4gICAgICBcInZvaWQgbWFpbigpIHtcIixcbiAgICAgIFwidmVjMyB2ID0gdE1hdCAqIHZlYzMoYVZlcnRleFBvc2l0aW9uLCAxLjApO1wiLFxuICAgICAgXCJnbF9Qb3NpdGlvbiA9IHZlYzQodi54LCB2LnksIDAsIDEpO1wiLFxuICAgICAgXCJ2VGV4dHVyZUNvb3JkID0gYVRleHR1cmVDb29yZDtcIixcbiAgICAgIFwiYWxwaGEgPSB0TWF0WzBdWzJdO1wiLFxuICAgICAgXCJ9XCJcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgcmV0dXJuIHZzU291cmNlO1xuICB9XG5cbiAgZ2V0RnJhZ21lbnRTaGFkZXIoKSB7XG4gICAgY29uc3QgZnNTb3VyY2UgPSBbXG4gICAgICBcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1wiLFxuICAgICAgXCJ2YXJ5aW5nIHZlYzIgdlRleHR1cmVDb29yZDtcIixcbiAgICAgIFwidmFyeWluZyBmbG9hdCBhbHBoYTtcIixcbiAgICAgIFwidW5pZm9ybSBzYW1wbGVyMkQgdVNhbXBsZXI7XCIsXG4gICAgICBcInVuaWZvcm0gdmVjNCBjb2xvcjtcIixcbiAgICAgIFwidW5pZm9ybSBib29sIHVzZVRleHR1cmU7XCIsXG4gICAgICBcInVuaWZvcm0gdmVjMyB1Q29sb3I7XCIsXG4gICAgICBcInZvaWQgbWFpbigpIHtcIixcbiAgICAgIFwidmVjNCB0ZXh0dXJlQ29sb3IgPSB0ZXh0dXJlMkQodVNhbXBsZXIsIHZUZXh0dXJlQ29vcmQpO1wiLFxuICAgICAgXCJnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlQ29sb3IgKiB2ZWM0KHVDb2xvciwgMS4wKTtcIixcbiAgICAgIFwiZ2xfRnJhZ0NvbG9yLncgKj0gYWxwaGE7XCIsXG4gICAgICBcIn1cIlxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgICByZXR1cm4gZnNTb3VyY2U7XG4gIH1cblxuICBpbml0VmFyKCkge1xuICAgIHRoaXMubXN0YWNrID0gbmV3IE1TdGFjaygpO1xuICAgIHRoaXMudW1hdCA9IE1hdDMuY3JlYXRlKFsyLCAwLCAxLCAwLCAtMiwgMCwgLTEsIDEsIDFdKTtcbiAgICB0aGlzLnNtYXQgPSBNYXQzLmNyZWF0ZShbMSAvIDEwMCwgMCwgMSwgMCwgMSAvIDEwMCwgMCwgMCwgMCwgMV0pO1xuICAgIHRoaXMudGV4dHVyZWJ1ZmZlcnMgPSB7fTtcbiAgfVxuXG4gIGJsZW5kRXF1YXRpb24oQSkge1xuICAgIHRoaXMuZ2wuYmxlbmRFcXVhdGlvbih0aGlzLmdsW0FdKTtcbiAgfVxuXG4gIGJsZW5kRnVuYyhBLCBCKSB7XG4gICAgdGhpcy5nbC5ibGVuZEZ1bmModGhpcy5nbFtBXSwgdGhpcy5nbFtCXSk7XG4gIH1cblxuICBnZXRTaGFkZXIoZ2wsIHN0ciwgZnMpIHtcbiAgICBjb25zdCBzaGFkZXIgPSBmcyA/IGdsLmNyZWF0ZVNoYWRlcihnbC5GUkFHTUVOVF9TSEFERVIpIDogZ2wuY3JlYXRlU2hhZGVyKGdsLlZFUlRFWF9TSEFERVIpO1xuXG4gICAgZ2wuc2hhZGVyU291cmNlKHNoYWRlciwgc3RyKTtcbiAgICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcik7XG5cbiAgICBpZiAoIWdsLmdldFNoYWRlclBhcmFtZXRlcihzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSkge1xuICAgICAgYWxlcnQoZ2wuZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBzaGFkZXI7XG4gIH1cblxuICBpbml0U2hhZGVycygpIHtcbiAgICBjb25zdCBmcmFnbWVudFNoYWRlciA9IHRoaXMuZ2V0U2hhZGVyKHRoaXMuZ2wsIHRoaXMuZ2V0RnJhZ21lbnRTaGFkZXIoKSwgdHJ1ZSk7XG4gICAgY29uc3QgdmVydGV4U2hhZGVyID0gdGhpcy5nZXRTaGFkZXIodGhpcy5nbCwgdGhpcy5nZXRWZXJ0ZXhTaGFkZXIoKSwgZmFsc2UpO1xuXG4gICAgdGhpcy5zcHJvZ3JhbSA9IHRoaXMuZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuICAgIHRoaXMuZ2wuYXR0YWNoU2hhZGVyKHRoaXMuc3Byb2dyYW0sIHZlcnRleFNoYWRlcik7XG4gICAgdGhpcy5nbC5hdHRhY2hTaGFkZXIodGhpcy5zcHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIpO1xuICAgIHRoaXMuZ2wubGlua1Byb2dyYW0odGhpcy5zcHJvZ3JhbSk7XG5cbiAgICBpZiAoIXRoaXMuZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcih0aGlzLnNwcm9ncmFtLCB0aGlzLmdsLkxJTktfU1RBVFVTKSkgYWxlcnQoXCJDb3VsZCBub3QgaW5pdGlhbGlzZSBzaGFkZXJzXCIpO1xuXG4gICAgdGhpcy5nbC51c2VQcm9ncmFtKHRoaXMuc3Byb2dyYW0pO1xuICAgIHRoaXMuc3Byb2dyYW0udnBhID0gdGhpcy5nbC5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLnNwcm9ncmFtLCBcImFWZXJ0ZXhQb3NpdGlvblwiKTtcbiAgICB0aGlzLnNwcm9ncmFtLnRjYSA9IHRoaXMuZ2wuZ2V0QXR0cmliTG9jYXRpb24odGhpcy5zcHJvZ3JhbSwgXCJhVGV4dHVyZUNvb3JkXCIpO1xuICAgIHRoaXMuZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodGhpcy5zcHJvZ3JhbS50Y2EpO1xuICAgIHRoaXMuZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodGhpcy5zcHJvZ3JhbS52cGEpO1xuXG4gICAgdGhpcy5zcHJvZ3JhbS50TWF0VW5pZm9ybSA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMuc3Byb2dyYW0sIFwidE1hdFwiKTtcbiAgICB0aGlzLnNwcm9ncmFtLnNhbXBsZXJVbmlmb3JtID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5zcHJvZ3JhbSwgXCJ1U2FtcGxlclwiKTtcbiAgICB0aGlzLnNwcm9ncmFtLnVzZVRleCA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMuc3Byb2dyYW0sIFwidXNlVGV4dHVyZVwiKTtcbiAgICB0aGlzLnNwcm9ncmFtLmNvbG9yID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5zcHJvZ3JhbSwgXCJ1Q29sb3JcIik7XG4gICAgdGhpcy5nbC51bmlmb3JtMWkodGhpcy5zcHJvZ3JhbS51c2VUZXgsIDEpO1xuICB9XG5cbiAgaW5pdEJ1ZmZlcnMoKSB7XG4gICAgY29uc3QgdnMgPSBbMCwgMywgMSwgMCwgMiwgM107XG4gICAgbGV0IGlkeDtcblxuICAgIHRoaXMudW5pdElCdWZmZXIgPSB0aGlzLmdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLnVuaXRJQnVmZmVyKTtcbiAgICB0aGlzLmdsLmJ1ZmZlckRhdGEodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbmV3IFVpbnQxNkFycmF5KHZzKSwgdGhpcy5nbC5TVEFUSUNfRFJBVyk7XG5cbiAgICBsZXQgaTtcbiAgICBsZXQgaWRzID0gW107XG4gICAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSBpZHMucHVzaChpKTtcbiAgICBpZHggPSBuZXcgVWludDE2QXJyYXkoaWRzKTtcblxuICAgIHRoaXMudW5pdEkzMyA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMudW5pdEkzMyk7XG4gICAgdGhpcy5nbC5idWZmZXJEYXRhKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGlkeCwgdGhpcy5nbC5TVEFUSUNfRFJBVyk7XG5cbiAgICBpZHMgPSBbXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIGlkcy5wdXNoKGksIGkgKyAxLCBpICsgMik7XG4gICAgaWR4ID0gbmV3IFVpbnQxNkFycmF5KGlkcyk7XG5cbiAgICB0aGlzLnN0cmlwQnVmZmVyID0gdGhpcy5nbC5jcmVhdGVCdWZmZXIoKTtcbiAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy5zdHJpcEJ1ZmZlcik7XG4gICAgdGhpcy5nbC5idWZmZXJEYXRhKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGlkeCwgdGhpcy5nbC5TVEFUSUNfRFJBVyk7XG4gIH1cblxuICBjcmVhdGVDaXJjbGUocmFpZHVzKSB7XG4gICAgdGhpcy5jaXJjbGVDYW52YXNSYWRpdXMgPSBXZWJHTFV0aWwubmhwb3QoVXRpbC5pbml0VmFsdWUocmFpZHVzLCAzMikpO1xuICAgIGNvbnN0IGNhbnZhcyA9IERvbVV0aWwuY3JlYXRlQ2FudmFzKFwiY2lyY2xlX2NhbnZhc1wiLCB0aGlzLmNpcmNsZUNhbnZhc1JhZGl1cyAqIDIsIHRoaXMuY2lyY2xlQ2FudmFzUmFkaXVzICogMik7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG5cbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIGNvbnRleHQuYXJjKHRoaXMuY2lyY2xlQ2FudmFzUmFkaXVzLCB0aGlzLmNpcmNsZUNhbnZhc1JhZGl1cywgdGhpcy5jaXJjbGVDYW52YXNSYWRpdXMsIDAsIE1hdGguUEkgKiAyLCB0cnVlKTtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gXCIjRkZGXCI7XG4gICAgY29udGV4dC5maWxsKCk7XG5cbiAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgpO1xuICB9XG5cbiAgZHJhd0ltZzJDYW52YXMocGFydGljbGUpIHtcbiAgICBjb25zdCBfdyA9IHBhcnRpY2xlLmJvZHkud2lkdGg7XG4gICAgY29uc3QgX2ggPSBwYXJ0aWNsZS5ib2R5LmhlaWdodDtcblxuICAgIGNvbnN0IF93aWR0aCA9IFdlYkdMVXRpbC5uaHBvdChwYXJ0aWNsZS5ib2R5LndpZHRoKTtcbiAgICBjb25zdCBfaGVpZ2h0ID0gV2ViR0xVdGlsLm5ocG90KHBhcnRpY2xlLmJvZHkuaGVpZ2h0KTtcblxuICAgIGNvbnN0IF9zY2FsZVggPSBwYXJ0aWNsZS5ib2R5LndpZHRoIC8gX3dpZHRoO1xuICAgIGNvbnN0IF9zY2FsZVkgPSBwYXJ0aWNsZS5ib2R5LmhlaWdodCAvIF9oZWlnaHQ7XG5cbiAgICBpZiAoIXRoaXMudGV4dHVyZWJ1ZmZlcnNbcGFydGljbGUuZGF0YS5zcmNdKVxuICAgICAgdGhpcy50ZXh0dXJlYnVmZmVyc1twYXJ0aWNsZS5kYXRhLnNyY10gPSBbXG4gICAgICAgIHRoaXMuZ2wuY3JlYXRlVGV4dHVyZSgpLFxuICAgICAgICB0aGlzLmdsLmNyZWF0ZUJ1ZmZlcigpLFxuICAgICAgICB0aGlzLmdsLmNyZWF0ZUJ1ZmZlcigpXG4gICAgICBdO1xuXG4gICAgcGFydGljbGUuZGF0YS50ZXh0dXJlID0gdGhpcy50ZXh0dXJlYnVmZmVyc1twYXJ0aWNsZS5kYXRhLnNyY11bMF07XG4gICAgcGFydGljbGUuZGF0YS52Y0J1ZmZlciA9IHRoaXMudGV4dHVyZWJ1ZmZlcnNbcGFydGljbGUuZGF0YS5zcmNdWzFdO1xuICAgIHBhcnRpY2xlLmRhdGEudGNCdWZmZXIgPSB0aGlzLnRleHR1cmVidWZmZXJzW3BhcnRpY2xlLmRhdGEuc3JjXVsyXTtcblxuICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgcGFydGljbGUuZGF0YS50Y0J1ZmZlcik7XG4gICAgdGhpcy5nbC5idWZmZXJEYXRhKFxuICAgICAgdGhpcy5nbC5BUlJBWV9CVUZGRVIsXG4gICAgICBuZXcgRmxvYXQzMkFycmF5KFswLjAsIDAuMCwgX3NjYWxlWCwgMC4wLCAwLjAsIF9zY2FsZVksIF9zY2FsZVksIF9zY2FsZVldKSxcbiAgICAgIHRoaXMuZ2wuU1RBVElDX0RSQVdcbiAgICApO1xuICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgcGFydGljbGUuZGF0YS52Y0J1ZmZlcik7XG4gICAgdGhpcy5nbC5idWZmZXJEYXRhKFxuICAgICAgdGhpcy5nbC5BUlJBWV9CVUZGRVIsXG4gICAgICBuZXcgRmxvYXQzMkFycmF5KFswLjAsIDAuMCwgX3csIDAuMCwgMC4wLCBfaCwgX3csIF9oXSksXG4gICAgICB0aGlzLmdsLlNUQVRJQ19EUkFXXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbnRleHQgPSBwYXJ0aWNsZS5kYXRhLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgY29uc3QgZGF0YSA9IGNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIF93aWR0aCwgX2hlaWdodCk7XG5cbiAgICB0aGlzLmdsLmJpbmRUZXh0dXJlKHRoaXMuZ2wuVEVYVFVSRV8yRCwgcGFydGljbGUuZGF0YS50ZXh0dXJlKTtcbiAgICB0aGlzLmdsLnRleEltYWdlMkQodGhpcy5nbC5URVhUVVJFXzJELCAwLCB0aGlzLmdsLlJHQkEsIHRoaXMuZ2wuUkdCQSwgdGhpcy5nbC5VTlNJR05FRF9CWVRFLCBkYXRhKTtcbiAgICB0aGlzLmdsLnRleFBhcmFtZXRlcmkodGhpcy5nbC5URVhUVVJFXzJELCB0aGlzLmdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgdGhpcy5nbC5MSU5FQVIpO1xuICAgIHRoaXMuZ2wudGV4UGFyYW1ldGVyaSh0aGlzLmdsLlRFWFRVUkVfMkQsIHRoaXMuZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCB0aGlzLmdsLkxJTkVBUl9NSVBNQVBfTkVBUkVTVCk7XG4gICAgdGhpcy5nbC5nZW5lcmF0ZU1pcG1hcCh0aGlzLmdsLlRFWFRVUkVfMkQpO1xuXG4gICAgcGFydGljbGUuZGF0YS50ZXh0dXJlTG9hZGVkID0gdHJ1ZTtcbiAgICBwYXJ0aWNsZS5kYXRhLnRleHR1cmVXaWR0aCA9IF93O1xuICAgIHBhcnRpY2xlLmRhdGEudGV4dHVyZUhlaWdodCA9IF9oO1xuICB9XG5cbiAgb25Qcm90b25VcGRhdGUoKSB7XG4gICAgLy8gdGhpcy5nbC5jbGVhckNvbG9yKDAsIDAsIDAsIDEpO1xuICAgIC8vIHRoaXMuZ2wuY2xlYXIodGhpcy5nbC5DT0xPUl9CVUZGRVJfQklUIHwgdGhpcy5nbC5ERVBUSF9CVUZGRVJfQklUKTtcbiAgfVxuXG4gIG9uUGFydGljbGVDcmVhdGVkKHBhcnRpY2xlKSB7XG4gICAgcGFydGljbGUuZGF0YS50ZXh0dXJlTG9hZGVkID0gZmFsc2U7XG4gICAgcGFydGljbGUuZGF0YS50bWF0ID0gTWF0My5jcmVhdGUoKTtcbiAgICBwYXJ0aWNsZS5kYXRhLnRtYXRbOF0gPSAxO1xuICAgIHBhcnRpY2xlLmRhdGEuaW1hdCA9IE1hdDMuY3JlYXRlKCk7XG4gICAgcGFydGljbGUuZGF0YS5pbWF0WzhdID0gMTtcblxuICAgIGlmIChwYXJ0aWNsZS5ib2R5KSB7XG4gICAgICBJbWdVdGlsLmdldEltZ0Zyb21DYWNoZShwYXJ0aWNsZS5ib2R5LCB0aGlzLmFkZEltZzJCb2R5LCBwYXJ0aWNsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIEltZ1V0aWwuZ2V0SW1nRnJvbUNhY2hlKHRoaXMuY2lyY2xlQ2FudmFzVVJMLCB0aGlzLmFkZEltZzJCb2R5LCBwYXJ0aWNsZSk7XG4gICAgICBwYXJ0aWNsZS5kYXRhLm9sZFNjYWxlID0gcGFydGljbGUucmFkaXVzIC8gdGhpcy5jaXJjbGVDYW52YXNSYWRpdXM7XG4gICAgfVxuICB9XG5cbiAgLy8gcHJpdmF0ZVxuICBhZGRJbWcyQm9keShpbWcsIHBhcnRpY2xlKSB7XG4gICAgaWYgKHBhcnRpY2xlLmRlYWQpIHJldHVybjtcbiAgICBwYXJ0aWNsZS5ib2R5ID0gaW1nO1xuICAgIHBhcnRpY2xlLmRhdGEuc3JjID0gaW1nLnNyYztcbiAgICBwYXJ0aWNsZS5kYXRhLmNhbnZhcyA9IEltZ1V0aWwuZ2V0Q2FudmFzRnJvbUNhY2hlKGltZyk7XG4gICAgcGFydGljbGUuZGF0YS5vbGRTY2FsZSA9IDE7XG5cbiAgICB0aGlzLmRyYXdJbWcyQ2FudmFzKHBhcnRpY2xlKTtcbiAgfVxuXG4gIG9uUGFydGljbGVVcGRhdGUocGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUuZGF0YS50ZXh0dXJlTG9hZGVkKSB7XG4gICAgICB0aGlzLnVwZGF0ZU1hdHJpeChwYXJ0aWNsZSk7XG5cbiAgICAgIHRoaXMuZ2wudW5pZm9ybTNmKHRoaXMuc3Byb2dyYW0uY29sb3IsIHBhcnRpY2xlLnJnYi5yIC8gMjU1LCBwYXJ0aWNsZS5yZ2IuZyAvIDI1NSwgcGFydGljbGUucmdiLmIgLyAyNTUpO1xuICAgICAgdGhpcy5nbC51bmlmb3JtTWF0cml4M2Z2KHRoaXMuc3Byb2dyYW0udE1hdFVuaWZvcm0sIGZhbHNlLCB0aGlzLm1zdGFjay50b3AoKSk7XG5cbiAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgcGFydGljbGUuZGF0YS52Y0J1ZmZlcik7XG4gICAgICB0aGlzLmdsLnZlcnRleEF0dHJpYlBvaW50ZXIodGhpcy5zcHJvZ3JhbS52cGEsIDIsIHRoaXMuZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKTtcbiAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgcGFydGljbGUuZGF0YS50Y0J1ZmZlcik7XG4gICAgICB0aGlzLmdsLnZlcnRleEF0dHJpYlBvaW50ZXIodGhpcy5zcHJvZ3JhbS50Y2EsIDIsIHRoaXMuZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKTtcbiAgICAgIHRoaXMuZ2wuYmluZFRleHR1cmUodGhpcy5nbC5URVhUVVJFXzJELCBwYXJ0aWNsZS5kYXRhLnRleHR1cmUpO1xuICAgICAgdGhpcy5nbC51bmlmb3JtMWkodGhpcy5zcHJvZ3JhbS5zYW1wbGVyVW5pZm9ybSwgMCk7XG4gICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy51bml0SUJ1ZmZlcik7XG5cbiAgICAgIHRoaXMuZ2wuZHJhd0VsZW1lbnRzKHRoaXMuZ2wuVFJJQU5HTEVTLCA2LCB0aGlzLmdsLlVOU0lHTkVEX1NIT1JULCAwKTtcbiAgICAgIHRoaXMubXN0YWNrLnBvcCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFydGljbGVEZWFkKHBhcnRpY2xlKSB7fVxuXG4gIHVwZGF0ZU1hdHJpeChwYXJ0aWNsZSkge1xuICAgIGNvbnN0IG1vdmVPcmlnaW5NYXRyaXggPSBXZWJHTFV0aWwubWFrZVRyYW5zbGF0aW9uKFxuICAgICAgLXBhcnRpY2xlLmRhdGEudGV4dHVyZVdpZHRoIC8gMixcbiAgICAgIC1wYXJ0aWNsZS5kYXRhLnRleHR1cmVIZWlnaHQgLyAyXG4gICAgKTtcbiAgICBjb25zdCB0cmFuc2xhdGlvbk1hdHJpeCA9IFdlYkdMVXRpbC5tYWtlVHJhbnNsYXRpb24ocGFydGljbGUucC54LCBwYXJ0aWNsZS5wLnkpO1xuXG4gICAgY29uc3QgYW5nZWwgPSBwYXJ0aWNsZS5yb3RhdGlvbiAqIE1hdGhVdGlsLlBJXzE4MDtcbiAgICBjb25zdCByb3RhdGlvbk1hdHJpeCA9IFdlYkdMVXRpbC5tYWtlUm90YXRpb24oYW5nZWwpO1xuXG4gICAgY29uc3Qgc2NhbGUgPSBwYXJ0aWNsZS5zY2FsZSAqIHBhcnRpY2xlLmRhdGEub2xkU2NhbGU7XG4gICAgY29uc3Qgc2NhbGVNYXRyaXggPSBXZWJHTFV0aWwubWFrZVNjYWxlKHNjYWxlLCBzY2FsZSk7XG4gICAgbGV0IG1hdHJpeCA9IFdlYkdMVXRpbC5tYXRyaXhNdWx0aXBseShtb3ZlT3JpZ2luTWF0cml4LCBzY2FsZU1hdHJpeCk7XG5cbiAgICBtYXRyaXggPSBXZWJHTFV0aWwubWF0cml4TXVsdGlwbHkobWF0cml4LCByb3RhdGlvbk1hdHJpeCk7XG4gICAgbWF0cml4ID0gV2ViR0xVdGlsLm1hdHJpeE11bHRpcGx5KG1hdHJpeCwgdHJhbnNsYXRpb25NYXRyaXgpO1xuXG4gICAgTWF0My5pbnZlcnNlKG1hdHJpeCwgcGFydGljbGUuZGF0YS5pbWF0KTtcbiAgICBtYXRyaXhbMl0gPSBwYXJ0aWNsZS5hbHBoYTtcblxuICAgIHRoaXMubXN0YWNrLnB1c2gobWF0cml4KTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuZ2wgPSBudWxsO1xuICAgIHRoaXMubXN0YWNrID0gbnVsbDtcbiAgICB0aGlzLnVtYXQgPSBudWxsO1xuICAgIHRoaXMuc21hdCA9IG51bGw7XG4gICAgdGhpcy50ZXh0dXJlYnVmZmVycyA9IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCBCYXNlUmVuZGVyZXIgZnJvbSBcIi4vQmFzZVJlbmRlcmVyXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGN1c3RvbSByZW5kZXJlciB0aGF0IGV4dGVuZHMgdGhlIEJhc2VSZW5kZXJlci5cbiAqIEBleHRlbmRzIEJhc2VSZW5kZXJlclxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDdXN0b21SZW5kZXJlciBleHRlbmRzIEJhc2VSZW5kZXJlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEN1c3RvbVJlbmRlcmVyIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIEhUTUwgZWxlbWVudCB0byByZW5kZXIgdG8uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlbGVtZW50KSB7XG4gICAgc3VwZXIoZWxlbWVudCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcmVuZGVyZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLm5hbWUgPSBcIkN1c3RvbVJlbmRlcmVyXCI7XG4gIH1cbn1cbiIsImltcG9ydCBab25lIGZyb20gXCIuL1pvbmVcIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcbmltcG9ydCBWZWN0b3IyRCBmcm9tIFwiLi4vbWF0aC9WZWN0b3IyRFwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBsaW5lIHpvbmUgZm9yIHBhcnRpY2xlIHN5c3RlbXMuXG4gKiBAZXh0ZW5kcyBab25lXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpbmVab25lIGV4dGVuZHMgWm9uZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IExpbmVab25lLlxuICAgKiBAcGFyYW0ge251bWJlcn0geDEgLSBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHkxIC0gVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbeDJdIC0gVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3kyXSAtIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkaXJlY3Rpb249XCI+XCJdIC0gVGhlIGRpcmVjdGlvbiBvZiB0aGUgbGluZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHgxLCB5MSwgeDIsIHkyLCBkaXJlY3Rpb24gPSBcIj5cIikge1xuICAgIHN1cGVyKCk7XG5cbiAgICBpZiAoeDIgLSB4MSA+PSAwKSB7XG4gICAgICB0aGlzLngxID0geDE7XG4gICAgICB0aGlzLnkxID0geTE7XG4gICAgICB0aGlzLngyID0geDI7XG4gICAgICB0aGlzLnkyID0geTI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMueDEgPSB4MjtcbiAgICAgIHRoaXMueTEgPSB5MjtcbiAgICAgIHRoaXMueDIgPSB4MTtcbiAgICAgIHRoaXMueTIgPSB5MTtcbiAgICB9XG5cbiAgICB0aGlzLmR4ID0gdGhpcy54MiAtIHRoaXMueDE7XG4gICAgdGhpcy5keSA9IHRoaXMueTIgLSB0aGlzLnkxO1xuXG4gICAgdGhpcy5taW54ID0gTWF0aC5taW4odGhpcy54MSwgdGhpcy54Mik7XG4gICAgdGhpcy5taW55ID0gTWF0aC5taW4odGhpcy55MSwgdGhpcy55Mik7XG4gICAgdGhpcy5tYXh4ID0gTWF0aC5tYXgodGhpcy54MSwgdGhpcy54Mik7XG4gICAgdGhpcy5tYXh5ID0gTWF0aC5tYXgodGhpcy55MSwgdGhpcy55Mik7XG5cbiAgICB0aGlzLmRvdCA9IHRoaXMueDIgKiB0aGlzLnkxIC0gdGhpcy54MSAqIHRoaXMueTI7XG4gICAgdGhpcy54eHl5ID0gdGhpcy5keCAqIHRoaXMuZHggKyB0aGlzLmR5ICogdGhpcy5keTtcblxuICAgIHRoaXMuZ3JhZGllbnQgPSB0aGlzLmdldEdyYWRpZW50KCk7XG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLmdldExlbmd0aCgpO1xuICAgIHRoaXMuZGlyZWN0aW9uID0gVXRpbC5pbml0VmFsdWUoZGlyZWN0aW9uLCBcIj5cIik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJhbmRvbSBwb3NpdGlvbiBvbiB0aGUgbGluZS5cbiAgICogQHJldHVybnMge1ZlY3RvcjJEfSBBIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIHJhbmRvbSBwb3NpdGlvbi5cbiAgICovXG4gIGdldFBvc2l0aW9uKCkge1xuICAgIHRoaXMucmFuZG9tID0gTWF0aC5yYW5kb20oKTtcbiAgICB0aGlzLnZlY3Rvci54ID0gdGhpcy54MSArIHRoaXMucmFuZG9tICogdGhpcy5sZW5ndGggKiBNYXRoLmNvcyh0aGlzLmdyYWRpZW50KTtcbiAgICB0aGlzLnZlY3Rvci55ID0gdGhpcy55MSArIHRoaXMucmFuZG9tICogdGhpcy5sZW5ndGggKiBNYXRoLnNpbih0aGlzLmdyYWRpZW50KTtcblxuICAgIHJldHVybiB0aGlzLnZlY3RvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoaWNoIHNpZGUgb2YgdGhlIGxpbmUgYSBwb2ludCBpcyBvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBwb2ludC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBwb2ludC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBvaW50IGlzIG9uIHRoZSBwb3NpdGl2ZSBzaWRlIG9mIHRoZSBsaW5lLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBnZXREaXJlY3Rpb24oeCwgeSkge1xuICAgIGNvbnN0IEEgPSB0aGlzLmR5O1xuICAgIGNvbnN0IEIgPSAtdGhpcy5keDtcbiAgICBjb25zdCBDID0gdGhpcy5kb3Q7XG4gICAgY29uc3QgRCA9IEIgPT09IDAgPyAxIDogQjtcblxuICAgIGlmICgoQSAqIHggKyBCICogeSArIEMpICogRCA+IDApIHJldHVybiB0cnVlO1xuICAgIGVsc2UgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIGRpc3RhbmNlIG9mIGEgcG9pbnQgZnJvbSB0aGUgbGluZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBwb2ludC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBwb2ludC5cbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIGRpc3RhbmNlIGZyb20gdGhlIHBvaW50IHRvIHRoZSBsaW5lLlxuICAgKi9cbiAgZ2V0RGlzdGFuY2UoeCwgeSkge1xuICAgIGNvbnN0IEEgPSB0aGlzLmR5O1xuICAgIGNvbnN0IEIgPSAtdGhpcy5keDtcbiAgICBjb25zdCBDID0gdGhpcy5kb3Q7XG4gICAgY29uc3QgRCA9IEEgKiB4ICsgQiAqIHkgKyBDO1xuXG4gICAgcmV0dXJuIEQgLyBNYXRoLnNxcnQodGhpcy54eHl5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBzeW1tZXRyaWMgdmVjdG9yIG9mIGEgZ2l2ZW4gdmVjdG9yIHdpdGggcmVzcGVjdCB0byB0aGUgbGluZS5cbiAgICogQHBhcmFtIHtWZWN0b3IyRH0gdiAtIFRoZSB2ZWN0b3IgdG8gcmVmbGVjdC5cbiAgICogQHJldHVybnMge1ZlY3RvcjJEfSBUaGUgcmVmbGVjdGVkIHZlY3Rvci5cbiAgICovXG4gIGdldFN5bW1ldHJpYyh2KSB7XG4gICAgY29uc3QgdGhhMiA9IHYuZ2V0R3JhZGllbnQoKTtcbiAgICBjb25zdCB0aGExID0gdGhpcy5nZXRHcmFkaWVudCgpO1xuICAgIGNvbnN0IHRoYSA9IDIgKiAodGhhMSAtIHRoYTIpO1xuXG4gICAgY29uc3Qgb2xkeCA9IHYueDtcbiAgICBjb25zdCBvbGR5ID0gdi55O1xuXG4gICAgdi54ID0gb2xkeCAqIE1hdGguY29zKHRoYSkgLSBvbGR5ICogTWF0aC5zaW4odGhhKTtcbiAgICB2LnkgPSBvbGR4ICogTWF0aC5zaW4odGhhKSArIG9sZHkgKiBNYXRoLmNvcyh0aGEpO1xuXG4gICAgcmV0dXJuIHY7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZ3JhZGllbnQgKGFuZ2xlKSBvZiB0aGUgbGluZS5cbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIGdyYWRpZW50IG9mIHRoZSBsaW5lIGluIHJhZGlhbnMuXG4gICAqL1xuICBnZXRHcmFkaWVudCgpIHtcbiAgICByZXR1cm4gTWF0aC5hdGFuMih0aGlzLmR5LCB0aGlzLmR4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBwYXJ0aWNsZSBpcyBvdXRzaWRlIHRoZSByYW5nZSBvZiB0aGUgbGluZS5cbiAgICogQHBhcmFtIHtQYXJ0aWNsZX0gcGFydGljbGUgLSBUaGUgcGFydGljbGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBwYXJ0aWNsZSBpcyB3aXRoaW4gcmFuZ2UsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHJhbmdlT3V0KHBhcnRpY2xlKSB7XG4gICAgY29uc3QgYW5nbGUgPSBNYXRoLmFicyh0aGlzLmdldEdyYWRpZW50KCkpO1xuXG4gICAgaWYgKGFuZ2xlIDw9IE1hdGhVdGlsLlBJIC8gNCkge1xuICAgICAgaWYgKHBhcnRpY2xlLnAueCA8PSB0aGlzLm1heHggJiYgcGFydGljbGUucC54ID49IHRoaXMubWlueCkgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwYXJ0aWNsZS5wLnkgPD0gdGhpcy5tYXh5ICYmIHBhcnRpY2xlLnAueSA+PSB0aGlzLm1pbnkpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsZW5ndGggb2YgdGhlIGxpbmUuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBsZW5ndGggb2YgdGhlIGxpbmUuXG4gICAqL1xuICBnZXRMZW5ndGgoKSB7XG4gICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLmR4ICogdGhpcy5keCArIHRoaXMuZHkgKiB0aGlzLmR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHBhcnRpY2xlIGNyb3NzaW5nIGJlaGF2aW9yIGJhc2VkIG9uIHRoZSBjcm9zc1R5cGUuXG4gICAqIEBwYXJhbSB7UGFydGljbGV9IHBhcnRpY2xlIC0gVGhlIHBhcnRpY2xlIHRvIGNoZWNrIGZvciBjcm9zc2luZy5cbiAgICovXG4gIGNyb3NzaW5nKHBhcnRpY2xlKSB7XG4gICAgaWYgKHRoaXMuY3Jvc3NUeXBlID09PSBcImRlYWRcIikge1xuICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSBcIj5cIiB8fCB0aGlzLmRpcmVjdGlvbiA9PT0gXCJSXCIgfHwgdGhpcy5kaXJlY3Rpb24gPT09IFwicmlnaHRcIiB8fCB0aGlzLmRpcmVjdGlvbiA9PT0gXCJkb3duXCIpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJhbmdlT3V0KHBhcnRpY2xlKSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5nZXREaXJlY3Rpb24ocGFydGljbGUucC54LCBwYXJ0aWNsZS5wLnkpKSBwYXJ0aWNsZS5kZWFkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghdGhpcy5yYW5nZU91dChwYXJ0aWNsZSkpIHJldHVybjtcbiAgICAgICAgaWYgKCF0aGlzLmdldERpcmVjdGlvbihwYXJ0aWNsZS5wLngsIHBhcnRpY2xlLnAueSkpIHBhcnRpY2xlLmRlYWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiYm91bmRcIikge1xuICAgICAgaWYgKCF0aGlzLnJhbmdlT3V0KHBhcnRpY2xlKSkgcmV0dXJuO1xuXG4gICAgICBpZiAodGhpcy5nZXREaXN0YW5jZShwYXJ0aWNsZS5wLngsIHBhcnRpY2xlLnAueSkgPD0gcGFydGljbGUucmFkaXVzKSB7XG4gICAgICAgIGlmICh0aGlzLmR4ID09PSAwKSB7XG4gICAgICAgICAgcGFydGljbGUudi54ICo9IC0xO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHkgPT09IDApIHtcbiAgICAgICAgICBwYXJ0aWNsZS52LnkgKj0gLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5nZXRTeW1tZXRyaWMocGFydGljbGUudik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuY3Jvc3NUeXBlID09PSBcImNyb3NzXCIpIHtcbiAgICAgIGlmICh0aGlzLmFsZXJ0KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJTb3JyeSwgTGluZVpvbmUgZG9lcyBub3Qgc3VwcG9ydCBjcm9zcyBtZXRob2QhXCIpO1xuICAgICAgICB0aGlzLmFsZXJ0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgWm9uZSBmcm9tIFwiLi9ab25lXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY2lyY3VsYXIgem9uZSBpbiBhIDJEIHNwYWNlLlxuICogQGV4dGVuZHMgWm9uZVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDaXJjbGVab25lIGV4dGVuZHMgWm9uZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IENpcmNsZVpvbmUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgY2lyY2xlJ3MgY2VudGVyLlxuICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGNpcmNsZSdzIGNlbnRlci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXNdIC0gVGhlIHJhZGl1cyBvZiB0aGUgY2lyY2xlLlxuICAgKi9cbiAgY29uc3RydWN0b3IoeCwgeSwgcmFkaXVzKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgICB0aGlzLnJhZGl1cyA9IHJhZGl1cztcbiAgICB0aGlzLmFuZ2xlID0gMDtcbiAgICB0aGlzLmNlbnRlciA9IHsgeCwgeSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSByYW5kb20gcG9zaXRpb24gd2l0aGluIHRoZSBjaXJjbGUuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEFuIG9iamVjdCB3aXRoIHggYW5kIHkgY29vcmRpbmF0ZXMuXG4gICAqL1xuICBnZXRQb3NpdGlvbigpIHtcbiAgICB0aGlzLmFuZ2xlID0gTWF0aFV0aWwuUEl4MiAqIE1hdGgucmFuZG9tKCk7XG4gICAgdGhpcy5yYW5kb21SYWRpdXMgPSBNYXRoLnJhbmRvbSgpICogdGhpcy5yYWRpdXM7XG4gICAgdGhpcy52ZWN0b3IueCA9IHRoaXMueCArIHRoaXMucmFuZG9tUmFkaXVzICogTWF0aC5jb3ModGhpcy5hbmdsZSk7XG4gICAgdGhpcy52ZWN0b3IueSA9IHRoaXMueSArIHRoaXMucmFuZG9tUmFkaXVzICogTWF0aC5zaW4odGhpcy5hbmdsZSk7XG5cbiAgICByZXR1cm4gdGhpcy52ZWN0b3I7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgY2VudGVyIG9mIHRoZSBjaXJjbGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIG5ldyB4LWNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgbmV3IHktY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyLlxuICAgKi9cbiAgc2V0Q2VudGVyKHgsIHkpIHtcbiAgICB0aGlzLmNlbnRlci54ID0geDtcbiAgICB0aGlzLmNlbnRlci55ID0geTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHBhcnRpY2xlIGNyb3NzaW5nIGJlaGF2aW9yLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFydGljbGUgLSBUaGUgcGFydGljbGUgdG8gY2hlY2sgZm9yIGNyb3NzaW5nLlxuICAgKi9cbiAgY3Jvc3NpbmcocGFydGljbGUpIHtcbiAgICBjb25zdCBkID0gcGFydGljbGUucC5kaXN0YW5jZVRvKHRoaXMuY2VudGVyKTtcblxuICAgIGlmICh0aGlzLmNyb3NzVHlwZSA9PT0gXCJkZWFkXCIpIHtcbiAgICAgIGlmIChkIC0gcGFydGljbGUucmFkaXVzID4gdGhpcy5yYWRpdXMpIHBhcnRpY2xlLmRlYWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiYm91bmRcIikge1xuICAgICAgaWYgKGQgKyBwYXJ0aWNsZS5yYWRpdXMgPj0gdGhpcy5yYWRpdXMpIHRoaXMuZ2V0U3ltbWV0cmljKHBhcnRpY2xlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3Jvc3NUeXBlID09PSBcImNyb3NzXCIpIHtcbiAgICAgIGlmICh0aGlzLmFsZXJ0KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJTb3JyeSwgQ2lyY2xlWm9uZSBkb2VzIG5vdCBzdXBwb3J0IGNyb3NzIG1ldGhvZCFcIik7XG4gICAgICAgIHRoaXMuYWxlcnQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgc3ltbWV0cmljIHBvc2l0aW9uIG9mIGEgcGFydGljbGUuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJ0aWNsZSAtIFRoZSBwYXJ0aWNsZSB0byBjYWxjdWxhdGUgc3ltbWV0cnkgZm9yLlxuICAgKi9cbiAgZ2V0U3ltbWV0cmljKHBhcnRpY2xlKSB7XG4gICAgY29uc3QgdGhhMiA9IHBhcnRpY2xlLnYuZ2V0R3JhZGllbnQoKTtcbiAgICBjb25zdCB0aGExID0gdGhpcy5nZXRHcmFkaWVudChwYXJ0aWNsZSk7XG5cbiAgICBjb25zdCB0aGEgPSAyICogKHRoYTEgLSB0aGEyKTtcbiAgICBjb25zdCBvbGR4ID0gcGFydGljbGUudi54O1xuICAgIGNvbnN0IG9sZHkgPSBwYXJ0aWNsZS52Lnk7XG5cbiAgICBwYXJ0aWNsZS52LnggPSBvbGR4ICogTWF0aC5jb3ModGhhKSAtIG9sZHkgKiBNYXRoLnNpbih0aGEpO1xuICAgIHBhcnRpY2xlLnYueSA9IG9sZHggKiBNYXRoLnNpbih0aGEpICsgb2xkeSAqIE1hdGguY29zKHRoYSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgZ3JhZGllbnQgZm9yIGEgcGFydGljbGUuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJ0aWNsZSAtIFRoZSBwYXJ0aWNsZSB0byBjYWxjdWxhdGUgdGhlIGdyYWRpZW50IGZvci5cbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIGNhbGN1bGF0ZWQgZ3JhZGllbnQuXG4gICAqL1xuICBnZXRHcmFkaWVudChwYXJ0aWNsZSkge1xuICAgIHJldHVybiAtTWF0aFV0aWwuUElfMiArIE1hdGguYXRhbjIocGFydGljbGUucC55IC0gdGhpcy5jZW50ZXIueSwgcGFydGljbGUucC54IC0gdGhpcy5jZW50ZXIueCk7XG4gIH1cbn1cbiIsImltcG9ydCBab25lIGZyb20gXCIuL1pvbmVcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcmVjdGFuZ3VsYXIgem9uZSBmb3IgcGFydGljbGUgc3lzdGVtcy5cbiAqIEBleHRlbmRzIFpvbmVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVjdFpvbmUgZXh0ZW5kcyBab25lIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgUmVjdFpvbmUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGhdIC0gVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0XSAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHgsIHksIHdpZHRoID0gMjAwLCBoZWlnaHQgPSAyMDApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmFuZG9tIHBvc2l0aW9uIHdpdGhpbiB0aGUgcmVjdGFuZ3VsYXIgem9uZS5cbiAgICogQHJldHVybnMge1ZlY3RvcjJEfSBBIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIHJhbmRvbSBwb3NpdGlvbi5cbiAgICovXG4gIGdldFBvc2l0aW9uKCkge1xuICAgIHRoaXMudmVjdG9yLnggPSB0aGlzLnggKyBNYXRoLnJhbmRvbSgpICogdGhpcy53aWR0aDtcbiAgICB0aGlzLnZlY3Rvci55ID0gdGhpcy55ICsgTWF0aC5yYW5kb20oKSAqIHRoaXMuaGVpZ2h0O1xuICAgIHJldHVybiB0aGlzLnZlY3RvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHBhcnRpY2xlIGNyb3NzaW5nIGJlaGF2aW9yIGJhc2VkIG9uIHRoZSBjcm9zc1R5cGUuXG4gICAqIEBwYXJhbSB7UGFydGljbGV9IHBhcnRpY2xlIC0gVGhlIHBhcnRpY2xlIHRvIGNoZWNrIGZvciBjcm9zc2luZy5cbiAgICovXG4gIGNyb3NzaW5nKHBhcnRpY2xlKSB7XG4gICAgLy8gcGFydGljbGUgZGVhZCB6b25lXG4gICAgaWYgKHRoaXMuY3Jvc3NUeXBlID09PSBcImRlYWRcIikge1xuICAgICAgaWYgKHBhcnRpY2xlLnAueCArIHBhcnRpY2xlLnJhZGl1cyA8IHRoaXMueCkgcGFydGljbGUuZGVhZCA9IHRydWU7XG4gICAgICBlbHNlIGlmIChwYXJ0aWNsZS5wLnggLSBwYXJ0aWNsZS5yYWRpdXMgPiB0aGlzLnggKyB0aGlzLndpZHRoKSBwYXJ0aWNsZS5kZWFkID0gdHJ1ZTtcblxuICAgICAgaWYgKHBhcnRpY2xlLnAueSArIHBhcnRpY2xlLnJhZGl1cyA8IHRoaXMueSkgcGFydGljbGUuZGVhZCA9IHRydWU7XG4gICAgICBlbHNlIGlmIChwYXJ0aWNsZS5wLnkgLSBwYXJ0aWNsZS5yYWRpdXMgPiB0aGlzLnkgKyB0aGlzLmhlaWdodCkgcGFydGljbGUuZGVhZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gcGFydGljbGUgYm91bmQgem9uZVxuICAgIGVsc2UgaWYgKHRoaXMuY3Jvc3NUeXBlID09PSBcImJvdW5kXCIpIHtcbiAgICAgIGlmIChwYXJ0aWNsZS5wLnggLSBwYXJ0aWNsZS5yYWRpdXMgPCB0aGlzLngpIHtcbiAgICAgICAgcGFydGljbGUucC54ID0gdGhpcy54ICsgcGFydGljbGUucmFkaXVzO1xuICAgICAgICBwYXJ0aWNsZS52LnggKj0gLTE7XG4gICAgICB9IGVsc2UgaWYgKHBhcnRpY2xlLnAueCArIHBhcnRpY2xlLnJhZGl1cyA+IHRoaXMueCArIHRoaXMud2lkdGgpIHtcbiAgICAgICAgcGFydGljbGUucC54ID0gdGhpcy54ICsgdGhpcy53aWR0aCAtIHBhcnRpY2xlLnJhZGl1cztcbiAgICAgICAgcGFydGljbGUudi54ICo9IC0xO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFydGljbGUucC55IC0gcGFydGljbGUucmFkaXVzIDwgdGhpcy55KSB7XG4gICAgICAgIHBhcnRpY2xlLnAueSA9IHRoaXMueSArIHBhcnRpY2xlLnJhZGl1cztcbiAgICAgICAgcGFydGljbGUudi55ICo9IC0xO1xuICAgICAgfSBlbHNlIGlmIChwYXJ0aWNsZS5wLnkgKyBwYXJ0aWNsZS5yYWRpdXMgPiB0aGlzLnkgKyB0aGlzLmhlaWdodCkge1xuICAgICAgICBwYXJ0aWNsZS5wLnkgPSB0aGlzLnkgKyB0aGlzLmhlaWdodCAtIHBhcnRpY2xlLnJhZGl1cztcbiAgICAgICAgcGFydGljbGUudi55ICo9IC0xO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHBhcnRpY2xlIGNyb3NzIHpvbmVcbiAgICBlbHNlIGlmICh0aGlzLmNyb3NzVHlwZSA9PT0gXCJjcm9zc1wiKSB7XG4gICAgICBpZiAocGFydGljbGUucC54ICsgcGFydGljbGUucmFkaXVzIDwgdGhpcy54ICYmIHBhcnRpY2xlLnYueCA8PSAwKSB7XG4gICAgICAgIHBhcnRpY2xlLnAueCA9IHRoaXMueCArIHRoaXMud2lkdGggKyBwYXJ0aWNsZS5yYWRpdXM7XG4gICAgICB9IGVsc2UgaWYgKHBhcnRpY2xlLnAueCAtIHBhcnRpY2xlLnJhZGl1cyA+IHRoaXMueCArIHRoaXMud2lkdGggJiYgcGFydGljbGUudi54ID49IDApIHtcbiAgICAgICAgcGFydGljbGUucC54ID0gdGhpcy54IC0gcGFydGljbGUucmFkaXVzO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFydGljbGUucC55ICsgcGFydGljbGUucmFkaXVzIDwgdGhpcy55ICYmIHBhcnRpY2xlLnYueSA8PSAwKSB7XG4gICAgICAgIHBhcnRpY2xlLnAueSA9IHRoaXMueSArIHRoaXMuaGVpZ2h0ICsgcGFydGljbGUucmFkaXVzO1xuICAgICAgfSBlbHNlIGlmIChwYXJ0aWNsZS5wLnkgLSBwYXJ0aWNsZS5yYWRpdXMgPiB0aGlzLnkgKyB0aGlzLmhlaWdodCAmJiBwYXJ0aWNsZS52LnkgPj0gMCkge1xuICAgICAgICBwYXJ0aWNsZS5wLnkgPSB0aGlzLnkgLSBwYXJ0aWNsZS5yYWRpdXM7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgWm9uZSBmcm9tIFwiLi9ab25lXCI7XG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSB6b25lIGJhc2VkIG9uIGltYWdlIGRhdGEuXG4gKiBAZXh0ZW5kcyBab25lXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEltYWdlWm9uZSBleHRlbmRzIFpvbmUge1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBJbWFnZVpvbmUuXG4gICAqIEBwYXJhbSB7SW1hZ2VEYXRhfSBpbWFnZURhdGEgLSBUaGUgaW1hZ2UgZGF0YSB0byB1c2UgZm9yIHRoZSB6b25lLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgeC1jb29yZGluYXRlIG9mZnNldC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIHktY29vcmRpbmF0ZSBvZmZzZXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZD0yXSAtIFRoZSBzYW1wbGluZyBkZW5zaXR5LlxuICAgKi9cbiAgY29uc3RydWN0b3IoaW1hZ2VEYXRhLCB4LCB5LCBkKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlc2V0KGltYWdlRGF0YSwgeCwgeSwgZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBJbWFnZVpvbmUgd2l0aCBuZXcgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtJbWFnZURhdGF9IGltYWdlRGF0YSAtIFRoZSBpbWFnZSBkYXRhIHRvIHVzZSBmb3IgdGhlIHpvbmUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSB4LWNvb3JkaW5hdGUgb2Zmc2V0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBUaGUgeS1jb29yZGluYXRlIG9mZnNldC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkPTJdIC0gVGhlIHNhbXBsaW5nIGRlbnNpdHkuXG4gICAqL1xuICByZXNldChpbWFnZURhdGEsIHgsIHksIGQpIHtcbiAgICB0aGlzLmltYWdlRGF0YSA9IGltYWdlRGF0YTtcbiAgICB0aGlzLnggPSBVdGlsLmluaXRWYWx1ZSh4LCAwKTtcbiAgICB0aGlzLnkgPSBVdGlsLmluaXRWYWx1ZSh5LCAwKTtcbiAgICB0aGlzLmQgPSBVdGlsLmluaXRWYWx1ZShkLCAyKTtcblxuICAgIHRoaXMudmVjdG9ycyA9IFtdO1xuICAgIHRoaXMuc2V0VmVjdG9ycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgdmVjdG9ycyBiYXNlZCBvbiB0aGUgaW1hZ2UgZGF0YS5cbiAgICogQHJldHVybnMge09iamVjdH0gVGhlIHZlY3RvciBvYmplY3QuXG4gICAqL1xuICBzZXRWZWN0b3JzKCkge1xuICAgIGxldCBpLCBqO1xuICAgIGNvbnN0IGxlbmd0aDEgPSB0aGlzLmltYWdlRGF0YS53aWR0aDtcbiAgICBjb25zdCBsZW5ndGgyID0gdGhpcy5pbWFnZURhdGEuaGVpZ2h0O1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDE7IGkgKz0gdGhpcy5kKSB7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgbGVuZ3RoMjsgaiArPSB0aGlzLmQpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gKChqID4+IDApICogbGVuZ3RoMSArIChpID4+IDApKSAqIDQ7XG5cbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VEYXRhLmRhdGFbaW5kZXggKyAzXSA+IDApIHtcbiAgICAgICAgICB0aGlzLnZlY3RvcnMucHVzaCh7IHg6IGkgKyB0aGlzLngsIHk6IGogKyB0aGlzLnkgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy52ZWN0b3I7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgcG9pbnQgaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIGltYWdlLlxuICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4LWNvb3JkaW5hdGUgdG8gY2hlY2suXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHktY29vcmRpbmF0ZSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBvaW50IGlzIHdpdGhpbiBib3VuZHMsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIGdldEJvdW5kKHgsIHkpIHtcbiAgICBjb25zdCBpbmRleCA9ICgoeSA+PiAwKSAqIHRoaXMuaW1hZ2VEYXRhLndpZHRoICsgKHggPj4gMCkpICogNDtcbiAgICByZXR1cm4gdGhpcy5pbWFnZURhdGEuZGF0YVtpbmRleCArIDNdID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmFuZG9tIHBvc2l0aW9uIHdpdGhpbiB0aGUgaW1hZ2Ugem9uZS5cbiAgICogQHJldHVybnMge09iamVjdH0gQSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSBwb3NpdGlvbi5cbiAgICovXG4gIGdldFBvc2l0aW9uKCkge1xuICAgIGNvbnN0IHZlY3RvciA9IFV0aWwuZ2V0UmFuZEZyb21BcnJheSh0aGlzLnZlY3RvcnMpO1xuICAgIHJldHVybiB0aGlzLnZlY3Rvci5jb3B5KHZlY3Rvcik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY29sb3IgYXQgYSBzcGVjaWZpYyBwb2ludCBpbiB0aGUgaW1hZ2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHgtY29vcmRpbmF0ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeS1jb29yZGluYXRlLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbiBvYmplY3QgY29udGFpbmluZyByLCBnLCBiLCBhbmQgYSB2YWx1ZXMuXG4gICAqL1xuICBnZXRDb2xvcih4LCB5KSB7XG4gICAgeCAtPSB0aGlzLng7XG4gICAgeSAtPSB0aGlzLnk7XG4gICAgY29uc3QgaSA9ICgoeSA+PiAwKSAqIHRoaXMuaW1hZ2VEYXRhLndpZHRoICsgKHggPj4gMCkpICogNDtcblxuICAgIHJldHVybiB7XG4gICAgICByOiB0aGlzLmltYWdlRGF0YS5kYXRhW2ldLFxuICAgICAgZzogdGhpcy5pbWFnZURhdGEuZGF0YVtpICsgMV0sXG4gICAgICBiOiB0aGlzLmltYWdlRGF0YS5kYXRhW2kgKyAyXSxcbiAgICAgIGE6IHRoaXMuaW1hZ2VEYXRhLmRhdGFbaSArIDNdXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHBhcnRpY2xlIGNyb3NzaW5nIGJlaGF2aW9yLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFydGljbGUgLSBUaGUgcGFydGljbGUgdG8gY2hlY2sgZm9yIGNyb3NzaW5nLlxuICAgKi9cbiAgY3Jvc3NpbmcocGFydGljbGUpIHtcbiAgICBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiZGVhZFwiKSB7XG4gICAgICBwYXJ0aWNsZS5kZWFkID0gdGhpcy5nZXRCb3VuZChwYXJ0aWNsZS5wLnggLSB0aGlzLngsIHBhcnRpY2xlLnAueSAtIHRoaXMueSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNyb3NzVHlwZSA9PT0gXCJib3VuZFwiKSB7XG4gICAgICBpZiAoIXRoaXMuZ2V0Qm91bmQocGFydGljbGUucC54IC0gdGhpcy54LCBwYXJ0aWNsZS5wLnkgLSB0aGlzLnkpKSBwYXJ0aWNsZS52Lm5lZ2F0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGUgSW1hZ2Vab25lIGFuZCBjbGVhbnMgdXAgcmVzb3VyY2VzLlxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5pbWFnZURhdGEgPSBudWxsO1xuICB9XG59XG4iLCJpbXBvcnQgQ29sb3JVdGlsIGZyb20gXCIuLi91dGlscy9Db2xvclV0aWxcIjtcbmltcG9ydCBDaXJjbGVab25lIGZyb20gXCIuLi96b25lL0NpcmNsZVpvbmVcIjtcbmltcG9ydCBQb2ludFpvbmUgZnJvbSBcIi4uL3pvbmUvUG9pbnRab25lXCI7XG5pbXBvcnQgTGluZVpvbmUgZnJvbSBcIi4uL3pvbmUvTGluZVpvbmVcIjtcbmltcG9ydCBSZWN0Wm9uZSBmcm9tIFwiLi4vem9uZS9SZWN0Wm9uZVwiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGFkZEV2ZW50TGlzdGVuZXIocHJvdG9uLCBmdW5jKSB7XG4gICAgcHJvdG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJQUk9UT05fVVBEQVRFX0FGVEVSXCIsICgpID0+IGZ1bmMoKSk7XG4gIH0sXG5cbiAgZ2V0U3R5bGUoY29sb3IgPSBcIiNmZjAwMDBcIikge1xuICAgIGNvbnN0IHJnYiA9IENvbG9yVXRpbC5oZXhUb1JnYihjb2xvcik7XG4gICAgcmV0dXJuIGByZ2JhKCR7cmdiLnJ9LCAke3JnYi5nfSwgJHtyZ2IuYn0sIDAuNSlgO1xuICB9LFxuXG4gIGRyYXdab25lKHByb3RvbiwgY2FudmFzLCB6b25lLCBjbGVhcikge1xuICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgIGNvbnN0IHN0eWxlID0gdGhpcy5nZXRTdHlsZSgpO1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHByb3RvbiwgKCkgPT4ge1xuICAgICAgaWYgKGNsZWFyKSBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuXG4gICAgICBpZiAoem9uZSBpbnN0YW5jZW9mIFBvaW50Wm9uZSkge1xuICAgICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IHN0eWxlO1xuICAgICAgICBjb250ZXh0LmFyYyh6b25lLngsIHpvbmUueSwgMTAsIDAsIE1hdGguUEkgKiAyLCB0cnVlKTtcbiAgICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgICB9IGVsc2UgaWYgKHpvbmUgaW5zdGFuY2VvZiBMaW5lWm9uZSkge1xuICAgICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gc3R5bGU7XG4gICAgICAgIGNvbnRleHQubW92ZVRvKHpvbmUueDEsIHpvbmUueTEpO1xuICAgICAgICBjb250ZXh0LmxpbmVUbyh6b25lLngyLCB6b25lLnkyKTtcbiAgICAgICAgY29udGV4dC5zdHJva2UoKTtcbiAgICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICAgIH0gZWxzZSBpZiAoem9uZSBpbnN0YW5jZW9mIFJlY3Rab25lKSB7XG4gICAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBzdHlsZTtcbiAgICAgICAgY29udGV4dC5kcmF3UmVjdCh6b25lLngsIHpvbmUueSwgem9uZS53aWR0aCwgem9uZS5oZWlnaHQpO1xuICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgfSBlbHNlIGlmICh6b25lIGluc3RhbmNlb2YgQ2lyY2xlWm9uZSkge1xuICAgICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gc3R5bGU7XG4gICAgICAgIGNvbnRleHQuYXJjKHpvbmUueCwgem9uZS55LCB6b25lLnJhZGl1cywgMCwgTWF0aC5QSSAqIDIsIHRydWUpO1xuICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIGRyYXdFbWl0dGVyKHByb3RvbiwgY2FudmFzLCBlbWl0dGVyLCBjbGVhcikge1xuICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgIGNvbnN0IHN0eWxlID0gdGhpcy5nZXRTdHlsZSgpO1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHByb3RvbiwgKCkgPT4ge1xuICAgICAgaWYgKGNsZWFyKSBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuXG4gICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBzdHlsZTtcbiAgICAgIGNvbnRleHQuYXJjKGVtaXR0ZXIucC54LCBlbWl0dGVyLnAueSwgMTAsIDAsIE1hdGguUEkgKiAyLCB0cnVlKTtcbiAgICAgIGNvbnRleHQuZmlsbCgpO1xuICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICB9KTtcbiAgfVxufTtcbiJdLCJuYW1lcyI6WyJpcG90IiwibGVuZ3RoIiwibmhwb3QiLCJpIiwibWFrZVRyYW5zbGF0aW9uIiwidHgiLCJ0eSIsIm1ha2VSb3RhdGlvbiIsImFuZ2xlSW5SYWRpYW5zIiwiYyIsIk1hdGgiLCJjb3MiLCJzIiwic2luIiwibWFrZVNjYWxlIiwic3giLCJzeSIsIm1hdHJpeE11bHRpcGx5IiwiYSIsImIiLCJhMDAiLCJhMDEiLCJhMDIiLCJhMTAiLCJhMTEiLCJhMTIiLCJhMjAiLCJhMjEiLCJhMjIiLCJiMDAiLCJiMDEiLCJiMDIiLCJiMTAiLCJiMTEiLCJiMTIiLCJiMjAiLCJiMjEiLCJiMjIiLCJjcmVhdGVDYW52YXMiLCJpZCIsIndpZHRoIiwiaGVpZ2h0IiwicG9zaXRpb24iLCJkb20iLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJzdHlsZSIsIm9wYWNpdHkiLCJ0cmFuc2Zvcm0iLCJjcmVhdGVEaXYiLCJyZXNpemUiLCJtYXJnaW5MZWZ0IiwibWFyZ2luVG9wIiwiZGl2IiwieCIsInkiLCJzY2FsZSIsInJvdGF0ZSIsIndpbGxDaGFuZ2UiLCJjc3MzIiwidHJhbnNmb3JtM2QiLCJrZXkiLCJ2YWwiLCJia2V5IiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJzdWJzdHIiLCJpbWdzQ2FjaGUiLCJjYW52YXNDYWNoZSIsImNhbnZhc0lkIiwiZ2V0SW1hZ2VEYXRhIiwiY29udGV4dCIsImltYWdlIiwicmVjdCIsImRyYXdJbWFnZSIsImltYWdlZGF0YSIsImNsZWFyUmVjdCIsImdldEltZ0Zyb21DYWNoZSIsImltZyIsImNhbGxiYWNrIiwicGFyYW0iLCJzcmMiLCJJbWFnZSIsIm9ubG9hZCIsImUiLCJ0YXJnZXQiLCJnZXRDYW52YXNGcm9tQ2FjaGUiLCJXZWJHTFV0aWwiLCJjYW52YXMiLCJEb21VdGlsIiwiZ2V0Q29udGV4dCIsImluaXRWYWx1ZSIsInZhbHVlIiwiZGVmYXVsdHMiLCJ1bmRlZmluZWQiLCJpc0FycmF5IiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwiZW1wdHlBcnJheSIsImFyciIsInRvQXJyYXkiLCJzbGljZUFycmF5IiwiYXJyMSIsImluZGV4IiwiYXJyMiIsInB1c2giLCJnZXRSYW5kRnJvbUFycmF5IiwiZmxvb3IiLCJyYW5kb20iLCJlbXB0eU9iamVjdCIsIm9iaiIsImlnbm9yZSIsImluZGV4T2YiLCJjbGFzc0FwcGx5IiwiY29uc3RydWN0b3IiLCJhcmdzIiwiRmFjdG9yeUZ1bmMiLCJiaW5kIiwiYXBwbHkiLCJjb25jYXQiLCJJbWdVdGlsIiwiZGVzdHJveUFsbCIsImRlc3Ryb3kiLCJhc3NpZ24iLCJzb3VyY2UiLCJoYXNPd25Qcm9wZXJ0eSIsImlkc01hcCIsIlB1aWQiLCJfaW5kZXgiLCJfY2FjaGUiLCJ0eXBlIiwiZ2V0SWQiLCJ1aWQiLCJnZXRJZEZyb21DYWNoZSIsImlzQm9keSIsImlzSW5uZXIiLCJnZXRUYXJnZXQiLCJQb29sIiwibnVtIiwidG90YWwiLCJjYWNoZSIsIl9wcm90byIsImdldCIsInBhcmFtcyIsInAiLCJfX3B1aWQiLCJwb3AiLCJjcmVhdGVPckNsb25lIiwiZXhwaXJlIiwiZ2V0Q2FjaGUiLCJjcmVhdGUiLCJVdGlsIiwiY2xvbmUiLCJnZXRDb3VudCIsImNvdW50IiwiU3RhdHMiLCJwcm90b24iLCJjb250YWluZXIiLCJlbWl0dGVySW5kZXgiLCJyZW5kZXJlckluZGV4IiwidXBkYXRlIiwiYm9keSIsImFkZCIsImVtaXR0ZXIiLCJnZXRFbWl0dGVyIiwicmVuZGVyZXIiLCJnZXRSZW5kZXJlciIsInN0ciIsImVtaXR0ZXJzIiwiZW1pdFNwZWVkIiwiZ2V0RW1pdHRlclBvcyIsImluaXRpYWxpemVzIiwiY29uY2F0QXJyIiwiYmVoYXZpb3VycyIsIm5hbWUiLCJnZXRDcmVhdGVkTnVtYmVyIiwicG9vbCIsImlubmVySFRNTCIsIl90aGlzIiwiY3NzVGV4dCIsImpvaW4iLCJhZGRFdmVudExpc3RlbmVyIiwiYmciLCJjb2xvciIsInBhcmVudE5vZGUiLCJhcHBlbmRDaGlsZCIsInJlbmRlcmVycyIsInJlc3VsdCIsImNwb29sIiwicm91bmQiLCJyZW1vdmVDaGlsZCIsIkV2ZW50RGlzcGF0Y2hlciIsIl9saXN0ZW5lcnMiLCJkaXNwYXRjaEV2ZW50IiwiaGFzRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJyZW1vdmVBbGxFdmVudExpc3RlbmVycyIsImxpc3RlbmVyIiwic3BsaWNlIiwibGlzdGVuZXJzIiwiaGFuZGxlciIsIlBJIiwiSU5GSU5JVFkiLCJJbmZpbml0eSIsIk1hdGhVdGlsIiwiUEl4MiIsIlBJXzIiLCJQSV8xODAiLCJOMTgwX1BJIiwiaXNJbmZpbml0eSIsInJhbmRvbUFUb0IiLCJpc0ludCIsInJhbmRvbUZsb2F0aW5nIiwiY2VudGVyIiwiZiIsInJhbmRvbUNvbG9yIiwic2xpY2UiLCJyYW5kb21ab25lIiwiZGlzcGxheSIsImsiLCJkaWdpdHMiLCJwb3ciLCJkZWdyZWVUcmFuc2Zvcm0iLCJ0b0NvbG9yMTYiLCJJbnRlZ3JhdGlvbiIsImNhbGN1bGF0ZSIsInBhcnRpY2xlcyIsInRpbWUiLCJkYW1waW5nIiwiZXVsZXJJbnRlZ3JhdGUiLCJwYXJ0aWNsZSIsInNsZWVwIiwib2xkIiwiY29weSIsInYiLCJtdWx0aXBseVNjYWxhciIsIm1hc3MiLCJjbGVhciIsIlByb3RvbiIsImludGVncmF0aW9uVHlwZSIsIm5vdyIsInRoZW4iLCJlbGFwc2VkIiwic3RhdHMiLCJFVUxFUiIsImludGVncmF0b3IiLCJfZnBzIiwiX2ludGVydmFsIiwiREVGQVVMVF9JTlRFUlZBTCIsImFkZFJlbmRlcmVyIiwicmVuZGVyIiwiaW5pdCIsInJlbW92ZVJlbmRlcmVyIiwicmVtb3ZlIiwiYWRkRW1pdHRlciIsInBhcmVudCIsIkVNSVRURVJfQURERUQiLCJyZW1vdmVFbWl0dGVyIiwiRU1JVFRFUl9SRU1PVkVEIiwiUFJPVE9OX1VQREFURSIsIlVTRV9DTE9DSyIsIkRhdGUiLCJnZXRUaW1lIiwiYW1lbmRDaGFuZ2VUYWJzQnVnIiwiZW1pdHRlcnNVcGRhdGUiLCJQUk9UT05fVVBEQVRFX0FGVEVSIiwiZ2V0QWxsUGFydGljbGVzIiwiZGVzdHJveUFsbEVtaXR0ZXJzIiwiZGVzdHJveU90aGVyIiwic2V0VGltZW91dCIsIl9jcmVhdGVDbGFzcyIsInNldCIsImZwcyIsIk1FQVNVUkUiLCJSSzIiLCJQQVJUSUNMRV9DUkVBVEVEIiwiUEFSVElDTEVfVVBEQVRFIiwiUEFSVElDTEVfU0xFRVAiLCJQQVJUSUNMRV9ERUFEIiwiUmdiIiwiciIsImciLCJyZXNldCIsIlNwYW4iLCJnZXRWYWx1ZSIsInNldFNwYW5WYWx1ZSIsImdldFNwYW5WYWx1ZSIsInBhbiIsImhhc1Byb3AiLCJzZXRQcm9wIiwicHJvcHMiLCJwcm9wIiwic2V0VmVjdG9yVmFsIiwiY29uZiIsImVhc2VMaW5lYXIiLCJlYXNlSW5RdWFkIiwiZWFzZU91dFF1YWQiLCJlYXNlSW5PdXRRdWFkIiwiZWFzZUluQ3ViaWMiLCJlYXNlT3V0Q3ViaWMiLCJlYXNlSW5PdXRDdWJpYyIsImVhc2VJblF1YXJ0IiwiZWFzZU91dFF1YXJ0IiwiZWFzZUluT3V0UXVhcnQiLCJlYXNlSW5TaW5lIiwiZWFzZU91dFNpbmUiLCJlYXNlSW5PdXRTaW5lIiwiZWFzZUluRXhwbyIsImVhc2VPdXRFeHBvIiwiZWFzZUluT3V0RXhwbyIsImVhc2VJbkNpcmMiLCJzcXJ0IiwiZWFzZU91dENpcmMiLCJlYXNlSW5PdXRDaXJjIiwiZWFzZUluQmFjayIsImVhc2VPdXRCYWNrIiwiZWFzZUluT3V0QmFjayIsImdldEVhc2luZyIsImVhc2UiLCJWZWN0b3IyRCIsInNldFgiLCJzZXRZIiwiZ2V0R3JhZGllbnQiLCJhdGFuMiIsInciLCJhZGRWZWN0b3JzIiwiYWRkWFkiLCJzdWIiLCJzdWJWZWN0b3JzIiwiZGl2aWRlU2NhbGFyIiwibmVnYXRlIiwiZG90IiwibGVuZ3RoU3EiLCJub3JtYWxpemUiLCJkaXN0YW5jZVRvIiwiZGlzdGFuY2VUb1NxdWFyZWQiLCJ0aGEiLCJkeCIsImR5IiwibGVycCIsImFscGhhIiwiZXF1YWxzIiwiUGFydGljbGUiLCJkYXRhIiwicmdiIiwiUHJvcFV0aWwiLCJnZXREaXJlY3Rpb24iLCJsaWZlIiwiYWdlIiwiZGVhZCIsInNwcml0ZSIsImVuZXJneSIsInJhZGl1cyIsInJvdGF0aW9uIiwiZWFzaW5nIiwicmVtb3ZlQWxsQmVoYXZpb3VycyIsImFwcGx5QmVoYXZpb3VycyIsIm1heCIsImFwcGx5QmVoYXZpb3VyIiwiYWRkQmVoYXZpb3VyIiwiYmVoYXZpb3VyIiwicGFyZW50cyIsImluaXRpYWxpemUiLCJhZGRCZWhhdmlvdXJzIiwicmVtb3ZlQmVoYXZpb3VyIiwiaGV4VG9SZ2IiLCJoIiwiaGV4MTYiLCJzdWJzdHJpbmciLCJwYXJzZUludCIsInJnYlRvSGV4IiwicmJnIiwiZ2V0SGV4MTZGcm9tUGFydGljbGUiLCJOdW1iZXIiLCJQb2xhcjJEIiwiYWJzIiwic2V0UiIsInNldFRoYSIsInRvVmVjdG9yIiwiZ2V0WCIsImdldFkiLCJNYXQzIiwibWF0MyIsIm1hdCIsIkZsb2F0MzJBcnJheSIsIm1hdDEiLCJtYXQyIiwibXVsdGlwbHkiLCJpbnZlcnNlIiwiZCIsIm11bHRpcGx5VmVjMiIsIm0iLCJ2ZWMiLCJBcnJheVNwYW4iLCJfU3BhbiIsIl9pbmhlcml0c0xvb3NlIiwiX2FyciIsImNyZWF0ZUFycmF5U3BhbiIsIlJlY3RhbmdsZSIsImJvdHRvbSIsInJpZ2h0IiwiY29udGFpbnMiLCJSYXRlIiwibnVtcGFuIiwidGltZXBhbiIsIm51bVBhbiIsInRpbWVQYW4iLCJzdGFydFRpbWUiLCJuZXh0VGltZSIsIkluaXRpYWxpemUiLCJMaWZlIiwiX0luaXRpYWxpemUiLCJsaWZlUGFuIiwiWm9uZSIsInZlY3RvciIsImNyb3NzVHlwZSIsImFsZXJ0IiwiZ2V0UG9zaXRpb24iLCJjcm9zc2luZyIsIlBvaW50Wm9uZSIsIl9ab25lIiwiY29uc29sZSIsImVycm9yIiwiUG9zaXRpb24iLCJ6b25lIiwiVmVsb2NpdHkiLCJycGFuIiwidGhhcGFuIiwiclBhbiIsInRoYVBhbiIsIm5vcm1hbGl6ZVZlbG9jaXR5IiwidnIiLCJwb2xhcjJkIiwiTWFzcyIsIm1hc3NQYW4iLCJSYWRpdXMiLCJvbGRSYWRpdXMiLCJCb2R5IiwiaW1hZ2VUYXJnZXQiLCJpbm5lciIsIkJlaGF2aW91ciIsIm5vcm1hbGl6ZUZvcmNlIiwiZm9yY2UiLCJub3JtYWxpemVWYWx1ZSIsIkZvcmNlIiwiX0JlaGF2aW91ciIsImZ4IiwiZnkiLCJBdHRyYWN0aW9uIiwidGFyZ2V0UG9zaXRpb24iLCJyYWRpdXNTcSIsImF0dHJhY3Rpb25Gb3JjZSIsIlJhbmRvbURyaWZ0IiwiZHJpZnRYIiwiZHJpZnRZIiwiZGVsYXkiLCJwYW5Gb2NlIiwiR3Jhdml0eSIsIl9Gb3JjZSIsIkNvbGxpc2lvbiIsIm5ld1Bvb2wiLCJjb2xsaXNpb25Qb29sIiwiZGVsdGEiLCJvdGhlclBhcnRpY2xlIiwib3ZlcmxhcCIsInRvdGFsTWFzcyIsImF2ZXJhZ2VNYXNzMSIsImF2ZXJhZ2VNYXNzMiIsImRpc3RhbmNlIiwiQ3Jvc3Nab25lIiwiQWxwaGEiLCJzYW1lIiwiYWxwaGFBIiwiYWxwaGFCIiwiU2NhbGUiLCJzY2FsZUEiLCJzY2FsZUIiLCJSb3RhdGUiLCJpbmZsdWVuY2UiLCJyb3RhdGlvbkEiLCJyb3RhdGlvbkIiLCJDb2xvciIsImNvbG9yQSIsIkNvbG9yVXRpbCIsImNvbG9yQiIsIkNIQU5HSU5HIiwiQ3ljbG9uZSIsImFuZ2xlIiwic2V0QW5nbGVBbmRGb3JjZSIsInNwYW4iLCJTdHJpbmciLCJ0b0xvd2VyQ2FzZSIsImNhbmdsZSIsImN5Y2xvbmUiLCJncmFkaWVudCIsIlJlcHVsc2lvbiIsIl9BdHRyYWN0aW9uIiwiR3Jhdml0eVdlbGwiLCJjZW50ZXJQb2ludCIsImRpc3RhbmNlVmVjIiwiZGlzdGFuY2VTcSIsImZhY3RvciIsImJpbmRFbWl0dGVyIiwiRW1pdHRlciIsIl9QYXJ0aWNsZSIsImVtaXRUaW1lIiwidG90YWxUaW1lIiwicmF0ZSIsImVtaXQiLCJzdG9wZWQiLCJpc05hTiIsInN0b3AiLCJwcmVFbWl0Iiwib2xkU3RvcGVkIiwib2xkRW1pdFRpbWUiLCJvbGRUb3RhbFRpbWUiLCJzdGVwIiwicmVtb3ZlQWxsUGFydGljbGVzIiwiYWRkU2VsZkluaXRpYWxpemUiLCJhZGRJbml0aWFsaXplIiwiX2xlbiIsImFyZ3VtZW50cyIsInJlc3QiLCJBcnJheSIsIl9rZXkiLCJyZW1vdmVJbml0aWFsaXplIiwiaW5pdGlhbGl6ZXIiLCJyZW1vdmVBbGxJbml0aWFsaXplcnMiLCJfbGVuMiIsIl9rZXkyIiwiZW1pdHRpbmciLCJpbnRlZ3JhdGUiLCJkaXNwYXRjaCIsImV2ZW50IiwiYmluZEV2ZW50IiwiY3JlYXRlUGFydGljbGUiLCJzZXR1cFBhcnRpY2xlIiwiSW5pdGlhbGl6ZVV0aWwiLCJCZWhhdmlvdXJFbWl0dGVyIiwiX0VtaXR0ZXIiLCJzZWxmQmVoYXZpb3VycyIsImFkZFNlbGZCZWhhdmlvdXIiLCJyZW1vdmVTZWxmQmVoYXZpb3VyIiwiRm9sbG93RW1pdHRlciIsIm1vdXNlVGFyZ2V0Iiwid2luZG93IiwiX2FsbG93RW1pdHRpbmciLCJpbml0RXZlbnRIYW5kbGVyIiwiX3RoaXMyIiwibW91c2Vtb3ZlSGFuZGxlciIsIm1vdXNlbW92ZSIsIm1vdXNlZG93bkhhbmRsZXIiLCJtb3VzZWRvd24iLCJtb3VzZXVwSGFuZGxlciIsIm1vdXNldXAiLCJsYXllclgiLCJsYXllclkiLCJvZmZzZXRYIiwib2Zmc2V0WSIsImlzSW1hZ2UiLCJfX2lzSW1hZ2UiLCJ0YWdOYW1lIiwibm9kZU5hbWUiLCJpc1N0cmluZyIsIkJhc2VSZW5kZXJlciIsImVsZW1lbnQiLCJzdHJva2UiLCJjaXJjbGVDb25mIiwiaXNDaXJjbGUiLCJzZXRTdHJva2UiLCJ0aGlua25lc3MiLCJfcHJvdG9uVXBkYXRlSGFuZGxlciIsIm9uUHJvdG9uVXBkYXRlIiwiX3Byb3RvblVwZGF0ZUFmdGVySGFuZGxlciIsIm9uUHJvdG9uVXBkYXRlQWZ0ZXIiLCJfZW1pdHRlckFkZGVkSGFuZGxlciIsIm9uRW1pdHRlckFkZGVkIiwiX2VtaXR0ZXJSZW1vdmVkSGFuZGxlciIsIm9uRW1pdHRlclJlbW92ZWQiLCJfcGFydGljbGVDcmVhdGVkSGFuZGxlciIsIm9uUGFydGljbGVDcmVhdGVkIiwiX3BhcnRpY2xlVXBkYXRlSGFuZGxlciIsIm9uUGFydGljbGVVcGRhdGUiLCJfcGFydGljbGVEZWFkSGFuZGxlciIsIm9uUGFydGljbGVEZWFkIiwiQ2FudmFzUmVuZGVyZXIiLCJfQmFzZVJlbmRlcmVyIiwiYnVmZmVyQ2FjaGUiLCJhZGRJbWcyQm9keSIsIlR5cGVzIiwiZHJhd0NpcmNsZSIsImJ1ZmZlciIsImNyZWF0ZUJ1ZmZlciIsImJ1ZkNvbnRleHQiLCJnbG9iYWxBbHBoYSIsImdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiIsImZpbGxTdHlsZSIsImZpbGxSZWN0Iiwic2F2ZSIsInRyYW5zbGF0ZSIsInJlc3RvcmUiLCJiZWdpblBhdGgiLCJhcmMiLCJzdHJva2VTdHlsZSIsImxpbmVXaWR0aCIsImNsb3NlUGF0aCIsImZpbGwiLCJzaXplIiwiRG9tUmVuZGVyZXIiLCJjcmVhdGVCb2R5IiwiX2Fzc2VydFRoaXNJbml0aWFsaXplZCIsImJvZHlSZWFkeSIsImJhY2tncm91bmRDb2xvciIsImNyZWF0ZUNpcmNsZSIsImNyZWF0ZVNwcml0ZSIsImJvcmRlclJhZGl1cyIsImJvcmRlckNvbG9yIiwiYm9yZGVyV2lkdGgiLCJ1cmwiLCJiYWNrZ3JvdW5kSW1hZ2UiLCJFYXNlbFJlbmRlcmVyIiwiYWRkQ2hpbGQiLCJzY2FsZVgiLCJzY2FsZVkiLCJncmFwaGljcyIsInJlZ1giLCJyZWdZIiwiY3JlYXRlanMiLCJHcmFwaGljcyIsImJlZ2luU3Ryb2tlIiwiYmVnaW5GaWxsIiwic2hhcGUiLCJTaGFwZSIsIlBpeGVsUmVuZGVyZXIiLCJyZWN0YW5nbGUiLCJpbWFnZURhdGEiLCJjcmVhdGVJbWFnZURhdGEiLCJwdXRJbWFnZURhdGEiLCJzZXRQaXhlbCIsIlBJWElDbGFzcyIsIlBpeGlSZW5kZXJlciIsInNldENvbG9yIiwiYmxlbmRNb2RlIiwic2V0UElYSSIsIlBJWEkiLCJTcHJpdGUiLCJjcmVhdGVGcm9tSW1hZ2UiLCJmcm9tIiwiZnJvbUltYWdlIiwidGludCIsImFuY2hvciIsImVuZEZpbGwiLCJNU3RhY2siLCJtYXRzIiwidG9wIiwiV2ViR0xSZW5kZXJlciIsImdsIiwiYW50aWFsaWFzIiwic3RlbmNpbCIsImRlcHRoIiwiaW5pdFZhciIsInNldE1heFJhZGl1cyIsImluaXRTaGFkZXJzIiwiaW5pdEJ1ZmZlcnMiLCJibGVuZEVxdWF0aW9uIiwiRlVOQ19BREQiLCJibGVuZEZ1bmMiLCJTUkNfQUxQSEEiLCJPTkVfTUlOVVNfU1JDX0FMUEhBIiwiZW5hYmxlIiwiQkxFTkQiLCJ1bWF0Iiwic21hdCIsIm1zdGFjayIsInZpZXdwb3J0IiwiY2lyY2xlQ2FudmFzVVJMIiwiZ2V0VmVydGV4U2hhZGVyIiwidnNTb3VyY2UiLCJnZXRGcmFnbWVudFNoYWRlciIsImZzU291cmNlIiwidGV4dHVyZWJ1ZmZlcnMiLCJBIiwiQiIsImdldFNoYWRlciIsImZzIiwic2hhZGVyIiwiY3JlYXRlU2hhZGVyIiwiRlJBR01FTlRfU0hBREVSIiwiVkVSVEVYX1NIQURFUiIsInNoYWRlclNvdXJjZSIsImNvbXBpbGVTaGFkZXIiLCJnZXRTaGFkZXJQYXJhbWV0ZXIiLCJDT01QSUxFX1NUQVRVUyIsImdldFNoYWRlckluZm9Mb2ciLCJmcmFnbWVudFNoYWRlciIsInZlcnRleFNoYWRlciIsInNwcm9ncmFtIiwiY3JlYXRlUHJvZ3JhbSIsImF0dGFjaFNoYWRlciIsImxpbmtQcm9ncmFtIiwiZ2V0UHJvZ3JhbVBhcmFtZXRlciIsIkxJTktfU1RBVFVTIiwidXNlUHJvZ3JhbSIsInZwYSIsImdldEF0dHJpYkxvY2F0aW9uIiwidGNhIiwiZW5hYmxlVmVydGV4QXR0cmliQXJyYXkiLCJ0TWF0VW5pZm9ybSIsImdldFVuaWZvcm1Mb2NhdGlvbiIsInNhbXBsZXJVbmlmb3JtIiwidXNlVGV4IiwidW5pZm9ybTFpIiwidnMiLCJpZHgiLCJ1bml0SUJ1ZmZlciIsImJpbmRCdWZmZXIiLCJFTEVNRU5UX0FSUkFZX0JVRkZFUiIsImJ1ZmZlckRhdGEiLCJVaW50MTZBcnJheSIsIlNUQVRJQ19EUkFXIiwiaWRzIiwidW5pdEkzMyIsInN0cmlwQnVmZmVyIiwicmFpZHVzIiwiY2lyY2xlQ2FudmFzUmFkaXVzIiwidG9EYXRhVVJMIiwiZHJhd0ltZzJDYW52YXMiLCJfdyIsIl9oIiwiX3dpZHRoIiwiX2hlaWdodCIsIl9zY2FsZVgiLCJfc2NhbGVZIiwiY3JlYXRlVGV4dHVyZSIsInRleHR1cmUiLCJ2Y0J1ZmZlciIsInRjQnVmZmVyIiwiQVJSQVlfQlVGRkVSIiwiYmluZFRleHR1cmUiLCJURVhUVVJFXzJEIiwidGV4SW1hZ2UyRCIsIlJHQkEiLCJVTlNJR05FRF9CWVRFIiwidGV4UGFyYW1ldGVyaSIsIlRFWFRVUkVfTUFHX0ZJTFRFUiIsIkxJTkVBUiIsIlRFWFRVUkVfTUlOX0ZJTFRFUiIsIkxJTkVBUl9NSVBNQVBfTkVBUkVTVCIsImdlbmVyYXRlTWlwbWFwIiwidGV4dHVyZUxvYWRlZCIsInRleHR1cmVXaWR0aCIsInRleHR1cmVIZWlnaHQiLCJ0bWF0IiwiaW1hdCIsIm9sZFNjYWxlIiwidXBkYXRlTWF0cml4IiwidW5pZm9ybTNmIiwidW5pZm9ybU1hdHJpeDNmdiIsInZlcnRleEF0dHJpYlBvaW50ZXIiLCJGTE9BVCIsImRyYXdFbGVtZW50cyIsIlRSSUFOR0xFUyIsIlVOU0lHTkVEX1NIT1JUIiwibW92ZU9yaWdpbk1hdHJpeCIsInRyYW5zbGF0aW9uTWF0cml4IiwiYW5nZWwiLCJyb3RhdGlvbk1hdHJpeCIsInNjYWxlTWF0cml4IiwibWF0cml4IiwiQ3VzdG9tUmVuZGVyZXIiLCJMaW5lWm9uZSIsIngxIiwieTEiLCJ4MiIsInkyIiwiZGlyZWN0aW9uIiwibWlueCIsIm1pbiIsIm1pbnkiLCJtYXh4IiwibWF4eSIsInh4eXkiLCJnZXRMZW5ndGgiLCJDIiwiRCIsImdldERpc3RhbmNlIiwiZ2V0U3ltbWV0cmljIiwidGhhMiIsInRoYTEiLCJvbGR4Iiwib2xkeSIsInJhbmdlT3V0IiwiQ2lyY2xlWm9uZSIsInJhbmRvbVJhZGl1cyIsInNldENlbnRlciIsIlJlY3Rab25lIiwiSW1hZ2Vab25lIiwidmVjdG9ycyIsInNldFZlY3RvcnMiLCJqIiwibGVuZ3RoMSIsImxlbmd0aDIiLCJnZXRCb3VuZCIsImdldENvbG9yIiwiZnVuYyIsImdldFN0eWxlIiwiZHJhd1pvbmUiLCJtb3ZlVG8iLCJsaW5lVG8iLCJkcmF3UmVjdCIsImRyYXdFbWl0dGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrQkFBZTtFQUNiO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNB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
diff --git a/build/proton.web.min.js b/build/proton.web.min.js
new file mode 100644
index 0000000..bbf76f9
--- /dev/null
+++ b/build/proton.web.min.js
@@ -0,0 +1,11 @@
+/*!
+* Proton v7.1.5
+* https://github.com/drawcall/Proton
+*
+* Copyright 2013-2025, drawcall
+* Licensed under the MIT license
+* http://www.opensource.org/licenses/mit-license
+*
+*/
+this.Proton=function(){"use strict";function t(t,e){for(var i=0;i>e;return t+1},a=function(t,e){return[1,0,0,0,1,0,t,e,1]},s=function(t){var e=Math.cos(t),i=Math.sin(t);return[e,-i,0,i,e,0,0,0,1]},o=function(t,e){return[t,0,0,0,e,0,0,0,1]},h=function(t,e){var i=t[0],n=t[1],r=t[2],a=t[3],s=t[4],o=t[5],h=t[6],l=t[7],c=t[8],u=e[0],d=e[1],p=e[2],f=e[3],g=e[4],y=e[5],m=e[6],v=e[7],b=e[8];return[i*u+n*f+r*m,i*d+n*g+r*v,i*p+n*y+r*b,a*u+s*f+o*m,a*d+s*g+o*v,a*p+s*y+o*b,h*u+l*f+c*m,h*d+l*g+c*v,h*p+l*y+c*b]},l={createCanvas:function(t,e,i,n){void 0===n&&(n="absolute");var r=document.createElement("canvas");return r.id=t,r.width=e,r.height=i,r.style.opacity=0,r.style.position=n,this.transform(r,-500,-500,0,0),r},createDiv:function(t,e,i){var n=document.createElement("div");return n.id=t,n.style.position="absolute",this.resize(n,e,i),n},resize:function(t,e,i){t.style.width=e+"px",t.style.height=i+"px",t.style.marginLeft=-e/2+"px",t.style.marginTop=-i/2+"px"},transform:function(t,e,i,n,r){t.style.willChange="transform";var a="translate("+e+"px, "+i+"px) scale("+n+") rotate("+r+"deg)";this.css3(t,"transform",a)},transform3d:function(t,e,i,n,r){t.style.willChange="transform";var a="translate3d("+e+"px, "+i+"px, 0) scale("+n+") rotate("+r+"deg)";this.css3(t,"backfaceVisibility","hidden"),this.css3(t,"transform",a)},css3:function(t,e,i){var n=e.charAt(0).toUpperCase()+e.substr(1);t.style["Webkit"+n]=i,t.style["Moz"+n]=i,t.style["O"+n]=i,t.style["ms"+n]=i,t.style[""+e]=i}},c={},u={},d=0,p=function(t,e,i){t.drawImage(e,i.x,i.y);var n=t.getImageData(i.x,i.y,i.width,i.height);return t.clearRect(i.x,i.y,i.width,i.height),n},f=function(t,e,i){var n="string"==typeof t?t:t.src;if(c[n])e(c[n],i);else{var r=new Image;r.onload=function(t){c[n]=t.target,e(c[n],i)},r.src=n}},g=function(t,e,i){var n=t.src;if(!u[n]){var a=r(t.width),s=r(t.height),o=l.createCanvas("proton_canvas_cache_"+ ++d,a,s);o.getContext("2d").drawImage(t,0,0,t.width,t.height),u[n]=o}return e&&e(u[n],i),u[n]},y={initValue:function(t,e){return t=null!=t?t:e},isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyArray:function(t){t&&(t.length=0)},toArray:function(t){return this.isArray(t)?t:[t]},sliceArray:function(t,e,i){this.emptyArray(i);for(var n=e;n-1||delete t[i]},classApply:function(t,e){return void 0===e&&(e=null),e?new(t.bind.apply(t,[null].concat(e))):new t},getImageData:function(t,e,i){return p(t,e,i)},destroyAll:function(t,e){void 0===e&&(e=null);for(var i=t.length;i--;){try{t[i].destroy(e)}catch(t){}delete t[i]}t.length=0},assign:function(t,e){if("function"!=typeof Object.assign){for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t}return Object.assign(t,e)}},m={},v={_index:0,_cache:{},id:function(t){return void 0!==m[t]&&null!==m[t]||(m[t]=0),t+"_"+m[t]++},getId:function(t){var e=this.getIdFromCache(t);return e||(e="PUID_"+this._index++,this._cache[e]=t,e)},getIdFromCache:function(t){var e,i;for(i in this._cache){if((e=this._cache[i])===t)return i;if(this.isBody(e,t)&&e.src===t.src)return i}return null},isBody:function(t,e){return"object"==typeof t&&"object"==typeof e&&t.isInner&&e.isInner},getTarget:function(t){return this._cache[t]}},b=function(){function t(t){this.total=0,this.cache={}}var e=t.prototype;return e.get=function(t,e,i){var n;return i=i||t.__puid||v.getId(t),(n=this.cache[i]&&this.cache[i].length>0?this.cache[i].pop():this.createOrClone(t,e)).__puid=t.__puid||i,n},e.expire=function(t){return this.getCache(t.__puid).push(t)},e.createOrClone=function(t,e){return this.total++,this.create?this.create(t,e):"function"==typeof t?y.classApply(t,e):t.clone()},e.getCount=function(){var t=0;for(var e in this.cache)t+=this.cache[e].length;return t++},e.destroy=function(){for(var t in this.cache)this.cache[t].length=0,delete this.cache[t]},e.getCache=function(t){return void 0===t&&(t="default"),this.cache[t]||(this.cache[t]=[]),this.cache[t]},t}(),x=function(){function t(t){this.proton=t,this.container=null,this.type=1,this.emitterIndex=0,this.rendererIndex=0}var e=t.prototype;return e.update=function(t,e){this.add(t,e);var i=this.getEmitter(),n=this.getRenderer(),r="";switch(this.type){case 2:r+="emitter:"+this.proton.emitters.length+"
",i&&(r+="em speed:"+i.emitSpeed+"
"),i&&(r+="pos:"+this.getEmitterPos(i));break;case 3:i&&(r+="initializes:"+i.initializes.length+"
"),i&&(r+=''+this.concatArr(i.initializes)+"
"),i&&(r+="behaviours:"+i.behaviours.length+"
"),i&&(r+=''+this.concatArr(i.behaviours)+"
");break;case 4:n&&(r+=n.name+"
"),n&&(r+="body:"+this.getCreatedNumber(n)+"
");break;default:r+="particles:"+this.proton.getCount()+"
",r+="pool:"+this.proton.pool.getCount()+"
",r+="total:"+this.proton.pool.total}this.container.innerHTML=r},e.add=function(t,e){var i=this;if(!this.container){var n,r;switch(this.type=1,this.container=document.createElement("div"),this.container.style.cssText=["position:absolute;bottom:0px;left:0;cursor:pointer;","opacity:0.9;z-index:10000;padding:10px;font-size:12px;font-family:Helvetica,Arial,sans-serif;","width:120px;height:50px;background-color:#002;color:#0ff;"].join(""),this.container.addEventListener("click",(function(t){i.type++,i.type>4&&(i.type=1)}),!1),t){case 2:n="#201",r="#f08";break;case 3:n="#020",r="#0f0";break;default:n="#002",r="#0ff"}this.container.style["background-color"]=n,this.container.style.color=r}this.container.parentNode||(e=e||this.body||document.body).appendChild(this.container)},e.getEmitter=function(){return this.proton.emitters[this.emitterIndex]},e.getRenderer=function(){return this.proton.renderers[this.rendererIndex]},e.concatArr=function(t){var e="";if(!t||!t.length)return e;for(var i=0;i0&&this.emittersUpdate(this.elapsed),this.then=this.now):this.emittersUpdate(e.DEFAULT_INTERVAL),this.dispatchEvent(e.PROTON_UPDATE_AFTER)):(this.then||(this.then=(new Date).getTime()),this.now=(new Date).getTime(),this.elapsed=.001*(this.now-this.then),this.elapsed>this._interval&&(this.dispatchEvent(e.PROTON_UPDATE),this.emittersUpdate(this._interval),this.then=this.now-this.elapsed%this._interval*1e3,this.dispatchEvent(e.PROTON_UPDATE_AFTER)))},a.emittersUpdate=function(t){for(var e=this.emitters.length;e--;)this.emitters[e].update(t)},a.amendChangeTabsBug=function(){e.amendChangeTabsBug&&this.elapsed>.5&&(this.then=(new Date).getTime(),this.elapsed=0)},a.getCount=function(){for(var t=0,e=this.emitters.length;e--;)t+=this.emitters[e].particles.length;return t},a.getAllParticles=function(){for(var t=[],e=this.emitters.length;e--;)t=t.concat(this.emitters[e].particles);return t},a.destroyAllEmitters=function(){y.destroyAll(this.emitters)},a.destroy=function(t){var e=this;void 0===t&&(t=!1);var i=function(){e.time=0,e.then=0,e.pool.destroy(),e.stats.destroy(),y.destroyAll(e.emitters),y.destroyAll(e.renderers,e.getAllParticles()),e.integrator=null,e.renderers=null,e.emitters=null,e.stats=null,e.pool=null};t?setTimeout(i,200):i()},i=e,(n=[{key:"fps",get:function(){return this._fps},set:function(t){this._fps=t,this._interval="auto"===t?e.DEFAULT_INTERVAL:T.floor(1/t,7)}}])&&t(i.prototype,n),r&&t(i,r),Object.defineProperty(i,"prototype",{writable:!1}),i}();_.USE_CLOCK=!1,_.MEASURE=100,_.EULER="euler",_.RK2="runge-kutta2",_.PARTICLE_CREATED="PARTICLE_CREATED",_.PARTICLE_UPDATE="PARTICLE_UPDATE",_.PARTICLE_SLEEP="PARTICLE_SLEEP",_.PARTICLE_DEAD="PARTICLE_DEAD",_.EMITTER_ADDED="EMITTER_ADDED",_.EMITTER_REMOVED="EMITTER_REMOVED",_.PROTON_UPDATE="PROTON_UPDATE",_.PROTON_UPDATE_AFTER="PROTON_UPDATE_AFTER",_.DEFAULT_INTERVAL=.0167,_.amendChangeTabsBug=!0,E.bind(_);var w=function(){function t(t,e,i){void 0===t&&(t=255),void 0===e&&(e=255),void 0===i&&(i=255),this.r=t,this.g=e,this.b=i}return t.prototype.reset=function(){this.r=255,this.g=255,this.b=255},t}(),C=function(){function t(t,e,i){this.isArray=void 0,this.a=void 0,this.b=void 0,this.center=void 0,y.isArray(t)?(this.isArray=!0,this.a=t):(this.isArray=!1,this.a=y.initValue(t,1),this.b=y.initValue(e,this.a),this.center=y.initValue(i,!1))}return t.prototype.getValue=function(t){return void 0===t&&(t=!1),this.isArray?y.getRandFromArray(this.a):this.center?T.randomFloating(this.a,this.b,t):T.randomAToB(this.a,this.b,t)},t.setSpanValue=function(e,i,n){return e instanceof t?e:void 0===i?new t(e):void 0===n?new t(e,i):new t(e,i,n)},t.getSpanValue=function(e){return e instanceof t?e.getValue():e},t}(),I={hasProp:function(t,e){return!!t&&void 0!==t[e]},setProp:function(t,e){for(var i in e)t.hasOwnProperty(i)&&(t[i]=C.getSpanValue(e[i]));return t},setVectorVal:function(t,e){void 0===e&&(e=null),e&&(this.hasProp(e,"x")&&(t.p.x=e.x),this.hasProp(e,"y")&&(t.p.y=e.y),this.hasProp(e,"vx")&&(t.v.x=e.vx),this.hasProp(e,"vy")&&(t.v.y=e.vy),this.hasProp(e,"ax")&&(t.a.x=e.ax),this.hasProp(e,"ay")&&(t.a.y=e.ay),this.hasProp(e,"p")&&t.p.copy(e.p),this.hasProp(e,"v")&&t.v.copy(e.v),this.hasProp(e,"a")&&t.a.copy(e.a),this.hasProp(e,"position")&&t.p.copy(e.position),this.hasProp(e,"velocity")&&t.v.copy(e.velocity),this.hasProp(e,"accelerate")&&t.a.copy(e.accelerate))}},S={easeLinear:function(t){return t},easeInQuad:function(t){return Math.pow(t,2)},easeOutQuad:function(t){return-(Math.pow(t-1,2)-1)},easeInOutQuad:function(t){return(t/=.5)<1?.5*Math.pow(t,2):-.5*((t-=2)*t-2)},easeInCubic:function(t){return Math.pow(t,3)},easeOutCubic:function(t){return Math.pow(t-1,3)+1},easeInOutCubic:function(t){return(t/=.5)<1?.5*Math.pow(t,3):.5*(Math.pow(t-2,3)+2)},easeInQuart:function(t){return Math.pow(t,4)},easeOutQuart:function(t){return-(Math.pow(t-1,4)-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*Math.pow(t,4):-.5*((t-=2)*Math.pow(t,3)-2)},easeInSine:function(t){return 1-Math.cos(t*T.PI_2)},easeOutSine:function(t){return Math.sin(t*T.PI_2)},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t)-1)},easeInExpo:function(t){return 0===t?0:Math.pow(2,10*(t-1))},easeOutExpo:function(t){return 1===t?1:1-Math.pow(2,-10*t)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*--t))},easeInCirc:function(t){return-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-Math.pow(t-1,2))},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},getEasing:function(t){return"function"==typeof t?t:this[t]||this.easeLinear}},D=function(){function t(t,e){this.x=void 0,this.y=void 0,this.x=t||0,this.y=e||0}var e=t.prototype;return e.set=function(t,e){return this.x=t,this.y=e,this},e.setX=function(t){return this.x=t,this},e.setY=function(t){return this.y=t,this},e.getGradient=function(){return 0!==this.x?Math.atan2(this.y,this.x):this.y>0?T.PI_2:this.y<0?-T.PI_2:void 0},e.copy=function(t){return this.x=t.x,this.y=t.y,this},e.add=function(t,e){return void 0!==e?this.addVectors(t,e):(this.x+=t.x,this.y+=t.y,this)},e.addXY=function(t,e){return this.x+=t,this.y+=e,this},e.addVectors=function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this},e.sub=function(t,e){return void 0!==e?this.subVectors(t,e):(this.x-=t.x,this.y-=t.y,this)},e.subVectors=function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this},e.divideScalar=function(t){return 0!==t?(this.x/=t,this.y/=t):this.set(0,0),this},e.multiplyScalar=function(t){return this.x*=t,this.y*=t,this},e.negate=function(){return this.multiplyScalar(-1)},e.dot=function(t){return this.x*t.x+this.y*t.y},e.lengthSq=function(){return this.x*this.x+this.y*this.y},e.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y)},e.normalize=function(){return this.divideScalar(this.length())},e.distanceTo=function(t){return Math.sqrt(this.distanceToSquared(t))},e.rotate=function(t){var e=this.x,i=this.y;return this.x=e*Math.cos(t)+i*Math.sin(t),this.y=-e*Math.sin(t)+i*Math.cos(t),this},e.distanceToSquared=function(t){var e=this.x-t.x,i=this.y-t.y;return e*e+i*i},e.lerp=function(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this},e.equals=function(t){return t.x===this.x&&t.y===this.y},e.clear=function(){return this.x=0,this.y=0,this},e.clone=function(){return new t(this.x,this.y)},t}(),V=function(){function t(t){this.id="",this.old=null,this.data=null,this.behaviours=null,this.p=null,this.v=null,this.a=null,this.rgb=null,this.name="Particle",this.id=v.id(this.name),this.old={},this.data={},this.behaviours=[],this.p=new D,this.v=new D,this.a=new D,this.old.p=new D,this.old.v=new D,this.old.a=new D,this.rgb=new w,this.reset(),t&&I.setProp(this,t)}var e=t.prototype;return e.getDirection=function(){return Math.atan2(this.v.x,-this.v.y)*T.N180_PI},e.reset=function(){return this.life=1/0,this.age=0,this.dead=!1,this.sleep=!1,this.body=null,this.sprite=null,this.parent=null,this.energy=1,this.mass=1,this.radius=10,this.alpha=1,this.scale=1,this.rotation=0,this.color=null,this.p.set(0,0),this.v.set(0,0),this.a.set(0,0),this.old.p.set(0,0),this.old.v.set(0,0),this.old.a.set(0,0),this.easing=S.easeLinear,this.rgb.reset(),y.emptyObject(this.data),this.removeAllBehaviours(),this},e.update=function(t,e){if(this.sleep||(this.age+=t,this.applyBehaviours(t,e)),this.age-1&&(this.behaviours.splice(e,1).parents=null)},e.removeAllBehaviours=function(){y.emptyArray(this.behaviours)},e.destroy=function(){this.removeAllBehaviours(),this.energy=0,this.dead=!0,this.parent=null},t}(),M={hexToRgb:function(t){var e="#"===t.charAt(0)?t.substring(1,7):t;return{r:parseInt(e.substring(0,2),16),g:parseInt(e.substring(2,4),16),b:parseInt(e.substring(4,6),16)}},rgbToHex:function(t){return"rgb("+t.r+", "+t.g+", "+t.b+")"},getHex16FromParticle:function(t){return 65536*Number(t.rgb.r)+256*Number(t.rgb.g)+Number(t.rgb.b)}},B=function(){function t(t,e){this.r=Math.abs(t)||0,this.tha=e||0}var e=t.prototype;return e.set=function(t,e){return this.r=t,this.tha=e,this},e.setR=function(t){return this.r=t,this},e.setTha=function(t){return this.tha=t,this},e.copy=function(t){return this.r=t.r,this.tha=t.tha,this},e.toVector=function(){return new D(this.getX(),this.getY())},e.getX=function(){return this.r*Math.sin(this.tha)},e.getY=function(){return-this.r*Math.cos(this.tha)},e.normalize=function(){return this.r=1,this},e.equals=function(t){return t.r===this.r&&t.tha===this.tha},e.clear=function(){return this.r=0,this.tha=0,this},e.clone=function(){return new t(this.r,this.tha)},t}(),L={create:function(t){var e=new Float32Array(9);return t&&this.set(t,e),e},set:function(t,e){for(var i=0;i<9;i++)e[i]=t[i];return e},multiply:function(t,e,i){var n=t[0],r=t[1],a=t[2],s=t[3],o=t[4],h=t[6],l=t[7],c=e[0],u=e[1],d=e[2],p=e[3],f=e[4],g=e[6],y=e[7];return i[0]=c*n+u*s,i[1]=c*r+u*o,i[2]=a*d,i[3]=p*n+f*s,i[4]=p*r+f*o,i[6]=g*n+y*s+h,i[7]=g*r+y*o+l,i},inverse:function(t,e){var i,n=t[0],r=t[1],a=t[3],s=t[4],o=t[6],h=t[7],l=s,c=-a,u=h*a-s*o;return i=1/(n*l+r*c),e[0]=l*i,e[1]=-r*i,e[3]=c*i,e[4]=n*i,e[6]=u*i,e[7]=(-h*n+r*o)*i,e},multiplyVec2:function(t,e,i){var n=e[0],r=e[1];return i[0]=n*t[0]+r*t[3]+t[6],i[1]=n*t[1]+r*t[4]+t[7],i}},U=function(t){function i(e){var i;return(i=t.call(this)||this)._arr=y.toArray(e),i}return e(i,t),i.prototype.getValue=function(){var t=y.getRandFromArray(this._arr);return"random"===t||"Random"===t?T.randomColor():t},i.createArraySpan=function(t){return t?t instanceof i?t:new i(t):null},i}(C),F=function(){function t(t,e,i,n){this.x=t,this.y=e,this.width=i,this.height=n,this.bottom=this.y+this.height,this.right=this.x+this.width}return t.prototype.contains=function(t,e){return t<=this.right&&t>=this.x&&e<=this.bottom&&e>=this.y},t}(),O=function(){function t(t,e){this.numPan=void 0,this.timePan=void 0,this.startTime=void 0,this.nextTime=void 0,this.numPan=C.setSpanValue(y.initValue(t,1)),this.timePan=C.setSpanValue(y.initValue(e,1)),this.startTime=0,this.nextTime=0,this.init()}var e=t.prototype;return e.init=function(){this.startTime=0,this.nextTime=this.timePan.getValue()},e.getValue=function(t){return this.startTime+=t,this.startTime>=this.nextTime?(this.startTime=0,this.nextTime=this.timePan.getValue(),1===this.numPan.b?this.numPan.getValue(!1)>.5?1:0:this.numPan.getValue(!0)):0},t}(),z=function(){function t(){}var e=t.prototype;return e.reset=function(){},e.init=function(t,e){e?this.initialize(e):this.initialize(t)},e.initialize=function(t){},t}(),k=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).lifePan=void 0,r.name=void 0,r.lifePan=C.setSpanValue(e,i,n),r.name="Life",r}return e(i,t),i.prototype.initialize=function(t){this.lifePan.a===1/0?t.life=1/0:t.life=this.lifePan.getValue()},i}(z),N=function(){function t(){this.vector=new D(0,0),this.random=0,this.crossType="dead",this.alert=!0}var e=t.prototype;return e.getPosition=function(){},e.crossing=function(t){},e.destroy=function(){this.vector=null},t}(),H=function(t){function i(e,i){var n;return(n=t.call(this)||this).x=e,n.y=i,n}e(i,t);var n=i.prototype;return n.getPosition=function(){return this.vector.x=this.x,this.vector.y=this.y,this.vector},n.crossing=function(t){this.alert&&(console.error("Sorry, PointZone does not support crossing method!"),this.alert=!1)},i}(N),q=function(t){function i(e){var i;return(i=t.call(this)||this).zone=void 0,i.name=void 0,i.zone=y.initValue(e,new H),i.name="Position",i}e(i,t);var n=i.prototype;return n.reset=function(t){this.zone=y.initValue(t,new H)},n.initialize=function(t){this.zone.getPosition(),t.p.x=this.zone.vector.x,t.p.y=this.zone.vector.y},i}(z),G=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).rPan=void 0,r.thaPan=void 0,r.name=void 0,r.rPan=C.setSpanValue(e),r.thaPan=C.setSpanValue(i),r.type=y.initValue(n,"vector"),r.name="Velocity",r}e(i,t);var n=i.prototype;return n.reset=function(t,e,i){this.rPan=C.setSpanValue(t),this.thaPan=C.setSpanValue(e),this.type=y.initValue(i,"vector")},n.normalizeVelocity=function(t){return t*_.MEASURE},n.initialize=function(t){if("p"===this.type||"P"===this.type||"polar"===this.type){var e=new B(this.normalizeVelocity(this.rPan.getValue()),this.thaPan.getValue()*T.PI_180);t.v.x=e.getX(),t.v.y=e.getY()}else t.v.x=this.normalizeVelocity(this.rPan.getValue()),t.v.y=this.normalizeVelocity(this.thaPan.getValue())},i}(z),X=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).massPan=void 0,r.name=void 0,r.massPan=C.setSpanValue(e,i,n),r.name="Mass",r}return e(i,t),i.prototype.initialize=function(t){t.mass=this.massPan.getValue()},i}(z),Y=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).radius=void 0,r.name=void 0,r.radius=C.setSpanValue(e,i,n),r.name="Radius",r}e(i,t);var n=i.prototype;return n.reset=function(t,e,i){this.radius=C.setSpanValue(t,e,i)},n.initialize=function(t){t.radius=this.radius.getValue(),t.data.oldRadius=t.radius},i}(z),j=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).image=void 0,r.name=void 0,r.image=r.setSpanValue(e),r.w=y.initValue(i,20),r.h=y.initValue(n,r.w),r.name="Body",r}e(i,t);var n=i.prototype;return n.initialize=function(t){var e=this.image.getValue();t.body="string"==typeof e?{width:this.w,height:this.h,src:e,isInner:!0,inner:!0}:e},n.setSpanValue=function(t){return t instanceof U?t:new U(t)},i}(z),W=function(){function t(e,i){this.life=y.initValue(e,1/0),this.easing=S.getEasing(i),this.age=0,this.energy=1,this.dead=!1,this.parents=[],this.id="Behaviour_"+t.id++,this.name="Behaviour"}var e=t.prototype;return e.reset=function(t,e){this.life=y.initValue(t,1/0),this.easing=S.getEasing(e)},e.normalizeForce=function(t){return t.multiplyScalar(_.MEASURE)},e.normalizeValue=function(t){return t*_.MEASURE},e.initialize=function(t){},e.calculate=function(t,e,i){if(this.age+=e,this.age>=this.life||this.dead)this.energy=0,this.dead=!0,this.destroy();else{var n=this.easing(t.age/t.life);this.energy=Math.max(1-n,0)}},e.applyBehaviour=function(t,e,i){this.calculate(t,e,i)},e.destroy=function(){for(var t=this.parents.length;t--;)this.parents[t].removeBehaviour(this);this.parents.length=0},t}();W.id=0;var Z=function(t){function i(e,i,n,r){var a;return(a=t.call(this,n,r)||this).force=a.normalizeForce(new D(e,i)),a.name="Force",a}e(i,t);var n=i.prototype;return n.reset=function(e,i,n,r){this.force=this.normalizeForce(new D(e,i)),n&&t.prototype.reset.call(this,n,r)},n.applyBehaviour=function(t,e,i){this.calculate(t,e,i),t.a.add(this.force)},i}(W),Q=function(t){function i(e,i,n,r,a){var s;return(s=t.call(this,r,a)||this).targetPosition=y.initValue(e,new D),s.radius=y.initValue(n,1e3),s.force=y.initValue(s.normalizeValue(i),100),s.radiusSq=s.radius*s.radius,s.attractionForce=new D,s.lengthSq=0,s.name="Attraction",s}e(i,t);var n=i.prototype;return n.reset=function(e,i,n,r,a){this.targetPosition=y.initValue(e,new D),this.radius=y.initValue(n,1e3),this.force=y.initValue(this.normalizeValue(i),100),this.radiusSq=this.radius*this.radius,this.attractionForce=new D,this.lengthSq=0,r&&t.prototype.reset.call(this,r,a)},n.applyBehaviour=function(t,e,i){this.calculate(t,e,i),this.attractionForce.copy(this.targetPosition),this.attractionForce.sub(t.p),this.lengthSq=this.attractionForce.lengthSq(),this.lengthSq>4e-5&&this.lengthSq=this.delay&&(t.a.addXY(T.randomAToB(-this.panFoce.x,this.panFoce.x),T.randomAToB(-this.panFoce.y,this.panFoce.y)),t.data.time=0)},i}(W),J=function(t){function i(e,i,n){var r;return(r=t.call(this,0,e,i,n)||this).name="Gravity",r}return e(i,t),i.prototype.reset=function(e,i,n){t.prototype.reset.call(this,0,e,i,n)},i}(Z),$=function(t){function i(e,i,n,r,a){var s;return(s=t.call(this,r,a)||this).reset(e,i,n),s.newPool=[],s.pool=[],s.name="Collision",s}e(i,t);var n=i.prototype;return n.reset=function(e,i,n,r,a){this.emitter=y.initValue(e,null),this.mass=y.initValue(i,!0),this.callback=y.initValue(n,null),this.collisionPool=[],this.delta=new D,r&&t.prototype.reset.call(this,r,a)},n.applyBehaviour=function(t,e,i){this.emitter?y.sliceArray(this.emitter.particles,i,this.newPool):y.sliceArray(this.pool,i,this.newPool);var n,r,a,s,o,h,l,c=this.newPool.length;for(l=0;lr;)t-=r,this.update(r);this.stoped=e,this.emitTime=i+Math.max(t,0),this.totalTime=n},n.removeAllParticles=function(){for(var t=this.particles.length;t--;)this.particles[t].dead=!0},n.addSelfInitialize=function(t){t.init&&t.init(this)},n.addInitialize=function(){for(var t=arguments.length,e=new Array(t),i=0;i-1&&this.initializes.splice(e,1)},n.removeAllInitializers=function(){y.emptyArray(this.initializes)},n.addBehaviour=function(){for(var t=arguments.length,e=new Array(t),i=0;i=this.life||this.dead)&&this.destroy(),this.emitting(t),this.integrate(t)},n.integrate=function(t){if(this.parent){var e,i,n=1-this.damping;for(this.parent.integrator.calculate(this,t,n),e=this.particles.length-1;e>=0;e--)(i=this.particles[e]).update(t,e),this.parent.integrator.calculate(i,t,n),this.dispatch("PARTICLE_UPDATE",i),i.dead&&(this.dispatch("PARTICLE_DEAD",i),this.parent.pool.expire(i),this.particles.splice(e,1))}},n.dispatch=function(t,e){this.parent&&this.parent.dispatchEvent(t,e),this.bindEvent&&this.dispatchEvent(t,e)},n.emitting=function(t){if(!this.stoped)if("none"===this.totalTime)this.emitTime+=t;else if("once"===this.totalTime){var e,i=this.rate.getValue(99999);for(i>0&&(this.emitSpeed=i),e=0;e0&&(this.emitSpeed=r),n=0;n-1&&this.selfBehaviours.splice(e,1)},n.update=function(e){if(t.prototype.update.call(this,e),!this.sleep){var i,n=this.selfBehaviours.length;for(i=0;ithis.element.width||i<0||i>this.element.height)){var a=4*((i|0)*t.width+(e|0));t.data[a]=r.r,t.data[a+1]=r.g,t.data[a+2]=r.b,t.data[a+3]=255*n.alpha}},n.onParticleDead=function(t){},n.destroy=function(){t.prototype.destroy.call(this),this.stroke=null,this.context=null,this.imageData=null,this.rectangle=null},i}(yt),Et=function(t){function i(e,i){var n;return(n=t.call(this,e)||this).stroke=i,n.color=!1,n.setColor=!1,n.blendMode=null,n.pool.create=function(t,e){return n.createBody(t,e)},n.setPIXI(window.PIXI),n.name="PixiRenderer",n}e(i,t);var n=i.prototype;return n.setPIXI=function(t){try{ut=t||{Sprite:{}},this.createFromImage=ut.Sprite.from||ut.Sprite.fromImage}catch(t){}},n.onProtonUpdate=function(){},n.onParticleCreated=function(t){t.body?t.body=this.pool.get(t.body,t):t.body=this.pool.get(this.circleConf,t),this.blendMode&&(t.body.blendMode=this.blendMode),this.element.addChild(t.body)},n.onParticleUpdate=function(t){this.transform(t,t.body),!0!==this.setColor&&!0!==this.color||(t.body.tint=M.getHex16FromParticle(t))},n.onParticleDead=function(t){this.element.removeChild(t.body),this.pool.expire(t.body),t.body=null},n.transform=function(t,e){e.x=t.p.x,e.y=t.p.y,e.alpha=t.alpha,e.scale.x=t.scale,e.scale.y=t.scale,e.rotation=t.rotation*T.PI_180},n.createBody=function(t,e){return t.isCircle?this.createCircle(e):this.createSprite(t)},n.createSprite=function(t){var e=t.isInner?this.createFromImage(t.src):new ut.Sprite(t);return e.anchor.x=.5,e.anchor.y=.5,e},n.createCircle=function(t){var e=new ut.Graphics;if(this.stroke){var i=gt(this.stroke)?this.stroke:0;e.beginStroke(i)}return e.beginFill(t.color||36077),e.drawCircle(0,0,t.radius),e.endFill(),e},n.destroy=function(e){t.prototype.destroy.call(this);for(var i=e.length;i--;){var n=e[i];n.body&&this.element.removeChild(n.body)}},i}(yt),Pt=function(){function t(){this.mats=[],this.size=0;for(var t=0;t<20;t++)this.mats.push(L.create([0,0,0,0,0,0,0,0,0]))}var e=t.prototype;return e.set=function(t,e){0===e?L.set(t,this.mats[0]):L.multiply(this.mats[e-1],t,this.mats[e]),this.size=Math.max(this.size,e+1)},e.push=function(t){0===this.size?L.set(t,this.mats[0]):L.multiply(this.mats[this.size-1],t,this.mats[this.size]),this.size++},e.pop=function(){this.size>0&&this.size--},e.top=function(){return this.mats[this.size-1]},t}(),At=function(t){function i(e){var i;return(i=t.call(this,e)||this).gl=i.element.getContext("experimental-webgl",{antialias:!0,stencil:!1,depth:!1}),i.gl||alert("Sorry your browser do not suppest WebGL!"),i.initVar(),i.setMaxRadius(),i.initShaders(),i.initBuffers(),i.gl.blendEquation(i.gl.FUNC_ADD),i.gl.blendFunc(i.gl.SRC_ALPHA,i.gl.ONE_MINUS_SRC_ALPHA),i.gl.enable(i.gl.BLEND),i.addImg2Body=i.addImg2Body.bind(i),i.name="WebGLRenderer",i}e(i,t);var n=i.prototype;return n.init=function(e){t.prototype.init.call(this,e),this.resize(this.element.width,this.element.height)},n.resize=function(t,e){this.umat[4]=-2,this.umat[7]=1,this.smat[0]=1/t,this.smat[4]=1/e,this.mstack.set(this.umat,0),this.mstack.set(this.smat,1),this.gl.viewport(0,0,t,e),this.element.width=t,this.element.height=e},n.setMaxRadius=function(t){this.circleCanvasURL=this.createCircle(t)},n.getVertexShader=function(){return["uniform vec2 viewport;","attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","uniform mat3 tMat;","varying vec2 vTextureCoord;","varying float alpha;","void main() {","vec3 v = tMat * vec3(aVertexPosition, 1.0);","gl_Position = vec4(v.x, v.y, 0, 1);","vTextureCoord = aTextureCoord;","alpha = tMat[0][2];","}"].join("\n")},n.getFragmentShader=function(){return["precision mediump float;","varying vec2 vTextureCoord;","varying float alpha;","uniform sampler2D uSampler;","uniform vec4 color;","uniform bool useTexture;","uniform vec3 uColor;","void main() {","vec4 textureColor = texture2D(uSampler, vTextureCoord);","gl_FragColor = textureColor * vec4(uColor, 1.0);","gl_FragColor.w *= alpha;","}"].join("\n")},n.initVar=function(){this.mstack=new Pt,this.umat=L.create([2,0,1,0,-2,0,-1,1,1]),this.smat=L.create([.01,0,1,0,.01,0,0,0,1]),this.texturebuffers={}},n.blendEquation=function(t){this.gl.blendEquation(this.gl[t])},n.blendFunc=function(t,e){this.gl.blendFunc(this.gl[t],this.gl[e])},n.getShader=function(t,e,i){var n=i?t.createShader(t.FRAGMENT_SHADER):t.createShader(t.VERTEX_SHADER);return t.shaderSource(n,e),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},n.initShaders=function(){var t=this.getShader(this.gl,this.getFragmentShader(),!0),e=this.getShader(this.gl,this.getVertexShader(),!1);this.sprogram=this.gl.createProgram(),this.gl.attachShader(this.sprogram,e),this.gl.attachShader(this.sprogram,t),this.gl.linkProgram(this.sprogram),this.gl.getProgramParameter(this.sprogram,this.gl.LINK_STATUS)||alert("Could not initialise shaders"),this.gl.useProgram(this.sprogram),this.sprogram.vpa=this.gl.getAttribLocation(this.sprogram,"aVertexPosition"),this.sprogram.tca=this.gl.getAttribLocation(this.sprogram,"aTextureCoord"),this.gl.enableVertexAttribArray(this.sprogram.tca),this.gl.enableVertexAttribArray(this.sprogram.vpa),this.sprogram.tMatUniform=this.gl.getUniformLocation(this.sprogram,"tMat"),this.sprogram.samplerUniform=this.gl.getUniformLocation(this.sprogram,"uSampler"),this.sprogram.useTex=this.gl.getUniformLocation(this.sprogram,"useTexture"),this.sprogram.color=this.gl.getUniformLocation(this.sprogram,"uColor"),this.gl.uniform1i(this.sprogram.useTex,1)},n.initBuffers=function(){var t,e;this.unitIBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitIBuffer),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,new Uint16Array([0,3,1,0,2,3]),this.gl.STATIC_DRAW);var i=[];for(e=0;e<100;e++)i.push(e);for(t=new Uint16Array(i),this.unitI33=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitI33),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,t,this.gl.STATIC_DRAW),i=[],e=0;e<100;e++)i.push(e,e+1,e+2);t=new Uint16Array(i),this.stripBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.stripBuffer),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,t,this.gl.STATIC_DRAW)},n.createCircle=function(t){this.circleCanvasRadius=r(y.initValue(t,32));var e=l.createCanvas("circle_canvas",2*this.circleCanvasRadius,2*this.circleCanvasRadius),i=e.getContext("2d");return i.beginPath(),i.arc(this.circleCanvasRadius,this.circleCanvasRadius,this.circleCanvasRadius,0,2*Math.PI,!0),i.closePath(),i.fillStyle="#FFF",i.fill(),e.toDataURL()},n.drawImg2Canvas=function(t){var e=t.body.width,i=t.body.height,n=r(t.body.width),a=r(t.body.height),s=t.body.width/n,o=t.body.height/a;this.texturebuffers[t.data.src]||(this.texturebuffers[t.data.src]=[this.gl.createTexture(),this.gl.createBuffer(),this.gl.createBuffer()]),t.data.texture=this.texturebuffers[t.data.src][0],t.data.vcBuffer=this.texturebuffers[t.data.src][1],t.data.tcBuffer=this.texturebuffers[t.data.src][2],this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.tcBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,0,s,0,0,o,o,o]),this.gl.STATIC_DRAW),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.vcBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,0,e,0,0,i,e,i]),this.gl.STATIC_DRAW);var h=t.data.canvas.getContext("2d").getImageData(0,0,n,a);this.gl.bindTexture(this.gl.TEXTURE_2D,t.data.texture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,h),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR_MIPMAP_NEAREST),this.gl.generateMipmap(this.gl.TEXTURE_2D),t.data.textureLoaded=!0,t.data.textureWidth=e,t.data.textureHeight=i},n.onProtonUpdate=function(){},n.onParticleCreated=function(t){t.data.textureLoaded=!1,t.data.tmat=L.create(),t.data.tmat[8]=1,t.data.imat=L.create(),t.data.imat[8]=1,t.body?f(t.body,this.addImg2Body,t):(f(this.circleCanvasURL,this.addImg2Body,t),t.data.oldScale=t.radius/this.circleCanvasRadius)},n.addImg2Body=function(t,e){e.dead||(e.body=t,e.data.src=t.src,e.data.canvas=g(t),e.data.oldScale=1,this.drawImg2Canvas(e))},n.onParticleUpdate=function(t){t.data.textureLoaded&&(this.updateMatrix(t),this.gl.uniform3f(this.sprogram.color,t.rgb.r/255,t.rgb.g/255,t.rgb.b/255),this.gl.uniformMatrix3fv(this.sprogram.tMatUniform,!1,this.mstack.top()),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.vcBuffer),this.gl.vertexAttribPointer(this.sprogram.vpa,2,this.gl.FLOAT,!1,0,0),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.tcBuffer),this.gl.vertexAttribPointer(this.sprogram.tca,2,this.gl.FLOAT,!1,0,0),this.gl.bindTexture(this.gl.TEXTURE_2D,t.data.texture),this.gl.uniform1i(this.sprogram.samplerUniform,0),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitIBuffer),this.gl.drawElements(this.gl.TRIANGLES,6,this.gl.UNSIGNED_SHORT,0),this.mstack.pop())},n.onParticleDead=function(t){},n.updateMatrix=function(t){var e=a(-t.data.textureWidth/2,-t.data.textureHeight/2),i=a(t.p.x,t.p.y),n=t.rotation*T.PI_180,r=s(n),l=t.scale*t.data.oldScale,c=o(l,l),u=h(e,c);u=h(u,r),u=h(u,i),L.inverse(u,t.data.imat),u[2]=t.alpha,this.mstack.push(u)},n.destroy=function(){t.prototype.destroy.call(this),this.gl=null,this.mstack=null,this.umat=null,this.smat=null,this.texturebuffers=null},i}(yt),Tt=function(t){function i(e){var i;return(i=t.call(this,e)||this).name="CustomRenderer",i}return e(i,t),i}(yt),Rt=function(t){function i(e,i,n,r,a){var s;return void 0===a&&(a=">"),s=t.call(this)||this,n-e>=0?(s.x1=e,s.y1=i,s.x2=n,s.y2=r):(s.x1=n,s.y1=r,s.x2=e,s.y2=i),s.dx=s.x2-s.x1,s.dy=s.y2-s.y1,s.minx=Math.min(s.x1,s.x2),s.miny=Math.min(s.y1,s.y2),s.maxx=Math.max(s.x1,s.x2),s.maxy=Math.max(s.y1,s.y2),s.dot=s.x2*s.y1-s.x1*s.y2,s.xxyy=s.dx*s.dx+s.dy*s.dy,s.gradient=s.getGradient(),s.length=s.getLength(),s.direction=y.initValue(a,">"),s}e(i,t);var n=i.prototype;return n.getPosition=function(){return this.random=Math.random(),this.vector.x=this.x1+this.random*this.length*Math.cos(this.gradient),this.vector.y=this.y1+this.random*this.length*Math.sin(this.gradient),this.vector},n.getDirection=function(t,e){var i=this.dy,n=-this.dx;return(i*t+n*e+this.dot)*(0===n?1:n)>0},n.getDistance=function(t,e){return(this.dy*t+-this.dx*e+this.dot)/Math.sqrt(this.xxyy)},n.getSymmetric=function(t){var e=t.getGradient(),i=2*(this.getGradient()-e),n=t.x,r=t.y;return t.x=n*Math.cos(i)-r*Math.sin(i),t.y=n*Math.sin(i)+r*Math.cos(i),t},n.getGradient=function(){return Math.atan2(this.dy,this.dx)},n.rangeOut=function(t){if(Math.abs(this.getGradient())<=T.PI/4){if(t.p.x<=this.maxx&&t.p.x>=this.minx)return!0}else if(t.p.y<=this.maxy&&t.p.y>=this.miny)return!0;return!1},n.getLength=function(){return Math.sqrt(this.dx*this.dx+this.dy*this.dy)},n.crossing=function(t){if("dead"===this.crossType)if(">"===this.direction||"R"===this.direction||"right"===this.direction||"down"===this.direction){if(!this.rangeOut(t))return;this.getDirection(t.p.x,t.p.y)&&(t.dead=!0)}else{if(!this.rangeOut(t))return;this.getDirection(t.p.x,t.p.y)||(t.dead=!0)}else if("bound"===this.crossType){if(!this.rangeOut(t))return;this.getDistance(t.p.x,t.p.y)<=t.radius&&(0===this.dx?t.v.x*=-1:0===this.dy?t.v.y*=-1:this.getSymmetric(t.v))}else"cross"===this.crossType&&this.alert&&(console.error("Sorry, LineZone does not support cross method!"),this.alert=!1)},i}(N),_t=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).x=e,r.y=i,r.radius=n,r.angle=0,r.center={x:e,y:i},r}e(i,t);var n=i.prototype;return n.getPosition=function(){return this.angle=T.PIx2*Math.random(),this.randomRadius=Math.random()*this.radius,this.vector.x=this.x+this.randomRadius*Math.cos(this.angle),this.vector.y=this.y+this.randomRadius*Math.sin(this.angle),this.vector},n.setCenter=function(t,e){this.center.x=t,this.center.y=e},n.crossing=function(t){var e=t.p.distanceTo(this.center);"dead"===this.crossType?e-t.radius>this.radius&&(t.dead=!0):"bound"===this.crossType?e+t.radius>=this.radius&&this.getSymmetric(t):"cross"===this.crossType&&this.alert&&(console.error("Sorry, CircleZone does not support cross method!"),this.alert=!1)},n.getSymmetric=function(t){var e=t.v.getGradient(),i=2*(this.getGradient(t)-e),n=t.v.x,r=t.v.y;t.v.x=n*Math.cos(i)-r*Math.sin(i),t.v.y=n*Math.sin(i)+r*Math.cos(i)},n.getGradient=function(t){return-T.PI_2+Math.atan2(t.p.y-this.center.y,t.p.x-this.center.x)},i}(N),wt=function(t){function i(e,i,n,r){var a;return void 0===n&&(n=200),void 0===r&&(r=200),(a=t.call(this)||this).x=e,a.y=i,a.width=n,a.height=r,a}e(i,t);var n=i.prototype;return n.getPosition=function(){return this.vector.x=this.x+Math.random()*this.width,this.vector.y=this.y+Math.random()*this.height,this.vector},n.crossing=function(t){"dead"===this.crossType?((t.p.x+t.radiusthis.x+this.width)&&(t.dead=!0),(t.p.y+t.radiusthis.y+this.height)&&(t.dead=!0)):"bound"===this.crossType?(t.p.x-t.radiusthis.x+this.width&&(t.p.x=this.x+this.width-t.radius,t.v.x*=-1),t.p.y-t.radiusthis.y+this.height&&(t.p.y=this.y+this.height-t.radius,t.v.y*=-1)):"cross"===this.crossType&&(t.p.x+t.radiusthis.x+this.width&&t.v.x>=0&&(t.p.x=this.x-t.radius),t.p.y+t.radiusthis.y+this.height&&t.v.y>=0&&(t.p.y=this.y-t.radius))},i}(N),Ct=function(t){function i(e,i,n,r){var a;return(a=t.call(this)||this).reset(e,i,n,r),a}e(i,t);var n=i.prototype;return n.reset=function(t,e,i,n){this.imageData=t,this.x=y.initValue(e,0),this.y=y.initValue(i,0),this.d=y.initValue(n,2),this.vectors=[],this.setVectors()},n.setVectors=function(){var t,e,i=this.imageData.width,n=this.imageData.height;for(t=0;t0&&this.vectors.push({x:t+this.x,y:e+this.y})}return this.vector},n.getBound=function(t,e){var i=4*((e|0)*this.imageData.width+(t|0));return this.imageData.data[i+3]>0},n.getPosition=function(){var t=y.getRandFromArray(this.vectors);return this.vector.copy(t)},n.getColor=function(t,e){t-=this.x;var i=4*(((e-=this.y)|0)*this.imageData.width+(t|0));return{r:this.imageData.data[i],g:this.imageData.data[i+1],b:this.imageData.data[i+2],a:this.imageData.data[i+3]}},n.crossing=function(t){"dead"===this.crossType?t.dead=this.getBound(t.p.x-this.x,t.p.y-this.y):"bound"===this.crossType&&(this.getBound(t.p.x-this.x,t.p.y-this.y)||t.v.negate())},n.destroy=function(){t.prototype.destroy.call(this),this.imageData=null},i}(N),It={addEventListener:function(t,e){t.addEventListener("PROTON_UPDATE_AFTER",(function(){return e()}))},getStyle:function(t){void 0===t&&(t="#ff0000");var e=M.hexToRgb(t);return"rgba("+e.r+", "+e.g+", "+e.b+", 0.5)"},drawZone:function(t,e,i,n){var r=e.getContext("2d"),a=this.getStyle();this.addEventListener(t,(function(){n&&r.clearRect(0,0,e.width,e.height),i instanceof H?(r.beginPath(),r.fillStyle=a,r.arc(i.x,i.y,10,0,2*Math.PI,!0),r.fill(),r.closePath()):i instanceof Rt?(r.beginPath(),r.strokeStyle=a,r.moveTo(i.x1,i.y1),r.lineTo(i.x2,i.y2),r.stroke(),r.closePath()):i instanceof wt?(r.beginPath(),r.strokeStyle=a,r.drawRect(i.x,i.y,i.width,i.height),r.stroke(),r.closePath()):i instanceof _t&&(r.beginPath(),r.strokeStyle=a,r.arc(i.x,i.y,i.radius,0,2*Math.PI,!0),r.stroke(),r.closePath())}))},drawEmitter:function(t,e,i,n){var r=e.getContext("2d"),a=this.getStyle();this.addEventListener(t,(function(){n&&r.clearRect(0,0,e.width,e.height),r.beginPath(),r.fillStyle=a,r.arc(i.p.x,i.p.y,10,0,2*Math.PI,!0),r.fill(),r.closePath()}))}};return _.Particle=V,_.Pool=b,_.Util=y,_.ColorUtil=M,_.MathUtil=T,_.Vector2D=_.Vector=D,_.Polar2D=_.Polar=B,_.ArraySpan=U,_.Rectangle=F,_.Rate=O,_.ease=S,_.Span=C,_.Mat3=L,_.getSpan=function(t,e,i){return new C(t,e,i)},_.createArraySpan=U.createArraySpan,_.Initialize=_.Init=z,_.Life=_.L=k,_.Position=_.P=q,_.Velocity=_.V=G,_.Mass=_.M=X,_.Radius=_.R=Y,_.Body=_.B=j,_.Behaviour=W,_.Force=_.F=Z,_.Attraction=_.A=Q,_.RandomDrift=_.RD=K,_.Gravity=_.G=J,_.Collision=$,_.CrossZone=tt,_.Alpha=et,_.Scale=_.S=it,_.Rotate=nt,_.Color=rt,_.Repulsion=ot,_.Cyclone=st,_.GravityWell=ht,_.Emitter=ct,_.BehaviourEmitter=dt,_.FollowEmitter=pt,_.Zone=N,_.LineZone=Rt,_.CircleZone=_t,_.PointZone=H,_.RectZone=wt,_.ImageZone=Ct,_.CanvasRenderer=mt,_.DomRenderer=vt,_.EaselRenderer=bt,_.PixiRenderer=Et,_.PixelRenderer=xt,_.WebGLRenderer=_.WebGlRenderer=At,_.CustomRenderer=Tt,_.Debug=It,y.assign(_,S),_}();
+//# sourceMappingURL=proton.web.min.js.map
diff --git a/build/proton.web.min.js.map b/build/proton.web.min.js.map
new file mode 100644
index 0000000..b626b88
--- /dev/null
+++ b/build/proton.web.min.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"proton.web.min.js","sources":["../src/utils/WebGLUtil.js","../src/utils/DomUtil.js","../src/utils/ImgUtil.js","../src/utils/Util.js","../src/utils/Puid.js","../src/core/Pool.js","../src/debug/Stats.js","../src/events/EventDispatcher.js","../src/math/MathUtil.js","../src/math/Integration.js","../src/core/Proton.js","../src/utils/Rgb.js","../src/math/Span.js","../src/utils/PropUtil.js","../src/math/ease.js","../src/math/Vector2D.js","../src/core/Particle.js","../src/utils/ColorUtil.js","../src/math/Polar2D.js","../src/math/Mat3.js","../src/math/ArraySpan.js","../src/math/Rectangle.js","../src/initialize/Rate.js","../src/initialize/Initialize.js","../src/initialize/Life.js","../src/zone/Zone.js","../src/zone/PointZone.js","../src/initialize/Position.js","../src/initialize/Velocity.js","../src/initialize/Mass.js","../src/initialize/Radius.js","../src/initialize/Body.js","../src/behaviour/Behaviour.js","../src/behaviour/Force.js","../src/behaviour/Attraction.js","../src/behaviour/RandomDrift.js","../src/behaviour/Gravity.js","../src/behaviour/Collision.js","../src/behaviour/CrossZone.js","../src/behaviour/Alpha.js","../src/behaviour/Scale.js","../src/behaviour/Rotate.js","../src/behaviour/Color.js","../src/behaviour/Cyclone.js","../src/behaviour/Repulsion.js","../src/behaviour/GravityWell.js","../src/initialize/InitializeUtil.js","../src/emitter/Emitter.js","../src/emitter/BehaviourEmitter.js","../src/render/PixiRenderer.js","../src/emitter/FollowEmitter.js","../src/utils/Types.js","../src/render/BaseRenderer.js","../src/render/CanvasRenderer.js","../src/render/DomRenderer.js","../src/render/EaselRenderer.js","../src/render/PixelRenderer.js","../src/utils/MStack.js","../src/render/WebGLRenderer.js","../src/render/CustomRenderer.js","../src/zone/LineZone.js","../src/zone/CircleZone.js","../src/zone/RectZone.js","../src/zone/ImageZone.js","../src/debug/Debug.js"],"sourcesContent":["export default {\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method ipot\n *\n * @todo add description\n * @todo add length description\n *\n * @param {Number} length\n *\n * @return {Boolean}\n */\n ipot(length) {\n return (length & (length - 1)) === 0;\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method nhpot\n *\n * @todo add description\n * @todo add length description\n *\n * @param {Number} length\n *\n * @return {Number}\n */\n nhpot(length) {\n --length;\n for (let i = 1; i < 32; i <<= 1) {\n length = length | (length >> i);\n }\n\n return length + 1;\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeTranslation\n *\n * @todo add description\n * @todo add tx, ty description\n * @todo add return description\n *\n * @param {Number} tx either 0 or 1\n * @param {Number} ty either 0 or 1\n *\n * @return {Object}\n */\n makeTranslation(tx, ty) {\n return [1, 0, 0, 0, 1, 0, tx, ty, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeRotation\n *\n * @todo add description\n * @todo add return description\n *\n * @param {Number} angleInRadians\n *\n * @return {Object}\n */\n makeRotation(angleInRadians) {\n let c = Math.cos(angleInRadians);\n let s = Math.sin(angleInRadians);\n\n return [c, -s, 0, s, c, 0, 0, 0, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeScale\n *\n * @todo add description\n * @todo add tx, ty description\n * @todo add return description\n *\n * @param {Number} sx either 0 or 1\n * @param {Number} sy either 0 or 1\n *\n * @return {Object}\n */\n makeScale(sx, sy) {\n return [sx, 0, 0, 0, sy, 0, 0, 0, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method matrixMultiply\n *\n * @todo add description\n * @todo add a, b description\n * @todo add return description\n *\n * @param {Object} a\n * @param {Object} b\n *\n * @return {Object}\n */\n matrixMultiply(a, b) {\n let a00 = a[0 * 3 + 0];\n let a01 = a[0 * 3 + 1];\n let a02 = a[0 * 3 + 2];\n let a10 = a[1 * 3 + 0];\n let a11 = a[1 * 3 + 1];\n let a12 = a[1 * 3 + 2];\n let a20 = a[2 * 3 + 0];\n let a21 = a[2 * 3 + 1];\n let a22 = a[2 * 3 + 2];\n let b00 = b[0 * 3 + 0];\n let b01 = b[0 * 3 + 1];\n let b02 = b[0 * 3 + 2];\n let b10 = b[1 * 3 + 0];\n let b11 = b[1 * 3 + 1];\n let b12 = b[1 * 3 + 2];\n let b20 = b[2 * 3 + 0];\n let b21 = b[2 * 3 + 1];\n let b22 = b[2 * 3 + 2];\n\n return [\n a00 * b00 + a01 * b10 + a02 * b20,\n a00 * b01 + a01 * b11 + a02 * b21,\n a00 * b02 + a01 * b12 + a02 * b22,\n a10 * b00 + a11 * b10 + a12 * b20,\n a10 * b01 + a11 * b11 + a12 * b21,\n a10 * b02 + a11 * b12 + a12 * b22,\n a20 * b00 + a21 * b10 + a22 * b20,\n a20 * b01 + a21 * b11 + a22 * b21,\n a20 * b02 + a21 * b12 + a22 * b22\n ];\n }\n};\n","export default {\n /**\n * Creates and returns a new canvas. The opacity is by default set to 0\n *\n * @memberof Proton#Proton.DomUtil\n * @method createCanvas\n *\n * @param {String} $id the canvas' id\n * @param {Number} $width the canvas' width\n * @param {Number} $height the canvas' height\n * @param {String} [$position=absolute] the canvas' position, default is 'absolute'\n *\n * @return {Object}\n */\n createCanvas(id, width, height, position = \"absolute\") {\n const dom = document.createElement(\"canvas\");\n\n dom.id = id;\n dom.width = width;\n dom.height = height;\n dom.style.opacity = 0;\n dom.style.position = position;\n this.transform(dom, -500, -500, 0, 0);\n\n return dom;\n },\n\n createDiv(id, width, height) {\n const dom = document.createElement(\"div\");\n\n dom.id = id;\n dom.style.position = \"absolute\";\n this.resize(dom, width, height);\n\n return dom;\n },\n\n resize(dom, width, height) {\n dom.style.width = width + \"px\";\n dom.style.height = height + \"px\";\n dom.style.marginLeft = -width / 2 + \"px\";\n dom.style.marginTop = -height / 2 + \"px\";\n },\n\n /**\n * Adds a transform: translate(), scale(), rotate() to a given div dom for all browsers\n *\n * @memberof Proton#Proton.DomUtil\n * @method transform\n *\n * @param {HTMLDivElement} div\n * @param {Number} $x\n * @param {Number} $y\n * @param {Number} $scale\n * @param {Number} $rotate\n */\n transform(div, x, y, scale, rotate) {\n div.style.willChange = \"transform\";\n const transform = `translate(${x}px, ${y}px) scale(${scale}) rotate(${rotate}deg)`;\n this.css3(div, \"transform\", transform);\n },\n\n transform3d(div, x, y, scale, rotate) {\n div.style.willChange = \"transform\";\n const transform = `translate3d(${x}px, ${y}px, 0) scale(${scale}) rotate(${rotate}deg)`;\n this.css3(div, \"backfaceVisibility\", \"hidden\");\n this.css3(div, \"transform\", transform);\n },\n\n css3(div, key, val) {\n const bkey = key.charAt(0).toUpperCase() + key.substr(1);\n\n div.style[`Webkit${bkey}`] = val;\n div.style[`Moz${bkey}`] = val;\n div.style[`O${bkey}`] = val;\n div.style[`ms${bkey}`] = val;\n div.style[`${key}`] = val;\n }\n};\n","import WebGLUtil from \"./WebGLUtil\";\nimport DomUtil from \"./DomUtil\";\n\nconst imgsCache = {};\nconst canvasCache = {};\nlet canvasId = 0;\n\nexport default {\n /**\n * This will get the image data. It could be necessary to create a Proton.Zone.\n *\n * @memberof Proton#Proton.Util\n * @method getImageData\n *\n * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'\n * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');\n * @param {Proton.Rectangle} rect\n */\n getImageData(context, image, rect) {\n context.drawImage(image, rect.x, rect.y);\n const imagedata = context.getImageData(rect.x, rect.y, rect.width, rect.height);\n context.clearRect(rect.x, rect.y, rect.width, rect.height);\n\n return imagedata;\n },\n\n /**\n * @memberof Proton#Proton.Util\n * @method getImgFromCache\n *\n * @todo add description\n * @todo describe func\n *\n * @param {Mixed} img\n * @param {Proton.Particle} particle\n * @param {Boolean} drawCanvas set to true if a canvas should be saved into particle.data.canvas\n * @param {Boolean} func\n */\n getImgFromCache(img, callback, param) {\n const src = typeof img === \"string\" ? img : img.src;\n\n if (imgsCache[src]) {\n callback(imgsCache[src], param);\n } else {\n const image = new Image();\n image.onload = e => {\n imgsCache[src] = e.target;\n callback(imgsCache[src], param);\n };\n\n image.src = src;\n }\n },\n\n getCanvasFromCache(img, callback, param) {\n const src = img.src;\n\n if (!canvasCache[src]) {\n const width = WebGLUtil.nhpot(img.width);\n const height = WebGLUtil.nhpot(img.height);\n\n const canvas = DomUtil.createCanvas(`proton_canvas_cache_${++canvasId}`, width, height);\n const context = canvas.getContext(\"2d\");\n context.drawImage(img, 0, 0, img.width, img.height);\n\n canvasCache[src] = canvas;\n }\n\n callback && callback(canvasCache[src], param);\n\n return canvasCache[src];\n }\n};\n","import ImgUtil from \"./ImgUtil\";\n\nexport default {\n /**\n * Returns the default if the value is null or undefined\n *\n * @memberof Proton#Proton.Util\n * @method initValue\n *\n * @param {Mixed} value a specific value, could be everything but null or undefined\n * @param {Mixed} defaults the default if the value is null or undefined\n */\n initValue(value, defaults) {\n value = value !== null && value !== undefined ? value : defaults;\n return value;\n },\n\n /**\n * Checks if the value is a valid array\n *\n * @memberof Proton#Proton.Util\n * @method isArray\n *\n * @param {Array} value Any array\n *\n * @returns {Boolean}\n */\n isArray(value) {\n return Object.prototype.toString.call(value) === \"[object Array]\";\n },\n\n /**\n * Destroyes the given array\n *\n * @memberof Proton#Proton.Util\n * @method emptyArray\n *\n * @param {Array} array Any array\n */\n emptyArray(arr) {\n if (arr) arr.length = 0;\n },\n\n toArray(arr) {\n return this.isArray(arr) ? arr : [arr];\n },\n\n sliceArray(arr1, index, arr2) {\n this.emptyArray(arr2);\n for (let i = index; i < arr1.length; i++) {\n arr2.push(arr1[i]);\n }\n },\n\n getRandFromArray(arr) {\n if (!arr) return null;\n return arr[Math.floor(arr.length * Math.random())];\n },\n\n /**\n * Destroyes the given object\n *\n * @memberof Proton#Proton.Util\n * @method emptyObject\n *\n * @param {Object} obj Any object\n */\n emptyObject(obj, ignore = null) {\n for (let key in obj) {\n if (ignore && ignore.indexOf(key) > -1) continue;\n delete obj[key];\n }\n },\n\n /**\n * Makes an instance of a class and binds the given array\n *\n * @memberof Proton#Proton.Util\n * @method classApply\n *\n * @param {Function} constructor A class to make an instance from\n * @param {Array} [args] Any array to bind it to the constructor\n *\n * @return {Object} The instance of constructor, optionally bind with args\n */\n classApply(constructor, args = null) {\n if (!args) {\n return new constructor();\n } else {\n const FactoryFunc = constructor.bind.apply(constructor, [null].concat(args));\n return new FactoryFunc();\n }\n },\n\n /**\n * This will get the image data. It could be necessary to create a Proton.Zone.\n *\n * @memberof Proton#Proton.Util\n * @method getImageData\n *\n * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'\n * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');\n * @param {Proton.Rectangle} rect\n */\n getImageData(context, image, rect) {\n return ImgUtil.getImageData(context, image, rect);\n },\n\n destroyAll(arr, param = null) {\n let i = arr.length;\n\n while (i--) {\n try {\n arr[i].destroy(param);\n } catch (e) {}\n\n delete arr[i];\n }\n\n arr.length = 0;\n },\n\n assign(target, source) {\n if (typeof Object.assign !== \"function\") {\n for (let key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n\n return target;\n } else {\n return Object.assign(target, source);\n }\n }\n};\n","const idsMap = {};\n\nconst Puid = {\n _index: 0,\n _cache: {},\n\n id(type) {\n if (idsMap[type] === undefined || idsMap[type] === null) idsMap[type] = 0;\n return `${type}_${idsMap[type]++}`;\n },\n\n getId(target) {\n let uid = this.getIdFromCache(target);\n if (uid) return uid;\n\n uid = `PUID_${this._index++}`;\n this._cache[uid] = target;\n return uid;\n },\n\n getIdFromCache(target) {\n let obj, id;\n\n for (id in this._cache) {\n obj = this._cache[id];\n\n if (obj === target) return id;\n if (this.isBody(obj, target) && obj.src === target.src) return id;\n }\n\n return null;\n },\n\n isBody(obj, target) {\n return typeof obj === \"object\" && typeof target === \"object\" && obj.isInner && target.isInner;\n },\n\n getTarget(uid) {\n return this._cache[uid];\n }\n};\n\nexport default Puid;\n","/**\n * Pool is the cache pool of the proton engine, it is very important.\n *\n * get(target, params, uid)\n * Class\n * uid = Puid.getId -> Puid save target cache\n * target.__puid = uid\n *\n * body\n * uid = Puid.getId -> Puid save target cache\n *\n *\n * expire(target)\n * cache[target.__puid] push target\n *\n */\nimport Util from \"../utils/Util\";\nimport Puid from \"../utils/Puid\";\n\nexport default class Pool {\n /**\n * @memberof! Proton#\n * @constructor\n * @alias Proton.Pool\n *\n * @todo add description\n * @todo add description of properties\n *\n * @property {Number} total\n * @property {Object} cache\n */\n constructor(num) {\n this.total = 0;\n this.cache = {};\n }\n\n /**\n * @todo add description\n *\n * @method get\n * @memberof Proton#Proton.Pool\n *\n * @param {Object|Function} target\n * @param {Object} [params] just add if `target` is a function\n *\n * @return {Object}\n */\n get(target, params, uid) {\n let p;\n uid = uid || target.__puid || Puid.getId(target);\n\n if (this.cache[uid] && this.cache[uid].length > 0) {\n p = this.cache[uid].pop();\n } else {\n p = this.createOrClone(target, params);\n }\n\n p.__puid = target.__puid || uid;\n return p;\n }\n\n /**\n * @todo add description\n *\n * @method set\n * @memberof Proton#Proton.Pool\n *\n * @param {Object} target\n *\n * @return {Object}\n */\n expire(target) {\n return this.getCache(target.__puid).push(target);\n }\n\n /**\n * Creates a new class instance\n *\n * @todo add more documentation\n *\n * @method create\n * @memberof Proton#Proton.Pool\n *\n * @param {Object|Function} target any Object or Function\n * @param {Object} [params] just add if `target` is a function\n *\n * @return {Object}\n */\n createOrClone(target, params) {\n this.total++;\n\n if (this.create) {\n return this.create(target, params);\n } else if (typeof target === \"function\") {\n return Util.classApply(target, params);\n } else {\n return target.clone();\n }\n }\n\n /**\n * @todo add description - what is in the cache?\n *\n * @method getCount\n * @memberof Proton#Proton.Pool\n *\n * @return {Number}\n */\n getCount() {\n let count = 0;\n for (let id in this.cache) count += this.cache[id].length;\n return count++;\n }\n\n /**\n * Destroyes all items from Pool.cache\n *\n * @method destroy\n * @memberof Proton#Proton.Pool\n */\n destroy() {\n for (let id in this.cache) {\n this.cache[id].length = 0;\n delete this.cache[id];\n }\n }\n\n /**\n * Returns Pool.cache\n *\n * @method getCache\n * @memberof Proton#Proton.Pool\n * @private\n *\n * @param {Number} uid the unique id\n *\n * @return {Object}\n */\n getCache(uid = \"default\") {\n if (!this.cache[uid]) this.cache[uid] = [];\n return this.cache[uid];\n }\n}\n","export default class Stats {\n constructor(proton) {\n this.proton = proton;\n this.container = null;\n this.type = 1;\n\n this.emitterIndex = 0;\n this.rendererIndex = 0;\n }\n\n update(style, body) {\n this.add(style, body);\n\n const emitter = this.getEmitter();\n const renderer = this.getRenderer();\n let str = \"\";\n\n switch (this.type) {\n case 2:\n str += \"emitter:\" + this.proton.emitters.length + \"
\";\n if (emitter) str += \"em speed:\" + emitter.emitSpeed + \"
\";\n if (emitter) str += \"pos:\" + this.getEmitterPos(emitter);\n break;\n\n case 3:\n if (emitter) str += \"initializes:\" + emitter.initializes.length + \"
\";\n if (emitter)\n str += '' + this.concatArr(emitter.initializes) + \"
\";\n if (emitter) str += \"behaviours:\" + emitter.behaviours.length + \"
\";\n if (emitter) str += '' + this.concatArr(emitter.behaviours) + \"
\";\n break;\n\n case 4:\n if (renderer) str += renderer.name + \"
\";\n if (renderer) str += \"body:\" + this.getCreatedNumber(renderer) + \"
\";\n break;\n\n default:\n str += \"particles:\" + this.proton.getCount() + \"
\";\n str += \"pool:\" + this.proton.pool.getCount() + \"
\";\n str += \"total:\" + this.proton.pool.total;\n }\n\n this.container.innerHTML = str;\n }\n\n add(style, body) {\n if (!this.container) {\n this.type = 1;\n\n this.container = document.createElement(\"div\");\n this.container.style.cssText = [\n \"position:absolute;bottom:0px;left:0;cursor:pointer;\",\n \"opacity:0.9;z-index:10000;padding:10px;font-size:12px;font-family:Helvetica,Arial,sans-serif;\",\n \"width:120px;height:50px;background-color:#002;color:#0ff;\"\n ].join(\"\");\n\n this.container.addEventListener(\n \"click\",\n e => {\n this.type++;\n if (this.type > 4) this.type = 1;\n },\n false\n );\n\n let bg, color;\n switch (style) {\n case 2:\n bg = \"#201\";\n color = \"#f08\";\n break;\n\n case 3:\n bg = \"#020\";\n color = \"#0f0\";\n break;\n\n default:\n bg = \"#002\";\n color = \"#0ff\";\n }\n\n this.container.style[\"background-color\"] = bg;\n this.container.style[\"color\"] = color;\n }\n\n if (!this.container.parentNode) {\n body = body || this.body || document.body;\n body.appendChild(this.container);\n }\n }\n\n getEmitter() {\n return this.proton.emitters[this.emitterIndex];\n }\n\n getRenderer() {\n return this.proton.renderers[this.rendererIndex];\n }\n\n concatArr(arr) {\n let result = \"\";\n if (!arr || !arr.length) return result;\n\n for (let i = 0; i < arr.length; i++) {\n result += (arr[i].name || \"\").substr(0, 1) + \".\";\n }\n\n return result;\n }\n\n getCreatedNumber(renderer) {\n return renderer.pool.total || (renderer.cpool && renderer.cpool.total) || 0;\n }\n\n getEmitterPos(e) {\n return Math.round(e.p.x) + \",\" + Math.round(e.p.y);\n }\n\n destroy() {\n if (this.container && this.container.parentNode) {\n const body = this.body || document.body;\n body.removeChild(this.container);\n }\n\n this.proton = null;\n this.container = null;\n }\n}\n","/*\n * EventDispatcher\n * This code reference since http://createjs.com/.\n *\n **/\n\nexport default class EventDispatcher {\n constructor() {\n this._listeners = null;\n }\n\n static bind(target) {\n target.prototype.dispatchEvent = EventDispatcher.prototype.dispatchEvent;\n target.prototype.hasEventListener = EventDispatcher.prototype.hasEventListener;\n target.prototype.addEventListener = EventDispatcher.prototype.addEventListener;\n target.prototype.removeEventListener = EventDispatcher.prototype.removeEventListener;\n target.prototype.removeAllEventListeners = EventDispatcher.prototype.removeAllEventListeners;\n }\n\n addEventListener(type, listener) {\n if (!this._listeners) {\n this._listeners = {};\n } else {\n this.removeEventListener(type, listener);\n }\n\n if (!this._listeners[type]) this._listeners[type] = [];\n this._listeners[type].push(listener);\n\n return listener;\n }\n\n removeEventListener(type, listener) {\n if (!this._listeners) return;\n if (!this._listeners[type]) return;\n\n const arr = this._listeners[type];\n const length = arr.length;\n\n for (let i = 0; i < length; i++) {\n if (arr[i] === listener) {\n if (length === 1) {\n delete this._listeners[type];\n }\n\n // allows for faster checks.\n else {\n arr.splice(i, 1);\n }\n\n break;\n }\n }\n }\n\n removeAllEventListeners(type) {\n if (!type) this._listeners = null;\n else if (this._listeners) delete this._listeners[type];\n }\n\n dispatchEvent(type, args) {\n let result = false;\n const listeners = this._listeners;\n\n if (type && listeners) {\n let arr = listeners[type];\n if (!arr) return result;\n\n // arr = arr.slice();\n // to avoid issues with items being removed or added during the dispatch\n\n let handler;\n let i = arr.length;\n while (i--) {\n handler = arr[i];\n result = result || handler(args);\n }\n }\n\n return !!result;\n }\n\n hasEventListener(type) {\n const listeners = this._listeners;\n return !!(listeners && listeners[type]);\n }\n}\n","const PI = 3.1415926;\nconst INFINITY = Infinity;\n\nconst MathUtil = {\n PI: PI,\n PIx2: PI * 2,\n PI_2: PI / 2,\n PI_180: PI / 180,\n N180_PI: 180 / PI,\n Infinity: -999,\n\n isInfinity(num) {\n return num === this.Infinity || num === INFINITY;\n },\n\n randomAToB(a, b, isInt = false) {\n if (!isInt) return a + Math.random() * (b - a);\n else return ((Math.random() * (b - a)) >> 0) + a;\n },\n\n randomFloating(center, f, isInt) {\n return this.randomAToB(center - f, center + f, isInt);\n },\n\n randomColor() {\n return \"#\" + (\"00000\" + ((Math.random() * 0x1000000) << 0).toString(16)).slice(-6);\n },\n\n randomZone(display) {},\n\n floor(num, k = 4) {\n const digits = Math.pow(10, k);\n return Math.floor(num * digits) / digits;\n },\n\n degreeTransform(a) {\n return (a * PI) / 180;\n },\n\n toColor16(num) {\n return `#${num.toString(16)}`;\n }\n};\n\nexport default MathUtil;\n","export default class Integration {\n constructor(type) {\n this.type = type;\n }\n\n calculate(particles, time, damping) {\n this.eulerIntegrate(particles, time, damping);\n }\n\n // Euler Integrate\n // https://rosettacode.org/wiki/Euler_method\n eulerIntegrate(particle, time, damping) {\n if (!particle.sleep) {\n particle.old.p.copy(particle.p);\n particle.old.v.copy(particle.v);\n\n particle.a.multiplyScalar(1 / particle.mass);\n particle.v.add(particle.a.multiplyScalar(time));\n particle.p.add(particle.old.v.multiplyScalar(time));\n\n if (damping) particle.v.multiplyScalar(damping);\n\n particle.a.clear();\n }\n }\n}\n","import Pool from \"./Pool\";\nimport Util from \"../utils/Util\";\nimport Stats from \"../debug/Stats\";\nimport EventDispatcher from \"../events/EventDispatcher\";\nimport MathUtil from \"../math/MathUtil\";\nimport Integration from \"../math/Integration\";\n\nexport default class Proton {\n static USE_CLOCK = false;\n\n // measure 1:100\n static MEASURE = 100;\n static EULER = \"euler\";\n static RK2 = \"runge-kutta2\";\n\n // event name\n static PARTICLE_CREATED = \"PARTICLE_CREATED\";\n static PARTICLE_UPDATE = \"PARTICLE_UPDATE\";\n static PARTICLE_SLEEP = \"PARTICLE_SLEEP\";\n static PARTICLE_DEAD = \"PARTICLE_DEAD\";\n\n static EMITTER_ADDED = \"EMITTER_ADDED\";\n static EMITTER_REMOVED = \"EMITTER_REMOVED\";\n\n static PROTON_UPDATE = \"PROTON_UPDATE\";\n static PROTON_UPDATE_AFTER = \"PROTON_UPDATE_AFTER\";\n static DEFAULT_INTERVAL = 0.0167;\n\n static amendChangeTabsBug = true;\n\n /**\n * The constructor to add emitters\n *\n * @constructor Proton\n *\n * @todo add more documentation of the single properties and parameters\n *\n * @param {Number | undefined} [integrationType=Proton.EULER]\n *\n * @property {String} [integrationType=Proton.EULER]\n * @property {Array} emitters All added emitter\n * @property {Array} renderers All added renderer\n * @property {Number} time The active time\n * @property {Number} oldtime The old time\n */\n constructor(integrationType) {\n this.emitters = [];\n this.renderers = [];\n\n this.time = 0;\n this.now = 0;\n this.then = 0;\n this.elapsed = 0;\n\n this.stats = new Stats(this);\n this.pool = new Pool(80);\n\n this.integrationType = Util.initValue(integrationType, Proton.EULER);\n this.integrator = new Integration(this.integrationType);\n\n this._fps = \"auto\";\n this._interval = Proton.DEFAULT_INTERVAL;\n }\n\n /**\n * Sets the frames per second (FPS) for the Proton system.\n * @param {number|string} fps - The desired FPS. Use \"auto\" for default behavior, or a number for a specific FPS.\n */\n set fps(fps) {\n this._fps = fps;\n this._interval = fps === \"auto\" ? Proton.DEFAULT_INTERVAL : MathUtil.floor(1 / fps, 7);\n }\n\n /**\n * Gets the current frames per second (FPS) setting.\n * @returns {number|string} The current FPS setting. Returns \"auto\" if set to default, or a number representing the specific FPS.\n */\n get fps() {\n return this._fps;\n }\n\n /**\n * add a type of Renderer\n *\n * @method addRenderer\n * @memberof Proton\n * @instance\n *\n * @param {Renderer} render\n */\n addRenderer(render) {\n render.init(this);\n this.renderers.push(render);\n }\n\n /**\n * @name add a type of Renderer\n *\n * @method addRenderer\n * @param {Renderer} render\n */\n removeRenderer(render) {\n const index = this.renderers.indexOf(render);\n this.renderers.splice(index, 1);\n render.remove(this);\n }\n\n /**\n * add the Emitter\n *\n * @method addEmitter\n * @memberof Proton\n * @instance\n *\n * @param {Emitter} emitter\n */\n addEmitter(emitter) {\n this.emitters.push(emitter);\n emitter.parent = this;\n\n this.dispatchEvent(Proton.EMITTER_ADDED, emitter);\n }\n\n /**\n * Removes an Emitter\n *\n * @method removeEmitter\n * @memberof Proton\n * @instance\n *\n * @param {Proton.Emitter} emitter\n */\n removeEmitter(emitter) {\n const index = this.emitters.indexOf(emitter);\n this.emitters.splice(index, 1);\n emitter.parent = null;\n\n this.dispatchEvent(Proton.EMITTER_REMOVED, emitter);\n }\n\n /**\n * Updates all added emitters\n *\n * @method update\n * @memberof Proton\n * @instance\n */\n update() {\n // 'auto' is the default browser refresh rate, the vast majority is 60fps\n if (this._fps === \"auto\") {\n this.dispatchEvent(Proton.PROTON_UPDATE);\n\n if (Proton.USE_CLOCK) {\n if (!this.then) this.then = new Date().getTime();\n this.now = new Date().getTime();\n this.elapsed = (this.now - this.then) * 0.001;\n // Fix bugs such as chrome browser switching tabs causing excessive time difference\n this.amendChangeTabsBug();\n\n if (this.elapsed > 0) this.emittersUpdate(this.elapsed);\n this.then = this.now;\n } else {\n this.emittersUpdate(Proton.DEFAULT_INTERVAL);\n }\n\n this.dispatchEvent(Proton.PROTON_UPDATE_AFTER);\n }\n\n // If the fps frame rate is set\n else {\n if (!this.then) this.then = new Date().getTime();\n this.now = new Date().getTime();\n this.elapsed = (this.now - this.then) * 0.001;\n\n if (this.elapsed > this._interval) {\n this.dispatchEvent(Proton.PROTON_UPDATE);\n this.emittersUpdate(this._interval);\n // https://stackoverflow.com/questions/19764018/controlling-fps-with-requestanimationframe\n this.then = this.now - (this.elapsed % this._interval) * 1000;\n this.dispatchEvent(Proton.PROTON_UPDATE_AFTER);\n }\n }\n }\n\n emittersUpdate(elapsed) {\n let i = this.emitters.length;\n while (i--) this.emitters[i].update(elapsed);\n }\n\n /**\n * @todo add description\n *\n * @method amendChangeTabsBug\n * @memberof Proton\n * @instance\n */\n amendChangeTabsBug() {\n if (!Proton.amendChangeTabsBug) return;\n if (this.elapsed > 0.5) {\n this.then = new Date().getTime();\n this.elapsed = 0;\n }\n }\n\n /**\n * Counts all particles from all emitters\n *\n * @method getCount\n * @memberof Proton\n * @instance\n */\n getCount() {\n let total = 0;\n let i = this.emitters.length;\n\n while (i--) total += this.emitters[i].particles.length;\n return total;\n }\n\n getAllParticles() {\n let particles = [];\n let i = this.emitters.length;\n\n while (i--) particles = particles.concat(this.emitters[i].particles);\n return particles;\n }\n\n destroyAllEmitters() {\n Util.destroyAll(this.emitters);\n }\n\n /**\n * Destroys everything related to this Proton instance. This includes all emitters, and all properties\n *\n * @method destroy\n * @memberof Proton\n * @instance\n */\n destroy(remove = false) {\n const destroyOther = () => {\n this.time = 0;\n this.then = 0;\n this.pool.destroy();\n this.stats.destroy();\n\n Util.destroyAll(this.emitters);\n Util.destroyAll(this.renderers, this.getAllParticles());\n\n this.integrator = null;\n this.renderers = null;\n this.emitters = null;\n this.stats = null;\n this.pool = null;\n };\n\n if (remove) {\n setTimeout(destroyOther, 200);\n } else {\n destroyOther();\n }\n }\n}\n\nEventDispatcher.bind(Proton);\n","export default class Rgb {\n constructor(r = 255, g = 255, b = 255) {\n this.r = r;\n this.g = g;\n this.b = b;\n }\n\n reset() {\n this.r = 255;\n this.g = 255;\n this.b = 255;\n }\n}\n","import Util from \"../utils/Util\";\nimport MathUtil from \"../math/MathUtil\";\n\n/**\n * Represents a span of values or an array.\n */\nexport default class Span {\n /**\n * @type {boolean}\n * @private\n */\n isArray;\n\n /**\n * @type {number|number[]}\n * @private\n */\n a;\n\n /**\n * @type {number}\n * @private\n */\n b;\n\n /**\n * @type {boolean}\n * @private\n */\n center;\n\n /**\n * Creates a new Span instance.\n * @param {number|number[]} a - The first value or an array of values.\n * @param {number} [b] - The second value (if a is not an array).\n * @param {boolean} [center=false] - Whether to use center-based calculation.\n */\n constructor(a, b, center) {\n if (Util.isArray(a)) {\n this.isArray = true;\n this.a = a;\n } else {\n this.isArray = false;\n this.a = Util.initValue(a, 1);\n this.b = Util.initValue(b, this.a);\n this.center = Util.initValue(center, false);\n }\n }\n\n /**\n * Gets a value from the span.\n * @param {boolean} [isInt=false] - Whether to return an integer value.\n * @returns {number} A random value from the span.\n */\n getValue(isInt = false) {\n if (this.isArray) {\n return Util.getRandFromArray(this.a);\n } else {\n if (!this.center) {\n return MathUtil.randomAToB(this.a, this.b, isInt);\n } else {\n return MathUtil.randomFloating(this.a, this.b, isInt);\n }\n }\n }\n\n /**\n * Returns a new Span object.\n * @param {*|Span} a - The first value or a Span object.\n * @param {*} [b] - The second value.\n * @param {*} [c] - The third value.\n * @returns {Span} A new Span instance.\n */\n static setSpanValue(a, b, c) {\n if (a instanceof Span) {\n return a;\n } else {\n if (b === undefined) {\n return new Span(a);\n } else {\n if (c === undefined) return new Span(a, b);\n else return new Span(a, b, c);\n }\n }\n }\n\n /**\n * Returns the value from a Span, if the param is not a Span it will return the given parameter.\n * @param {*|Span} pan - The value or Span to get the value from.\n * @returns {*} The value of Span OR the parameter if it is not a Span.\n */\n static getSpanValue(pan) {\n return pan instanceof Span ? pan.getValue() : pan;\n }\n}\n","import Span from \"../math/Span\";\n\nexport default {\n hasProp(target, key) {\n if (!target) return false;\n return target[key] !== undefined;\n // return obj.hasOwnProperty(key);\n },\n\n /**\n * set the prototype in a given prototypeObject\n *\n * @memberof Proton#Proton.Util\n * @method setProp\n *\n * @todo add description for param `target`\n * @todo translate desription from chinese to english\n *\n * @param {Object} target\n * @param {Object} prototypeObject An object of single prototypes\n *\n * @return {Object} target\n */\n setProp(target, props) {\n for (let prop in props) {\n if (target.hasOwnProperty(prop)) {\n target[prop] = Span.getSpanValue(props[prop]);\n }\n }\n\n return target;\n },\n\n /**\n * @memberof Proton#Proton.Util\n * @method setVectorVal\n *\n * @todo add description for param `target`\n * @todo add description for param `conf`\n * @todo add description for function\n *\n * @param {Object} target\n * @param {Object} conf\n */\n setVectorVal(particle, conf = null) {\n if (!conf) return;\n\n if (this.hasProp(conf, \"x\")) particle.p.x = conf[\"x\"];\n if (this.hasProp(conf, \"y\")) particle.p.y = conf[\"y\"];\n\n if (this.hasProp(conf, \"vx\")) particle.v.x = conf[\"vx\"];\n if (this.hasProp(conf, \"vy\")) particle.v.y = conf[\"vy\"];\n\n if (this.hasProp(conf, \"ax\")) particle.a.x = conf[\"ax\"];\n if (this.hasProp(conf, \"ay\")) particle.a.y = conf[\"ay\"];\n\n if (this.hasProp(conf, \"p\")) particle.p.copy(conf[\"p\"]);\n if (this.hasProp(conf, \"v\")) particle.v.copy(conf[\"v\"]);\n if (this.hasProp(conf, \"a\")) particle.a.copy(conf[\"a\"]);\n\n if (this.hasProp(conf, \"position\")) particle.p.copy(conf[\"position\"]);\n if (this.hasProp(conf, \"velocity\")) particle.v.copy(conf[\"velocity\"]);\n if (this.hasProp(conf, \"accelerate\")) particle.a.copy(conf[\"accelerate\"]);\n }\n};\n","import MathUtil from \"./MathUtil\";\n\nexport default {\n easeLinear(value) {\n return value;\n },\n\n easeInQuad(value) {\n return Math.pow(value, 2);\n },\n\n easeOutQuad(value) {\n return -(Math.pow(value - 1, 2) - 1);\n },\n\n easeInOutQuad(value) {\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 2);\n\n return -0.5 * ((value -= 2) * value - 2);\n },\n\n easeInCubic(value) {\n return Math.pow(value, 3);\n },\n\n easeOutCubic(value) {\n return Math.pow(value - 1, 3) + 1;\n },\n\n easeInOutCubic(value) {\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 3);\n\n return 0.5 * (Math.pow(value - 2, 3) + 2);\n },\n\n easeInQuart(value) {\n return Math.pow(value, 4);\n },\n\n easeOutQuart(value) {\n return -(Math.pow(value - 1, 4) - 1);\n },\n\n easeInOutQuart(value) {\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 4);\n\n return -0.5 * ((value -= 2) * Math.pow(value, 3) - 2);\n },\n\n easeInSine(value) {\n return -Math.cos(value * MathUtil.PI_2) + 1;\n },\n\n easeOutSine(value) {\n return Math.sin(value * MathUtil.PI_2);\n },\n\n easeInOutSine(value) {\n return -0.5 * (Math.cos(Math.PI * value) - 1);\n },\n\n easeInExpo(value) {\n return value === 0 ? 0 : Math.pow(2, 10 * (value - 1));\n },\n\n easeOutExpo(value) {\n return value === 1 ? 1 : -Math.pow(2, -10 * value) + 1;\n },\n\n easeInOutExpo(value) {\n if (value === 0) return 0;\n\n if (value === 1) return 1;\n\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(2, 10 * (value - 1));\n\n return 0.5 * (-Math.pow(2, -10 * --value) + 2);\n },\n\n easeInCirc(value) {\n return -(Math.sqrt(1 - value * value) - 1);\n },\n\n easeOutCirc(value) {\n return Math.sqrt(1 - Math.pow(value - 1, 2));\n },\n\n easeInOutCirc(value) {\n if ((value /= 0.5) < 1) return -0.5 * (Math.sqrt(1 - value * value) - 1);\n return 0.5 * (Math.sqrt(1 - (value -= 2) * value) + 1);\n },\n\n easeInBack(value) {\n let s = 1.70158;\n return value * value * ((s + 1) * value - s);\n },\n\n easeOutBack(value) {\n let s = 1.70158;\n return (value = value - 1) * value * ((s + 1) * value + s) + 1;\n },\n\n easeInOutBack(value) {\n let s = 1.70158;\n if ((value /= 0.5) < 1) return 0.5 * (value * value * (((s *= 1.525) + 1) * value - s));\n return 0.5 * ((value -= 2) * value * (((s *= 1.525) + 1) * value + s) + 2);\n },\n\n getEasing(ease) {\n if (typeof ease === \"function\") return ease;\n else return this[ease] || this.easeLinear;\n }\n};\n","import MathUtil from \"../math/MathUtil\";\n\nexport default class Vector2D {\n /** @type {number} */\n x;\n\n /** @type {number} */\n y;\n\n /**\n * Creates a new Vector2D instance.\n * @param {number} [x=0] - The x coordinate.\n * @param {number} [y=0] - The y coordinate.\n */\n constructor(x, y) {\n this.x = x || 0;\n this.y = y || 0;\n }\n\n /**\n * Sets the x and y components of this vector.\n * @param {number} x - The x coordinate.\n * @param {number} y - The y coordinate.\n * @returns {Vector2D} This vector.\n */\n set(x, y) {\n this.x = x;\n this.y = y;\n return this;\n }\n\n /**\n * Sets the x component of this vector.\n * @param {number} x - The x coordinate.\n * @returns {Vector2D} This vector.\n */\n setX(x) {\n this.x = x;\n return this;\n }\n\n /**\n * Sets the y component of this vector.\n * @param {number} y - The y coordinate.\n * @returns {Vector2D} This vector.\n */\n setY(y) {\n this.y = y;\n return this;\n }\n\n /**\n * Calculates the gradient (angle) of this vector.\n * @returns {number} The gradient in radians.\n */\n getGradient() {\n if (this.x !== 0) return Math.atan2(this.y, this.x);\n else if (this.y > 0) return MathUtil.PI_2;\n else if (this.y < 0) return -MathUtil.PI_2;\n }\n\n /**\n * Copies the values of another vector to this one.\n * @param {Vector2D} v - The vector to copy from.\n * @returns {Vector2D} This vector.\n */\n copy(v) {\n this.x = v.x;\n this.y = v.y;\n\n return this;\n }\n\n /**\n * Adds another vector to this one.\n * @param {Vector2D} v - The vector to add.\n * @param {Vector2D} [w] - An optional second vector to add.\n * @returns {Vector2D} This vector.\n */\n add(v, w) {\n if (w !== undefined) {\n return this.addVectors(v, w);\n }\n\n this.x += v.x;\n this.y += v.y;\n\n return this;\n }\n\n /**\n * Adds scalar values to this vector's components.\n * @param {number} a - Value to add to x.\n * @param {number} b - Value to add to y.\n * @returns {Vector2D} This vector.\n */\n addXY(a, b) {\n this.x += a;\n this.y += b;\n\n return this;\n }\n\n /**\n * Adds two vectors and sets the result to this vector.\n * @param {Vector2D} a - The first vector to add.\n * @param {Vector2D} b - The second vector to add.\n * @returns {Vector2D} This vector.\n */\n addVectors(a, b) {\n this.x = a.x + b.x;\n this.y = a.y + b.y;\n\n return this;\n }\n\n /**\n * Subtracts another vector from this one.\n * @param {Vector2D} v - The vector to subtract.\n * @param {Vector2D} [w] - An optional second vector to subtract.\n * @returns {Vector2D} This vector.\n */\n sub(v, w) {\n if (w !== undefined) {\n return this.subVectors(v, w);\n }\n\n this.x -= v.x;\n this.y -= v.y;\n\n return this;\n }\n\n /**\n * Subtracts one vector from another and sets the result to this vector.\n * @param {Vector2D} a - The vector to subtract from.\n * @param {Vector2D} b - The vector to subtract.\n * @returns {Vector2D} This vector.\n */\n subVectors(a, b) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n\n return this;\n }\n\n /**\n * Divides this vector by a scalar.\n * @param {number} s - The scalar to divide by.\n * @returns {Vector2D} This vector.\n */\n divideScalar(s) {\n if (s !== 0) {\n this.x /= s;\n this.y /= s;\n } else {\n this.set(0, 0);\n }\n\n return this;\n }\n\n /**\n * Multiplies this vector by a scalar.\n * @param {number} s - The scalar to multiply by.\n * @returns {Vector2D} This vector.\n */\n multiplyScalar(s) {\n this.x *= s;\n this.y *= s;\n\n return this;\n }\n\n /**\n * Negates this vector (inverts its direction).\n * @returns {Vector2D} This vector.\n */\n negate() {\n return this.multiplyScalar(-1);\n }\n\n /**\n * Calculates the dot product of this vector with another.\n * @param {Vector2D} v - The other vector.\n * @returns {number} The dot product.\n */\n dot(v) {\n return this.x * v.x + this.y * v.y;\n }\n\n /**\n * Calculates the squared length of this vector.\n * @returns {number} The squared length.\n */\n lengthSq() {\n return this.x * this.x + this.y * this.y;\n }\n\n /**\n * Calculates the length of this vector.\n * @returns {number} The length.\n */\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n\n /**\n * Normalizes this vector (makes it unit length).\n * @returns {Vector2D} This vector.\n */\n normalize() {\n return this.divideScalar(this.length());\n }\n\n /**\n * Calculates the distance to another vector.\n * @param {Vector2D} v - The other vector.\n * @returns {number} The distance.\n */\n distanceTo(v) {\n return Math.sqrt(this.distanceToSquared(v));\n }\n\n /**\n * Rotates this vector by an angle.\n * @param {number} tha - The angle to rotate by (in radians).\n * @returns {Vector2D} This vector.\n */\n rotate(tha) {\n const x = this.x;\n const y = this.y;\n\n this.x = x * Math.cos(tha) + y * Math.sin(tha);\n this.y = -x * Math.sin(tha) + y * Math.cos(tha);\n\n return this;\n }\n\n /**\n * Calculates the squared distance to another vector.\n * @param {Vector2D} v - The other vector.\n * @returns {number} The squared distance.\n */\n distanceToSquared(v) {\n const dx = this.x - v.x;\n const dy = this.y - v.y;\n\n return dx * dx + dy * dy;\n }\n\n /**\n * Linearly interpolates this vector toward another vector.\n * @param {Vector2D} v - The target vector.\n * @param {number} alpha - The interpolation factor (0-1).\n * @returns {Vector2D} This vector.\n */\n lerp(v, alpha) {\n this.x += (v.x - this.x) * alpha;\n this.y += (v.y - this.y) * alpha;\n\n return this;\n }\n\n /**\n * Checks if this vector is equal to another vector.\n * @param {Vector2D} v - The other vector.\n * @returns {boolean} True if the vectors are equal, false otherwise.\n */\n equals(v) {\n return v.x === this.x && v.y === this.y;\n }\n\n /**\n * Sets this vector to zero.\n * @returns {Vector2D} This vector.\n */\n clear() {\n this.x = 0.0;\n this.y = 0.0;\n return this;\n }\n\n /**\n * Creates a new vector with the same x and y values as this one.\n * @returns {Vector2D} A new Vector2D instance.\n */\n clone() {\n return new Vector2D(this.x, this.y);\n }\n}\n","import Rgb from \"../utils/Rgb\";\nimport Puid from \"../utils/Puid\";\nimport Util from \"../utils/Util\";\nimport PropUtil from \"../utils/PropUtil\";\nimport ease from \"../math/ease\";\nimport Vector2D from \"../math/Vector2D\";\nimport MathUtil from \"../math/MathUtil\";\n\n/**\n * Represents a particle in a particle system.\n * @class Particle\n */\nexport default class Particle {\n /** @type {string} The unique identifier of the particle */\n id = \"\";\n\n /** @type {{p:Vector2D,v:Vector2D,a:Vector2D}} Old state of the particle */\n old = null;\n\n /** @type {object} Custom data associated with the particle */\n data = null;\n\n /** @type {Behaviour[]} Array of behaviours applied to the particle */\n behaviours = null;\n\n /** @type {Vector2D} Current position of the particle */\n p = null;\n\n /** @type {Vector2D} Current velocity of the particle */\n v = null;\n\n /** @type {Vector2D} Current acceleration of the particle */\n a = null;\n\n /** @type {Rgb} Color of the particle */\n rgb = null;\n\n /**\n * Creates a new Particle instance.\n * @param {Object} [conf] Configuration object for the particle\n */\n constructor(conf) {\n this.name = \"Particle\";\n this.id = Puid.id(this.name);\n this.old = {};\n this.data = {};\n this.behaviours = [];\n\n this.p = new Vector2D();\n this.v = new Vector2D();\n this.a = new Vector2D();\n this.old.p = new Vector2D();\n this.old.v = new Vector2D();\n this.old.a = new Vector2D();\n\n this.rgb = new Rgb();\n this.reset();\n conf && PropUtil.setProp(this, conf);\n }\n\n /**\n * Gets the direction of the particle's movement in degrees.\n * @returns {number} The direction in degrees\n */\n getDirection() {\n return Math.atan2(this.v.x, -this.v.y) * MathUtil.N180_PI;\n }\n\n /**\n * Resets the particle to its initial state.\n * @returns {Particle} The particle instance\n */\n reset() {\n this.life = Infinity;\n this.age = 0;\n\n this.dead = false;\n this.sleep = false;\n this.body = null;\n this.sprite = null;\n this.parent = null;\n\n this.energy = 1; // Energy Loss\n this.mass = 1;\n this.radius = 10;\n this.alpha = 1;\n this.scale = 1;\n this.rotation = 0;\n this.color = null;\n\n this.p.set(0, 0);\n this.v.set(0, 0);\n this.a.set(0, 0);\n this.old.p.set(0, 0);\n this.old.v.set(0, 0);\n this.old.a.set(0, 0);\n this.easing = ease.easeLinear;\n\n this.rgb.reset();\n Util.emptyObject(this.data);\n this.removeAllBehaviours();\n\n return this;\n }\n\n /**\n * Updates the particle's state.\n * @param {number} time The time elapsed since the last update\n * @param {number} index The index of the particle in its parent system\n */\n update(time, index) {\n if (!this.sleep) {\n this.age += time;\n this.applyBehaviours(time, index);\n }\n\n if (this.age < this.life) {\n const scale = this.easing(this.age / this.life);\n this.energy = Math.max(1 - scale, 0);\n } else {\n this.destroy();\n }\n }\n\n /**\n * Applies all behaviours attached to the particle.\n * @param {number} time The time elapsed since the last update\n * @param {number} index The index of the particle in its parent system\n */\n applyBehaviours(time, index) {\n const length = this.behaviours.length;\n let i;\n\n for (i = 0; i < length; i++) {\n this.behaviours[i] && this.behaviours[i].applyBehaviour(this, time, index);\n }\n }\n\n /**\n * Adds a behaviour to the particle.\n * @param {Behaviour} behaviour The behaviour to add\n */\n addBehaviour(behaviour) {\n this.behaviours.push(behaviour);\n\n if (behaviour.hasOwnProperty(\"parents\")) behaviour.parents.push(this);\n behaviour.initialize(this);\n }\n\n /**\n * Adds multiple behaviours to the particle.\n * @param {Behaviour[]} behaviours An array of behaviours to add\n */\n addBehaviours(behaviours) {\n const length = behaviours.length;\n let i;\n\n for (i = 0; i < length; i++) {\n this.addBehaviour(behaviours[i]);\n }\n }\n\n /**\n * Removes a specific behaviour from the particle.\n * @param {Behaviour} behaviour The behaviour to remove\n */\n removeBehaviour(behaviour) {\n const index = this.behaviours.indexOf(behaviour);\n\n if (index > -1) {\n const behaviour = this.behaviours.splice(index, 1);\n behaviour.parents = null;\n }\n }\n\n /**\n * Removes all behaviours from the particle.\n */\n removeAllBehaviours() {\n Util.emptyArray(this.behaviours);\n }\n\n /**\n * Destroys the particle, removing all behaviours and setting it as dead.\n */\n destroy() {\n this.removeAllBehaviours();\n this.energy = 0;\n this.dead = true;\n this.parent = null;\n }\n}\n","export default {\n /**\n * @typedef {Object} rgbObject\n * @property {Number} r red value\n * @property {Number} g green value\n * @property {Number} b blue value\n */\n /**\n * converts a hex value to a rgb object\n *\n * @memberof Proton#Proton.Util\n * @method hexToRgb\n *\n * @param {String} h any hex value, e.g. #000000 or 000000 for black\n *\n * @return {rgbObject}\n */\n hexToRgb(h) {\n const hex16 = h.charAt(0) === \"#\" ? h.substring(1, 7) : h;\n const r = parseInt(hex16.substring(0, 2), 16);\n const g = parseInt(hex16.substring(2, 4), 16);\n const b = parseInt(hex16.substring(4, 6), 16);\n\n return { r, g, b };\n },\n\n /**\n * converts a rgb value to a rgb string\n *\n * @memberof Proton#Proton.Util\n * @method rgbToHex\n *\n * @param {Object | Proton.hexToRgb} rgb a rgb object like in {@link Proton#Proton.}\n *\n * @return {String} rgb()\n */\n rgbToHex(rbg) {\n return `rgb(${rbg.r}, ${rbg.g}, ${rbg.b})`;\n },\n\n getHex16FromParticle(p) {\n return Number(p.rgb.r) * 65536 + Number(p.rgb.g) * 256 + Number(p.rgb.b);\n }\n};\n","import Vector2D from \"./Vector2D\";\n\nexport default class Polar2D {\n constructor(r, tha) {\n this.r = Math.abs(r) || 0;\n this.tha = tha || 0;\n }\n\n set(r, tha) {\n this.r = r;\n this.tha = tha;\n return this;\n }\n\n setR(r) {\n this.r = r;\n return this;\n }\n\n setTha(tha) {\n this.tha = tha;\n return this;\n }\n\n copy(p) {\n this.r = p.r;\n this.tha = p.tha;\n return this;\n }\n\n toVector() {\n return new Vector2D(this.getX(), this.getY());\n }\n\n getX() {\n return this.r * Math.sin(this.tha);\n }\n\n getY() {\n return -this.r * Math.cos(this.tha);\n }\n\n normalize() {\n this.r = 1;\n return this;\n }\n\n equals(v) {\n return v.r === this.r && v.tha === this.tha;\n }\n\n clear() {\n this.r = 0.0;\n this.tha = 0.0;\n return this;\n }\n\n clone() {\n return new Polar2D(this.r, this.tha);\n }\n}\n","const Mat3 = {\n create(mat3) {\n const mat = new Float32Array(9);\n if (mat3) this.set(mat3, mat);\n\n return mat;\n },\n\n set(mat1, mat2) {\n for (let i = 0; i < 9; i++) mat2[i] = mat1[i];\n\n return mat2;\n },\n\n multiply(mat, mat2, mat3) {\n let a00 = mat[0],\n a01 = mat[1],\n a02 = mat[2],\n a10 = mat[3],\n a11 = mat[4],\n a20 = mat[6],\n a21 = mat[7],\n b00 = mat2[0],\n b01 = mat2[1],\n b02 = mat2[2],\n b10 = mat2[3],\n b11 = mat2[4],\n b20 = mat2[6],\n b21 = mat2[7];\n\n mat3[0] = b00 * a00 + b01 * a10;\n mat3[1] = b00 * a01 + b01 * a11;\n mat3[2] = a02 * b02;\n mat3[3] = b10 * a00 + b11 * a10;\n mat3[4] = b10 * a01 + b11 * a11;\n mat3[6] = b20 * a00 + b21 * a10 + a20;\n mat3[7] = b20 * a01 + b21 * a11 + a21;\n\n return mat3;\n },\n\n inverse(mat, mat3) {\n let a00 = mat[0],\n a01 = mat[1],\n a10 = mat[3],\n a11 = mat[4],\n a20 = mat[6],\n a21 = mat[7],\n b01 = a11,\n b11 = -a10,\n b21 = a21 * a10 - a11 * a20,\n d = a00 * b01 + a01 * b11,\n id;\n\n id = 1 / d;\n mat3[0] = b01 * id;\n mat3[1] = -a01 * id;\n mat3[3] = b11 * id;\n mat3[4] = a00 * id;\n mat3[6] = b21 * id;\n mat3[7] = (-a21 * a00 + a01 * a20) * id;\n\n return mat3;\n },\n\n multiplyVec2(m, vec, mat3) {\n let x = vec[0],\n y = vec[1];\n\n mat3[0] = x * m[0] + y * m[3] + m[6];\n mat3[1] = x * m[1] + y * m[4] + m[7];\n\n return mat3;\n }\n};\n\nexport default Mat3;\n","import Span from \"./Span\";\nimport Util from \"../utils/Util\";\nimport MathUtil from \"./MathUtil\";\n\n/**\n * Represents an ArraySpan, a subclass of Span that works with arrays.\n * @extends Span\n */\nexport default class ArraySpan extends Span {\n /**\n * Creates an instance of ArraySpan.\n * @param {Array|*|any} arr - The array or value to be converted to an array.\n */\n constructor(arr) {\n super();\n this._arr = Util.toArray(arr);\n }\n\n /**\n * Gets a random value from the array.\n * If the value is \"random\" or \"Random\", it returns a random color.\n * @returns {*} A random value from the array or a random color.\n */\n getValue() {\n const val = Util.getRandFromArray(this._arr);\n return val === \"random\" || val === \"Random\" ? MathUtil.randomColor() : val;\n }\n\n /**\n * Creates an ArraySpan instance from the given array.\n * If the input is already an ArraySpan instance, it returns the input.\n * @static\n * @param {Array|ArraySpan|any} arr - The array or ArraySpan instance.\n * @returns {ArraySpan|null} A new ArraySpan instance or null if the input is falsy.\n */\n static createArraySpan(arr) {\n if (!arr) return null;\n\n if (arr instanceof ArraySpan) return arr;\n else return new ArraySpan(arr);\n }\n}\n","export default class Rectangle {\n constructor(x, y, w, h) {\n this.x = x;\n this.y = y;\n\n this.width = w;\n this.height = h;\n\n this.bottom = this.y + this.height;\n this.right = this.x + this.width;\n }\n\n contains(x, y) {\n if (x <= this.right && x >= this.x && y <= this.bottom && y >= this.y) return true;\n else return false;\n }\n}\n","import Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\n\n/**\n * Rate class for controlling particle emission rate.\n */\nexport default class Rate {\n /**\n * @type {Span}\n * @private\n */\n numPan;\n\n /**\n * @type {Span}\n * @private\n */\n timePan;\n\n /**\n * @type {number}\n * @private\n */\n startTime;\n\n /**\n * @type {number}\n * @private\n */\n nextTime;\n\n /**\n * Creates a new Rate instance.\n * The number of particles per second emission (a [particle]/b [s]).\n * @param {Array|number|Span} [numpan=1] - The number of particles for each emission.\n * @param {Array|number|Span} [timepan=1] - The time interval between each emission.\n * @example\n * // Create a rate of 10-20 particles every 0.1-0.25 seconds\n * new Rate(new Span(10, 20), new Span(0.1, 0.25));\n */\n constructor(numpan, timepan) {\n this.numPan = Span.setSpanValue(Util.initValue(numpan, 1));\n this.timePan = Span.setSpanValue(Util.initValue(timepan, 1));\n\n this.startTime = 0;\n this.nextTime = 0;\n this.init();\n }\n\n /**\n * Initializes the rate.\n * @private\n */\n init() {\n this.startTime = 0;\n this.nextTime = this.timePan.getValue();\n }\n\n /**\n * Gets the number of particles to emit based on the elapsed time.\n * @param {number} time - The elapsed time since the last update.\n * @returns {number} The number of particles to emit.\n */\n getValue(time) {\n this.startTime += time;\n\n if (this.startTime >= this.nextTime) {\n this.startTime = 0;\n this.nextTime = this.timePan.getValue();\n\n if (this.numPan.b === 1) {\n if (this.numPan.getValue(false) > 0.5) return 1;\n else return 0;\n } else {\n return this.numPan.getValue(true);\n }\n }\n\n return 0;\n }\n}\n","export default class Initialize {\n reset() {}\n\n init(emitter, particle) {\n if (particle) {\n this.initialize(particle);\n } else {\n this.initialize(emitter);\n }\n }\n\n // sub class init\n initialize(target) {}\n}\n","import Span from \"../math/Span\";\nimport Initialize from \"./Initialize\";\n\n/**\n * Life class for initializing particle lifetime.\n * @extends Initialize\n */\nexport default class Life extends Initialize {\n /**\n * @type {Span}\n * @private\n */\n lifePan;\n\n /**\n * @type {string}\n */\n name;\n\n /**\n * Creates a new Life instance.\n * @param {number|Span} a - The lifetime value or the lower bound of the lifetime range.\n * @param {number} [b] - The upper bound of the lifetime range (if a is a number).\n * @param {boolean} [c] - Whether to use center-based calculation (if a and b are numbers).\n */\n constructor(a, b, c) {\n super();\n\n this.lifePan = Span.setSpanValue(a, b, c);\n this.name = \"Life\";\n }\n\n /**\n * Initializes the lifetime of a target particle.\n * @param {object} target - The target particle to initialize.\n */\n initialize(target) {\n if (this.lifePan.a === Infinity) target.life = Infinity;\n else target.life = this.lifePan.getValue();\n }\n}\n","import Vector2D from \"../math/Vector2D\";\n\nexport default class Zone {\n constructor() {\n this.vector = new Vector2D(0, 0);\n this.random = 0;\n this.crossType = \"dead\";\n this.alert = true;\n }\n\n getPosition() {}\n\n crossing(particle) {}\n\n destroy() {\n this.vector = null;\n }\n}\n","import Zone from \"./Zone\";\n\n/**\n * Represents a point zone in a 2D space.\n * @extends Zone\n */\nexport default class PointZone extends Zone {\n /**\n * Creates a new PointZone.\n * @param {number} x - The x-coordinate of the point.\n * @param {number} y - The y-coordinate of the point.\n */\n constructor(x, y) {\n super();\n\n /**\n * The x-coordinate of the point.\n * @type {number}\n */\n this.x = x;\n\n /**\n * The y-coordinate of the point.\n * @type {number}\n */\n this.y = y;\n }\n\n /**\n * Gets the position of the point.\n * @returns {Object} An object representing the position vector.\n */\n getPosition() {\n this.vector.x = this.x;\n this.vector.y = this.y;\n\n return this.vector;\n }\n\n /**\n * This method is not supported for PointZone.\n * @param {Object} particle - The particle object (unused).\n */\n crossing(particle) {\n if (this.alert) {\n console.error(\"Sorry, PointZone does not support crossing method!\");\n this.alert = false;\n }\n }\n}\n","import Util from \"../utils/Util\";\nimport PointZone from \"../zone/PointZone\";\nimport Initialize from \"./Initialize\";\n\n/**\n * Position class for initializing particle positions.\n * @extends Initialize\n */\nexport default class Position extends Initialize {\n /**\n * @type {PointZone|any}\n * @private\n */\n zone;\n\n /**\n * @type {string}\n */\n name;\n\n /**\n * Creates a new Position instance.\n * @param {PointZone|any} [zone] - The zone to use for positioning. Defaults to a new PointZone if not provided.\n */\n constructor(zone) {\n super();\n this.zone = Util.initValue(zone, new PointZone());\n this.name = \"Position\";\n }\n\n /**\n * Resets this initializer's parameters.\n * @param {PointZone|any} [zone] - The new zone to use for positioning. Defaults to a new PointZone if not provided.\n */\n reset(zone) {\n this.zone = Util.initValue(zone, new PointZone());\n }\n\n /**\n * Initializes the particle's position.\n * @param {object} target - The particle to initialize.\n * @param {object} target.p - The particle's position object.\n * @param {number} target.p.x - The particle's x coordinate.\n * @param {number} target.p.y - The particle's y coordinate.\n */\n initialize(target) {\n this.zone.getPosition();\n\n target.p.x = this.zone.vector.x;\n target.p.y = this.zone.vector.y;\n }\n}\n","import Proton from \"../core/Proton\";\nimport Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\nimport Initialize from \"./Initialize\";\nimport Polar2D from \"../math/Polar2D\";\nimport MathUtil from \"../math/MathUtil\";\n\n/**\n * Velocity class for initializing particle velocities.\n * @extends Initialize\n */\nexport default class Velocity extends Initialize {\n /**\n * @type {Span}\n * @private\n */\n rPan;\n\n /**\n * @type {Span}\n * @private\n */\n thaPan;\n\n /**\n * @type {string}\n */\n name;\n\n /**\n * Creates a new Velocity instance.\n * @param {number|Span} [rpan] - The radial component of the velocity or its range.\n * @param {number|Span} [thapan] - The angular component of the velocity or its range.\n * @param {string} [type='vector'] - The type of velocity ('vector' or 'polar').\n */\n constructor(rpan, thapan, type) {\n super();\n\n this.rPan = Span.setSpanValue(rpan);\n this.thaPan = Span.setSpanValue(thapan);\n this.type = Util.initValue(type, \"vector\");\n\n this.name = \"Velocity\";\n }\n\n /**\n * Resets the velocity parameters.\n * @param {number|Span} [rpan] - The radial component of the velocity or its range.\n * @param {number|Span} [thapan] - The angular component of the velocity or its range.\n * @param {string} [type='vector'] - The type of velocity ('vector' or 'polar').\n */\n reset(rpan, thapan, type) {\n this.rPan = Span.setSpanValue(rpan);\n this.thaPan = Span.setSpanValue(thapan);\n this.type = Util.initValue(type, \"vector\");\n }\n\n /**\n * Normalizes the velocity value.\n * @param {number} vr - The velocity value to normalize.\n * @returns {number} The normalized velocity value.\n * @private\n */\n normalizeVelocity(vr) {\n return vr * Proton.MEASURE;\n }\n\n /**\n * Initializes the particle's velocity.\n * @param {object} target - The particle to initialize.\n */\n initialize(target) {\n if (this.type === \"p\" || this.type === \"P\" || this.type === \"polar\") {\n const polar2d = new Polar2D(\n this.normalizeVelocity(this.rPan.getValue()),\n this.thaPan.getValue() * MathUtil.PI_180\n );\n\n target.v.x = polar2d.getX();\n target.v.y = polar2d.getY();\n } else {\n target.v.x = this.normalizeVelocity(this.rPan.getValue());\n target.v.y = this.normalizeVelocity(this.thaPan.getValue());\n }\n }\n}\n","import Span from \"../math/Span\";\nimport Initialize from \"./Initialize\";\n\n/**\n * Mass class for initializing particle mass.\n * @extends Initialize\n */\nexport default class Mass extends Initialize {\n /**\n * @type {Span}\n * @private\n */\n massPan;\n\n /**\n * @type {string}\n */\n name;\n\n /**\n * Creates a new Mass instance.\n * @param {number|Span} a - The mass value or the lower bound of the mass range.\n * @param {number} [b] - The upper bound of the mass range (if a is a number).\n * @param {boolean} [c] - Whether to use center-based calculation (if a and b are numbers).\n */\n constructor(a, b, c) {\n super();\n this.massPan = Span.setSpanValue(a, b, c);\n this.name = \"Mass\";\n }\n\n /**\n * Initializes the mass of a target particle.\n * @param {object} target - The target particle to initialize.\n */\n initialize(target) {\n target.mass = this.massPan.getValue();\n }\n}\n","import Span from \"../math/Span\";\nimport Initialize from \"./Initialize\";\n\n/**\n * Radius class for initializing particle radius.\n * @extends Initialize\n */\nexport default class Radius extends Initialize {\n /**\n * @type {Span}\n */\n radius;\n\n /**\n * @type {string}\n */\n name;\n\n /**\n * Creates a new Radius instance.\n * @param {number|Span} a - The radius value or the lower bound of the radius range.\n * @param {number} [b] - The upper bound of the radius range (if a is a number).\n * @param {boolean} [c] - Whether to use center-based calculation (if a and b are numbers).\n */\n constructor(a, b, c) {\n super();\n this.radius = Span.setSpanValue(a, b, c);\n this.name = \"Radius\";\n }\n\n /**\n * Resets this initializer's parameters.\n * @param {number|Span} a - The radius value or the lower bound of the radius range.\n * @param {number} [b] - The upper bound of the radius range (if a is a number).\n * @param {boolean} [c] - Whether to use center-based calculation (if a and b are numbers).\n */\n reset(a, b, c) {\n this.radius = Span.setSpanValue(a, b, c);\n }\n\n /**\n * Initializes the particle's radius.\n * @param {Particle} particle - The particle to initialize.\n */\n initialize(particle) {\n particle.radius = this.radius.getValue();\n particle.data.oldRadius = particle.radius;\n }\n}\n","import Util from \"../utils/Util\";\nimport ArraySpan from \"../math/ArraySpan\";\nimport Initialize from \"./Initialize\";\n\n/**\n * Body class for initializing particle bodies.\n * @extends Initialize\n */\nexport default class Body extends Initialize {\n /**\n * @type {ArraySpan}\n * @private\n */\n image;\n\n /**\n * @type {string}\n */\n name;\n\n /**\n * Creates a new Body instance.\n * @param {string|object|Image|HTMLImageElement|ArraySpan} image - The image source or object to use for the particle body.\n * @param {number} [w=20] - The width of the particle body.\n * @param {number} [h] - The height of the particle body. Defaults to the width if not provided.\n */\n constructor(image, w, h) {\n super();\n\n this.image = this.setSpanValue(image);\n this.w = Util.initValue(w, 20);\n this.h = Util.initValue(h, this.w);\n this.name = \"Body\";\n }\n\n /**\n * Initializes the particle's body.\n * @param {object} particle - The particle to initialize.\n */\n initialize(particle) {\n const imageTarget = this.image.getValue();\n\n if (typeof imageTarget === \"string\") {\n particle.body = {\n width: this.w,\n height: this.h,\n src: imageTarget,\n isInner: true,\n inner: true\n };\n } else {\n particle.body = imageTarget;\n }\n }\n\n /**\n * Sets the span value for the image.\n * @param {string|object|Image|HTMLImageElement|ArraySpan} image - The image source or object to set as span value.\n * @returns {ArraySpan} The ArraySpan instance.\n * @private\n */\n setSpanValue(image) {\n return image instanceof ArraySpan ? image : new ArraySpan(image);\n }\n}\n","import Proton from \"../core/Proton\";\nimport Util from \"../utils/Util\";\nimport ease from \"../math/ease\";\n\n/**\n * The Behaviour class is the base for the other Behaviour\n * @class\n */\nexport default class Behaviour {\n static id = 0;\n\n /**\n * Create a new Behaviour instance\n * @param {number} [life=Infinity] - The behaviour's life\n * @param {string} [easing='easeLinear'] - The behaviour's decaying trend, for example ease.easeOutQuart\n */\n constructor(life, easing) {\n /**\n * The behaviour's life\n * @type {number}\n */\n this.life = Util.initValue(life, Infinity);\n\n /**\n * The behaviour's easing function\n * @type {function}\n */\n this.easing = ease.getEasing(easing);\n\n /**\n * The behaviour's current age\n * @type {number}\n */\n this.age = 0;\n\n /**\n * The behaviour's current energy\n * @type {number}\n */\n this.energy = 1;\n\n /**\n * Whether the behaviour is dead\n * @type {boolean}\n */\n this.dead = false;\n\n /**\n * The behaviour's parent emitters\n * @type {Array}\n */\n this.parents = [];\n\n /**\n * The behaviour's unique id\n * @type {string}\n */\n this.id = `Behaviour_${Behaviour.id++}`;\n\n /**\n * The behaviour's name\n * @type {string}\n */\n this.name = \"Behaviour\";\n }\n\n /**\n * Reset this behaviour's parameters\n * @param {number} [life=Infinity] - This behaviour's new life\n * @param {string} [easing='easeLinear'] - This behaviour's new easing\n */\n reset(life, easing) {\n this.life = Util.initValue(life, Infinity);\n this.easing = ease.getEasing(easing);\n }\n\n /**\n * Normalize a force by 1:100\n * @param {Proton.Vector2D} force - The force to normalize\n * @returns {Proton.Vector2D} The normalized force\n */\n normalizeForce(force) {\n return force.multiplyScalar(Proton.MEASURE);\n }\n\n /**\n * Normalize a value by 1:100\n * @param {number} value - The value to normalize\n * @returns {number} The normalized value\n */\n normalizeValue(value) {\n return value * Proton.MEASURE;\n }\n\n /**\n * Initialize the behaviour's parameters for a particle\n * @param {Proton.Particle} particle - The particle to initialize\n */\n initialize(particle) {}\n\n /**\n * Compute the behaviour's life cycle\n * @param {Proton.Particle} particle - The particle to calculate for\n * @param {number} time - The integrate time 1/ms\n * @param {number} index - The particle index\n */\n calculate(particle, time, index) {\n this.age += time;\n\n if (this.age >= this.life || this.dead) {\n this.energy = 0;\n this.dead = true;\n this.destroy();\n } else {\n const scale = this.easing(particle.age / particle.life);\n this.energy = Math.max(1 - scale, 0);\n }\n }\n\n /**\n * Apply this behaviour to a particle\n * @param {Proton.Particle} particle - The particle to apply the behaviour to\n * @param {number} time - The integrate time 1/ms\n * @param {number} index - The particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n }\n\n /**\n * Destroy this behaviour\n */\n destroy() {\n let i = this.parents.length;\n while (i--) {\n this.parents[i].removeBehaviour(this);\n }\n\n this.parents.length = 0;\n }\n}\n","import Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Force extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Force\n *\n * @param {Number} fx\n * @param {Number} fy\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(fx, fy, life, easing) {\n super(life, easing);\n\n this.force = this.normalizeForce(new Vector2D(fx, fy));\n this.name = \"Force\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Force\n * @instance\n *\n * @param {Number} fx\n * @param {Number} fy\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(fx, fy, life, easing) {\n this.force = this.normalizeForce(new Vector2D(fx, fy));\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Force\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n particle.a.add(this.force);\n }\n}\n","import Util from \"../utils/Util\";\nimport Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\n/**\n * Attraction behavior for particles.\n * This behaviour makes particles follow a specific target position.\n * @extends Behaviour\n */\nexport default class Attraction extends Behaviour {\n /**\n * Creates an instance of Attraction.\n * @param {Vector2D} targetPosition - The attraction point coordinates.\n * @param {number} [force=100] - The strength of the attraction force.\n * @param {number} [radius=1000] - The radius of influence for the attraction.\n * @param {number} [life=Infinity] - The life span of this behaviour.\n * @param {string} [easing='ease.easeLinear'] - The easing function for this behaviour.\n */\n constructor(targetPosition, force, radius, life, easing) {\n super(life, easing);\n\n /**\n * The target position for attraction.\n * @type {Vector2D}\n */\n this.targetPosition = Util.initValue(targetPosition, new Vector2D());\n\n /**\n * The radius of influence for the attraction.\n * @type {number}\n */\n this.radius = Util.initValue(radius, 1000);\n\n /**\n * The strength of the attraction force.\n * @type {number}\n */\n this.force = Util.initValue(this.normalizeValue(force), 100);\n\n /**\n * The squared radius (for optimization).\n * @type {number}\n */\n this.radiusSq = this.radius * this.radius;\n\n /**\n * The attraction force vector.\n * @type {Vector2D}\n */\n this.attractionForce = new Vector2D();\n\n /**\n * The squared length of the attraction force.\n * @type {number}\n */\n this.lengthSq = 0;\n\n /**\n * The name of the behaviour.\n * @type {string}\n */\n this.name = \"Attraction\";\n }\n\n /**\n * Resets the behaviour's parameters.\n * @param {Vector2D} targetPosition - The new attraction point coordinates.\n * @param {number} [force=100] - The new strength of the attraction force.\n * @param {number} [radius=1000] - The new radius of influence for the attraction.\n * @param {number} [life=Infinity] - The new life span of this behaviour.\n * @param {string} [easing='ease.easeLinear'] - The new easing function for this behaviour.\n */\n reset(targetPosition, force, radius, life, easing) {\n this.targetPosition = Util.initValue(targetPosition, new Vector2D());\n this.radius = Util.initValue(radius, 1000);\n this.force = Util.initValue(this.normalizeValue(force), 100);\n this.radiusSq = this.radius * this.radius;\n this.attractionForce = new Vector2D();\n this.lengthSq = 0;\n\n life && super.reset(life, easing);\n }\n\n /**\n * Applies this behaviour to a particle.\n * @param {Particle} particle - The particle to apply the behaviour to.\n * @param {number} time - The current simulation time.\n * @param {number} index - The index of the particle.\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n this.attractionForce.copy(this.targetPosition);\n this.attractionForce.sub(particle.p);\n this.lengthSq = this.attractionForce.lengthSq();\n\n if (this.lengthSq > 0.00004 && this.lengthSq < this.radiusSq) {\n this.attractionForce.normalize();\n this.attractionForce.multiplyScalar(1 - this.lengthSq / this.radiusSq);\n this.attractionForce.multiplyScalar(this.force);\n\n particle.a.add(this.attractionForce);\n }\n }\n}\n","import Vector2D from \"../math/Vector2D\";\nimport MathUtil from \"../math/MathUtil\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class RandomDrift extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Behaviour\n * @constructor\n * @alias RandomDrift\n *\n * @param {Number} driftX \t\t\t\tX value of the new Vector2D\n * @param {Number} driftY \t\t\t\tY value of the new Vector2D\n * @param {Number} delay \t\t\t\tHow much delay the drift should have\n * @param {Number} [life=Infinity] \t\tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n *\n * @property {Number} time The time of the drift\n * @property {String} name The Behaviour name\n */\n constructor(driftX, driftY, delay, life, easing) {\n super(life, easing);\n\n this.reset(driftX, driftY, delay);\n this.time = 0;\n this.name = \"RandomDrift\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#RandomDrift\n * @instance\n *\n * @param {Number} driftX \t\t\t\tX value of the new Vector2D\n * @param {Number} driftY \t\t\t\tY value of the new Vector2D\n * @param {Number} delay \t\t\t\tHow much delay the drift should have\n * @param {Number} [life=Infinity] \t\tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n */\n reset(driftX, driftY, delay, life, easing) {\n this.panFoce = new Vector2D(driftX, driftY);\n this.panFoce = this.normalizeForce(this.panFoce);\n this.delay = delay;\n\n life && super.reset(life, easing);\n }\n\n initialize(particle) {\n particle.data.time = 0;\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#RandomDrift\n * @instance\n *\n * @param {Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n particle.data.time += time;\n\n if (particle.data.time >= this.delay) {\n particle.a.addXY(\n MathUtil.randomAToB(-this.panFoce.x, this.panFoce.x),\n MathUtil.randomAToB(-this.panFoce.y, this.panFoce.y)\n );\n\n particle.data.time = 0;\n }\n }\n}\n","import Force from \"./Force\";\n\nexport default class Gravity extends Force {\n /**\n * @memberof! Proton#\n * @augments Proton#Proton.Force\n * @constructor\n * @alias Proton.Gravity\n *\n * @param {Number} g \t\t\t\t\t\t\tGravity\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(g, life, easing) {\n super(0, g, life, easing);\n this.name = \"Gravity\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Gravity\n * @instance\n *\n * @param {Number} g \t\t\t\t\t\t\tGravity\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(g, life, easing) {\n super.reset(0, g, life, easing);\n }\n}\n","import Util from \"../utils/Util\";\nimport Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Collision extends Behaviour {\n /**\n * The callback after collision\n *\n * @callback Callback\n *\n * @param {Proton.Particle} particle\n * @param {Proton.Paritcle} otherParticle\n */\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Collision\n *\n * @todo add description to mass\n *\n * @param {Proton.Emitter} \t[emitter=null] \t\tthe attraction point coordinates\n * @param {Boolean} \t\t[mass=true]\n * @param {Callback}\t \t[callback=null]\t\tthe callback after the collision\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(emitter, mass, callback, life, easing) {\n super(life, easing);\n this.reset(emitter, mass, callback);\n this.newPool = [];\n this.pool = [];\n this.name = \"Collision\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @memberof Proton#Proton.Collision\n * @method reset\n * @instance\n *\n * @todo add description to mass\n *\n * @param {Proton.Emitter} \t[emitter=null] \t\tthe attraction point coordinates\n * @param {Boolean} \t\t[mass=true]\n * @param {Callback}\t \t[callback=null]\t\tthe callback after the collision\n * @param {Number} \t\t\t[life=Infinity] \tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(emitter, mass, callback, life, easing) {\n this.emitter = Util.initValue(emitter, null);\n this.mass = Util.initValue(mass, true);\n this.callback = Util.initValue(callback, null);\n\n this.collisionPool = [];\n this.delta = new Vector2D();\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @memberof Proton#Proton.Collision\n * @method applyBehaviour\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n if (this.emitter) {\n Util.sliceArray(this.emitter.particles, index, this.newPool);\n } else {\n Util.sliceArray(this.pool, index, this.newPool);\n }\n\n const length = this.newPool.length;\n let otherParticle;\n let lengthSq;\n let overlap;\n let totalMass;\n let averageMass1, averageMass2;\n let i;\n\n for (i = 0; i < length; i++) {\n otherParticle = this.newPool[i];\n\n if (otherParticle !== particle) {\n this.delta.copy(otherParticle.p);\n this.delta.sub(particle.p);\n\n lengthSq = this.delta.lengthSq();\n const distance = particle.radius + otherParticle.radius;\n\n if (lengthSq <= distance * distance) {\n overlap = distance - Math.sqrt(lengthSq);\n overlap += 0.5;\n\n totalMass = particle.mass + otherParticle.mass;\n averageMass1 = this.mass ? otherParticle.mass / totalMass : 0.5;\n averageMass2 = this.mass ? particle.mass / totalMass : 0.5;\n\n particle.p.add(\n this.delta\n .clone()\n .normalize()\n .multiplyScalar(overlap * -averageMass1)\n );\n otherParticle.p.add(this.delta.normalize().multiplyScalar(overlap * averageMass2));\n\n this.callback && this.callback(particle, otherParticle);\n }\n }\n }\n }\n}\n","import Util from \"../utils/Util\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class CrossZone extends Behaviour {\n /**\n * Defines what happens if the particles come to the end of the specified zone\n *\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.CrossZone\n *\n * @param {Proton.Zone} zone \t\t\t\t\t\tcan be any Proton.Zone - e.g. Proton.RectZone()\n * @param {String} \t\t[crossType=dead] \t\t\twhat happens if the particles pass the zone - allowed strings: dead | bound | cross\n * @param {Number} \t\t[life=Infinity] \t\t\tthis behaviour's life\n * @param {String} \t\t[easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(zone, crossType, life, easing) {\n super(life, easing);\n\n this.reset(zone, crossType);\n this.name = \"CrossZone\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.CrossZone\n * @instance\n *\n * @param {Proton.Zone} zone \t\t\t\tcan be any Proton.Zone - e.g. Proton.RectZone()\n * @param {String} \t\t[crossType=dead] \twhat happens if the particles pass the zone - allowed strings: dead | bound | cross\n * @param {Number} \t\t[life=Infinity] \tthis behaviour's life\n * @param {String} \t\t[easing=easeLinear]\tthis behaviour's easing\n */\n reset(zone, crossType, life, easing) {\n this.zone = zone;\n this.zone.crossType = Util.initValue(crossType, \"dead\");\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.CrossZone\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n this.zone.crossing(particle);\n }\n}\n","import Util from \"../utils/Util\";\nimport Span from \"../math/Span\";\nimport Behaviour from \"./Behaviour\";\n\n/**\n * Alpha behaviour for controlling particle opacity over time.\n * @extends Behaviour\n */\nexport default class Alpha extends Behaviour {\n /**\n * @type {boolean}\n * @private\n */\n same;\n\n /**\n * @type {Span}\n * @private\n */\n a;\n\n /**\n * @type {Span}\n * @private\n */\n b;\n\n /**\n * @type {string}\n */\n name;\n\n /**\n * Creates a new Alpha instance.\n * @param {number|Span} [a=1] - The initial alpha value or range.\n * @param {number|Span} [b] - The final alpha value or range. If not provided, it will be the same as 'a'.\n * @param {number} [life=Infinity] - This behaviour's life.\n * @param {string} [easing='easeLinear'] - This behaviour's easing function.\n */\n constructor(a, b, life, easing) {\n super(life, easing);\n\n this.reset(a, b);\n this.name = \"Alpha\";\n }\n\n /**\n * Resets this behaviour's parameters.\n * @param {number|Span} [a=1] - The initial alpha value or range.\n * @param {number|Span} [b] - The final alpha value or range. If not provided, it will be the same as 'a'.\n * @param {number} [life] - This behaviour's life.\n * @param {string} [easing] - This behaviour's easing function.\n */\n reset(a, b, life, easing) {\n this.same = b === null || b === undefined;\n this.a = Span.setSpanValue(Util.initValue(a, 1));\n this.b = Span.setSpanValue(b);\n\n life && super.reset(life, easing);\n }\n\n /**\n * Initializes the particle's alpha values.\n * @param {Particle} particle - The particle to initialize.\n */\n initialize(particle) {\n particle.data.alphaA = this.a.getValue();\n\n if (this.same) particle.data.alphaB = particle.data.alphaA;\n else particle.data.alphaB = this.b.getValue();\n }\n\n /**\n * Applies the alpha behaviour to the particle.\n * @param {Particle} particle - The particle to apply the behaviour to.\n * @param {number} time - The current simulation time.\n * @param {number} index - The index of the particle.\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n particle.alpha = particle.data.alphaB + (particle.data.alphaA - particle.data.alphaB) * this.energy;\n\n if (particle.alpha < 0.001) particle.alpha = 0;\n }\n}\n","import Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\nimport Behaviour from \"./Behaviour\";\n\n/**\n * Scale behaviour for controlling particle size over time.\n * @extends Behaviour\n */\nexport default class Scale extends Behaviour {\n /**\n * @type {boolean}\n * @private\n */\n same;\n\n /**\n * @type {string}\n */\n name;\n\n /**\n * Creates a new Scale instance.\n * @param {number|Span} [a=1] - The initial scale value or range.\n * @param {number|Span} [b] - The final scale value or range. If not provided, it will be the same as 'a'.\n * @param {number} [life=Infinity] - This behaviour's life.\n * @param {string} [easing='easeLinear'] - This behaviour's easing function.\n */\n constructor(a, b, life, easing) {\n super(life, easing);\n\n this.reset(a, b);\n this.name = \"Scale\";\n }\n\n /**\n * Resets this behaviour's parameters.\n * @param {number|Span} a - The initial scale value or range.\n * @param {number|Span} [b] - The final scale value or range. If not provided, it will be the same as 'a'.\n * @param {number} [life] - This behaviour's life.\n * @param {string} [easing] - This behaviour's easing function.\n */\n reset(a, b, life, easing) {\n this.same = b === null || b === undefined;\n this.a = Span.setSpanValue(Util.initValue(a, 1));\n this.b = Span.setSpanValue(b);\n\n life && super.reset(life, easing);\n }\n\n /**\n * Initializes the particle's scale values.\n * @param {Particle} particle - The particle to initialize.\n */\n initialize(particle) {\n particle.data.scaleA = this.a.getValue();\n particle.data.oldRadius = particle.radius;\n particle.data.scaleB = this.same ? particle.data.scaleA : this.b.getValue();\n }\n\n /**\n * Applies the scale behaviour to the particle.\n * @param {Particle} particle - The particle to apply the behaviour to.\n * @param {number} time - The current simulation time.\n * @param {number} index - The index of the particle.\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n particle.scale = particle.data.scaleB + (particle.data.scaleA - particle.data.scaleB) * this.energy;\n\n if (particle.scale < 0.0001) particle.scale = 0;\n particle.radius = particle.data.oldRadius * particle.scale;\n }\n}\n","import Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\nimport Behaviour from \"./Behaviour\";\n\n/**\n * Rotate behaviour for controlling particle rotation.\n * @extends Behaviour\n */\nexport default class Rotate extends Behaviour {\n /**\n * @type {boolean}\n * @private\n */\n same;\n\n /**\n * @type {Span}\n * @private\n */\n a;\n\n /**\n * @type {Span}\n * @private\n */\n b;\n\n /**\n * @type {string}\n * @private\n */\n style;\n\n /**\n * @type {string}\n */\n name;\n\n /**\n * Creates a new Rotate instance.\n * @param {string|number|Span} [influence='Velocity'] - The rotation's influence or initial rotation.\n * @param {string|number|Span} [b] - The final rotation value or range.\n * @param {string} [style='to'] - The style of rotation ('to' or 'add').\n * @param {number} [life=Infinity] - This behaviour's life.\n * @param {string} [easing='easeLinear'] - This behaviour's easing function.\n */\n constructor(influence, b, style, life, easing) {\n super(life, easing);\n\n this.reset(influence, b, style);\n this.name = \"Rotate\";\n }\n\n /**\n * Resets this behaviour's parameters.\n * @param {string|number|Span} [a='Velocity'] - The rotation's influence or initial rotation.\n * @param {string|number|Span} [b] - The final rotation value or range.\n * @param {string} [style='to'] - The style of rotation ('to' or 'add').\n * @param {number} [life] - This behaviour's life.\n * @param {string} [easing] - This behaviour's easing function.\n */\n reset(a, b, style, life, easing) {\n this.same = b === null || b === undefined;\n\n this.a = Span.setSpanValue(Util.initValue(a, \"Velocity\"));\n this.b = Span.setSpanValue(Util.initValue(b, 0));\n this.style = Util.initValue(style, \"to\");\n\n life && super.reset(life, easing);\n }\n\n /**\n * Initializes the behaviour's parameters for a particle.\n * @param {object} particle - The particle to initialize.\n * @param {number} particle.rotation - The particle's rotation.\n * @param {object} particle.data - The particle's data object.\n */\n initialize(particle) {\n particle.rotation = this.a.getValue();\n particle.data.rotationA = this.a.getValue();\n\n if (!this.same) particle.data.rotationB = this.b.getValue();\n }\n\n /**\n * Applies this behaviour to a particle.\n * @param {object} particle - The particle to apply the behaviour to.\n * @param {number} time - The integrate time (1/ms).\n * @param {number} index - The particle index.\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n if (!this.same) {\n if (this.style === \"to\" || this.style === \"TO\" || this.style === \"_\") {\n particle.rotation +=\n particle.data.rotationB + (particle.data.rotationA - particle.data.rotationB) * this.energy;\n } else {\n particle.rotation += particle.data.rotationB;\n }\n } else if (this.a.a === \"V\" || this.a.a === \"Velocity\" || this.a.a === \"v\") {\n // beta...\n particle.rotation = particle.getDirection();\n }\n }\n}\n","import ColorUtil from \"../utils/ColorUtil\";\nimport ArraySpan from \"../math/ArraySpan\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Color extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Color\n *\n * @param {Proton.ArraySpan | String} [a] the string should be a hex e.g. #000000 for black\n * @param {Proton.ArraySpan | String} [b] the string should be a hex e.g. #000000 for black\n * @param {Number} [life=Infinity] \tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(a, b, life, easing) {\n super(life, easing);\n\n this.reset(a, b);\n this.name = \"Color\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black\n * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black\n * @param {Number} [life=Infinity] \tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n */\n reset(a, b, life, easing) {\n this.a = ArraySpan.createArraySpan(a);\n this.b = ArraySpan.createArraySpan(b);\n life && super.reset(life, easing);\n }\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n */\n initialize(particle) {\n particle.color = this.a.getValue();\n particle.data.colorA = ColorUtil.hexToRgb(particle.color);\n\n if (this.b) particle.data.colorB = ColorUtil.hexToRgb(this.b.getValue());\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n if (this.b) {\n this.calculate(particle, time, index);\n\n particle.rgb.r = particle.data.colorB.r + (particle.data.colorA.r - particle.data.colorB.r) * this.energy;\n particle.rgb.g = particle.data.colorB.g + (particle.data.colorA.g - particle.data.colorB.g) * this.energy;\n particle.rgb.b = particle.data.colorB.b + (particle.data.colorA.b - particle.data.colorB.b) * this.energy;\n\n particle.rgb.r = particle.rgb.r << 0;\n particle.rgb.g = particle.rgb.g << 0;\n particle.rgb.b = particle.rgb.b << 0;\n } else {\n particle.rgb.r = particle.data.colorA.r;\n particle.rgb.g = particle.data.colorA.g;\n particle.rgb.b = particle.data.colorA.b;\n }\n }\n}\n","import MathUtil from \"../math/MathUtil\";\nimport Vector2D from \"../math/Vector2D\";\nimport Span from \"../math/Span\";\nimport Behaviour from \"./Behaviour\";\n\nconst CHANGING = \"changing\";\n\nexport default class Cyclone extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Cyclone\n *\n * @param {Number} angle\n * @param {Number} force\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(angle, force, life, easing) {\n super(life, easing);\n this.setAngleAndForce(angle, force);\n this.name = \"Cyclone\";\n }\n\n setAngleAndForce(angle, force) {\n this.force = CHANGING;\n this.angle = MathUtil.PI / 2;\n\n if (angle === \"right\") {\n this.angle = MathUtil.PI / 2;\n } else if (angle === \"left\") {\n this.angle = -MathUtil.PI / 2;\n } else if (angle === \"random\") {\n this.angle = \"random\";\n } else if (angle instanceof Span) {\n this.angle = \"span\";\n this.span = angle;\n } else if (angle) {\n this.angle = angle;\n }\n\n if (\n String(force).toLowerCase() === \"changing\" ||\n String(force).toLowerCase() === \"chang\" ||\n String(force).toLowerCase() === \"auto\"\n ) {\n this.force = CHANGING;\n } else if (force) {\n this.force = force;\n }\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Cyclone\n * @instance\n *\n * @param {Number} angle\n * @param {Number} force\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(angle, force, life, easing) {\n this.angle = MathUtil.PI / 2;\n this.setAngleAndForce(angle, force);\n life && super.reset(life, easing);\n }\n\n initialize(particle) {\n if (this.angle === \"random\") {\n particle.data.cangle = MathUtil.randomAToB(-MathUtil.PI, MathUtil.PI);\n } else if (this.angle === \"span\") {\n particle.data.cangle = this.span.getValue();\n }\n\n particle.data.cyclone = new Vector2D(0, 0);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Cyclone\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n let length;\n let gradient = particle.v.getGradient();\n if (this.angle === \"random\" || this.angle === \"span\") {\n gradient += particle.data.cangle;\n } else {\n gradient += this.angle;\n }\n\n if (this.force === CHANGING) {\n length = particle.v.length() / 100;\n } else {\n length = this.force;\n }\n\n particle.data.cyclone.x = length * Math.cos(gradient);\n particle.data.cyclone.y = length * Math.sin(gradient);\n particle.data.cyclone = this.normalizeForce(particle.data.cyclone);\n particle.a.add(particle.data.cyclone);\n }\n}\n","import Attraction from \"./Attraction\";\n\n/**\n * The opposite of Attraction - turns the force\n *\n * @class\n * @extends Proton.Attraction\n * @memberof! Proton#\n * @alias Proton.Repulsion\n */\nexport default class Repulsion extends Attraction {\n /**\n * Creates a new Repulsion behaviour instance\n *\n * @constructor\n * @param {Proton.Vector2D} targetPosition - The repulsion point coordinates\n * @param {number} [force=100] - The strength of the repulsion force\n * @param {number} [radius=1000] - The radius of influence for the repulsion\n * @param {number} [life=Infinity] - The behaviour's life\n * @param {string} [easing='easeLinear'] - The behaviour's easing function\n */\n constructor(targetPosition, force, radius, life, easing) {\n super(targetPosition, force, radius, life, easing);\n\n /**\n * The strength of the repulsion force\n * @type {number}\n */\n this.force *= -1;\n\n /**\n * The name of the behaviour\n * @type {string}\n */\n this.name = \"Repulsion\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @param {Proton.Vector2D} targetPosition - The new repulsion point coordinates\n * @param {number} [force=100] - The new strength of the repulsion force\n * @param {number} [radius=1000] - The new radius of influence for the repulsion\n * @param {number} [life=Infinity] - The new behaviour's life\n * @param {string} [easing='easeLinear'] - The new behaviour's easing function\n */\n reset(targetPosition, force, radius, life, easing) {\n super.reset(targetPosition, force, radius, life, easing);\n this.force *= -1;\n }\n}\n","import Util from \"../utils/Util\";\nimport Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class GravityWell extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Behaviour\n * @constructor\n * @alias GravityWell\n *\n * @param {Vector2D} [centerPoint=new Vector2D] The point in the center\n * @param {Number} [force=100]\t\t\t\t\tThe force\n * @param {Number} [life=Infinity]\t\t\t\tthis behaviour's life\n * @param {String} [easing=easeLinear]\tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(centerPoint, force, life, easing) {\n super(life, easing);\n\n this.distanceVec = new Vector2D();\n this.centerPoint = Util.initValue(centerPoint, new Vector2D());\n this.force = Util.initValue(this.normalizeValue(force), 100);\n\n this.name = \"GravityWell\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#GravityWell\n * @instance\n *\n * @param {Vector2D} [centerPoint=new Vector2D] The point in the center\n * @param {Number} [force=100]\t\t\t\t\tThe force\n * @param {Number} [life=Infinity]\t\t\t\tthis behaviour's life\n * @param {String} [easing=easeLinear]\tthis behaviour's easing\n */\n reset(centerPoint, force, life, easing) {\n this.distanceVec = new Vector2D();\n this.centerPoint = Util.initValue(centerPoint, new Vector2D());\n this.force = Util.initValue(this.normalizeValue(force), 100);\n\n life && super.reset(life, easing);\n }\n\n /**\n * @inheritdoc\n */\n initialize(particle) {}\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#GravityWell\n * @instance\n *\n * @param {Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.distanceVec.set(this.centerPoint.x - particle.p.x, this.centerPoint.y - particle.p.y);\n const distanceSq = this.distanceVec.lengthSq();\n\n if (distanceSq !== 0) {\n const distance = this.distanceVec.length();\n const factor = (this.force * time) / (distanceSq * distance);\n\n particle.v.x += factor * this.distanceVec.x;\n particle.v.y += factor * this.distanceVec.y;\n }\n }\n}\n","import PropUtil from \"../utils/PropUtil\";\nimport Initialize from \"./Initialize\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default {\n initialize(emitter, particle, initializes) {\n const length = initializes.length;\n let i;\n\n for (i = 0; i < length; i++) {\n if (initializes[i] instanceof Initialize) {\n initializes[i].init(emitter, particle);\n } else {\n this.init(emitter, particle, initializes[i]);\n }\n }\n\n this.bindEmitter(emitter, particle);\n },\n\n // init\n init(emitter, particle, initialize) {\n PropUtil.setProp(particle, initialize);\n PropUtil.setVectorVal(particle, initialize);\n },\n\n bindEmitter(emitter, particle) {\n if (emitter.bindEmitter) {\n particle.p.add(emitter.p);\n particle.v.add(emitter.v);\n particle.a.add(emitter.a);\n particle.v.rotate(MathUtil.degreeTransform(emitter.rotation));\n }\n }\n};\n","import Util from \"../utils/Util\";\nimport Puid from \"../utils/Puid\";\nimport Particle from \"../core/Particle\";\nimport EventDispatcher from \"../events/EventDispatcher\";\n\nimport Rate from \"../initialize/Rate\";\nimport InitializeUtil from \"../initialize/InitializeUtil\";\n\nexport default class Emitter extends Particle {\n /**\n * You can use this emit particles.\n *\n * It will dispatch follow events:\n * PARTICLE_CREATED\n * PARTICLE_UPDATA\n * PARTICLE_DEAD\n *\n * @class Emitter\n * @constructor\n * @param {Object} conf the parameters object;\n * for example {damping:0.01,bindEmitter:false}\n */\n constructor(conf = {}) {\n super(conf);\n\n this.particles = [];\n this.behaviours = [];\n this.initializes = [];\n\n this.emitTime = 0;\n this.emitSpeed = 0;\n this.totalTime = -1;\n\n /**\n * The friction coefficient for all particle emit by This;\n * @property damping\n * @type {Number}\n * @default 0.006\n */\n this.damping = 0.006;\n\n /**\n * If bindEmitter the particles can bind this emitter's property;\n * @property bindEmitter\n * @type {Boolean}\n * @default true\n */\n this.bindEmitter = true;\n\n /**\n * The number of particles per second emit (a [particle]/b [s]);\n * @property rate\n * @type {Rate}\n * @default Rate(1, .1)\n */\n this.rate = new Rate(1, 0.1);\n\n this.name = \"Emitter\";\n this.id = Puid.id(this.name);\n }\n\n /**\n * start emit particle\n * @method emit\n * @param {Number | String} [totalTime] begin emit time;\n * @param {String | boolean} [life] the life of this emitter\n */\n emit(totalTime, life) {\n this.stoped = false;\n this.emitTime = 0;\n this.totalTime = Util.initValue(totalTime, Infinity);\n\n if (life === true || life === \"life\" || life === \"destroy\") {\n this.life = totalTime === \"once\" ? 1 : this.totalTime;\n } else if (!isNaN(life)) {\n this.life = life;\n }\n this.rate.init();\n }\n\n /**\n * stop emiting\n * @method stop\n */\n stop() {\n this.totalTime = -1;\n this.emitTime = 0;\n this.stoped = true;\n }\n\n preEmit(time) {\n let oldStoped = this.stoped;\n let oldEmitTime = this.emitTime;\n let oldTotalTime = this.totalTime;\n\n this.stoped = false;\n this.emitTime = 0;\n this.totalTime = time;\n this.rate.init();\n\n const step = 0.0167;\n while (time > step) {\n time -= step;\n this.update(step);\n }\n\n this.stoped = oldStoped;\n this.emitTime = oldEmitTime + Math.max(time, 0);\n this.totalTime = oldTotalTime;\n }\n\n /**\n * remove current all particles\n * @method removeAllParticles\n */\n removeAllParticles() {\n let i = this.particles.length;\n while (i--) this.particles[i].dead = true;\n }\n\n /**\n * add initialize to this emitter\n * @method addSelfInitialize\n */\n addSelfInitialize(initialize) {\n if (initialize[\"init\"]) {\n initialize.init(this);\n } else {\n // this.initAll();\n }\n }\n\n /**\n * add the Initialize to particles;\n *\n * you can use initializes array:for example emitter.addInitialize(initialize1,initialize2,initialize3);\n * @method addInitialize\n * @param {Initialize} initialize like this new Radius(1, 12)\n */\n addInitialize(...rest) {\n let i = rest.length;\n while (i--) this.initializes.push(rest[i]);\n }\n\n /**\n * remove the Initialize\n * @method removeInitialize\n * @param {Initialize} initialize a initialize\n */\n removeInitialize(initializer) {\n const index = this.initializes.indexOf(initializer);\n if (index > -1) this.initializes.splice(index, 1);\n }\n\n /**\n * remove all Initializes\n * @method removeInitializers\n */\n removeAllInitializers() {\n Util.emptyArray(this.initializes);\n }\n\n /**\n * add the Behaviour to particles;\n *\n * you can use Behaviours array:emitter.addBehaviour(Behaviour1,Behaviour2,Behaviour3);\n * @method addBehaviour\n * @param {Behaviour} behaviour like this new Color('random')\n */\n addBehaviour(...rest) {\n let i = arguments.length;\n while (i--) {\n let behaviour = rest[i];\n this.behaviours.push(behaviour);\n if (behaviour.parents) behaviour.parents.push(this);\n }\n }\n\n /**\n * remove the Behaviour\n * @method removeBehaviour\n * @param {Behaviour} behaviour a behaviour\n */\n removeBehaviour(behaviour) {\n let index = this.behaviours.indexOf(behaviour);\n this.behaviours.splice(index, 1);\n\n if (behaviour.parents) {\n index = behaviour.parents.indexOf(behaviour);\n behaviour.parents.splice(index, 1);\n }\n\n return index;\n }\n\n /**\n * remove all behaviours\n * @method removeAllBehaviours\n */\n removeAllBehaviours() {\n Util.emptyArray(this.behaviours);\n }\n\n // emitter update\n update(time) {\n this.age += time;\n if (this.age >= this.life || this.dead) this.destroy();\n\n this.emitting(time);\n this.integrate(time);\n }\n\n integrate(time) {\n if (!this.parent) return;\n\n const damping = 1 - this.damping;\n this.parent.integrator.calculate(this, time, damping);\n\n const length = this.particles.length;\n let i, particle;\n\n for (i = length - 1; i >= 0; i--) {\n particle = this.particles[i];\n\n // particle update\n particle.update(time, i);\n this.parent.integrator.calculate(particle, time, damping);\n this.dispatch(\"PARTICLE_UPDATE\", particle);\n\n // check dead\n if (particle.dead) {\n this.dispatch(\"PARTICLE_DEAD\", particle);\n\n this.parent.pool.expire(particle);\n this.particles.splice(i, 1);\n }\n }\n }\n\n dispatch(event, target) {\n this.parent && this.parent.dispatchEvent(event, target);\n this.bindEvent && this.dispatchEvent(event, target);\n }\n\n emitting(time) {\n if (this.stoped) return;\n\n if (this.totalTime === \"none\") {\n this.emitTime += time;\n } else if (this.totalTime === \"once\") {\n let i;\n const length = this.rate.getValue(99999);\n\n if (length > 0) this.emitSpeed = length;\n for (i = 0; i < length; i++) this.createParticle();\n this.totalTime = \"none\";\n } else {\n this.emitTime += time;\n\n if (this.emitTime < this.totalTime) {\n const length = this.rate.getValue(time);\n let i;\n\n if (length > 0) this.emitSpeed = length;\n for (i = 0; i < length; i++) this.createParticle();\n }\n }\n }\n\n /**\n * Creates a single particle.\n *\n * @param {Object|Array} [initialize] - Initialization parameters or array of initialization objects.\n * @param {Object|Array} [behaviour] - Behavior object or array of behavior objects.\n * @returns {Particle} The created particle.\n *\n */\n createParticle(initialize, behaviour) {\n const particle = this.parent.pool.get(Particle);\n this.setupParticle(particle, initialize, behaviour);\n this.dispatch(\"PARTICLE_CREATED\", particle);\n\n return particle;\n }\n\n /**\n * Sets up a particle with initialization and behavior.\n *\n * @param {Particle} particle - The particle to set up.\n * @param {Object|Array} [initialize] - Initialization parameters or array of initialization objects.\n * @param {Object|Array} [behaviour] - Behavior object or array of behavior objects.\n */\n setupParticle(particle, initialize, behaviour) {\n let initializes = this.initializes;\n let behaviours = this.behaviours;\n\n if (initialize) initializes = Util.toArray(initialize);\n if (behaviour) behaviours = Util.toArray(behaviour);\n\n particle.reset();\n InitializeUtil.initialize(this, particle, initializes);\n particle.addBehaviours(behaviours);\n particle.parent = this;\n\n this.particles.push(particle);\n }\n\n /**\n * Removes all particles and stops the emitter.\n */\n remove() {\n this.stop();\n Util.destroyAll(this.particles);\n }\n\n /**\n * Destory this Emitter\n * @method destroy\n */\n destroy() {\n this.dead = true;\n this.remove();\n this.removeAllInitializers();\n this.removeAllBehaviours();\n this.parent && this.parent.removeEmitter(this);\n\n this.rate = null;\n this.old = null;\n this.rgb = null;\n this.v = null;\n this.a = null;\n this.p = null;\n }\n}\n\nEventDispatcher.bind(Emitter);\n","import Emitter from \"./Emitter\";\n\nexport default class BehaviourEmitter extends Emitter {\n /**\n * The BehaviourEmitter class inherits from Proton.Emitter\n *\n * use the BehaviourEmitter you can add behaviours to self;\n * @class Proton.BehaviourEmitter\n * @constructor\n * @param {Object} conf the parameters object;\n */\n constructor(conf) {\n super(conf);\n\n this.selfBehaviours = [];\n }\n\n /**\n * add the Behaviour to emitter;\n *\n * you can use Behaviours array:emitter.addSelfBehaviour(Behaviour1,Behaviour2,Behaviour3);\n * @method addSelfBehaviour\n * @param {Proton.Behaviour} behaviour like this new Proton.Color('random')\n */\n addSelfBehaviour(...rest) {\n let i,\n length = rest.length;\n\n for (i = 0; i < length; i++) {\n let behaviour = rest[i];\n this.selfBehaviours.push(behaviour);\n behaviour.initialize(this);\n }\n }\n\n /**\n * remove the Behaviour for self\n * @method removeSelfBehaviour\n * @param {Proton.Behaviour} behaviour a behaviour\n */\n removeSelfBehaviour(behaviour) {\n const index = this.selfBehaviours.indexOf(behaviour);\n if (index > -1) this.selfBehaviours.splice(index, 1);\n }\n\n update(time) {\n super.update(time);\n\n if (!this.sleep) {\n const length = this.selfBehaviours.length;\n let i;\n\n for (i = 0; i < length; i++) {\n this.selfBehaviours[i].applyBehaviour(this, time, i);\n }\n }\n }\n}\n","import Types from \"../utils/Types\";\nimport ColorUtil from \"../utils/ColorUtil\";\nimport MathUtil from \"../math/MathUtil\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nlet PIXIClass;\n\n/**\n * Represents a PIXI-based renderer for particle systems.\n * @extends BaseRenderer\n */\nexport default class PixiRenderer extends BaseRenderer {\n /**\n * Creates a new PixiRenderer instance.\n * @param {PIXI.Container} element - The PIXI container to render to.\n * @param {string|number} [stroke] - The stroke color for particles.\n */\n constructor(element, stroke) {\n super(element);\n\n this.stroke = stroke;\n this.color = false;\n this.setColor = false;\n this.blendMode = null;\n this.pool.create = (body, particle) => this.createBody(body, particle);\n this.setPIXI(window.PIXI);\n\n this.name = \"PixiRenderer\";\n }\n\n setPIXI(PIXI) {\n try {\n PIXIClass = PIXI || { Sprite: {} };\n this.createFromImage = PIXIClass.Sprite.from || PIXIClass.Sprite.fromImage;\n } catch (e) {}\n }\n\n onProtonUpdate() {}\n\n /**\n * @param particle\n */\n onParticleCreated(particle) {\n if (particle.body) {\n particle.body = this.pool.get(particle.body, particle);\n } else {\n particle.body = this.pool.get(this.circleConf, particle);\n }\n\n if (this.blendMode) {\n particle.body.blendMode = this.blendMode;\n }\n\n this.element.addChild(particle.body);\n }\n\n /**\n * @param particle\n */\n onParticleUpdate(particle) {\n this.transform(particle, particle.body);\n\n if (this.setColor === true || this.color === true) {\n particle.body.tint = ColorUtil.getHex16FromParticle(particle);\n }\n }\n\n /**\n * @param particle\n */\n onParticleDead(particle) {\n this.element.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n\n transform(particle, target) {\n target.x = particle.p.x;\n target.y = particle.p.y;\n\n target.alpha = particle.alpha;\n\n target.scale.x = particle.scale;\n target.scale.y = particle.scale;\n\n // using cached version of MathUtil.PI_180 for slight performance increase.\n target.rotation = particle.rotation * MathUtil.PI_180; // MathUtil.PI_180;\n }\n\n createBody(body, particle) {\n if (body.isCircle) return this.createCircle(particle);\n else return this.createSprite(body);\n }\n\n createSprite(body) {\n const sprite = body.isInner ? this.createFromImage(body.src) : new PIXIClass.Sprite(body);\n\n sprite.anchor.x = 0.5;\n sprite.anchor.y = 0.5;\n\n return sprite;\n }\n\n createCircle(particle) {\n const graphics = new PIXIClass.Graphics();\n\n if (this.stroke) {\n const stroke = Types.isString(this.stroke) ? this.stroke : 0x000000;\n graphics.beginStroke(stroke);\n }\n\n graphics.beginFill(particle.color || 0x008ced);\n graphics.drawCircle(0, 0, particle.radius);\n graphics.endFill();\n\n return graphics;\n }\n\n /**\n * Destroys the renderer and cleans up resources.\n * @param {Array} particles - The particles to clean up.\n */\n destroy(particles) {\n super.destroy();\n\n let i = particles.length;\n while (i--) {\n let particle = particles[i];\n if (particle.body) {\n this.element.removeChild(particle.body);\n }\n }\n }\n}\n","import Util from \"../utils/Util\";\nimport Emitter from \"./Emitter\";\n\nexport default class FollowEmitter extends Emitter {\n /**\n * The FollowEmitter class inherits from Proton.Emitter\n *\n * use the FollowEmitter will emit particle when mousemoving\n *\n * @class Proton.FollowEmitter\n * @constructor\n * @param {Element} mouseTarget mouseevent's target;\n * @param {Number} ease the easing of following speed;\n * @default 0.7\n * @param {Object} conf the parameters object;\n */\n constructor(mouseTarget, ease, conf) {\n super(conf);\n\n this.mouseTarget = Util.initValue(mouseTarget, window);\n this.ease = Util.initValue(ease, 0.7);\n\n this._allowEmitting = false;\n this.initEventHandler();\n }\n\n initEventHandler() {\n this.mousemoveHandler = e => this.mousemove.call(this, e);\n this.mousedownHandler = e => this.mousedown.call(this, e);\n this.mouseupHandler = e => this.mouseup.call(this, e);\n this.mouseTarget.addEventListener(\"mousemove\", this.mousemoveHandler, false);\n }\n\n /**\n * start emit particle\n * @method emit\n */\n emit() {\n this._allowEmitting = true;\n }\n\n /**\n * stop emiting\n * @method stop\n */\n stop() {\n this._allowEmitting = false;\n }\n\n mousemove(e) {\n if (e.layerX || e.layerX === 0) {\n this.p.x += (e.layerX - this.p.x) * this.ease;\n this.p.y += (e.layerY - this.p.y) * this.ease;\n } else if (e.offsetX || e.offsetX === 0) {\n this.p.x += (e.offsetX - this.p.x) * this.ease;\n this.p.y += (e.offsetY - this.p.y) * this.ease;\n }\n\n if (this._allowEmitting) super.emit(\"once\");\n }\n\n /**\n * Destory this Emitter\n * @method destroy\n */\n destroy() {\n super.destroy();\n this.mouseTarget.removeEventListener(\"mousemove\", this.mousemoveHandler, false);\n }\n}\n","export default {\n /**\n * Determine whether it is a picture object\n *\n * @return {boolean} is or no\n */\n isImage(obj) {\n if (!obj) return false;\n if (obj.__isImage) return true;\n\n const tagName = `${obj.tagName}`.toUpperCase();\n const nodeName = `${obj.nodeName}`.toUpperCase();\n if (nodeName === \"IMG\" || tagName === \"IMG\") {\n obj.__isImage = true;\n return true;\n }\n\n return false;\n },\n\n /**\n * Determine whether it is a string object\n *\n * @return {boolean} is or no\n */\n isString(obj) {\n return typeof obj === \"string\";\n }\n};\n","import Pool from \"../core/Pool\";\n\nexport default class BaseRenderer {\n constructor(element, stroke) {\n this.pool = new Pool();\n this.element = element;\n this.stroke = stroke;\n this.circleConf = { isCircle: true };\n\n this.initEventHandler();\n this.name = \"BaseRenderer\";\n }\n\n setStroke(color = \"#000000\", thinkness = 1) {\n this.stroke = { color, thinkness };\n }\n\n initEventHandler() {\n this._protonUpdateHandler = () => {\n this.onProtonUpdate.call(this);\n };\n\n this._protonUpdateAfterHandler = () => {\n this.onProtonUpdateAfter.call(this);\n };\n\n this._emitterAddedHandler = emitter => {\n this.onEmitterAdded.call(this, emitter);\n };\n\n this._emitterRemovedHandler = emitter => {\n this.onEmitterRemoved.call(this, emitter);\n };\n\n this._particleCreatedHandler = particle => {\n this.onParticleCreated.call(this, particle);\n };\n\n this._particleUpdateHandler = particle => {\n this.onParticleUpdate.call(this, particle);\n };\n\n this._particleDeadHandler = particle => {\n this.onParticleDead.call(this, particle);\n };\n }\n\n init(proton) {\n this.parent = proton;\n\n proton.addEventListener(\"PROTON_UPDATE\", this._protonUpdateHandler);\n proton.addEventListener(\"PROTON_UPDATE_AFTER\", this._protonUpdateAfterHandler);\n\n proton.addEventListener(\"EMITTER_ADDED\", this._emitterAddedHandler);\n proton.addEventListener(\"EMITTER_REMOVED\", this._emitterRemovedHandler);\n\n proton.addEventListener(\"PARTICLE_CREATED\", this._particleCreatedHandler);\n proton.addEventListener(\"PARTICLE_UPDATE\", this._particleUpdateHandler);\n proton.addEventListener(\"PARTICLE_DEAD\", this._particleDeadHandler);\n }\n\n resize(width, height) {}\n\n destroy() {\n this.remove();\n this.pool.destroy();\n this.pool = null;\n this.element = null;\n this.stroke = null;\n }\n\n remove(proton) {\n this.parent.removeEventListener(\"PROTON_UPDATE\", this._protonUpdateHandler);\n this.parent.removeEventListener(\"PROTON_UPDATE_AFTER\", this._protonUpdateAfterHandler);\n\n this.parent.removeEventListener(\"EMITTER_ADDED\", this._emitterAddedHandler);\n this.parent.removeEventListener(\"EMITTER_REMOVED\", this._emitterRemovedHandler);\n\n this.parent.removeEventListener(\"PARTICLE_CREATED\", this._particleCreatedHandler);\n this.parent.removeEventListener(\"PARTICLE_UPDATE\", this._particleUpdateHandler);\n this.parent.removeEventListener(\"PARTICLE_DEAD\", this._particleDeadHandler);\n\n this.parent = null;\n }\n\n onProtonUpdate() {}\n onProtonUpdateAfter() {}\n\n onEmitterAdded(emitter) {}\n onEmitterRemoved(emitter) {}\n\n onParticleCreated(particle) {}\n onParticleUpdate(particle) {}\n onParticleDead(particle) {}\n}\n","import Types from \"../utils/Types\";\nimport ImgUtil from \"../utils/ImgUtil\";\nimport ColorUtil from \"../utils/ColorUtil\";\nimport MathUtil from \"../math/MathUtil\";\nimport BaseRenderer from \"./BaseRenderer\";\n\n/**\n * CanvasRenderer class for rendering particles on a canvas element.\n * @extends BaseRenderer\n */\nexport default class CanvasRenderer extends BaseRenderer {\n /**\n * @type {object|null}\n * @private\n */\n stroke;\n\n /**\n * @type {CanvasRenderingContext2D}\n * @private\n */\n context;\n\n /**\n * @type {object}\n * @private\n */\n bufferCache;\n\n /**\n * @type {string}\n */\n name;\n\n /**\n * Creates a new CanvasRenderer instance.\n * @param {HTMLCanvasElement} element - The canvas element to render on.\n */\n constructor(element) {\n super(element);\n\n this.stroke = null;\n this.context = this.element.getContext(\"2d\");\n this.bufferCache = {};\n this.name = \"CanvasRenderer\";\n }\n\n /**\n * Resizes the canvas element.\n * @param {number} width - The new width of the canvas.\n * @param {number} height - The new height of the canvas.\n */\n resize(width, height) {\n this.element.width = width;\n this.element.height = height;\n }\n\n /**\n * Clears the canvas on Proton update.\n */\n onProtonUpdate() {\n this.context.clearRect(0, 0, this.element.width, this.element.height);\n }\n\n /**\n * Handles particle creation.\n * @param {object} particle - The created particle.\n */\n onParticleCreated(particle) {\n if (particle.body) {\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n } else {\n particle.color = particle.color || \"#ff0000\";\n }\n }\n\n /**\n * Handles particle updates.\n * @param {object} particle - The updated particle.\n */\n onParticleUpdate(particle) {\n if (particle.body) {\n if (Types.isImage(particle.body)) {\n this.drawImage(particle);\n }\n } else {\n this.drawCircle(particle);\n }\n }\n\n /**\n * Handles particle destruction.\n * @param {object} particle - The destroyed particle.\n */\n onParticleDead(particle) {\n particle.body = null;\n }\n\n /**\n * Adds an image to the particle body.\n * @param {HTMLImageElement} img - The image to add.\n * @param {object} particle - The particle to add the image to.\n * @private\n */\n addImg2Body(img, particle) {\n particle.body = img;\n }\n\n /**\n * Draws an image particle.\n * @param {object} particle - The particle to draw.\n * @private\n */\n drawImage(particle) {\n const w = (particle.body.width * particle.scale) | 0;\n const h = (particle.body.height * particle.scale) | 0;\n const x = particle.p.x - w / 2;\n const y = particle.p.y - h / 2;\n\n if (!!particle.color) {\n if (!particle.data[\"buffer\"]) particle.data.buffer = this.createBuffer(particle.body);\n\n const bufContext = particle.data.buffer.getContext(\"2d\");\n bufContext.clearRect(0, 0, particle.data.buffer.width, particle.data.buffer.height);\n bufContext.globalAlpha = particle.alpha;\n bufContext.drawImage(particle.body, 0, 0);\n\n bufContext.globalCompositeOperation = \"source-atop\";\n bufContext.fillStyle = ColorUtil.rgbToHex(particle.rgb);\n bufContext.fillRect(0, 0, particle.data.buffer.width, particle.data.buffer.height);\n bufContext.globalCompositeOperation = \"source-over\";\n bufContext.globalAlpha = 1;\n\n this.context.drawImage(\n particle.data.buffer,\n 0,\n 0,\n particle.data.buffer.width,\n particle.data.buffer.height,\n x,\n y,\n w,\n h\n );\n } else {\n this.context.save();\n\n this.context.globalAlpha = particle.alpha;\n this.context.translate(particle.p.x, particle.p.y);\n this.context.rotate(MathUtil.degreeTransform(particle.rotation));\n this.context.translate(-particle.p.x, -particle.p.y);\n this.context.drawImage(particle.body, 0, 0, particle.body.width, particle.body.height, x, y, w, h);\n\n this.context.globalAlpha = 1;\n this.context.restore();\n }\n }\n\n /**\n * Draws a circular particle.\n * @param {object} particle - The particle to draw.\n * @private\n */\n drawCircle(particle) {\n if (particle.rgb) {\n this.context.fillStyle = `rgba(${particle.rgb.r},${particle.rgb.g},${particle.rgb.b},${particle.alpha})`;\n } else {\n this.context.fillStyle = particle.color;\n }\n\n this.context.beginPath();\n this.context.arc(particle.p.x, particle.p.y, particle.radius, 0, Math.PI * 2, true);\n\n if (this.stroke) {\n this.context.strokeStyle = this.stroke.color;\n this.context.lineWidth = this.stroke.thinkness;\n this.context.stroke();\n }\n\n this.context.closePath();\n this.context.fill();\n }\n\n /**\n * Creates a buffer for image particles.\n * @param {HTMLImageElement} image - The image to create a buffer for.\n * @returns {HTMLCanvasElement|undefined} The created buffer canvas.\n * @private\n */\n createBuffer(image) {\n if (Types.isImage(image)) {\n const size = image.width + \"_\" + image.height;\n let canvas = this.bufferCache[size];\n\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n canvas.width = image.width;\n canvas.height = image.height;\n this.bufferCache[size] = canvas;\n }\n\n return canvas;\n }\n }\n\n /**\n * Destroys the renderer and cleans up resources.\n */\n destroy() {\n super.destroy();\n this.stroke = null;\n this.context = null;\n this.bufferCache = null;\n }\n}\n","import DomUtil from \"../utils/DomUtil\";\nimport ImgUtil from \"../utils/ImgUtil\";\nimport BaseRenderer from \"./BaseRenderer\";\n\n/**\n * Represents a DOM-based renderer for particle systems.\n * @extends BaseRenderer\n */\nexport default class DomRenderer extends BaseRenderer {\n /**\n * Creates a new DomRenderer instance.\n * @param {HTMLElement} element - The HTML element to render to.\n */\n constructor(element) {\n super(element);\n\n this.stroke = null;\n this.transform3d = false;\n this.pool.create = (body, particle) => this.createBody(body, particle);\n this.addImg2Body = this.addImg2Body.bind(this);\n\n this.name = \"DomRenderer\";\n }\n\n onParticleCreated(particle) {\n if (particle.body) {\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n } else {\n particle.body = this.pool.get(this.circleConf, particle);\n this.element.appendChild(particle.body);\n }\n }\n\n onParticleUpdate(particle) {\n if (this.bodyReady(particle)) {\n if (this.transform3d) {\n DomUtil.transform3d(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);\n } else {\n DomUtil.transform(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);\n }\n\n particle.body.style.opacity = particle.alpha;\n\n if (particle.body.isCircle) {\n particle.body.style.backgroundColor = particle.color || \"#ff0000\";\n }\n }\n }\n\n onParticleDead(particle) {\n if (this.bodyReady(particle)) {\n this.element.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n }\n\n bodyReady(particle) {\n return typeof particle.body === \"object\" && particle.body && !particle.body.isInner;\n }\n\n // private method\n addImg2Body(img, particle) {\n if (particle.dead) return;\n particle.body = this.pool.get(img, particle);\n DomUtil.resize(particle.body, img.width, img.height);\n\n this.element.appendChild(particle.body);\n }\n\n createBody(body, particle) {\n if (body.isCircle) return this.createCircle(particle);\n return this.createSprite(body, particle);\n }\n\n // private methods\n createCircle(particle) {\n const dom = DomUtil.createDiv(`${particle.id}_dom`, 2 * particle.radius, 2 * particle.radius);\n dom.style.borderRadius = `${particle.radius}px`;\n\n if (this.stroke) {\n dom.style.borderColor = this.stroke.color;\n dom.style.borderWidth = `${this.stroke.thinkness}px`;\n }\n dom.isCircle = true;\n\n return dom;\n }\n\n createSprite(body, particle) {\n const url = typeof body === \"string\" ? body : body.src;\n const dom = DomUtil.createDiv(`${particle.id}_dom`, body.width, body.height);\n dom.style.backgroundImage = `url(${url})`;\n\n return dom;\n }\n\n /**\n * Destroys the renderer and cleans up resources.\n */\n destroy() {\n super.destroy();\n this.stroke = null;\n }\n}\n","import Types from \"../utils/Types\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nexport default class EaselRenderer extends BaseRenderer {\n constructor(element, stroke) {\n super(element);\n\n this.stroke = stroke;\n this.name = \"EaselRenderer\";\n }\n\n onParticleCreated(particle) {\n if (particle.body) {\n this.createSprite(particle);\n } else {\n this.createCircle(particle);\n }\n\n this.element.addChild(particle.body);\n }\n\n onParticleUpdate(particle) {\n if (particle.body) {\n particle.body.x = particle.p.x;\n particle.body.y = particle.p.y;\n\n particle.body.alpha = particle.alpha;\n particle.body.scaleX = particle.body.scaleY = particle.scale;\n particle.body.rotation = particle.rotation;\n }\n }\n\n onParticleDead(particle) {\n if (particle.body) {\n particle.body.parent && particle.body.parent.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n\n if (particle.graphics) this.pool.expire(particle.graphics);\n }\n\n // private\n createSprite(particle) {\n particle.body = this.pool.get(particle.body);\n\n if (particle.body.parent) return;\n if (particle.body[\"image\"]) {\n particle.body.regX = particle.body.image.width / 2;\n particle.body.regY = particle.body.image.height / 2;\n }\n }\n\n createCircle(particle) {\n const graphics = this.pool.get(window.createjs.Graphics);\n\n if (this.stroke) {\n if (Types.isString(this.stroke)) {\n graphics.beginStroke(this.stroke);\n } else {\n graphics.beginStroke(\"#000000\");\n }\n }\n graphics.beginFill(particle.color || \"#ff0000\").drawCircle(0, 0, particle.radius);\n const shape = this.pool.get(window.createjs.Shape, [graphics]);\n\n particle.body = shape;\n particle.graphics = graphics;\n }\n\n destroy() {\n super.destroy();\n this.stroke = null;\n }\n}\n","import Rectangle from \"../math/Rectangle\";\nimport BaseRenderer from \"./BaseRenderer\";\n\n/**\n * Represents a pixel-based renderer for particle systems.\n * @extends BaseRenderer\n */\nexport default class PixelRenderer extends BaseRenderer {\n /**\n * Creates a new PixelRenderer instance.\n * @param {HTMLCanvasElement} element - The canvas element to render to.\n * @param {Rectangle} [rectangle] - The rectangle defining the rendering area.\n */\n constructor(element, rectangle) {\n super(element);\n\n this.context = this.element.getContext(\"2d\");\n this.imageData = null;\n this.rectangle = rectangle;\n this.createImageData(rectangle);\n\n this.name = \"PixelRenderer\";\n }\n\n resize(width, height) {\n this.element.width = width;\n this.element.height = height;\n }\n\n createImageData(rectangle) {\n this.rectangle = rectangle ? rectangle : new Rectangle(0, 0, this.element.width, this.element.height);\n this.imageData = this.context.createImageData(this.rectangle.width, this.rectangle.height);\n this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);\n }\n\n onProtonUpdate() {\n this.context.clearRect(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height);\n this.imageData = this.context.getImageData(\n this.rectangle.x,\n this.rectangle.y,\n this.rectangle.width,\n this.rectangle.height\n );\n }\n\n onProtonUpdateAfter() {\n this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);\n }\n\n onParticleCreated(particle) {}\n\n onParticleUpdate(particle) {\n if (this.imageData) {\n this.setPixel(\n this.imageData,\n (particle.p.x - this.rectangle.x) >> 0,\n (particle.p.y - this.rectangle.y) >> 0,\n particle\n );\n }\n }\n\n setPixel(imagedata, x, y, particle) {\n const rgb = particle.rgb;\n if (x < 0 || x > this.element.width || y < 0 || y > this.element.height) return;\n\n const i = ((y >> 0) * imagedata.width + (x >> 0)) * 4;\n imagedata.data[i] = rgb.r;\n imagedata.data[i + 1] = rgb.g;\n imagedata.data[i + 2] = rgb.b;\n imagedata.data[i + 3] = particle.alpha * 255;\n }\n\n onParticleDead(particle) {}\n\n /**\n * Destroys the renderer and cleans up resources.\n */\n destroy() {\n super.destroy();\n this.stroke = null;\n this.context = null;\n this.imageData = null;\n this.rectangle = null;\n }\n}\n","import Mat3 from \"../math/Mat3\";\n\nexport default class MStack {\n constructor() {\n this.mats = [];\n this.size = 0;\n\n for (let i = 0; i < 20; i++) this.mats.push(Mat3.create([0, 0, 0, 0, 0, 0, 0, 0, 0]));\n }\n\n set(m, i) {\n if (i === 0) Mat3.set(m, this.mats[0]);\n else Mat3.multiply(this.mats[i - 1], m, this.mats[i]);\n\n this.size = Math.max(this.size, i + 1);\n }\n\n push(m) {\n if (this.size === 0) Mat3.set(m, this.mats[0]);\n else Mat3.multiply(this.mats[this.size - 1], m, this.mats[this.size]);\n\n this.size++;\n }\n\n pop() {\n if (this.size > 0) this.size--;\n }\n\n top() {\n return this.mats[this.size - 1];\n }\n}\n","import Mat3 from \"../math/Mat3\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nimport Util from \"../utils/Util\";\nimport ImgUtil from \"../utils/ImgUtil\";\nimport MStack from \"../utils/MStack\";\nimport DomUtil from \"../utils/DomUtil\";\nimport WebGLUtil from \"../utils/WebGLUtil\";\nimport MathUtil from \"../math/MathUtil\";\n\n/**\n * Represents a WebGL-based renderer for particle systems.\n * @extends BaseRenderer\n */\nexport default class WebGLRenderer extends BaseRenderer {\n /**\n * Creates a new WebGLRenderer instance.\n * @param {HTMLCanvasElement} element - The canvas element to render to.\n */\n constructor(element) {\n super(element);\n\n this.gl = this.element.getContext(\"experimental-webgl\", { antialias: true, stencil: false, depth: false });\n if (!this.gl) alert(\"Sorry your browser do not suppest WebGL!\");\n\n this.initVar();\n this.setMaxRadius();\n this.initShaders();\n this.initBuffers();\n\n this.gl.blendEquation(this.gl.FUNC_ADD);\n this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n this.gl.enable(this.gl.BLEND);\n this.addImg2Body = this.addImg2Body.bind(this);\n\n this.name = \"WebGLRenderer\";\n }\n\n init(proton) {\n super.init(proton);\n this.resize(this.element.width, this.element.height);\n }\n\n resize(width, height) {\n this.umat[4] = -2;\n this.umat[7] = 1;\n\n this.smat[0] = 1 / width;\n this.smat[4] = 1 / height;\n\n this.mstack.set(this.umat, 0);\n this.mstack.set(this.smat, 1);\n\n this.gl.viewport(0, 0, width, height);\n this.element.width = width;\n this.element.height = height;\n }\n\n setMaxRadius(radius) {\n this.circleCanvasURL = this.createCircle(radius);\n }\n\n getVertexShader() {\n const vsSource = [\n \"uniform vec2 viewport;\",\n \"attribute vec2 aVertexPosition;\",\n \"attribute vec2 aTextureCoord;\",\n \"uniform mat3 tMat;\",\n \"varying vec2 vTextureCoord;\",\n \"varying float alpha;\",\n \"void main() {\",\n \"vec3 v = tMat * vec3(aVertexPosition, 1.0);\",\n \"gl_Position = vec4(v.x, v.y, 0, 1);\",\n \"vTextureCoord = aTextureCoord;\",\n \"alpha = tMat[0][2];\",\n \"}\"\n ].join(\"\\n\");\n return vsSource;\n }\n\n getFragmentShader() {\n const fsSource = [\n \"precision mediump float;\",\n \"varying vec2 vTextureCoord;\",\n \"varying float alpha;\",\n \"uniform sampler2D uSampler;\",\n \"uniform vec4 color;\",\n \"uniform bool useTexture;\",\n \"uniform vec3 uColor;\",\n \"void main() {\",\n \"vec4 textureColor = texture2D(uSampler, vTextureCoord);\",\n \"gl_FragColor = textureColor * vec4(uColor, 1.0);\",\n \"gl_FragColor.w *= alpha;\",\n \"}\"\n ].join(\"\\n\");\n return fsSource;\n }\n\n initVar() {\n this.mstack = new MStack();\n this.umat = Mat3.create([2, 0, 1, 0, -2, 0, -1, 1, 1]);\n this.smat = Mat3.create([1 / 100, 0, 1, 0, 1 / 100, 0, 0, 0, 1]);\n this.texturebuffers = {};\n }\n\n blendEquation(A) {\n this.gl.blendEquation(this.gl[A]);\n }\n\n blendFunc(A, B) {\n this.gl.blendFunc(this.gl[A], this.gl[B]);\n }\n\n getShader(gl, str, fs) {\n const shader = fs ? gl.createShader(gl.FRAGMENT_SHADER) : gl.createShader(gl.VERTEX_SHADER);\n\n gl.shaderSource(shader, str);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n alert(gl.getShaderInfoLog(shader));\n return null;\n }\n\n return shader;\n }\n\n initShaders() {\n const fragmentShader = this.getShader(this.gl, this.getFragmentShader(), true);\n const vertexShader = this.getShader(this.gl, this.getVertexShader(), false);\n\n this.sprogram = this.gl.createProgram();\n this.gl.attachShader(this.sprogram, vertexShader);\n this.gl.attachShader(this.sprogram, fragmentShader);\n this.gl.linkProgram(this.sprogram);\n\n if (!this.gl.getProgramParameter(this.sprogram, this.gl.LINK_STATUS)) alert(\"Could not initialise shaders\");\n\n this.gl.useProgram(this.sprogram);\n this.sprogram.vpa = this.gl.getAttribLocation(this.sprogram, \"aVertexPosition\");\n this.sprogram.tca = this.gl.getAttribLocation(this.sprogram, \"aTextureCoord\");\n this.gl.enableVertexAttribArray(this.sprogram.tca);\n this.gl.enableVertexAttribArray(this.sprogram.vpa);\n\n this.sprogram.tMatUniform = this.gl.getUniformLocation(this.sprogram, \"tMat\");\n this.sprogram.samplerUniform = this.gl.getUniformLocation(this.sprogram, \"uSampler\");\n this.sprogram.useTex = this.gl.getUniformLocation(this.sprogram, \"useTexture\");\n this.sprogram.color = this.gl.getUniformLocation(this.sprogram, \"uColor\");\n this.gl.uniform1i(this.sprogram.useTex, 1);\n }\n\n initBuffers() {\n const vs = [0, 3, 1, 0, 2, 3];\n let idx;\n\n this.unitIBuffer = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(vs), this.gl.STATIC_DRAW);\n\n let i;\n let ids = [];\n for (i = 0; i < 100; i++) ids.push(i);\n idx = new Uint16Array(ids);\n\n this.unitI33 = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitI33);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);\n\n ids = [];\n for (i = 0; i < 100; i++) ids.push(i, i + 1, i + 2);\n idx = new Uint16Array(ids);\n\n this.stripBuffer = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.stripBuffer);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);\n }\n\n createCircle(raidus) {\n this.circleCanvasRadius = WebGLUtil.nhpot(Util.initValue(raidus, 32));\n const canvas = DomUtil.createCanvas(\"circle_canvas\", this.circleCanvasRadius * 2, this.circleCanvasRadius * 2);\n const context = canvas.getContext(\"2d\");\n\n context.beginPath();\n context.arc(this.circleCanvasRadius, this.circleCanvasRadius, this.circleCanvasRadius, 0, Math.PI * 2, true);\n context.closePath();\n context.fillStyle = \"#FFF\";\n context.fill();\n\n return canvas.toDataURL();\n }\n\n drawImg2Canvas(particle) {\n const _w = particle.body.width;\n const _h = particle.body.height;\n\n const _width = WebGLUtil.nhpot(particle.body.width);\n const _height = WebGLUtil.nhpot(particle.body.height);\n\n const _scaleX = particle.body.width / _width;\n const _scaleY = particle.body.height / _height;\n\n if (!this.texturebuffers[particle.data.src])\n this.texturebuffers[particle.data.src] = [\n this.gl.createTexture(),\n this.gl.createBuffer(),\n this.gl.createBuffer()\n ];\n\n particle.data.texture = this.texturebuffers[particle.data.src][0];\n particle.data.vcBuffer = this.texturebuffers[particle.data.src][1];\n particle.data.tcBuffer = this.texturebuffers[particle.data.src][2];\n\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.tcBuffer);\n this.gl.bufferData(\n this.gl.ARRAY_BUFFER,\n new Float32Array([0.0, 0.0, _scaleX, 0.0, 0.0, _scaleY, _scaleY, _scaleY]),\n this.gl.STATIC_DRAW\n );\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.vcBuffer);\n this.gl.bufferData(\n this.gl.ARRAY_BUFFER,\n new Float32Array([0.0, 0.0, _w, 0.0, 0.0, _h, _w, _h]),\n this.gl.STATIC_DRAW\n );\n\n const context = particle.data.canvas.getContext(\"2d\");\n const data = context.getImageData(0, 0, _width, _height);\n\n this.gl.bindTexture(this.gl.TEXTURE_2D, particle.data.texture);\n this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, data);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_NEAREST);\n this.gl.generateMipmap(this.gl.TEXTURE_2D);\n\n particle.data.textureLoaded = true;\n particle.data.textureWidth = _w;\n particle.data.textureHeight = _h;\n }\n\n onProtonUpdate() {\n // this.gl.clearColor(0, 0, 0, 1);\n // this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);\n }\n\n onParticleCreated(particle) {\n particle.data.textureLoaded = false;\n particle.data.tmat = Mat3.create();\n particle.data.tmat[8] = 1;\n particle.data.imat = Mat3.create();\n particle.data.imat[8] = 1;\n\n if (particle.body) {\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n } else {\n ImgUtil.getImgFromCache(this.circleCanvasURL, this.addImg2Body, particle);\n particle.data.oldScale = particle.radius / this.circleCanvasRadius;\n }\n }\n\n // private\n addImg2Body(img, particle) {\n if (particle.dead) return;\n particle.body = img;\n particle.data.src = img.src;\n particle.data.canvas = ImgUtil.getCanvasFromCache(img);\n particle.data.oldScale = 1;\n\n this.drawImg2Canvas(particle);\n }\n\n onParticleUpdate(particle) {\n if (particle.data.textureLoaded) {\n this.updateMatrix(particle);\n\n this.gl.uniform3f(this.sprogram.color, particle.rgb.r / 255, particle.rgb.g / 255, particle.rgb.b / 255);\n this.gl.uniformMatrix3fv(this.sprogram.tMatUniform, false, this.mstack.top());\n\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.vcBuffer);\n this.gl.vertexAttribPointer(this.sprogram.vpa, 2, this.gl.FLOAT, false, 0, 0);\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.tcBuffer);\n this.gl.vertexAttribPointer(this.sprogram.tca, 2, this.gl.FLOAT, false, 0, 0);\n this.gl.bindTexture(this.gl.TEXTURE_2D, particle.data.texture);\n this.gl.uniform1i(this.sprogram.samplerUniform, 0);\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);\n\n this.gl.drawElements(this.gl.TRIANGLES, 6, this.gl.UNSIGNED_SHORT, 0);\n this.mstack.pop();\n }\n }\n\n onParticleDead(particle) {}\n\n updateMatrix(particle) {\n const moveOriginMatrix = WebGLUtil.makeTranslation(\n -particle.data.textureWidth / 2,\n -particle.data.textureHeight / 2\n );\n const translationMatrix = WebGLUtil.makeTranslation(particle.p.x, particle.p.y);\n\n const angel = particle.rotation * MathUtil.PI_180;\n const rotationMatrix = WebGLUtil.makeRotation(angel);\n\n const scale = particle.scale * particle.data.oldScale;\n const scaleMatrix = WebGLUtil.makeScale(scale, scale);\n let matrix = WebGLUtil.matrixMultiply(moveOriginMatrix, scaleMatrix);\n\n matrix = WebGLUtil.matrixMultiply(matrix, rotationMatrix);\n matrix = WebGLUtil.matrixMultiply(matrix, translationMatrix);\n\n Mat3.inverse(matrix, particle.data.imat);\n matrix[2] = particle.alpha;\n\n this.mstack.push(matrix);\n }\n\n destroy() {\n super.destroy();\n this.gl = null;\n this.mstack = null;\n this.umat = null;\n this.smat = null;\n this.texturebuffers = null;\n }\n}\n","import BaseRenderer from \"./BaseRenderer\";\n\n/**\n * Represents a custom renderer that extends the BaseRenderer.\n * @extends BaseRenderer\n */\nexport default class CustomRenderer extends BaseRenderer {\n /**\n * Creates a new CustomRenderer instance.\n * @param {HTMLElement} element - The HTML element to render to.\n */\n constructor(element) {\n super(element);\n\n /**\n * The name of the renderer.\n * @type {string}\n */\n this.name = \"CustomRenderer\";\n }\n}\n","import Zone from \"./Zone\";\nimport Util from \"../utils/Util\";\nimport MathUtil from \"../math/MathUtil\";\nimport Vector2D from \"../math/Vector2D\";\n\n/**\n * Represents a line zone for particle systems.\n * @extends Zone\n */\nexport default class LineZone extends Zone {\n /**\n * Creates a new LineZone.\n * @param {number} x1 - The x-coordinate of the first point.\n * @param {number} y1 - The y-coordinate of the first point.\n * @param {number} [x2] - The x-coordinate of the second point.\n * @param {number} [y2] - The y-coordinate of the second point.\n * @param {string} [direction=\">\"] - The direction of the line.\n */\n constructor(x1, y1, x2, y2, direction = \">\") {\n super();\n\n if (x2 - x1 >= 0) {\n this.x1 = x1;\n this.y1 = y1;\n this.x2 = x2;\n this.y2 = y2;\n } else {\n this.x1 = x2;\n this.y1 = y2;\n this.x2 = x1;\n this.y2 = y1;\n }\n\n this.dx = this.x2 - this.x1;\n this.dy = this.y2 - this.y1;\n\n this.minx = Math.min(this.x1, this.x2);\n this.miny = Math.min(this.y1, this.y2);\n this.maxx = Math.max(this.x1, this.x2);\n this.maxy = Math.max(this.y1, this.y2);\n\n this.dot = this.x2 * this.y1 - this.x1 * this.y2;\n this.xxyy = this.dx * this.dx + this.dy * this.dy;\n\n this.gradient = this.getGradient();\n this.length = this.getLength();\n this.direction = Util.initValue(direction, \">\");\n }\n\n /**\n * Gets a random position on the line.\n * @returns {Vector2D} A vector representing the random position.\n */\n getPosition() {\n this.random = Math.random();\n this.vector.x = this.x1 + this.random * this.length * Math.cos(this.gradient);\n this.vector.y = this.y1 + this.random * this.length * Math.sin(this.gradient);\n\n return this.vector;\n }\n\n /**\n * Determines which side of the line a point is on.\n * @param {number} x - The x-coordinate of the point.\n * @param {number} y - The y-coordinate of the point.\n * @returns {boolean} True if the point is on the positive side of the line, false otherwise.\n */\n getDirection(x, y) {\n const A = this.dy;\n const B = -this.dx;\n const C = this.dot;\n const D = B === 0 ? 1 : B;\n\n if ((A * x + B * y + C) * D > 0) return true;\n else return false;\n }\n\n /**\n * Calculates the distance of a point from the line.\n * @param {number} x - The x-coordinate of the point.\n * @param {number} y - The y-coordinate of the point.\n * @returns {number} The distance from the point to the line.\n */\n getDistance(x, y) {\n const A = this.dy;\n const B = -this.dx;\n const C = this.dot;\n const D = A * x + B * y + C;\n\n return D / Math.sqrt(this.xxyy);\n }\n\n /**\n * Calculates the symmetric vector of a given vector with respect to the line.\n * @param {Vector2D} v - The vector to reflect.\n * @returns {Vector2D} The reflected vector.\n */\n getSymmetric(v) {\n const tha2 = v.getGradient();\n const tha1 = this.getGradient();\n const tha = 2 * (tha1 - tha2);\n\n const oldx = v.x;\n const oldy = v.y;\n\n v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);\n v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);\n\n return v;\n }\n\n /**\n * Gets the gradient (angle) of the line.\n * @returns {number} The gradient of the line in radians.\n */\n getGradient() {\n return Math.atan2(this.dy, this.dx);\n }\n\n /**\n * Checks if a particle is outside the range of the line.\n * @param {Particle} particle - The particle to check.\n * @returns {boolean} True if the particle is within range, false otherwise.\n */\n rangeOut(particle) {\n const angle = Math.abs(this.getGradient());\n\n if (angle <= MathUtil.PI / 4) {\n if (particle.p.x <= this.maxx && particle.p.x >= this.minx) return true;\n } else {\n if (particle.p.y <= this.maxy && particle.p.y >= this.miny) return true;\n }\n\n return false;\n }\n\n /**\n * Gets the length of the line.\n * @returns {number} The length of the line.\n */\n getLength() {\n return Math.sqrt(this.dx * this.dx + this.dy * this.dy);\n }\n\n /**\n * Handles particle crossing behavior based on the crossType.\n * @param {Particle} particle - The particle to check for crossing.\n */\n crossing(particle) {\n if (this.crossType === \"dead\") {\n if (this.direction === \">\" || this.direction === \"R\" || this.direction === \"right\" || this.direction === \"down\") {\n if (!this.rangeOut(particle)) return;\n if (this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;\n } else {\n if (!this.rangeOut(particle)) return;\n if (!this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;\n }\n } else if (this.crossType === \"bound\") {\n if (!this.rangeOut(particle)) return;\n\n if (this.getDistance(particle.p.x, particle.p.y) <= particle.radius) {\n if (this.dx === 0) {\n particle.v.x *= -1;\n } else if (this.dy === 0) {\n particle.v.y *= -1;\n } else {\n this.getSymmetric(particle.v);\n }\n }\n } else if (this.crossType === \"cross\") {\n if (this.alert) {\n console.error(\"Sorry, LineZone does not support cross method!\");\n this.alert = false;\n }\n }\n }\n}\n","import Zone from \"./Zone\";\nimport MathUtil from \"../math/MathUtil\";\n\n/**\n * Represents a circular zone in a 2D space.\n * @extends Zone\n */\nexport default class CircleZone extends Zone {\n /**\n * Creates a new CircleZone.\n * @param {number} x - The x-coordinate of the circle's center.\n * @param {number} y - The y-coordinate of the circle's center.\n * @param {number} [radius] - The radius of the circle.\n */\n constructor(x, y, radius) {\n super();\n\n this.x = x;\n this.y = y;\n this.radius = radius;\n this.angle = 0;\n this.center = { x, y };\n }\n\n /**\n * Gets a random position within the circle.\n * @returns {Object} An object with x and y coordinates.\n */\n getPosition() {\n this.angle = MathUtil.PIx2 * Math.random();\n this.randomRadius = Math.random() * this.radius;\n this.vector.x = this.x + this.randomRadius * Math.cos(this.angle);\n this.vector.y = this.y + this.randomRadius * Math.sin(this.angle);\n\n return this.vector;\n }\n\n /**\n * Sets the center of the circle.\n * @param {number} x - The new x-coordinate of the center.\n * @param {number} y - The new y-coordinate of the center.\n */\n setCenter(x, y) {\n this.center.x = x;\n this.center.y = y;\n }\n\n /**\n * Handles particle crossing behavior.\n * @param {Object} particle - The particle to check for crossing.\n */\n crossing(particle) {\n const d = particle.p.distanceTo(this.center);\n\n if (this.crossType === \"dead\") {\n if (d - particle.radius > this.radius) particle.dead = true;\n } else if (this.crossType === \"bound\") {\n if (d + particle.radius >= this.radius) this.getSymmetric(particle);\n } else if (this.crossType === \"cross\") {\n if (this.alert) {\n console.error(\"Sorry, CircleZone does not support cross method!\");\n this.alert = false;\n }\n }\n }\n\n /**\n * Calculates the symmetric position of a particle.\n * @param {Object} particle - The particle to calculate symmetry for.\n */\n getSymmetric(particle) {\n const tha2 = particle.v.getGradient();\n const tha1 = this.getGradient(particle);\n\n const tha = 2 * (tha1 - tha2);\n const oldx = particle.v.x;\n const oldy = particle.v.y;\n\n particle.v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);\n particle.v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);\n }\n\n /**\n * Calculates the gradient for a particle.\n * @param {Object} particle - The particle to calculate the gradient for.\n * @returns {number} The calculated gradient.\n */\n getGradient(particle) {\n return -MathUtil.PI_2 + Math.atan2(particle.p.y - this.center.y, particle.p.x - this.center.x);\n }\n}\n","import Zone from \"./Zone\";\n\n/**\n * Represents a rectangular zone for particle systems.\n * @extends Zone\n */\nexport default class RectZone extends Zone {\n /**\n * Creates a new RectZone.\n * @param {number} x - The x-coordinate of the top-left corner of the rectangle.\n * @param {number} y - The y-coordinate of the top-left corner of the rectangle.\n * @param {number} [width] - The width of the rectangle.\n * @param {number} [height] - The height of the rectangle.\n */\n constructor(x, y, width = 200, height = 200) {\n super();\n\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n }\n\n /**\n * Gets a random position within the rectangular zone.\n * @returns {Vector2D} A vector representing the random position.\n */\n getPosition() {\n this.vector.x = this.x + Math.random() * this.width;\n this.vector.y = this.y + Math.random() * this.height;\n return this.vector;\n }\n\n /**\n * Handles particle crossing behavior based on the crossType.\n * @param {Particle} particle - The particle to check for crossing.\n */\n crossing(particle) {\n // particle dead zone\n if (this.crossType === \"dead\") {\n if (particle.p.x + particle.radius < this.x) particle.dead = true;\n else if (particle.p.x - particle.radius > this.x + this.width) particle.dead = true;\n\n if (particle.p.y + particle.radius < this.y) particle.dead = true;\n else if (particle.p.y - particle.radius > this.y + this.height) particle.dead = true;\n }\n\n // particle bound zone\n else if (this.crossType === \"bound\") {\n if (particle.p.x - particle.radius < this.x) {\n particle.p.x = this.x + particle.radius;\n particle.v.x *= -1;\n } else if (particle.p.x + particle.radius > this.x + this.width) {\n particle.p.x = this.x + this.width - particle.radius;\n particle.v.x *= -1;\n }\n\n if (particle.p.y - particle.radius < this.y) {\n particle.p.y = this.y + particle.radius;\n particle.v.y *= -1;\n } else if (particle.p.y + particle.radius > this.y + this.height) {\n particle.p.y = this.y + this.height - particle.radius;\n particle.v.y *= -1;\n }\n }\n\n // particle cross zone\n else if (this.crossType === \"cross\") {\n if (particle.p.x + particle.radius < this.x && particle.v.x <= 0) {\n particle.p.x = this.x + this.width + particle.radius;\n } else if (particle.p.x - particle.radius > this.x + this.width && particle.v.x >= 0) {\n particle.p.x = this.x - particle.radius;\n }\n\n if (particle.p.y + particle.radius < this.y && particle.v.y <= 0) {\n particle.p.y = this.y + this.height + particle.radius;\n } else if (particle.p.y - particle.radius > this.y + this.height && particle.v.y >= 0) {\n particle.p.y = this.y - particle.radius;\n }\n }\n }\n}\n","import Zone from \"./Zone\";\nimport Util from \"../utils/Util\";\n\n/**\n * Represents a zone based on image data.\n * @extends Zone\n */\nexport default class ImageZone extends Zone {\n /**\n * Creates an ImageZone.\n * @param {ImageData} imageData - The image data to use for the zone.\n * @param {number} [x=0] - The x-coordinate offset.\n * @param {number} [y=0] - The y-coordinate offset.\n * @param {number} [d=2] - The sampling density.\n */\n constructor(imageData, x, y, d) {\n super();\n this.reset(imageData, x, y, d);\n }\n\n /**\n * Resets the ImageZone with new parameters.\n * @param {ImageData} imageData - The image data to use for the zone.\n * @param {number} [x=0] - The x-coordinate offset.\n * @param {number} [y=0] - The y-coordinate offset.\n * @param {number} [d=2] - The sampling density.\n */\n reset(imageData, x, y, d) {\n this.imageData = imageData;\n this.x = Util.initValue(x, 0);\n this.y = Util.initValue(y, 0);\n this.d = Util.initValue(d, 2);\n\n this.vectors = [];\n this.setVectors();\n }\n\n /**\n * Sets up vectors based on the image data.\n * @returns {Object} The vector object.\n */\n setVectors() {\n let i, j;\n const length1 = this.imageData.width;\n const length2 = this.imageData.height;\n\n for (i = 0; i < length1; i += this.d) {\n for (j = 0; j < length2; j += this.d) {\n let index = ((j >> 0) * length1 + (i >> 0)) * 4;\n\n if (this.imageData.data[index + 3] > 0) {\n this.vectors.push({ x: i + this.x, y: j + this.y });\n }\n }\n }\n\n return this.vector;\n }\n\n /**\n * Checks if a point is within the bounds of the image.\n * @param {number} x - The x-coordinate to check.\n * @param {number} y - The y-coordinate to check.\n * @returns {boolean} True if the point is within bounds, false otherwise.\n */\n getBound(x, y) {\n const index = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;\n return this.imageData.data[index + 3] > 0;\n }\n\n /**\n * Gets a random position within the image zone.\n * @returns {Object} A vector representing the position.\n */\n getPosition() {\n const vector = Util.getRandFromArray(this.vectors);\n return this.vector.copy(vector);\n }\n\n /**\n * Gets the color at a specific point in the image.\n * @param {number} x - The x-coordinate.\n * @param {number} y - The y-coordinate.\n * @returns {Object} An object containing r, g, b, and a values.\n */\n getColor(x, y) {\n x -= this.x;\n y -= this.y;\n const i = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;\n\n return {\n r: this.imageData.data[i],\n g: this.imageData.data[i + 1],\n b: this.imageData.data[i + 2],\n a: this.imageData.data[i + 3]\n };\n }\n\n /**\n * Handles particle crossing behavior.\n * @param {Object} particle - The particle to check for crossing.\n */\n crossing(particle) {\n if (this.crossType === \"dead\") {\n particle.dead = this.getBound(particle.p.x - this.x, particle.p.y - this.y);\n } else if (this.crossType === \"bound\") {\n if (!this.getBound(particle.p.x - this.x, particle.p.y - this.y)) particle.v.negate();\n }\n }\n\n /**\n * Destroys the ImageZone and cleans up resources.\n */\n destroy() {\n super.destroy();\n this.imageData = null;\n }\n}\n","import ColorUtil from \"../utils/ColorUtil\";\nimport CircleZone from \"../zone/CircleZone\";\nimport PointZone from \"../zone/PointZone\";\nimport LineZone from \"../zone/LineZone\";\nimport RectZone from \"../zone/RectZone\";\n\nexport default {\n addEventListener(proton, func) {\n proton.addEventListener(\"PROTON_UPDATE_AFTER\", () => func());\n },\n\n getStyle(color = \"#ff0000\") {\n const rgb = ColorUtil.hexToRgb(color);\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.5)`;\n },\n\n drawZone(proton, canvas, zone, clear) {\n const context = canvas.getContext(\"2d\");\n const style = this.getStyle();\n\n this.addEventListener(proton, () => {\n if (clear) context.clearRect(0, 0, canvas.width, canvas.height);\n\n if (zone instanceof PointZone) {\n context.beginPath();\n context.fillStyle = style;\n context.arc(zone.x, zone.y, 10, 0, Math.PI * 2, true);\n context.fill();\n context.closePath();\n } else if (zone instanceof LineZone) {\n context.beginPath();\n context.strokeStyle = style;\n context.moveTo(zone.x1, zone.y1);\n context.lineTo(zone.x2, zone.y2);\n context.stroke();\n context.closePath();\n } else if (zone instanceof RectZone) {\n context.beginPath();\n context.strokeStyle = style;\n context.drawRect(zone.x, zone.y, zone.width, zone.height);\n context.stroke();\n context.closePath();\n } else if (zone instanceof CircleZone) {\n context.beginPath();\n context.strokeStyle = style;\n context.arc(zone.x, zone.y, zone.radius, 0, Math.PI * 2, true);\n context.stroke();\n context.closePath();\n }\n });\n },\n\n drawEmitter(proton, canvas, emitter, clear) {\n const context = canvas.getContext(\"2d\");\n const style = this.getStyle();\n\n this.addEventListener(proton, () => {\n if (clear) context.clearRect(0, 0, canvas.width, canvas.height);\n\n context.beginPath();\n context.fillStyle = style;\n context.arc(emitter.p.x, emitter.p.y, 10, 0, Math.PI * 2, true);\n context.fill();\n context.closePath();\n });\n }\n};\n"],"names":["WebGLUtil","nhpot","length","i","tx","ty","makeRotation","angleInRadians","c","Math","cos","s","sin","sx","sy","a","b","a00","a01","a02","a10","a11","a12","a20","a21","a22","b00","b01","b02","b10","b11","b12","b20","b21","b22","DomUtil","createCanvas","id","width","height","position","dom","document","createElement","style","opacity","this","transform","createDiv","resize","marginLeft","marginTop","div","x","y","scale","rotate","willChange","css3","transform3d","key","val","bkey","charAt","toUpperCase","substr","imgsCache","canvasCache","canvasId","ImgUtil","context","image","rect","drawImage","imagedata","getImageData","clearRect","img","callback","param","src","Image","onload","e","target","canvas","getContext","Util","initValue","value","defaults","isArray","Object","prototype","toString","call","emptyArray","arr","toArray","sliceArray","arr1","index","arr2","push","getRandFromArray","floor","random","emptyObject","obj","ignore","indexOf","classApply","constructor","args","bind","apply","concat","destroyAll","destroy","assign","source","hasOwnProperty","idsMap","Puid","_index","_cache","type","undefined","getId","uid","getIdFromCache","isBody","isInner","getTarget","Pool","num","total","cache","_proto","get","params","p","__puid","pop","createOrClone","expire","getCache","create","clone","getCount","count","Stats","proton","container","emitterIndex","rendererIndex","update","body","add","emitter","getEmitter","renderer","getRenderer","str","emitters","emitSpeed","getEmitterPos","initializes","concatArr","behaviours","name","getCreatedNumber","pool","innerHTML","_this","bg","color","cssText","join","addEventListener","parentNode","appendChild","renderers","result","cpool","round","removeChild","EventDispatcher","_listeners","dispatchEvent","hasEventListener","removeEventListener","removeAllEventListeners","listener","splice","listeners","handler","PI","INFINITY","Infinity","MathUtil","PIx2","PI_2","PI_180","N180_PI","isInfinity","randomAToB","isInt","randomFloating","center","f","randomColor","slice","randomZone","display","k","digits","pow","degreeTransform","toColor16","Integration","calculate","particles","time","damping","eulerIntegrate","particle","sleep","old","copy","v","multiplyScalar","mass","clear","Proton","integrationType","now","then","elapsed","stats","EULER","integrator","_fps","_interval","DEFAULT_INTERVAL","addRenderer","render","init","removeRenderer","remove","addEmitter","parent","EMITTER_ADDED","removeEmitter","EMITTER_REMOVED","PROTON_UPDATE","USE_CLOCK","Date","getTime","amendChangeTabsBug","emittersUpdate","PROTON_UPDATE_AFTER","getAllParticles","destroyAllEmitters","destroyOther","setTimeout","set","fps","MEASURE","RK2","PARTICLE_CREATED","PARTICLE_UPDATE","PARTICLE_SLEEP","PARTICLE_DEAD","Rgb","r","g","reset","Span","getValue","setSpanValue","getSpanValue","pan","PropUtil","hasProp","setProp","props","prop","setVectorVal","conf","ease","easeLinear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","sqrt","easeOutCirc","easeInOutCirc","easeInBack","easeOutBack","easeInOutBack","getEasing","Vector2D","setX","setY","getGradient","atan2","w","addVectors","addXY","sub","subVectors","divideScalar","negate","dot","lengthSq","normalize","distanceTo","distanceToSquared","tha","dx","dy","lerp","alpha","equals","Particle","data","rgb","getDirection","life","age","dead","sprite","energy","radius","rotation","easing","removeAllBehaviours","applyBehaviours","max","applyBehaviour","addBehaviour","behaviour","parents","initialize","addBehaviours","removeBehaviour","ColorUtil","hexToRgb","h","hex16","substring","parseInt","rgbToHex","rbg","getHex16FromParticle","Number","Polar2D","abs","setR","setTha","toVector","getX","getY","Mat3","mat3","mat","Float32Array","mat1","mat2","multiply","inverse","multiplyVec2","m","vec","ArraySpan","_Span","_arr","_inheritsLoose","createArraySpan","Rectangle","bottom","right","contains","Rate","numpan","timepan","numPan","timePan","startTime","nextTime","Initialize","Life","_Initialize","lifePan","Zone","vector","crossType","alert","getPosition","crossing","PointZone","_Zone","console","error","Position","zone","Velocity","rpan","thapan","rPan","thaPan","normalizeVelocity","vr","polar2d","Mass","massPan","Radius","oldRadius","Body","imageTarget","inner","Behaviour","normalizeForce","force","normalizeValue","Force","_Behaviour","fx","fy","Attraction","targetPosition","radiusSq","attractionForce","RandomDrift","driftX","driftY","delay","panFoce","Gravity","_Force","Collision","newPool","collisionPool","delta","otherParticle","overlap","totalMass","averageMass1","averageMass2","distance","CrossZone","Alpha","same","alphaA","alphaB","Scale","scaleA","scaleB","Rotate","influence","rotationA","rotationB","Color","colorA","colorB","CHANGING","Cyclone","angle","setAngleAndForce","span","String","toLowerCase","cangle","cyclone","gradient","Repulsion","_Attraction","GravityWell","centerPoint","distanceVec","distanceSq","factor","InitializeUtil","bindEmitter","Emitter","_Particle","emitTime","totalTime","rate","emit","stoped","isNaN","stop","preEmit","oldStoped","oldEmitTime","oldTotalTime","step","removeAllParticles","addSelfInitialize","addInitialize","_len","arguments","rest","Array","_key","removeInitialize","initializer","removeAllInitializers","_len2","_key2","emitting","integrate","dispatch","event","bindEvent","createParticle","setupParticle","PIXIClass","BehaviourEmitter","_Emitter","selfBehaviours","addSelfBehaviour","removeSelfBehaviour","FollowEmitter","mouseTarget","window","_allowEmitting","initEventHandler","_this2","mousemoveHandler","mousemove","mousedownHandler","mousedown","mouseupHandler","mouseup","layerX","layerY","offsetX","offsetY","Types","isImage","__isImage","tagName","nodeName","isString","BaseRenderer","element","stroke","circleConf","isCircle","setStroke","thinkness","_protonUpdateHandler","onProtonUpdate","_protonUpdateAfterHandler","onProtonUpdateAfter","_emitterAddedHandler","onEmitterAdded","_emitterRemovedHandler","onEmitterRemoved","_particleCreatedHandler","onParticleCreated","_particleUpdateHandler","onParticleUpdate","_particleDeadHandler","onParticleDead","CanvasRenderer","_BaseRenderer","bufferCache","addImg2Body","drawCircle","buffer","createBuffer","bufContext","globalAlpha","globalCompositeOperation","fillStyle","fillRect","save","translate","restore","beginPath","arc","strokeStyle","lineWidth","closePath","fill","size","DomRenderer","createBody","bodyReady","backgroundColor","createCircle","createSprite","borderRadius","borderColor","borderWidth","url","backgroundImage","EaselRenderer","addChild","scaleX","scaleY","graphics","regX","regY","createjs","Graphics","beginStroke","beginFill","shape","Shape","PixelRenderer","rectangle","imageData","createImageData","putImageData","setPixel","PixiRenderer","setColor","blendMode","setPIXI","PIXI","Sprite","createFromImage","from","fromImage","tint","anchor","endFill","MStack","mats","top","WebGLRenderer","gl","antialias","stencil","depth","initVar","setMaxRadius","initShaders","initBuffers","blendEquation","FUNC_ADD","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","enable","BLEND","umat","smat","mstack","viewport","circleCanvasURL","getVertexShader","getFragmentShader","texturebuffers","A","B","getShader","fs","shader","createShader","FRAGMENT_SHADER","VERTEX_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","fragmentShader","vertexShader","sprogram","createProgram","attachShader","linkProgram","getProgramParameter","LINK_STATUS","useProgram","vpa","getAttribLocation","tca","enableVertexAttribArray","tMatUniform","getUniformLocation","samplerUniform","useTex","uniform1i","idx","unitIBuffer","bindBuffer","ELEMENT_ARRAY_BUFFER","bufferData","Uint16Array","STATIC_DRAW","ids","unitI33","stripBuffer","raidus","circleCanvasRadius","toDataURL","drawImg2Canvas","_w","_h","_width","_height","_scaleX","_scaleY","createTexture","texture","vcBuffer","tcBuffer","ARRAY_BUFFER","bindTexture","TEXTURE_2D","texImage2D","RGBA","UNSIGNED_BYTE","texParameteri","TEXTURE_MAG_FILTER","LINEAR","TEXTURE_MIN_FILTER","LINEAR_MIPMAP_NEAREST","generateMipmap","textureLoaded","textureWidth","textureHeight","tmat","imat","oldScale","updateMatrix","uniform3f","uniformMatrix3fv","vertexAttribPointer","FLOAT","drawElements","TRIANGLES","UNSIGNED_SHORT","moveOriginMatrix","translationMatrix","angel","rotationMatrix","scaleMatrix","matrix","CustomRenderer","LineZone","x1","y1","x2","y2","direction","minx","min","miny","maxx","maxy","xxyy","getLength","getDistance","getSymmetric","tha2","oldx","oldy","rangeOut","CircleZone","randomRadius","setCenter","d","RectZone","ImageZone","vectors","setVectors","j","length1","length2","getBound","getColor","Debug","func","getStyle","drawZone","moveTo","lineTo","drawRect","drawEmitter"],"mappings":"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"}
\ No newline at end of file
diff --git a/eslintrc.json b/eslintrc.json
new file mode 100755
index 0000000..abc71a7
--- /dev/null
+++ b/eslintrc.json
@@ -0,0 +1,183 @@
+{
+ "parser": "@babel/eslint-parser",
+ "parserOptions": {
+ "ecmaVersion": 9,
+ "ecmaFeatures": {
+ },
+ "sourceType": "module"
+ },
+
+ "env": {
+ "es6": true
+ },
+
+ "plugins": [
+ "import",
+ "promise",
+ "standard"
+ ],
+
+ "globals": {
+ "document": false,
+ "navigator": false,
+ "window": false
+ },
+
+ "rules": {
+ "accessor-pairs": "error",
+ "arrow-spacing": ["error", { "before": true, "after": true }],
+ "block-spacing": ["error", "always"],
+ "brace-style": 0,
+ "camelcase": ["error", { "properties": "never" }],
+ "comma-dangle": ["error", {
+ "arrays": "never",
+ "objects": "never",
+ "imports": "never",
+ "exports": "never",
+ "functions": "never"
+ }],
+ "comma-spacing": ["error", { "before": false, "after": true }],
+ "comma-style": ["error", "last"],
+ "constructor-super": "error",
+ "curly": 0,
+ "dot-location": ["error", "property"],
+ "eol-last": 0,
+ "eqeqeq": ["error", "always", { "null": "ignore" }],
+ "func-call-spacing": ["error", "never"],
+ "generator-star-spacing": ["error", { "before": true, "after": true }],
+ "handle-callback-err": ["error", "^(err|error)$" ],
+ "key-spacing": ["error", { "beforeColon": false, "afterColon": true }],
+ "keyword-spacing": ["error", { "before": true, "after": true }],
+ "new-cap": ["error", { "newIsCap": true, "capIsNew": false }],
+ "new-parens": 0,
+ "no-array-constructor": "error",
+ "no-caller": "error",
+ "no-class-assign": "error",
+ "no-compare-neg-zero": "error",
+ "no-cond-assign": "error",
+ "no-const-assign": "error",
+ "no-constant-condition": ["error", { "checkLoops": false }],
+ "no-control-regex": "error",
+ "no-debugger": "error",
+ "no-delete-var": "error",
+ "no-dupe-args": "error",
+ "no-dupe-class-members": "error",
+ "no-dupe-keys": "error",
+ "no-duplicate-case": "error",
+ "no-empty-character-class": "error",
+ "no-empty-pattern": "error",
+ "no-eval": "error",
+ "no-ex-assign": "error",
+ "no-extend-native": "error",
+ "no-extra-bind": "error",
+ "no-extra-boolean-cast": 0,
+ "no-extra-parens": ["error", "functions"],
+ "no-fallthrough": "error",
+ "no-floating-decimal": 0,
+ "no-func-assign": "error",
+ "no-global-assign": "error",
+ "no-implied-eval": "error",
+ "no-inner-declarations": ["error", "functions"],
+ "no-invalid-regexp": "error",
+ "no-irregular-whitespace": "error",
+ "no-iterator": "error",
+ "no-label-var": "error",
+ "no-labels": ["error", { "allowLoop": false, "allowSwitch": false }],
+ "no-lone-blocks": "error",
+ "no-mixed-operators": ["error", {
+ "groups": [
+ ["==", "!=", "===", "!==", ">", ">=", "<", "<="],
+ ["&&", "||"],
+ ["in", "instanceof"]
+ ],
+ "allowSamePrecedence": true
+ }],
+ "no-mixed-spaces-and-tabs": "error",
+ "no-multi-spaces": "error",
+ "no-multi-str": "error",
+ "no-multiple-empty-lines": ["error", { "max": 1, "maxEOF": 0 }],
+ "no-negated-in-lhs": "error",
+ "no-new": "error",
+ "no-new-func": "error",
+ "no-new-object": "error",
+ "no-new-require": "error",
+ "no-new-symbol": "error",
+ "no-new-wrappers": "error",
+ "no-obj-calls": "error",
+ "no-octal": "error",
+ "no-octal-escape": "error",
+ "no-path-concat": "error",
+ "no-proto": "error",
+ "no-redeclare": "error",
+ "no-regex-spaces": "error",
+ "no-return-assign": ["error", "except-parens"],
+ "no-return-await": "error",
+ "no-self-assign": "error",
+ "no-self-compare": "error",
+ "no-sequences": "error",
+ "no-shadow-restricted-names": "error",
+ "no-sparse-arrays": "error",
+ "no-tabs": "off",
+ "no-template-curly-in-string": "error",
+ "no-this-before-super": "error",
+ "no-throw-literal": "error",
+ "no-trailing-spaces": "error",
+ "no-undef": 0,
+ "no-undef-init": "error",
+ "no-unexpected-multiline": "error",
+ "no-unmodified-loop-condition": "error",
+ "no-unneeded-ternary": 0,
+ "no-unreachable": "error",
+ "no-unsafe-finally": "error",
+ "no-unsafe-negation": "error",
+ "no-unused-expressions": ["error", { "allowShortCircuit": true, "allowTernary": true, "allowTaggedTemplates": true }],
+ "no-unused-vars": ["error", { "vars": "all", "args": "none", "ignoreRestSiblings": true, "varsIgnorePattern": "Vector2D" }],
+ "no-use-before-define": ["error", { "functions": false, "classes": false, "variables": false }],
+ "no-useless-call": 0,
+ "no-useless-computed-key": "error",
+ "no-useless-constructor": "error",
+ "no-useless-escape": "error",
+ "no-useless-rename": "error",
+ "no-useless-return": "error",
+ "no-whitespace-before-property": "error",
+ "no-with": "error",
+ "object-property-newline": ["error", { "allowMultiplePropertiesPerLine": true }],
+ "one-var": 0,
+ "operator-linebreak": ["error", "after", { "overrides": { "?": "before", ":": "before" } }],
+ "padded-blocks": 0,
+ "prefer-promise-reject-errors": "error",
+ "quotes": 0,
+ "rest-spread-spacing": ["error", "never"],
+ "semi": 0,
+ "semi-spacing": ["error", { "before": false, "after": true }],
+ "space-before-blocks": ["error", "always"],
+ "space-before-function-paren": 0,
+ "space-in-parens": ["error", "never"],
+ "space-infix-ops": "error",
+ "space-unary-ops": ["error", { "words": true, "nonwords": false }],
+ "spaced-comment": ["error", "always", {
+ "line": { "markers": ["*package", "!", "/", ",", "="] },
+ "block": { "balanced": true, "markers": ["*package", "!", ",", ":", "::", "flow-include"], "exceptions": ["*"] }
+ }],
+ "symbol-description": "error",
+ "template-curly-spacing": ["error", "never"],
+ "template-tag-spacing": ["error", "never"],
+ "unicode-bom": ["error", "never"],
+ "use-isnan": "error",
+ "valid-typeof": ["error", { "requireStringLiterals": true }],
+ "wrap-iife": ["error", "any", { "functionPrototypeMethods": true }],
+ "yield-star-spacing": ["error", "both"],
+ "yoda": ["error", "never"],
+
+ "import/export": "error",
+ "import/first": "error",
+ "import/no-duplicates": "error",
+ "import/no-webpack-loader-syntax": "error",
+
+ "promise/param-names": "error",
+
+ "standard/array-bracket-even-spacing": ["error", "either"],
+ "standard/computed-property-even-spacing": ["error", "even"],
+ "standard/object-curly-even-spacing": ["error", "either"]
+ }
+}
diff --git a/example/behaviour/attraction/attraction1.html b/example/behaviour/attraction/attraction1.html
old mode 100644
new mode 100755
index ebd552e..d852d0c
--- a/example/behaviour/attraction/attraction1.html
+++ b/example/behaviour/attraction/attraction1.html
@@ -1,161 +1,176 @@
-
+
-
-
+
behaviour-attraction1
-
-
+
+
-
+
-
-
+
+
+
-
+
-
-
-
\ No newline at end of file
+
+