three-nebula 10.0.3 → 11.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. package/.claude/rules/no-coauthor.md +4 -0
  2. package/CHANGELOG.md +33 -0
  3. package/dist/three-nebula.cjs +109 -0
  4. package/dist/three-nebula.cjs.map +1 -0
  5. package/dist/three-nebula.mjs +2968 -0
  6. package/dist/three-nebula.mjs.map +1 -0
  7. package/dist/three-nebula.umd.js +109 -0
  8. package/dist/three-nebula.umd.js.map +1 -0
  9. package/package.json +32 -56
  10. package/specs/01-emitter-hierarchy.md +200 -0
  11. package/specs/02-determinism-scrubbing.md +188 -0
  12. package/specs/03-sound-renderer.md +183 -0
  13. package/specs/04-schema-versioning.md +140 -0
  14. package/specs/05-content-addressed-assets.md +288 -0
  15. package/specs/README.md +80 -0
  16. package/build/cjs/behaviour/Alpha.js +0 -189
  17. package/build/cjs/behaviour/Attraction.js +0 -189
  18. package/build/cjs/behaviour/Behaviour.js +0 -253
  19. package/build/cjs/behaviour/Collision.js +0 -146
  20. package/build/cjs/behaviour/Color.js +0 -148
  21. package/build/cjs/behaviour/CrossZone.js +0 -141
  22. package/build/cjs/behaviour/Force.js +0 -126
  23. package/build/cjs/behaviour/Gravity.js +0 -78
  24. package/build/cjs/behaviour/RandomDrift.js +0 -153
  25. package/build/cjs/behaviour/Repulsion.js +0 -123
  26. package/build/cjs/behaviour/Rotate.js +0 -265
  27. package/build/cjs/behaviour/Scale.js +0 -177
  28. package/build/cjs/behaviour/Spring.js +0 -133
  29. package/build/cjs/behaviour/constants.js +0 -28
  30. package/build/cjs/behaviour/index.js +0 -112
  31. package/build/cjs/behaviour/types.js +0 -33
  32. package/build/cjs/constants/index.js +0 -61
  33. package/build/cjs/core/Particle.js +0 -390
  34. package/build/cjs/core/Pool.js +0 -203
  35. package/build/cjs/core/System.js +0 -366
  36. package/build/cjs/core/constants.js +0 -163
  37. package/build/cjs/core/fromJSON.js +0 -128
  38. package/build/cjs/core/fromJSONAsync.js +0 -239
  39. package/build/cjs/core/index.js +0 -32
  40. package/build/cjs/core/three/Euler.js +0 -233
  41. package/build/cjs/core/three/Math.js +0 -91
  42. package/build/cjs/core/three/Matrix4.js +0 -745
  43. package/build/cjs/core/three/Quaternion.js +0 -451
  44. package/build/cjs/core/three/Vector3.js +0 -464
  45. package/build/cjs/core/three/constants.js +0 -298
  46. package/build/cjs/core/three/index.js +0 -48
  47. package/build/cjs/core/types.js +0 -13
  48. package/build/cjs/debug/Debug.js +0 -209
  49. package/build/cjs/debug/constants.js +0 -19
  50. package/build/cjs/debug/index.js +0 -24
  51. package/build/cjs/debug/log.js +0 -38
  52. package/build/cjs/ease/index.js +0 -149
  53. package/build/cjs/emitter/Emitter.js +0 -791
  54. package/build/cjs/emitter/FollowEmitter.js +0 -146
  55. package/build/cjs/emitter/constants.js +0 -20
  56. package/build/cjs/emitter/index.js +0 -24
  57. package/build/cjs/emitter/types.js +0 -11
  58. package/build/cjs/events/EventDispatcher.js +0 -105
  59. package/build/cjs/events/constants.js +0 -23
  60. package/build/cjs/events/index.js +0 -27
  61. package/build/cjs/index.js +0 -151
  62. package/build/cjs/initializer/Body.js +0 -122
  63. package/build/cjs/initializer/BodySprite.js +0 -146
  64. package/build/cjs/initializer/Initializer.js +0 -109
  65. package/build/cjs/initializer/InitializerUtil.js +0 -54
  66. package/build/cjs/initializer/Life.js +0 -106
  67. package/build/cjs/initializer/Mass.js +0 -101
  68. package/build/cjs/initializer/Position.js +0 -152
  69. package/build/cjs/initializer/Radius.js +0 -118
  70. package/build/cjs/initializer/Rate.js +0 -150
  71. package/build/cjs/initializer/Texture.js +0 -139
  72. package/build/cjs/initializer/Velocity/PolarVelocity.js +0 -102
  73. package/build/cjs/initializer/Velocity/RadialVelocity.js +0 -111
  74. package/build/cjs/initializer/Velocity/VectorVelocity.js +0 -108
  75. package/build/cjs/initializer/Velocity/Velocity.js +0 -94
  76. package/build/cjs/initializer/Velocity/index.js +0 -32
  77. package/build/cjs/initializer/constants.js +0 -43
  78. package/build/cjs/initializer/index.js +0 -100
  79. package/build/cjs/initializer/types.js +0 -35
  80. package/build/cjs/math/ArraySpan.js +0 -103
  81. package/build/cjs/math/Box.js +0 -46
  82. package/build/cjs/math/ColorSpan.js +0 -113
  83. package/build/cjs/math/MathUtils.js +0 -57
  84. package/build/cjs/math/Polar3D.js +0 -115
  85. package/build/cjs/math/Span.js +0 -88
  86. package/build/cjs/math/Vector3D.js +0 -76
  87. package/build/cjs/math/constants.js +0 -35
  88. package/build/cjs/math/index.js +0 -122
  89. package/build/cjs/math/integration.js +0 -59
  90. package/build/cjs/math/types.js +0 -19
  91. package/build/cjs/renderer/BaseRenderer.js +0 -108
  92. package/build/cjs/renderer/CustomRenderer.js +0 -65
  93. package/build/cjs/renderer/GPURenderer/Desktop/index.js +0 -350
  94. package/build/cjs/renderer/GPURenderer/Desktop/shaders/fragmentShader.js +0 -13
  95. package/build/cjs/renderer/GPURenderer/Desktop/shaders/index.js +0 -22
  96. package/build/cjs/renderer/GPURenderer/Desktop/shaders/vertexShader.js +0 -17
  97. package/build/cjs/renderer/GPURenderer/Mobile/index.js +0 -364
  98. package/build/cjs/renderer/GPURenderer/Mobile/shaders/fragmentShader.js +0 -13
  99. package/build/cjs/renderer/GPURenderer/Mobile/shaders/index.js +0 -22
  100. package/build/cjs/renderer/GPURenderer/Mobile/shaders/vertexShader.js +0 -15
  101. package/build/cjs/renderer/GPURenderer/common/ParticleBuffer/constants.js +0 -53
  102. package/build/cjs/renderer/GPURenderer/common/ParticleBuffer/index.js +0 -93
  103. package/build/cjs/renderer/GPURenderer/common/TextureAtlas/constants.js +0 -9
  104. package/build/cjs/renderer/GPURenderer/common/TextureAtlas/index.js +0 -221
  105. package/build/cjs/renderer/GPURenderer/common/constants.js +0 -22
  106. package/build/cjs/renderer/GPURenderer/common/index.js +0 -38
  107. package/build/cjs/renderer/GPURenderer/common/shaders/constants.js +0 -9
  108. package/build/cjs/renderer/GPURenderer/common/stores/Target.js +0 -43
  109. package/build/cjs/renderer/GPURenderer/common/stores/UniqueList.js +0 -51
  110. package/build/cjs/renderer/GPURenderer/common/stores/index.js +0 -22
  111. package/build/cjs/renderer/GPURenderer/index.js +0 -97
  112. package/build/cjs/renderer/MeshRenderer.js +0 -136
  113. package/build/cjs/renderer/SpriteRenderer.js +0 -63
  114. package/build/cjs/renderer/index.js +0 -40
  115. package/build/cjs/renderer/types.js +0 -21
  116. package/build/cjs/utils/ColorUtil.js +0 -39
  117. package/build/cjs/utils/PUID.js +0 -26
  118. package/build/cjs/utils/THREEUtil.js +0 -40
  119. package/build/cjs/utils/Util.js +0 -69
  120. package/build/cjs/utils/index.js +0 -61
  121. package/build/cjs/utils/uid.js +0 -14
  122. package/build/cjs/zone/BoxZone.js +0 -178
  123. package/build/cjs/zone/LineZone.js +0 -101
  124. package/build/cjs/zone/MeshZone.js +0 -101
  125. package/build/cjs/zone/PointZone.js +0 -99
  126. package/build/cjs/zone/ScreenZone.js +0 -164
  127. package/build/cjs/zone/SphereZone.js +0 -155
  128. package/build/cjs/zone/Zone.js +0 -172
  129. package/build/cjs/zone/index.js +0 -56
  130. package/build/cjs/zone/types.js +0 -21
  131. package/build/esm/behaviour/Alpha.js +0 -134
  132. package/build/esm/behaviour/Attraction.js +0 -135
  133. package/build/esm/behaviour/Behaviour.js +0 -215
  134. package/build/esm/behaviour/Collision.js +0 -100
  135. package/build/esm/behaviour/Color.js +0 -101
  136. package/build/esm/behaviour/CrossZone.js +0 -82
  137. package/build/esm/behaviour/Force.js +0 -83
  138. package/build/esm/behaviour/Gravity.js +0 -40
  139. package/build/esm/behaviour/RandomDrift.js +0 -97
  140. package/build/esm/behaviour/Repulsion.js +0 -81
  141. package/build/esm/behaviour/Rotate.js +0 -214
  142. package/build/esm/behaviour/Scale.js +0 -131
  143. package/build/esm/behaviour/Spring.js +0 -90
  144. package/build/esm/behaviour/constants.js +0 -11
  145. package/build/esm/behaviour/index.js +0 -14
  146. package/build/esm/behaviour/types.js +0 -14
  147. package/build/esm/constants/index.js +0 -42
  148. package/build/esm/core/Particle.js +0 -357
  149. package/build/esm/core/Pool.js +0 -161
  150. package/build/esm/core/System.js +0 -320
  151. package/build/esm/core/constants.js +0 -127
  152. package/build/esm/core/fromJSON.js +0 -107
  153. package/build/esm/core/fromJSONAsync.js +0 -210
  154. package/build/esm/core/index.js +0 -4
  155. package/build/esm/core/three/Euler.js +0 -224
  156. package/build/esm/core/three/Math.js +0 -84
  157. package/build/esm/core/three/Matrix4.js +0 -739
  158. package/build/esm/core/three/Quaternion.js +0 -445
  159. package/build/esm/core/three/Vector3.js +0 -457
  160. package/build/esm/core/three/constants.js +0 -148
  161. package/build/esm/core/three/index.js +0 -5
  162. package/build/esm/core/types.js +0 -4
  163. package/build/esm/debug/Debug.js +0 -195
  164. package/build/esm/debug/constants.js +0 -7
  165. package/build/esm/debug/index.js +0 -3
  166. package/build/esm/debug/log.js +0 -31
  167. package/build/esm/ease/index.js +0 -113
  168. package/build/esm/emitter/Emitter.js +0 -701
  169. package/build/esm/emitter/FollowEmitter.js +0 -97
  170. package/build/esm/emitter/constants.js +0 -7
  171. package/build/esm/emitter/index.js +0 -3
  172. package/build/esm/emitter/types.js +0 -3
  173. package/build/esm/events/EventDispatcher.js +0 -82
  174. package/build/esm/events/constants.js +0 -9
  175. package/build/esm/events/index.js +0 -4
  176. package/build/esm/index.js +0 -13
  177. package/build/esm/initializer/Body.js +0 -83
  178. package/build/esm/initializer/BodySprite.js +0 -108
  179. package/build/esm/initializer/Initializer.js +0 -84
  180. package/build/esm/initializer/InitializerUtil.js +0 -48
  181. package/build/esm/initializer/Life.js +0 -66
  182. package/build/esm/initializer/Mass.js +0 -60
  183. package/build/esm/initializer/Position.js +0 -98
  184. package/build/esm/initializer/Radius.js +0 -75
  185. package/build/esm/initializer/Rate.js +0 -107
  186. package/build/esm/initializer/Texture.js +0 -101
  187. package/build/esm/initializer/Velocity/PolarVelocity.js +0 -63
  188. package/build/esm/initializer/Velocity/RadialVelocity.js +0 -72
  189. package/build/esm/initializer/Velocity/VectorVelocity.js +0 -69
  190. package/build/esm/initializer/Velocity/Velocity.js +0 -52
  191. package/build/esm/initializer/Velocity/index.js +0 -4
  192. package/build/esm/initializer/constants.js +0 -26
  193. package/build/esm/initializer/index.js +0 -11
  194. package/build/esm/initializer/types.js +0 -15
  195. package/build/esm/math/ArraySpan.js +0 -62
  196. package/build/esm/math/Box.js +0 -25
  197. package/build/esm/math/ColorSpan.js +0 -71
  198. package/build/esm/math/MathUtils.js +0 -48
  199. package/build/esm/math/Polar3D.js +0 -81
  200. package/build/esm/math/Span.js +0 -63
  201. package/build/esm/math/Vector3D.js +0 -34
  202. package/build/esm/math/constants.js +0 -24
  203. package/build/esm/math/index.js +0 -10
  204. package/build/esm/math/integration.js +0 -47
  205. package/build/esm/math/types.js +0 -7
  206. package/build/esm/renderer/BaseRenderer.js +0 -78
  207. package/build/esm/renderer/CustomRenderer.js +0 -23
  208. package/build/esm/renderer/GPURenderer/Desktop/index.js +0 -331
  209. package/build/esm/renderer/GPURenderer/Desktop/shaders/fragmentShader.js +0 -23
  210. package/build/esm/renderer/GPURenderer/Desktop/shaders/index.js +0 -3
  211. package/build/esm/renderer/GPURenderer/Desktop/shaders/vertexShader.js +0 -33
  212. package/build/esm/renderer/GPURenderer/Mobile/index.js +0 -349
  213. package/build/esm/renderer/GPURenderer/Mobile/shaders/fragmentShader.js +0 -20
  214. package/build/esm/renderer/GPURenderer/Mobile/shaders/index.js +0 -3
  215. package/build/esm/renderer/GPURenderer/Mobile/shaders/vertexShader.js +0 -30
  216. package/build/esm/renderer/GPURenderer/common/ParticleBuffer/constants.js +0 -27
  217. package/build/esm/renderer/GPURenderer/common/ParticleBuffer/index.js +0 -70
  218. package/build/esm/renderer/GPURenderer/common/TextureAtlas/constants.js +0 -2
  219. package/build/esm/renderer/GPURenderer/common/TextureAtlas/index.js +0 -206
  220. package/build/esm/renderer/GPURenderer/common/constants.js +0 -13
  221. package/build/esm/renderer/GPURenderer/common/index.js +0 -4
  222. package/build/esm/renderer/GPURenderer/common/shaders/constants.js +0 -2
  223. package/build/esm/renderer/GPURenderer/common/stores/Target.js +0 -24
  224. package/build/esm/renderer/GPURenderer/common/stores/UniqueList.js +0 -29
  225. package/build/esm/renderer/GPURenderer/common/stores/index.js +0 -3
  226. package/build/esm/renderer/GPURenderer/index.js +0 -57
  227. package/build/esm/renderer/MeshRenderer.js +0 -94
  228. package/build/esm/renderer/SpriteRenderer.js +0 -26
  229. package/build/esm/renderer/index.js +0 -5
  230. package/build/esm/renderer/types.js +0 -8
  231. package/build/esm/utils/ColorUtil.js +0 -32
  232. package/build/esm/utils/PUID.js +0 -19
  233. package/build/esm/utils/THREEUtil.js +0 -31
  234. package/build/esm/utils/Util.js +0 -60
  235. package/build/esm/utils/index.js +0 -13
  236. package/build/esm/utils/uid.js +0 -3
  237. package/build/esm/zone/BoxZone.js +0 -133
  238. package/build/esm/zone/LineZone.js +0 -61
  239. package/build/esm/zone/MeshZone.js +0 -60
  240. package/build/esm/zone/PointZone.js +0 -59
  241. package/build/esm/zone/ScreenZone.js +0 -116
  242. package/build/esm/zone/SphereZone.js +0 -113
  243. package/build/esm/zone/Zone.js +0 -141
  244. package/build/esm/zone/index.js +0 -7
  245. package/build/esm/zone/types.js +0 -8
  246. package/build/three-nebula.js +0 -2
  247. package/build/three-nebula.js.map +0 -1
@@ -1,791 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- var _typeof = require("@babel/runtime/helpers/typeof");
6
-
7
- Object.defineProperty(exports, "__esModule", {
8
- value: true
9
- });
10
- exports["default"] = void 0;
11
-
12
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
-
14
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
15
-
16
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
17
-
18
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
19
-
20
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
21
-
22
- var _constants = require("./constants");
23
-
24
- var _events = _interopRequireWildcard(require("../events"));
25
-
26
- var _math = require("../math");
27
-
28
- var _utils = require("../utils");
29
-
30
- var _initializer = require("../initializer");
31
-
32
- var _Particle2 = _interopRequireDefault(require("../core/Particle"));
33
-
34
- var _isNumber = _interopRequireDefault(require("lodash/isNumber"));
35
-
36
- var _types = require("./types");
37
-
38
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
39
-
40
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
41
-
42
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
43
-
44
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
45
-
46
- /**
47
- * Emitters are the System engine's particle factories. They cause particles to
48
- * be rendered by emitting them, and store all particle initializers and behaviours.
49
- *
50
- */
51
- var Emitter = /*#__PURE__*/function (_Particle) {
52
- (0, _inherits2["default"])(Emitter, _Particle);
53
-
54
- var _super = _createSuper(Emitter);
55
-
56
- /**
57
- * Constructs an Emitter instance.
58
- *
59
- * @param {object} properties - The properties to instantiate the emitter with
60
- * @return void
61
- */
62
- function Emitter(properties) {
63
- var _this;
64
-
65
- (0, _classCallCheck2["default"])(this, Emitter);
66
- _this = _super.call(this, properties);
67
- /**
68
- * @desc The class type.
69
- * @type {string}
70
- */
71
-
72
- _this.type = _types.EMITTER_TYPE_EMITTER;
73
- /**
74
- * @desc The particles emitted by this emitter.
75
- * @type {array}
76
- */
77
-
78
- _this.particles = [];
79
- /**
80
- * @desc The initializers for particles emitted by this emitter.
81
- * @type {array}
82
- */
83
-
84
- _this.initializers = [];
85
- /**
86
- * @desc The behaviours for particles emitted by this emitter.
87
- * @type {array}
88
- */
89
-
90
- _this.behaviours = [];
91
- /**
92
- * @desc The behaviours for the emitter.
93
- * @type {array}
94
- */
95
-
96
- _this.emitterBehaviours = [];
97
- /**
98
- * @desc The current emit iteration.
99
- * @type {integer}
100
- */
101
-
102
- _this.currentEmitTime = 0;
103
- /**
104
- * @desc The total number of times the emitter should emit particles.
105
- * @type {integer}
106
- */
107
-
108
- _this.totalEmitTimes = -1;
109
- /**
110
- * @desc The friction coefficient for all particle to emit by.
111
- * @type {number}
112
- */
113
-
114
- _this.damping = _constants.DEFAULT_DAMPING;
115
- /**
116
- * @desc Ensures that particles emitted by this emitter are positioned
117
- * according to the emitter's properties.
118
- * @type {boolean}
119
- */
120
-
121
- _this.bindEmitter = _constants.DEFAULT_BIND_EMITTER;
122
- /**
123
- * @desc Determines if the emitter will dispatch internal events. Defaults
124
- * to false
125
- * @type {boolean}
126
- */
127
-
128
- _this.bindEmitterEvent = _constants.DEFAULT_BIND_EMITTER_EVENT;
129
- /**
130
- * @desc The number of particles to emit per second (a [particle]/b [s])
131
- * @type {Rate}
132
- */
133
-
134
- _this.rate = _constants.DEFAULT_EMITTER_RATE;
135
- /**
136
- * @desc Determines if the emitter is emitting particles or not.
137
- * @type {boolean}
138
- */
139
-
140
- _this.isEmitting = false;
141
- /**
142
- * @desc The emitter's id.
143
- * @type {string}
144
- */
145
-
146
- _this.id = "emitter-".concat((0, _utils.uid)());
147
- _this.cID = 0;
148
- _this.name = 'Emitter';
149
- /**
150
- * @desc The index of the emitter as it is added to the system.
151
- * @type {number|undefined}
152
- */
153
-
154
- _this.index = _constants.DEFAULT_EMITTER_INDEX;
155
- /**
156
- * @desc The emitter's internal event dispatcher.
157
- * @type {EventDispatcher}
158
- */
159
-
160
- _this.eventDispatcher = new _events["default"]();
161
- return _this;
162
- }
163
- /**
164
- * Proxy method for the internal event dispatcher's dispatchEvent method.
165
- *
166
- * @param {string} event - The event to dispatch
167
- * @param {object<Particle>} [target=this] - The event target
168
- */
169
-
170
-
171
- (0, _createClass2["default"])(Emitter, [{
172
- key: "dispatch",
173
- value: function dispatch(event) {
174
- var target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this;
175
- this.eventDispatcher.dispatchEvent(event, target);
176
- }
177
- /**
178
- * Sets the emitter rate.
179
- *
180
- * @param {Rate} rate - a rate initializer object
181
- * @return {Emitter}
182
- */
183
-
184
- }, {
185
- key: "setRate",
186
- value: function setRate(rate) {
187
- this.rate = rate;
188
- return this;
189
- }
190
- /**
191
- * Sets the position of the emitter.
192
- *
193
- * @param {object} newPosition - an object the new x, y and z props
194
- * @return {Emitter}
195
- */
196
-
197
- }, {
198
- key: "setPosition",
199
- value: function setPosition() {
200
- var newPosition = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
201
- var position = this.position;
202
- var _newPosition$x = newPosition.x,
203
- x = _newPosition$x === void 0 ? position.x : _newPosition$x,
204
- _newPosition$y = newPosition.y,
205
- y = _newPosition$y === void 0 ? position.y : _newPosition$y,
206
- _newPosition$z = newPosition.z,
207
- z = _newPosition$z === void 0 ? position.z : _newPosition$z;
208
- this.position.set(x, y, z);
209
- return this;
210
- }
211
- /**
212
- * Sets the rotation of the emitter.
213
- *
214
- * @param {object} newRotation - an object the new x, y and z props
215
- * @return {Emitter}
216
- */
217
-
218
- }, {
219
- key: "setRotation",
220
- value: function setRotation() {
221
- var newRotation = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
222
- var rotation = this.rotation;
223
- var _newRotation$x = newRotation.x,
224
- x = _newRotation$x === void 0 ? rotation.x : _newRotation$x,
225
- _newRotation$y = newRotation.y,
226
- y = _newRotation$y === void 0 ? rotation.y : _newRotation$y,
227
- _newRotation$z = newRotation.z,
228
- z = _newRotation$z === void 0 ? rotation.z : _newRotation$z;
229
- this.rotation.set(x, y, z);
230
- return this;
231
- }
232
- /**
233
- * Sets the total number of times the emitter should emit particles as well as
234
- * the emitter's life. Also intializes the emitter rate.
235
- * This enables the emitter to emit particles.
236
- *
237
- * @param {number} [totalEmitTimes=Infinity] - the total number of times to emit particles
238
- * @param {number} [life=Infinity] - the life of this emitter in milliseconds
239
- * @return {Emitter}
240
- */
241
-
242
- }, {
243
- key: "emit",
244
- value: function emit() {
245
- var totalEmitTimes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Infinity;
246
- var life = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Infinity;
247
- this.currentEmitTime = 0;
248
- this.totalEmitTimes = (0, _isNumber["default"])(totalEmitTimes) ? totalEmitTimes : Infinity;
249
-
250
- if (totalEmitTimes === 1) {
251
- this.life = totalEmitTimes;
252
- } else {
253
- this.life = (0, _isNumber["default"])(life) ? life : Infinity;
254
- }
255
-
256
- this.rate.init();
257
- this.isEmitting = true;
258
- return this;
259
- }
260
- /**
261
- * Experimental emit method that is designed to be called from the System.emit method.
262
- *
263
- * @return {Emitter}
264
- */
265
-
266
- }, {
267
- key: "experimental_emit",
268
- value: function experimental_emit() {
269
- var isEmitting = this.isEmitting,
270
- totalEmitTimes = this.totalEmitTimes,
271
- life = this.life;
272
-
273
- if (!isEmitting) {
274
- this.currentEmitTime = 0;
275
-
276
- if (!totalEmitTimes) {
277
- this.setTotalEmitTimes(Infinity);
278
- }
279
-
280
- if (!life) {
281
- this.setLife(Infinity);
282
- }
283
-
284
- this.rate.init();
285
- this.isEmitting = true;
286
- }
287
-
288
- return this;
289
- }
290
- /**
291
- * Sets the total emit times for the emitter.
292
- *
293
- * @param {number} [totalEmitTimes=Infinity] - the total number of times to emit particles
294
- * @return {Emitter}
295
- */
296
-
297
- }, {
298
- key: "setTotalEmitTimes",
299
- value: function setTotalEmitTimes() {
300
- var totalEmitTimes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Infinity;
301
- this.totalEmitTimes = (0, _isNumber["default"])(totalEmitTimes) ? totalEmitTimes : Infinity;
302
- return this;
303
- }
304
- /**
305
- * Sets the life of the emitter.
306
- *
307
- * @param {number} [life=Infinity] - the life of this emitter in milliseconds
308
- * @return {Emitter}
309
- */
310
-
311
- }, {
312
- key: "setLife",
313
- value: function setLife() {
314
- var life = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Infinity;
315
-
316
- if (this.totalEmitTimes === 1) {
317
- this.life = this.totalEmitTimes;
318
- } else {
319
- this.life = (0, _isNumber["default"])(life) ? life : Infinity;
320
- }
321
-
322
- return this;
323
- }
324
- /**
325
- * Stops the emitter from emitting particles.
326
- *
327
- * @return void
328
- */
329
-
330
- }, {
331
- key: "stopEmit",
332
- value: function stopEmit() {
333
- this.totalEmitTimes = -1;
334
- this.currentEmitTime = 0;
335
- this.isEmitting = false;
336
- }
337
- /**
338
- * Kills all of the emitter's particles.
339
- *
340
- * @return void
341
- */
342
-
343
- }, {
344
- key: "removeAllParticles",
345
- value: function removeAllParticles() {
346
- var i = this.particles.length;
347
-
348
- while (i--) {
349
- this.particles[i].dead = true;
350
- }
351
- }
352
- /**
353
- * Adds a particle initializer to the emitter.
354
- * Each initializer is run on each particle when they are created.
355
- *
356
- * @param {Initializer} initializer - The initializer to add
357
- * @return {Emitter}
358
- */
359
-
360
- }, {
361
- key: "addInitializer",
362
- value: function addInitializer(initializer) {
363
- this.initializers.push(initializer);
364
- return this;
365
- }
366
- /**
367
- * Adds multiple particle initializers to the emitter.
368
- *
369
- * @param {array<Initializer>} initializers - an array of particle initializers
370
- * @return {Emitter}
371
- */
372
-
373
- }, {
374
- key: "addInitializers",
375
- value: function addInitializers(initializers) {
376
- var i = initializers.length;
377
-
378
- while (i--) {
379
- this.addInitializer(initializers[i]);
380
- }
381
-
382
- return this;
383
- }
384
- /**
385
- * Sets the emitter's particle initializers.
386
- *
387
- * @param {array<Initializer>} initializers - an array of particle initializers
388
- * @return {Emitter}
389
- */
390
-
391
- }, {
392
- key: "setInitializers",
393
- value: function setInitializers(initializers) {
394
- this.initializers = initializers;
395
- return this;
396
- }
397
- /**
398
- * Removes an initializer from the emitter's initializers array.
399
- *
400
- * @param {Initializer} initializer - The initializer to remove
401
- * @return {Emitter}
402
- */
403
-
404
- }, {
405
- key: "removeInitializer",
406
- value: function removeInitializer(initializer) {
407
- var index = this.initializers.indexOf(initializer);
408
-
409
- if (index > -1) {
410
- this.initializers.splice(index, 1);
411
- }
412
-
413
- return this;
414
- }
415
- /**
416
- * Removes all initializers.
417
- *
418
- * @return {Emitter}
419
- */
420
-
421
- }, {
422
- key: "removeAllInitializers",
423
- value: function removeAllInitializers() {
424
- _utils.Util.destroyArray(this.initializers);
425
-
426
- return this;
427
- }
428
- /**
429
- * Adds a behaviour to the emitter. All emitter behaviours are added to each particle when
430
- * they are emitted.
431
- *
432
- * @param {Behaviour} behaviour - The behaviour to add to the emitter
433
- * @return {Emitter}
434
- */
435
-
436
- }, {
437
- key: "addBehaviour",
438
- value: function addBehaviour(behaviour) {
439
- this.behaviours.push(behaviour);
440
- return this;
441
- }
442
- /**
443
- * Adds multiple behaviours to the emitter.
444
- *
445
- * @param {array<Behaviour>} behaviours - an array of emitter behaviours
446
- * @return {Emitter}
447
- */
448
-
449
- }, {
450
- key: "addBehaviours",
451
- value: function addBehaviours(behaviours) {
452
- var i = behaviours.length;
453
-
454
- while (i--) {
455
- this.addBehaviour(behaviours[i]);
456
- }
457
-
458
- return this;
459
- }
460
- /**
461
- * Sets the emitter's behaviours.
462
- *
463
- * @param {array<Behaviour>} behaviours - an array of emitter behaviours
464
- * @return {Emitter}
465
- */
466
-
467
- }, {
468
- key: "setBehaviours",
469
- value: function setBehaviours(behaviours) {
470
- this.behaviours = behaviours;
471
- return this;
472
- }
473
- /**
474
- * Removes the behaviour from the emitter's behaviours array.
475
- *
476
- * @param {Behaviour} behaviour - The behaviour to remove
477
- * @return {Emitter}
478
- */
479
-
480
- }, {
481
- key: "removeBehaviour",
482
- value: function removeBehaviour(behaviour) {
483
- var index = this.behaviours.indexOf(behaviour);
484
-
485
- if (index > -1) {
486
- this.behaviours.splice(index, 1);
487
- }
488
-
489
- return this;
490
- }
491
- /**
492
- * Removes all behaviours from the emitter.
493
- *
494
- * @return {Emitter}
495
- */
496
-
497
- }, {
498
- key: "removeAllBehaviours",
499
- value: function removeAllBehaviours() {
500
- _utils.Util.destroyArray(this.behaviours);
501
-
502
- return this;
503
- }
504
- /**
505
- * Adds an emitter behaviour to the emitter.
506
- *
507
- * @param {Behaviour} behaviour - The behaviour to add to the emitter
508
- * @return {Emitter}
509
- */
510
-
511
- }, {
512
- key: "addEmitterBehaviour",
513
- value: function addEmitterBehaviour(behaviour) {
514
- this.emitterBehaviours.push(behaviour);
515
- behaviour.initialize(this);
516
- return this;
517
- }
518
- /**
519
- * Adds multiple behaviours to the emitter.
520
- *
521
- * @param {array<Behaviour>} behaviours - an array of emitter behaviours
522
- * @return {Emitter}
523
- */
524
-
525
- }, {
526
- key: "addEmitterBehaviours",
527
- value: function addEmitterBehaviours(behaviours) {
528
- var i = behaviours.length;
529
-
530
- while (i--) {
531
- this.addEmitterBehaviour(behaviours[i]);
532
- }
533
-
534
- return this;
535
- }
536
- /**
537
- * Sets the emitter's behaviours.
538
- *
539
- * @param {array<Behaviour>} behaviours - an array of emitter behaviours
540
- * @return {Emitter}
541
- */
542
-
543
- }, {
544
- key: "setEmitterBehaviours",
545
- value: function setEmitterBehaviours(behaviours) {
546
- var length = behaviours.length;
547
- this.emitterBehaviours = behaviours;
548
-
549
- for (var i = 0; i < length; i++) {
550
- this.emitterBehaviours[i].initialize(this);
551
- }
552
-
553
- return this;
554
- }
555
- /**
556
- * Removes the behaviour from the emitter's behaviours array.
557
- *
558
- * @param {Behaviour} behaviour - The behaviour to remove
559
- * @return {Emitter}
560
- */
561
-
562
- }, {
563
- key: "removeEmitterBehaviour",
564
- value: function removeEmitterBehaviour(behaviour) {
565
- var index = this.emitterBehaviours.indexOf(behaviour);
566
-
567
- if (index > -1) {
568
- this.emitterBehaviours.splice(index, 1);
569
- }
570
-
571
- return this;
572
- }
573
- /**
574
- * Removes all behaviours from the emitter.
575
- *
576
- * @return {Emitter}
577
- */
578
-
579
- }, {
580
- key: "removeAllEmitterBehaviours",
581
- value: function removeAllEmitterBehaviours() {
582
- _utils.Util.destroyArray(this.emitterBehaviours);
583
-
584
- return this;
585
- }
586
- /**
587
- * Adds the event listener for the EMITTER_DEAD event.
588
- *
589
- * @param {onEmitterDead} - The function to call when the EMITTER_DEAD is dispatched.
590
- * @return {Emitter}
591
- */
592
-
593
- }, {
594
- key: "addOnEmitterDeadEventListener",
595
- value: function addOnEmitterDeadEventListener(onEmitterDead) {
596
- this.eventDispatcher.addEventListener("".concat(this.id, "_").concat(_events.EMITTER_DEAD), function () {
597
- return onEmitterDead();
598
- });
599
- return this;
600
- }
601
- /**
602
- * Creates a particle by retreiving one from the pool and setting it up with
603
- * the supplied initializer and behaviour.
604
- *
605
- * @return {Emitter}
606
- */
607
-
608
- }, {
609
- key: "createParticle",
610
- value: function createParticle() {
611
- var particle = this.parent.pool.get(_Particle2["default"]);
612
- var index = this.particles.length;
613
- this.setupParticle(particle, index);
614
- this.parent && this.parent.dispatch(_events.PARTICLE_CREATED, particle);
615
- this.bindEmitterEvent && this.dispatch(_events.PARTICLE_CREATED, particle);
616
- return particle;
617
- }
618
- /**
619
- * Sets up a particle by running all initializers on it and setting its behaviours.
620
- * Also adds the particle to this.particles.
621
- *
622
- * @param {Particle} particle - The particle to setup
623
- * @return void
624
- */
625
-
626
- }, {
627
- key: "setupParticle",
628
- value: function setupParticle(particle, index) {
629
- var initializers = this.initializers,
630
- behaviours = this.behaviours;
631
-
632
- _initializer.InitializerUtil.initialize(this, particle, initializers);
633
-
634
- particle.addBehaviours(behaviours);
635
- particle.parent = this;
636
- particle.index = index;
637
- this.particles.push(particle);
638
- }
639
- /**
640
- * Updates the emitter according to the time passed by calling the generate
641
- * and integrate methods. The generate method creates particles, the integrate
642
- * method updates existing particles.
643
- *
644
- * If the emitter age is greater than time, the emitter is killed.
645
- *
646
- * This method also indexes/deindexes particles.
647
- *
648
- * @param {number} time - System engine time
649
- * @return void
650
- */
651
-
652
- }, {
653
- key: "update",
654
- value: function update(time) {
655
- if (!this.isEmitting) {
656
- return;
657
- }
658
-
659
- this.age += time;
660
-
661
- if (this.dead || this.age >= this.life) {
662
- this.destroy();
663
- }
664
-
665
- this.generate(time);
666
- this.integrate(time);
667
- var i = this.particles.length;
668
-
669
- while (i--) {
670
- var particle = this.particles[i];
671
-
672
- if (particle.dead) {
673
- this.parent && this.parent.dispatch(_events.PARTICLE_DEAD, particle);
674
- this.bindEmitterEvent && this.dispatch(_events.PARTICLE_DEAD, particle);
675
- this.parent.pool.expire(particle.reset());
676
- this.particles.splice(i, 1);
677
- }
678
- }
679
-
680
- this.updateEmitterBehaviours(time);
681
- }
682
- /**
683
- * Updates the emitter's emitter behaviours.
684
- *
685
- * @param {number} time - System engine time
686
- * @return void
687
- */
688
-
689
- }, {
690
- key: "updateEmitterBehaviours",
691
- value: function updateEmitterBehaviours(time) {
692
- if (this.sleep) {
693
- return;
694
- }
695
-
696
- var length = this.emitterBehaviours.length;
697
-
698
- for (var i = 0; i < length; i++) {
699
- this.emitterBehaviours[i].applyBehaviour(this, time, i);
700
- }
701
- }
702
- /**
703
- * Runs the integration algorithm on the emitter and all particles.
704
- * Updates the particles with the timstamp passed.
705
- *
706
- * @param {number} time - System engine time
707
- * @return void
708
- */
709
-
710
- }, {
711
- key: "integrate",
712
- value: function integrate(time) {
713
- var integrationType = this.parent ? this.parent.integrationType : _math.INTEGRATION_TYPE_EULER;
714
- var damping = 1 - this.damping;
715
- (0, _math.integrate)(this, time, damping, integrationType);
716
- var index = this.particles.length;
717
-
718
- while (index--) {
719
- var particle = this.particles[index];
720
- particle.update(time, index);
721
- (0, _math.integrate)(particle, time, damping, integrationType);
722
- this.parent && this.parent.dispatch(_events.PARTICLE_UPDATE, particle);
723
- this.bindEmitterEvent && this.dispatch(_events.PARTICLE_UPDATE, particle);
724
- }
725
- }
726
- /**
727
- * Generates new particles.
728
- *
729
- * @param {number} time - System engine time
730
- * @return void
731
- */
732
-
733
- }, {
734
- key: "generate",
735
- value: function generate(time) {
736
- if (this.totalEmitTimes === 1) {
737
- var i = this.rate.getValue(99999);
738
-
739
- if (i > 0) {
740
- this.cID = i;
741
- }
742
-
743
- while (i--) {
744
- this.createParticle();
745
- }
746
-
747
- this.totalEmitTimes = 0;
748
- return;
749
- }
750
-
751
- this.currentEmitTime += time;
752
-
753
- if (this.currentEmitTime < this.totalEmitTimes) {
754
- var _i = this.rate.getValue(time);
755
-
756
- if (_i > 0) {
757
- this.cID = _i;
758
- }
759
-
760
- while (_i--) {
761
- this.createParticle();
762
- }
763
- }
764
- }
765
- /**
766
- * Kills the emitter.
767
- *
768
- * @return void
769
- */
770
-
771
- }, {
772
- key: "destroy",
773
- value: function destroy() {
774
- this.dead = true;
775
- this.energy = 0;
776
- this.totalEmitTimes = -1;
777
-
778
- if (this.particles.length == 0) {
779
- this.isEmitting = false;
780
- this.removeAllInitializers();
781
- this.removeAllBehaviours();
782
- this.dispatch("".concat(this.id, "_").concat(_events.EMITTER_DEAD));
783
- this.parent && this.parent.removeEmitter(this);
784
- }
785
- }
786
- }]);
787
- return Emitter;
788
- }(_Particle2["default"]);
789
-
790
- exports["default"] = Emitter;
791
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbWl0dGVyL0VtaXR0ZXIuanMiXSwibmFtZXMiOlsiRW1pdHRlciIsInByb3BlcnRpZXMiLCJ0eXBlIiwicGFydGljbGVzIiwiaW5pdGlhbGl6ZXJzIiwiYmVoYXZpb3VycyIsImVtaXR0ZXJCZWhhdmlvdXJzIiwiY3VycmVudEVtaXRUaW1lIiwidG90YWxFbWl0VGltZXMiLCJkYW1waW5nIiwiREVGQVVMVF9EQU1QSU5HIiwiYmluZEVtaXR0ZXIiLCJERUZBVUxUX0JJTkRfRU1JVFRFUiIsImJpbmRFbWl0dGVyRXZlbnQiLCJERUZBVUxUX0JJTkRfRU1JVFRFUl9FVkVOVCIsInJhdGUiLCJERUZBVUxUX0VNSVRURVJfUkFURSIsImlzRW1pdHRpbmciLCJpZCIsImNJRCIsIm5hbWUiLCJpbmRleCIsIkRFRkFVTFRfRU1JVFRFUl9JTkRFWCIsImV2ZW50RGlzcGF0Y2hlciIsIkV2ZW50RGlzcGF0Y2hlciIsImV2ZW50IiwidGFyZ2V0IiwiZGlzcGF0Y2hFdmVudCIsIm5ld1Bvc2l0aW9uIiwicG9zaXRpb24iLCJ4IiwieSIsInoiLCJzZXQiLCJuZXdSb3RhdGlvbiIsInJvdGF0aW9uIiwiSW5maW5pdHkiLCJsaWZlIiwiaW5pdCIsInNldFRvdGFsRW1pdFRpbWVzIiwic2V0TGlmZSIsImkiLCJsZW5ndGgiLCJkZWFkIiwiaW5pdGlhbGl6ZXIiLCJwdXNoIiwiYWRkSW5pdGlhbGl6ZXIiLCJpbmRleE9mIiwic3BsaWNlIiwiVXRpbCIsImRlc3Ryb3lBcnJheSIsImJlaGF2aW91ciIsImFkZEJlaGF2aW91ciIsImluaXRpYWxpemUiLCJhZGRFbWl0dGVyQmVoYXZpb3VyIiwib25FbWl0dGVyRGVhZCIsImFkZEV2ZW50TGlzdGVuZXIiLCJFTUlUVEVSX0RFQUQiLCJwYXJ0aWNsZSIsInBhcmVudCIsInBvb2wiLCJnZXQiLCJQYXJ0aWNsZSIsInNldHVwUGFydGljbGUiLCJkaXNwYXRjaCIsIlBBUlRJQ0xFX0NSRUFURUQiLCJJbml0aWFsaXplclV0aWwiLCJhZGRCZWhhdmlvdXJzIiwidGltZSIsImFnZSIsImRlc3Ryb3kiLCJnZW5lcmF0ZSIsImludGVncmF0ZSIsIlBBUlRJQ0xFX0RFQUQiLCJleHBpcmUiLCJyZXNldCIsInVwZGF0ZUVtaXR0ZXJCZWhhdmlvdXJzIiwic2xlZXAiLCJhcHBseUJlaGF2aW91ciIsImludGVncmF0aW9uVHlwZSIsIklOVEVHUkFUSU9OX1RZUEVfRVVMRVIiLCJ1cGRhdGUiLCJQQVJUSUNMRV9VUERBVEUiLCJnZXRWYWx1ZSIsImNyZWF0ZVBhcnRpY2xlIiwiZW5lcmd5IiwicmVtb3ZlQWxsSW5pdGlhbGl6ZXJzIiwicmVtb3ZlQWxsQmVoYXZpb3VycyIsInJlbW92ZUVtaXR0ZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQU9BOztBQU1BOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNxQkEsTzs7Ozs7QUFDbkI7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0UsbUJBQVlDLFVBQVosRUFBd0I7QUFBQTs7QUFBQTtBQUN0Qiw4QkFBTUEsVUFBTjtBQUVBO0FBQ0o7QUFDQTtBQUNBOztBQUNJLFVBQUtDLElBQUwsR0FBWUEsMkJBQVo7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxVQUFLQyxTQUFMLEdBQWlCLEVBQWpCO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksVUFBS0MsWUFBTCxHQUFvQixFQUFwQjtBQUVBO0FBQ0o7QUFDQTtBQUNBOztBQUNJLFVBQUtDLFVBQUwsR0FBa0IsRUFBbEI7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxVQUFLQyxpQkFBTCxHQUF5QixFQUF6QjtBQUVBO0FBQ0o7QUFDQTtBQUNBOztBQUNJLFVBQUtDLGVBQUwsR0FBdUIsQ0FBdkI7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxVQUFLQyxjQUFMLEdBQXNCLENBQUMsQ0FBdkI7QUFFQTtBQUNKO0FBQ0E7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UUFBTCxXQUFpQixLQUFLOUMsRUFBdEIsY0FBNEJ1QyxvQkFBNUI7QUFFQSxhQUFLRSxNQUFMLElBQWUsS0FBS0EsTUFBTCxDQUFZNkIsYUFBWixDQUEwQixJQUExQixDQUFmO0FBQ0Q7QUFDRjs7O0VBenBCa0MxQixxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERFRkFVTFRfQklORF9FTUlUVEVSLFxuICBERUZBVUxUX0JJTkRfRU1JVFRFUl9FVkVOVCxcbiAgREVGQVVMVF9EQU1QSU5HLFxuICBERUZBVUxUX0VNSVRURVJfSU5ERVgsXG4gIERFRkFVTFRfRU1JVFRFUl9SQVRFLFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgRXZlbnREaXNwYXRjaGVyLCB7XG4gIEVNSVRURVJfREVBRCxcbiAgUEFSVElDTEVfQ1JFQVRFRCxcbiAgUEFSVElDTEVfREVBRCxcbiAgUEFSVElDTEVfVVBEQVRFLFxufSBmcm9tICcuLi9ldmVudHMnO1xuaW1wb3J0IHsgSU5URUdSQVRJT05fVFlQRV9FVUxFUiwgaW50ZWdyYXRlIH0gZnJvbSAnLi4vbWF0aCc7XG5pbXBvcnQgeyBVdGlsLCB1aWQgfSBmcm9tICcuLi91dGlscyc7XG5cbmltcG9ydCB7IEluaXRpYWxpemVyVXRpbCB9IGZyb20gJy4uL2luaXRpYWxpemVyJztcbmltcG9ydCBQYXJ0aWNsZSBmcm9tICcuLi9jb3JlL1BhcnRpY2xlJztcbmltcG9ydCBpc051bWJlciBmcm9tICdsb2Rhc2gvaXNOdW1iZXInO1xuaW1wb3J0IHsgRU1JVFRFUl9UWVBFX0VNSVRURVIgYXMgdHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIEVtaXR0ZXJzIGFyZSB0aGUgU3lzdGVtIGVuZ2luZSdzIHBhcnRpY2xlIGZhY3Rvcmllcy4gVGhleSBjYXVzZSBwYXJ0aWNsZXMgdG9cbiAqIGJlIHJlbmRlcmVkIGJ5IGVtaXR0aW5nIHRoZW0sIGFuZCBzdG9yZSBhbGwgcGFydGljbGUgaW5pdGlhbGl6ZXJzIGFuZCBiZWhhdmlvdXJzLlxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW1pdHRlciBleHRlbmRzIFBhcnRpY2xlIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYW4gRW1pdHRlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHByb3BlcnRpZXMgLSBUaGUgcHJvcGVydGllcyB0byBpbnN0YW50aWF0ZSB0aGUgZW1pdHRlciB3aXRoXG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgY29uc3RydWN0b3IocHJvcGVydGllcykge1xuICAgIHN1cGVyKHByb3BlcnRpZXMpO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIGNsYXNzIHR5cGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIHBhcnRpY2xlcyBlbWl0dGVkIGJ5IHRoaXMgZW1pdHRlci5cbiAgICAgKiBAdHlwZSB7YXJyYXl9XG4gICAgICovXG4gICAgdGhpcy5wYXJ0aWNsZXMgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBpbml0aWFsaXplcnMgZm9yIHBhcnRpY2xlcyBlbWl0dGVkIGJ5IHRoaXMgZW1pdHRlci5cbiAgICAgKiBAdHlwZSB7YXJyYXl9XG4gICAgICovXG4gICAgdGhpcy5pbml0aWFsaXplcnMgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBiZWhhdmlvdXJzIGZvciBwYXJ0aWNsZXMgZW1pdHRlZCBieSB0aGlzIGVtaXR0ZXIuXG4gICAgICogQHR5cGUge2FycmF5fVxuICAgICAqL1xuICAgIHRoaXMuYmVoYXZpb3VycyA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIGJlaGF2aW91cnMgZm9yIHRoZSBlbWl0dGVyLlxuICAgICAqIEB0eXBlIHthcnJheX1cbiAgICAgKi9cbiAgICB0aGlzLmVtaXR0ZXJCZWhhdmlvdXJzID0gW107XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgY3VycmVudCBlbWl0IGl0ZXJhdGlvbi5cbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cbiAgICAgKi9cbiAgICB0aGlzLmN1cnJlbnRFbWl0VGltZSA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoZSBlbWl0dGVyIHNob3VsZCBlbWl0IHBhcnRpY2xlcy5cbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cbiAgICAgKi9cbiAgICB0aGlzLnRvdGFsRW1pdFRpbWVzID0gLTE7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgZnJpY3Rpb24gY29lZmZpY2llbnQgZm9yIGFsbCBwYXJ0aWNsZSB0byBlbWl0IGJ5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5kYW1waW5nID0gREVGQVVMVF9EQU1QSU5HO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgRW5zdXJlcyB0aGF0IHBhcnRpY2xlcyBlbWl0dGVkIGJ5IHRoaXMgZW1pdHRlciBhcmUgcG9zaXRpb25lZFxuICAgICAqIGFjY29yZGluZyB0byB0aGUgZW1pdHRlcidzIHByb3BlcnRpZXMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5iaW5kRW1pdHRlciA9IERFRkFVTFRfQklORF9FTUlUVEVSO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgRGV0ZXJtaW5lcyBpZiB0aGUgZW1pdHRlciB3aWxsIGRpc3BhdGNoIGludGVybmFsIGV2ZW50cy4gRGVmYXVsdHNcbiAgICAgKiB0byBmYWxzZVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIHRoaXMuYmluZEVtaXR0ZXJFdmVudCA9IERFRkFVTFRfQklORF9FTUlUVEVSX0VWRU5UO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIG51bWJlciBvZiBwYXJ0aWNsZXMgdG8gZW1pdCBwZXIgc2Vjb25kIChhIFtwYXJ0aWNsZV0vYiBbc10pXG4gICAgICogQHR5cGUge1JhdGV9XG4gICAgICovXG4gICAgdGhpcy5yYXRlID0gREVGQVVMVF9FTUlUVEVSX1JBVEU7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBEZXRlcm1pbmVzIGlmIHRoZSBlbWl0dGVyIGlzIGVtaXR0aW5nIHBhcnRpY2xlcyBvciBub3QuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5pc0VtaXR0aW5nID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgZW1pdHRlcidzIGlkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5pZCA9IGBlbWl0dGVyLSR7dWlkKCl9YDtcbiAgICB0aGlzLmNJRCA9IDA7XG4gICAgdGhpcy5uYW1lID0gJ0VtaXR0ZXInO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIGluZGV4IG9mIHRoZSBlbWl0dGVyIGFzIGl0IGlzIGFkZGVkIHRvIHRoZSBzeXN0ZW0uXG4gICAgICogQHR5cGUge251bWJlcnx1bmRlZmluZWR9XG4gICAgICovXG4gICAgdGhpcy5pbmRleCA9IERFRkFVTFRfRU1JVFRFUl9JTkRFWDtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBlbWl0dGVyJ3MgaW50ZXJuYWwgZXZlbnQgZGlzcGF0Y2hlci5cbiAgICAgKiBAdHlwZSB7RXZlbnREaXNwYXRjaGVyfVxuICAgICAqL1xuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyID0gbmV3IEV2ZW50RGlzcGF0Y2hlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3h5IG1ldGhvZCBmb3IgdGhlIGludGVybmFsIGV2ZW50IGRpc3BhdGNoZXIncyBkaXNwYXRjaEV2ZW50IG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50IC0gVGhlIGV2ZW50IHRvIGRpc3BhdGNoXG4gICAqIEBwYXJhbSB7b2JqZWN0PFBhcnRpY2xlPn0gW3RhcmdldD10aGlzXSAtIFRoZSBldmVudCB0YXJnZXRcbiAgICovXG4gIGRpc3BhdGNoKGV2ZW50LCB0YXJnZXQgPSB0aGlzKSB7XG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZGlzcGF0Y2hFdmVudChldmVudCwgdGFyZ2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBlbWl0dGVyIHJhdGUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmF0ZX0gcmF0ZSAtIGEgcmF0ZSBpbml0aWFsaXplciBvYmplY3RcbiAgICogQHJldHVybiB7RW1pdHRlcn1cbiAgICovXG4gIHNldFJhdGUocmF0ZSkge1xuICAgIHRoaXMucmF0ZSA9IHJhdGU7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgZW1pdHRlci5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG5ld1Bvc2l0aW9uIC0gYW4gb2JqZWN0IHRoZSBuZXcgeCwgeSBhbmQgeiBwcm9wc1xuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgc2V0UG9zaXRpb24obmV3UG9zaXRpb24gPSB7fSkge1xuICAgIGNvbnN0IHsgcG9zaXRpb24gfSA9IHRoaXM7XG4gICAgY29uc3QgeyB4ID0gcG9zaXRpb24ueCwgeSA9IHBvc2l0aW9uLnksIHogPSBwb3NpdGlvbi56IH0gPSBuZXdQb3NpdGlvbjtcblxuICAgIHRoaXMucG9zaXRpb24uc2V0KHgsIHksIHopO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcm90YXRpb24gb2YgdGhlIGVtaXR0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBuZXdSb3RhdGlvbiAtIGFuIG9iamVjdCB0aGUgbmV3IHgsIHkgYW5kIHogcHJvcHNcbiAgICogQHJldHVybiB7RW1pdHRlcn1cbiAgICovXG4gIHNldFJvdGF0aW9uKG5ld1JvdGF0aW9uID0ge30pIHtcbiAgICBjb25zdCB7IHJvdGF0aW9uIH0gPSB0aGlzO1xuICAgIGNvbnN0IHsgeCA9IHJvdGF0aW9uLngsIHkgPSByb3RhdGlvbi55LCB6ID0gcm90YXRpb24ueiB9ID0gbmV3Um90YXRpb247XG5cbiAgICB0aGlzLnJvdGF0aW9uLnNldCh4LCB5LCB6KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0aGUgZW1pdHRlciBzaG91bGQgZW1pdCBwYXJ0aWNsZXMgYXMgd2VsbCBhc1xuICAgKiB0aGUgZW1pdHRlcidzIGxpZmUuIEFsc28gaW50aWFsaXplcyB0aGUgZW1pdHRlciByYXRlLlxuICAgKiBUaGlzIGVuYWJsZXMgdGhlIGVtaXR0ZXIgdG8gZW1pdCBwYXJ0aWNsZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbdG90YWxFbWl0VGltZXM9SW5maW5pdHldIC0gdGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0byBlbWl0IHBhcnRpY2xlc1xuICAgKiBAcGFyYW0ge251bWJlcn0gW2xpZmU9SW5maW5pdHldIC0gdGhlIGxpZmUgb2YgdGhpcyBlbWl0dGVyIGluIG1pbGxpc2Vjb25kc1xuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgZW1pdCh0b3RhbEVtaXRUaW1lcyA9IEluZmluaXR5LCBsaWZlID0gSW5maW5pdHkpIHtcbiAgICB0aGlzLmN1cnJlbnRFbWl0VGltZSA9IDA7XG4gICAgdGhpcy50b3RhbEVtaXRUaW1lcyA9IGlzTnVtYmVyKHRvdGFsRW1pdFRpbWVzKSA/IHRvdGFsRW1pdFRpbWVzIDogSW5maW5pdHk7XG5cbiAgICBpZiAodG90YWxFbWl0VGltZXMgPT09IDEpIHtcbiAgICAgIHRoaXMubGlmZSA9IHRvdGFsRW1pdFRpbWVzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxpZmUgPSBpc051bWJlcihsaWZlKSA/IGxpZmUgOiBJbmZpbml0eTtcbiAgICB9XG5cbiAgICB0aGlzLnJhdGUuaW5pdCgpO1xuICAgIHRoaXMuaXNFbWl0dGluZyA9IHRydWU7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBlcmltZW50YWwgZW1pdCBtZXRob2QgdGhhdCBpcyBkZXNpZ25lZCB0byBiZSBjYWxsZWQgZnJvbSB0aGUgU3lzdGVtLmVtaXQgbWV0aG9kLlxuICAgKlxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgZXhwZXJpbWVudGFsX2VtaXQoKSB7XG4gICAgY29uc3QgeyBpc0VtaXR0aW5nLCB0b3RhbEVtaXRUaW1lcywgbGlmZSB9ID0gdGhpcztcblxuICAgIGlmICghaXNFbWl0dGluZykge1xuICAgICAgdGhpcy5jdXJyZW50RW1pdFRpbWUgPSAwO1xuXG4gICAgICBpZiAoIXRvdGFsRW1pdFRpbWVzKSB7XG4gICAgICAgIHRoaXMuc2V0VG90YWxFbWl0VGltZXMoSW5maW5pdHkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWxpZmUpIHtcbiAgICAgICAgdGhpcy5zZXRMaWZlKEluZmluaXR5KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yYXRlLmluaXQoKTtcbiAgICAgIHRoaXMuaXNFbWl0dGluZyA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdG90YWwgZW1pdCB0aW1lcyBmb3IgdGhlIGVtaXR0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbdG90YWxFbWl0VGltZXM9SW5maW5pdHldIC0gdGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0byBlbWl0IHBhcnRpY2xlc1xuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgc2V0VG90YWxFbWl0VGltZXModG90YWxFbWl0VGltZXMgPSBJbmZpbml0eSkge1xuICAgIHRoaXMudG90YWxFbWl0VGltZXMgPSBpc051bWJlcih0b3RhbEVtaXRUaW1lcykgPyB0b3RhbEVtaXRUaW1lcyA6IEluZmluaXR5O1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbGlmZSBvZiB0aGUgZW1pdHRlci5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtsaWZlPUluZmluaXR5XSAtIHRoZSBsaWZlIG9mIHRoaXMgZW1pdHRlciBpbiBtaWxsaXNlY29uZHNcbiAgICogQHJldHVybiB7RW1pdHRlcn1cbiAgICovXG4gIHNldExpZmUobGlmZSA9IEluZmluaXR5KSB7XG4gICAgaWYgKHRoaXMudG90YWxFbWl0VGltZXMgPT09IDEpIHtcbiAgICAgIHRoaXMubGlmZSA9IHRoaXMudG90YWxFbWl0VGltZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGlmZSA9IGlzTnVtYmVyKGxpZmUpID8gbGlmZSA6IEluZmluaXR5O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBlbWl0dGVyIGZyb20gZW1pdHRpbmcgcGFydGljbGVzLlxuICAgKlxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIHN0b3BFbWl0KCkge1xuICAgIHRoaXMudG90YWxFbWl0VGltZXMgPSAtMTtcbiAgICB0aGlzLmN1cnJlbnRFbWl0VGltZSA9IDA7XG4gICAgdGhpcy5pc0VtaXR0aW5nID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogS2lsbHMgYWxsIG9mIHRoZSBlbWl0dGVyJ3MgcGFydGljbGVzLlxuICAgKlxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIHJlbW92ZUFsbFBhcnRpY2xlcygpIHtcbiAgICBsZXQgaSA9IHRoaXMucGFydGljbGVzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHRoaXMucGFydGljbGVzW2ldLmRlYWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcGFydGljbGUgaW5pdGlhbGl6ZXIgdG8gdGhlIGVtaXR0ZXIuXG4gICAqIEVhY2ggaW5pdGlhbGl6ZXIgaXMgcnVuIG9uIGVhY2ggcGFydGljbGUgd2hlbiB0aGV5IGFyZSBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0luaXRpYWxpemVyfSBpbml0aWFsaXplciAtIFRoZSBpbml0aWFsaXplciB0byBhZGRcbiAgICogQHJldHVybiB7RW1pdHRlcn1cbiAgICovXG4gIGFkZEluaXRpYWxpemVyKGluaXRpYWxpemVyKSB7XG4gICAgdGhpcy5pbml0aWFsaXplcnMucHVzaChpbml0aWFsaXplcik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIG11bHRpcGxlIHBhcnRpY2xlIGluaXRpYWxpemVycyB0byB0aGUgZW1pdHRlci5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheTxJbml0aWFsaXplcj59IGluaXRpYWxpemVycyAtIGFuIGFycmF5IG9mIHBhcnRpY2xlIGluaXRpYWxpemVyc1xuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgYWRkSW5pdGlhbGl6ZXJzKGluaXRpYWxpemVycykge1xuICAgIGxldCBpID0gaW5pdGlhbGl6ZXJzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHRoaXMuYWRkSW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXJzW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBlbWl0dGVyJ3MgcGFydGljbGUgaW5pdGlhbGl6ZXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5PEluaXRpYWxpemVyPn0gaW5pdGlhbGl6ZXJzIC0gYW4gYXJyYXkgb2YgcGFydGljbGUgaW5pdGlhbGl6ZXJzXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICBzZXRJbml0aWFsaXplcnMoaW5pdGlhbGl6ZXJzKSB7XG4gICAgdGhpcy5pbml0aWFsaXplcnMgPSBpbml0aWFsaXplcnM7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGluaXRpYWxpemVyIGZyb20gdGhlIGVtaXR0ZXIncyBpbml0aWFsaXplcnMgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7SW5pdGlhbGl6ZXJ9IGluaXRpYWxpemVyIC0gVGhlIGluaXRpYWxpemVyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgcmVtb3ZlSW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXIpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5pdGlhbGl6ZXJzLmluZGV4T2YoaW5pdGlhbGl6ZXIpO1xuXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgaW5pdGlhbGl6ZXJzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgcmVtb3ZlQWxsSW5pdGlhbGl6ZXJzKCkge1xuICAgIFV0aWwuZGVzdHJveUFycmF5KHRoaXMuaW5pdGlhbGl6ZXJzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBiZWhhdmlvdXIgdG8gdGhlIGVtaXR0ZXIuIEFsbCBlbWl0dGVyIGJlaGF2aW91cnMgYXJlIGFkZGVkIHRvIGVhY2ggcGFydGljbGUgd2hlblxuICAgKiB0aGV5IGFyZSBlbWl0dGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0JlaGF2aW91cn0gYmVoYXZpb3VyIC0gVGhlIGJlaGF2aW91ciB0byBhZGQgdG8gdGhlIGVtaXR0ZXJcbiAgICogQHJldHVybiB7RW1pdHRlcn1cbiAgICovXG4gIGFkZEJlaGF2aW91cihiZWhhdmlvdXIpIHtcbiAgICB0aGlzLmJlaGF2aW91cnMucHVzaChiZWhhdmlvdXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBtdWx0aXBsZSBiZWhhdmlvdXJzIHRvIHRoZSBlbWl0dGVyLlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5PEJlaGF2aW91cj59IGJlaGF2aW91cnMgLSBhbiBhcnJheSBvZiBlbWl0dGVyIGJlaGF2aW91cnNcbiAgICogQHJldHVybiB7RW1pdHRlcn1cbiAgICovXG4gIGFkZEJlaGF2aW91cnMoYmVoYXZpb3Vycykge1xuICAgIGxldCBpID0gYmVoYXZpb3Vycy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB0aGlzLmFkZEJlaGF2aW91cihiZWhhdmlvdXJzW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBlbWl0dGVyJ3MgYmVoYXZpb3Vycy5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheTxCZWhhdmlvdXI+fSBiZWhhdmlvdXJzIC0gYW4gYXJyYXkgb2YgZW1pdHRlciBiZWhhdmlvdXJzXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICBzZXRCZWhhdmlvdXJzKGJlaGF2aW91cnMpIHtcbiAgICB0aGlzLmJlaGF2aW91cnMgPSBiZWhhdmlvdXJzO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgYmVoYXZpb3VyIGZyb20gdGhlIGVtaXR0ZXIncyBiZWhhdmlvdXJzIGFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0ge0JlaGF2aW91cn0gYmVoYXZpb3VyIC0gVGhlIGJlaGF2aW91ciB0byByZW1vdmVcbiAgICogQHJldHVybiB7RW1pdHRlcn1cbiAgICovXG4gIHJlbW92ZUJlaGF2aW91cihiZWhhdmlvdXIpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuYmVoYXZpb3Vycy5pbmRleE9mKGJlaGF2aW91cik7XG5cbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgdGhpcy5iZWhhdmlvdXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgYmVoYXZpb3VycyBmcm9tIHRoZSBlbWl0dGVyLlxuICAgKlxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgcmVtb3ZlQWxsQmVoYXZpb3VycygpIHtcbiAgICBVdGlsLmRlc3Ryb3lBcnJheSh0aGlzLmJlaGF2aW91cnMpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBlbWl0dGVyIGJlaGF2aW91ciB0byB0aGUgZW1pdHRlci5cbiAgICpcbiAgICogQHBhcmFtIHtCZWhhdmlvdXJ9IGJlaGF2aW91ciAtIFRoZSBiZWhhdmlvdXIgdG8gYWRkIHRvIHRoZSBlbWl0dGVyXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICBhZGRFbWl0dGVyQmVoYXZpb3VyKGJlaGF2aW91cikge1xuICAgIHRoaXMuZW1pdHRlckJlaGF2aW91cnMucHVzaChiZWhhdmlvdXIpO1xuXG4gICAgYmVoYXZpb3VyLmluaXRpYWxpemUodGhpcyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIG11bHRpcGxlIGJlaGF2aW91cnMgdG8gdGhlIGVtaXR0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXk8QmVoYXZpb3VyPn0gYmVoYXZpb3VycyAtIGFuIGFycmF5IG9mIGVtaXR0ZXIgYmVoYXZpb3Vyc1xuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgYWRkRW1pdHRlckJlaGF2aW91cnMoYmVoYXZpb3Vycykge1xuICAgIGxldCBpID0gYmVoYXZpb3Vycy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB0aGlzLmFkZEVtaXR0ZXJCZWhhdmlvdXIoYmVoYXZpb3Vyc1tpXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZW1pdHRlcidzIGJlaGF2aW91cnMuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXk8QmVoYXZpb3VyPn0gYmVoYXZpb3VycyAtIGFuIGFycmF5IG9mIGVtaXR0ZXIgYmVoYXZpb3Vyc1xuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgc2V0RW1pdHRlckJlaGF2aW91cnMoYmVoYXZpb3Vycykge1xuICAgIGNvbnN0IGxlbmd0aCA9IGJlaGF2aW91cnMubGVuZ3RoO1xuXG4gICAgdGhpcy5lbWl0dGVyQmVoYXZpb3VycyA9IGJlaGF2aW91cnM7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmVtaXR0ZXJCZWhhdmlvdXJzW2ldLmluaXRpYWxpemUodGhpcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgYmVoYXZpb3VyIGZyb20gdGhlIGVtaXR0ZXIncyBiZWhhdmlvdXJzIGFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0ge0JlaGF2aW91cn0gYmVoYXZpb3VyIC0gVGhlIGJlaGF2aW91ciB0byByZW1vdmVcbiAgICogQHJldHVybiB7RW1pdHRlcn1cbiAgICovXG4gIHJlbW92ZUVtaXR0ZXJCZWhhdmlvdXIoYmVoYXZpb3VyKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmVtaXR0ZXJCZWhhdmlvdXJzLmluZGV4T2YoYmVoYXZpb3VyKTtcblxuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLmVtaXR0ZXJCZWhhdmlvdXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgYmVoYXZpb3VycyBmcm9tIHRoZSBlbWl0dGVyLlxuICAgKlxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgcmVtb3ZlQWxsRW1pdHRlckJlaGF2aW91cnMoKSB7XG4gICAgVXRpbC5kZXN0cm95QXJyYXkodGhpcy5lbWl0dGVyQmVoYXZpb3Vycyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBldmVudCBsaXN0ZW5lciBmb3IgdGhlIEVNSVRURVJfREVBRCBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtvbkVtaXR0ZXJEZWFkfSAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIEVNSVRURVJfREVBRCBpcyBkaXNwYXRjaGVkLlxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgYWRkT25FbWl0dGVyRGVhZEV2ZW50TGlzdGVuZXIob25FbWl0dGVyRGVhZCkge1xuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmFkZEV2ZW50TGlzdGVuZXIoYCR7dGhpcy5pZH1fJHtFTUlUVEVSX0RFQUR9YCwgKCkgPT5cbiAgICAgIG9uRW1pdHRlckRlYWQoKVxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcGFydGljbGUgYnkgcmV0cmVpdmluZyBvbmUgZnJvbSB0aGUgcG9vbCBhbmQgc2V0dGluZyBpdCB1cCB3aXRoXG4gICAqIHRoZSBzdXBwbGllZCBpbml0aWFsaXplciBhbmQgYmVoYXZpb3VyLlxuICAgKlxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgY3JlYXRlUGFydGljbGUoKSB7XG4gICAgY29uc3QgcGFydGljbGUgPSB0aGlzLnBhcmVudC5wb29sLmdldChQYXJ0aWNsZSk7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnBhcnRpY2xlcy5sZW5ndGg7XG5cbiAgICB0aGlzLnNldHVwUGFydGljbGUocGFydGljbGUsIGluZGV4KTtcbiAgICB0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5kaXNwYXRjaChQQVJUSUNMRV9DUkVBVEVELCBwYXJ0aWNsZSk7XG4gICAgdGhpcy5iaW5kRW1pdHRlckV2ZW50ICYmIHRoaXMuZGlzcGF0Y2goUEFSVElDTEVfQ1JFQVRFRCwgcGFydGljbGUpO1xuXG4gICAgcmV0dXJuIHBhcnRpY2xlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgYSBwYXJ0aWNsZSBieSBydW5uaW5nIGFsbCBpbml0aWFsaXplcnMgb24gaXQgYW5kIHNldHRpbmcgaXRzIGJlaGF2aW91cnMuXG4gICAqIEFsc28gYWRkcyB0aGUgcGFydGljbGUgdG8gdGhpcy5wYXJ0aWNsZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7UGFydGljbGV9IHBhcnRpY2xlIC0gVGhlIHBhcnRpY2xlIHRvIHNldHVwXG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgc2V0dXBQYXJ0aWNsZShwYXJ0aWNsZSwgaW5kZXgpIHtcbiAgICBjb25zdCB7IGluaXRpYWxpemVycywgYmVoYXZpb3VycyB9ID0gdGhpcztcblxuICAgIEluaXRpYWxpemVyVXRpbC5pbml0aWFsaXplKHRoaXMsIHBhcnRpY2xlLCBpbml0aWFsaXplcnMpO1xuXG4gICAgcGFydGljbGUuYWRkQmVoYXZpb3VycyhiZWhhdmlvdXJzKTtcbiAgICBwYXJ0aWNsZS5wYXJlbnQgPSB0aGlzO1xuICAgIHBhcnRpY2xlLmluZGV4ID0gaW5kZXg7XG5cbiAgICB0aGlzLnBhcnRpY2xlcy5wdXNoKHBhcnRpY2xlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBlbWl0dGVyIGFjY29yZGluZyB0byB0aGUgdGltZSBwYXNzZWQgYnkgY2FsbGluZyB0aGUgZ2VuZXJhdGVcbiAgICogYW5kIGludGVncmF0ZSBtZXRob2RzLiBUaGUgZ2VuZXJhdGUgbWV0aG9kIGNyZWF0ZXMgcGFydGljbGVzLCB0aGUgaW50ZWdyYXRlXG4gICAqIG1ldGhvZCB1cGRhdGVzIGV4aXN0aW5nIHBhcnRpY2xlcy5cbiAgICpcbiAgICogSWYgdGhlIGVtaXR0ZXIgYWdlIGlzIGdyZWF0ZXIgdGhhbiB0aW1lLCB0aGUgZW1pdHRlciBpcyBraWxsZWQuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGFsc28gaW5kZXhlcy9kZWluZGV4ZXMgcGFydGljbGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFN5c3RlbSBlbmdpbmUgdGltZVxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIHVwZGF0ZSh0aW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzRW1pdHRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFnZSArPSB0aW1lO1xuXG4gICAgaWYgKHRoaXMuZGVhZCB8fCB0aGlzLmFnZSA+PSB0aGlzLmxpZmUpIHtcbiAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHRoaXMuZ2VuZXJhdGUodGltZSk7XG4gICAgdGhpcy5pbnRlZ3JhdGUodGltZSk7XG5cbiAgICBsZXQgaSA9IHRoaXMucGFydGljbGVzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGNvbnN0IHBhcnRpY2xlID0gdGhpcy5wYXJ0aWNsZXNbaV07XG5cbiAgICAgIGlmIChwYXJ0aWNsZS5kZWFkKSB7XG4gICAgICAgIHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LmRpc3BhdGNoKFBBUlRJQ0xFX0RFQUQsIHBhcnRpY2xlKTtcbiAgICAgICAgdGhpcy5iaW5kRW1pdHRlckV2ZW50ICYmIHRoaXMuZGlzcGF0Y2goUEFSVElDTEVfREVBRCwgcGFydGljbGUpO1xuICAgICAgICB0aGlzLnBhcmVudC5wb29sLmV4cGlyZShwYXJ0aWNsZS5yZXNldCgpKTtcbiAgICAgICAgdGhpcy5wYXJ0aWNsZXMuc3BsaWNlKGksIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXBkYXRlRW1pdHRlckJlaGF2aW91cnModGltZSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZW1pdHRlcidzIGVtaXR0ZXIgYmVoYXZpb3Vycy5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgLSBTeXN0ZW0gZW5naW5lIHRpbWVcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICB1cGRhdGVFbWl0dGVyQmVoYXZpb3Vycyh0aW1lKSB7XG4gICAgaWYgKHRoaXMuc2xlZXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsZW5ndGggPSB0aGlzLmVtaXR0ZXJCZWhhdmlvdXJzLmxlbmd0aDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZW1pdHRlckJlaGF2aW91cnNbaV0uYXBwbHlCZWhhdmlvdXIodGhpcywgdGltZSwgaSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIGludGVncmF0aW9uIGFsZ29yaXRobSBvbiB0aGUgZW1pdHRlciBhbmQgYWxsIHBhcnRpY2xlcy5cbiAgICogVXBkYXRlcyB0aGUgcGFydGljbGVzIHdpdGggdGhlIHRpbXN0YW1wIHBhc3NlZC5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgLSBTeXN0ZW0gZW5naW5lIHRpbWVcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBpbnRlZ3JhdGUodGltZSkge1xuICAgIGNvbnN0IGludGVncmF0aW9uVHlwZSA9IHRoaXMucGFyZW50XG4gICAgICA/IHRoaXMucGFyZW50LmludGVncmF0aW9uVHlwZVxuICAgICAgOiBJTlRFR1JBVElPTl9UWVBFX0VVTEVSO1xuICAgIGNvbnN0IGRhbXBpbmcgPSAxIC0gdGhpcy5kYW1waW5nO1xuXG4gICAgaW50ZWdyYXRlKHRoaXMsIHRpbWUsIGRhbXBpbmcsIGludGVncmF0aW9uVHlwZSk7XG5cbiAgICBsZXQgaW5kZXggPSB0aGlzLnBhcnRpY2xlcy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgY29uc3QgcGFydGljbGUgPSB0aGlzLnBhcnRpY2xlc1tpbmRleF07XG5cbiAgICAgIHBhcnRpY2xlLnVwZGF0ZSh0aW1lLCBpbmRleCk7XG4gICAgICBpbnRlZ3JhdGUocGFydGljbGUsIHRpbWUsIGRhbXBpbmcsIGludGVncmF0aW9uVHlwZSk7XG5cbiAgICAgIHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LmRpc3BhdGNoKFBBUlRJQ0xFX1VQREFURSwgcGFydGljbGUpO1xuICAgICAgdGhpcy5iaW5kRW1pdHRlckV2ZW50ICYmIHRoaXMuZGlzcGF0Y2goUEFSVElDTEVfVVBEQVRFLCBwYXJ0aWNsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBuZXcgcGFydGljbGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFN5c3RlbSBlbmdpbmUgdGltZVxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIGdlbmVyYXRlKHRpbWUpIHtcbiAgICBpZiAodGhpcy50b3RhbEVtaXRUaW1lcyA9PT0gMSkge1xuICAgICAgbGV0IGkgPSB0aGlzLnJhdGUuZ2V0VmFsdWUoOTk5OTkpO1xuXG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgdGhpcy5jSUQgPSBpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlUGFydGljbGUoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50b3RhbEVtaXRUaW1lcyA9IDA7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRFbWl0VGltZSArPSB0aW1lO1xuXG4gICAgaWYgKHRoaXMuY3VycmVudEVtaXRUaW1lIDwgdGhpcy50b3RhbEVtaXRUaW1lcykge1xuICAgICAgbGV0IGkgPSB0aGlzLnJhdGUuZ2V0VmFsdWUodGltZSk7XG5cbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICB0aGlzLmNJRCA9IGk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgdGhpcy5jcmVhdGVQYXJ0aWNsZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBLaWxscyB0aGUgZW1pdHRlci5cbiAgICpcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHRoaXMuZGVhZCA9IHRydWU7XG4gICAgdGhpcy5lbmVyZ3kgPSAwO1xuICAgIHRoaXMudG90YWxFbWl0VGltZXMgPSAtMTtcblxuICAgIGlmICh0aGlzLnBhcnRpY2xlcy5sZW5ndGggPT0gMCkge1xuICAgICAgdGhpcy5pc0VtaXR0aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnJlbW92ZUFsbEluaXRpYWxpemVycygpO1xuICAgICAgdGhpcy5yZW1vdmVBbGxCZWhhdmlvdXJzKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoKGAke3RoaXMuaWR9XyR7RU1JVFRFUl9ERUFEfWApO1xuXG4gICAgICB0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5yZW1vdmVFbWl0dGVyKHRoaXMpO1xuICAgIH1cbiAgfVxufVxuIl19