three-nebula 11.0.0 → 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.
- package/CHANGELOG.md +10 -0
- package/dist/three-nebula.cjs +109 -0
- package/dist/three-nebula.cjs.map +1 -0
- package/dist/three-nebula.mjs +2968 -0
- package/dist/three-nebula.mjs.map +1 -0
- package/dist/three-nebula.umd.js +109 -0
- package/dist/three-nebula.umd.js.map +1 -0
- package/package.json +23 -47
- package/specs/01-emitter-hierarchy.md +200 -0
- package/specs/02-determinism-scrubbing.md +188 -0
- package/specs/03-sound-renderer.md +183 -0
- package/specs/04-schema-versioning.md +140 -0
- package/specs/05-content-addressed-assets.md +288 -0
- package/specs/README.md +80 -0
- package/build/cjs/behaviour/Alpha.js +0 -189
- package/build/cjs/behaviour/Attraction.js +0 -189
- package/build/cjs/behaviour/Behaviour.js +0 -253
- package/build/cjs/behaviour/Collision.js +0 -146
- package/build/cjs/behaviour/Color.js +0 -148
- package/build/cjs/behaviour/CrossZone.js +0 -141
- package/build/cjs/behaviour/Force.js +0 -126
- package/build/cjs/behaviour/Gravity.js +0 -78
- package/build/cjs/behaviour/RandomDrift.js +0 -153
- package/build/cjs/behaviour/Repulsion.js +0 -123
- package/build/cjs/behaviour/Rotate.js +0 -265
- package/build/cjs/behaviour/Scale.js +0 -177
- package/build/cjs/behaviour/Spring.js +0 -133
- package/build/cjs/behaviour/constants.js +0 -28
- package/build/cjs/behaviour/index.js +0 -112
- package/build/cjs/behaviour/types.js +0 -33
- package/build/cjs/constants/index.js +0 -61
- package/build/cjs/core/Particle.js +0 -390
- package/build/cjs/core/Pool.js +0 -203
- package/build/cjs/core/System.js +0 -366
- package/build/cjs/core/constants.js +0 -163
- package/build/cjs/core/fromJSON.js +0 -128
- package/build/cjs/core/fromJSONAsync.js +0 -239
- package/build/cjs/core/index.js +0 -32
- package/build/cjs/core/three/Euler.js +0 -233
- package/build/cjs/core/three/Math.js +0 -91
- package/build/cjs/core/three/Matrix4.js +0 -745
- package/build/cjs/core/three/Quaternion.js +0 -451
- package/build/cjs/core/three/Vector3.js +0 -464
- package/build/cjs/core/three/constants.js +0 -298
- package/build/cjs/core/three/index.js +0 -48
- package/build/cjs/core/types.js +0 -13
- package/build/cjs/debug/Debug.js +0 -209
- package/build/cjs/debug/constants.js +0 -19
- package/build/cjs/debug/index.js +0 -24
- package/build/cjs/debug/log.js +0 -38
- package/build/cjs/ease/index.js +0 -149
- package/build/cjs/emitter/Emitter.js +0 -798
- package/build/cjs/emitter/FollowEmitter.js +0 -146
- package/build/cjs/emitter/constants.js +0 -20
- package/build/cjs/emitter/index.js +0 -24
- package/build/cjs/emitter/types.js +0 -11
- package/build/cjs/events/EventDispatcher.js +0 -105
- package/build/cjs/events/constants.js +0 -23
- package/build/cjs/events/index.js +0 -27
- package/build/cjs/index.js +0 -151
- package/build/cjs/initializer/Body.js +0 -122
- package/build/cjs/initializer/BodySprite.js +0 -146
- package/build/cjs/initializer/Initializer.js +0 -109
- package/build/cjs/initializer/InitializerUtil.js +0 -54
- package/build/cjs/initializer/Life.js +0 -106
- package/build/cjs/initializer/Mass.js +0 -101
- package/build/cjs/initializer/Position.js +0 -152
- package/build/cjs/initializer/Radius.js +0 -118
- package/build/cjs/initializer/Rate.js +0 -150
- package/build/cjs/initializer/Rotation.js +0 -95
- package/build/cjs/initializer/Texture.js +0 -139
- package/build/cjs/initializer/Velocity/PolarVelocity.js +0 -102
- package/build/cjs/initializer/Velocity/RadialVelocity.js +0 -111
- package/build/cjs/initializer/Velocity/VectorVelocity.js +0 -108
- package/build/cjs/initializer/Velocity/Velocity.js +0 -94
- package/build/cjs/initializer/Velocity/index.js +0 -32
- package/build/cjs/initializer/constants.js +0 -43
- package/build/cjs/initializer/index.js +0 -108
- package/build/cjs/initializer/types.js +0 -37
- package/build/cjs/math/ArraySpan.js +0 -103
- package/build/cjs/math/Box.js +0 -46
- package/build/cjs/math/ColorSpan.js +0 -113
- package/build/cjs/math/MathUtils.js +0 -57
- package/build/cjs/math/Polar3D.js +0 -115
- package/build/cjs/math/Span.js +0 -88
- package/build/cjs/math/Vector3D.js +0 -76
- package/build/cjs/math/constants.js +0 -35
- package/build/cjs/math/index.js +0 -122
- package/build/cjs/math/integration.js +0 -59
- package/build/cjs/math/types.js +0 -19
- package/build/cjs/renderer/BaseRenderer.js +0 -108
- package/build/cjs/renderer/CustomRenderer.js +0 -65
- package/build/cjs/renderer/GPURenderer/Desktop/index.js +0 -371
- package/build/cjs/renderer/GPURenderer/Desktop/shaders/fragmentShader.js +0 -13
- package/build/cjs/renderer/GPURenderer/Desktop/shaders/index.js +0 -22
- package/build/cjs/renderer/GPURenderer/Desktop/shaders/vertexShader.js +0 -17
- package/build/cjs/renderer/GPURenderer/Mobile/index.js +0 -385
- package/build/cjs/renderer/GPURenderer/Mobile/shaders/fragmentShader.js +0 -13
- package/build/cjs/renderer/GPURenderer/Mobile/shaders/index.js +0 -22
- package/build/cjs/renderer/GPURenderer/Mobile/shaders/vertexShader.js +0 -15
- package/build/cjs/renderer/GPURenderer/common/ParticleBuffer/constants.js +0 -58
- package/build/cjs/renderer/GPURenderer/common/ParticleBuffer/index.js +0 -93
- package/build/cjs/renderer/GPURenderer/common/TextureAtlas/constants.js +0 -9
- package/build/cjs/renderer/GPURenderer/common/TextureAtlas/index.js +0 -221
- package/build/cjs/renderer/GPURenderer/common/constants.js +0 -22
- package/build/cjs/renderer/GPURenderer/common/index.js +0 -38
- package/build/cjs/renderer/GPURenderer/common/shaders/constants.js +0 -9
- package/build/cjs/renderer/GPURenderer/common/stores/Target.js +0 -45
- package/build/cjs/renderer/GPURenderer/common/stores/UniqueList.js +0 -51
- package/build/cjs/renderer/GPURenderer/common/stores/index.js +0 -22
- package/build/cjs/renderer/GPURenderer/index.js +0 -97
- package/build/cjs/renderer/MeshRenderer.js +0 -136
- package/build/cjs/renderer/SpriteRenderer.js +0 -68
- package/build/cjs/renderer/index.js +0 -40
- package/build/cjs/renderer/types.js +0 -21
- package/build/cjs/utils/ColorUtil.js +0 -39
- package/build/cjs/utils/PUID.js +0 -26
- package/build/cjs/utils/THREEUtil.js +0 -40
- package/build/cjs/utils/Util.js +0 -69
- package/build/cjs/utils/index.js +0 -61
- package/build/cjs/utils/uid.js +0 -12
- package/build/cjs/zone/BoxZone.js +0 -178
- package/build/cjs/zone/LineZone.js +0 -101
- package/build/cjs/zone/MeshZone.js +0 -101
- package/build/cjs/zone/PointZone.js +0 -99
- package/build/cjs/zone/ScreenZone.js +0 -164
- package/build/cjs/zone/SphereZone.js +0 -155
- package/build/cjs/zone/Zone.js +0 -172
- package/build/cjs/zone/index.js +0 -56
- package/build/cjs/zone/types.js +0 -21
- package/build/esm/behaviour/Alpha.js +0 -134
- package/build/esm/behaviour/Attraction.js +0 -135
- package/build/esm/behaviour/Behaviour.js +0 -215
- package/build/esm/behaviour/Collision.js +0 -100
- package/build/esm/behaviour/Color.js +0 -101
- package/build/esm/behaviour/CrossZone.js +0 -82
- package/build/esm/behaviour/Force.js +0 -83
- package/build/esm/behaviour/Gravity.js +0 -40
- package/build/esm/behaviour/RandomDrift.js +0 -97
- package/build/esm/behaviour/Repulsion.js +0 -81
- package/build/esm/behaviour/Rotate.js +0 -214
- package/build/esm/behaviour/Scale.js +0 -131
- package/build/esm/behaviour/Spring.js +0 -90
- package/build/esm/behaviour/constants.js +0 -11
- package/build/esm/behaviour/index.js +0 -14
- package/build/esm/behaviour/types.js +0 -14
- package/build/esm/constants/index.js +0 -42
- package/build/esm/core/Particle.js +0 -357
- package/build/esm/core/Pool.js +0 -161
- package/build/esm/core/System.js +0 -320
- package/build/esm/core/constants.js +0 -127
- package/build/esm/core/fromJSON.js +0 -107
- package/build/esm/core/fromJSONAsync.js +0 -210
- package/build/esm/core/index.js +0 -4
- package/build/esm/core/three/Euler.js +0 -224
- package/build/esm/core/three/Math.js +0 -84
- package/build/esm/core/three/Matrix4.js +0 -739
- package/build/esm/core/three/Quaternion.js +0 -445
- package/build/esm/core/three/Vector3.js +0 -457
- package/build/esm/core/three/constants.js +0 -148
- package/build/esm/core/three/index.js +0 -5
- package/build/esm/core/types.js +0 -4
- package/build/esm/debug/Debug.js +0 -195
- package/build/esm/debug/constants.js +0 -7
- package/build/esm/debug/index.js +0 -3
- package/build/esm/debug/log.js +0 -31
- package/build/esm/ease/index.js +0 -113
- package/build/esm/emitter/Emitter.js +0 -708
- package/build/esm/emitter/FollowEmitter.js +0 -97
- package/build/esm/emitter/constants.js +0 -7
- package/build/esm/emitter/index.js +0 -3
- package/build/esm/emitter/types.js +0 -3
- package/build/esm/events/EventDispatcher.js +0 -82
- package/build/esm/events/constants.js +0 -9
- package/build/esm/events/index.js +0 -4
- package/build/esm/index.js +0 -13
- package/build/esm/initializer/Body.js +0 -83
- package/build/esm/initializer/BodySprite.js +0 -108
- package/build/esm/initializer/Initializer.js +0 -84
- package/build/esm/initializer/InitializerUtil.js +0 -48
- package/build/esm/initializer/Life.js +0 -66
- package/build/esm/initializer/Mass.js +0 -60
- package/build/esm/initializer/Position.js +0 -98
- package/build/esm/initializer/Radius.js +0 -75
- package/build/esm/initializer/Rate.js +0 -107
- package/build/esm/initializer/Rotation.js +0 -54
- package/build/esm/initializer/Texture.js +0 -101
- package/build/esm/initializer/Velocity/PolarVelocity.js +0 -63
- package/build/esm/initializer/Velocity/RadialVelocity.js +0 -72
- package/build/esm/initializer/Velocity/VectorVelocity.js +0 -69
- package/build/esm/initializer/Velocity/Velocity.js +0 -52
- package/build/esm/initializer/Velocity/index.js +0 -4
- package/build/esm/initializer/constants.js +0 -26
- package/build/esm/initializer/index.js +0 -12
- package/build/esm/initializer/types.js +0 -16
- package/build/esm/math/ArraySpan.js +0 -62
- package/build/esm/math/Box.js +0 -25
- package/build/esm/math/ColorSpan.js +0 -71
- package/build/esm/math/MathUtils.js +0 -48
- package/build/esm/math/Polar3D.js +0 -81
- package/build/esm/math/Span.js +0 -63
- package/build/esm/math/Vector3D.js +0 -34
- package/build/esm/math/constants.js +0 -24
- package/build/esm/math/index.js +0 -10
- package/build/esm/math/integration.js +0 -47
- package/build/esm/math/types.js +0 -7
- package/build/esm/renderer/BaseRenderer.js +0 -78
- package/build/esm/renderer/CustomRenderer.js +0 -23
- package/build/esm/renderer/GPURenderer/Desktop/index.js +0 -357
- package/build/esm/renderer/GPURenderer/Desktop/shaders/fragmentShader.js +0 -30
- package/build/esm/renderer/GPURenderer/Desktop/shaders/index.js +0 -3
- package/build/esm/renderer/GPURenderer/Desktop/shaders/vertexShader.js +0 -36
- package/build/esm/renderer/GPURenderer/Mobile/index.js +0 -375
- package/build/esm/renderer/GPURenderer/Mobile/shaders/fragmentShader.js +0 -27
- package/build/esm/renderer/GPURenderer/Mobile/shaders/index.js +0 -3
- package/build/esm/renderer/GPURenderer/Mobile/shaders/vertexShader.js +0 -33
- package/build/esm/renderer/GPURenderer/common/ParticleBuffer/constants.js +0 -30
- package/build/esm/renderer/GPURenderer/common/ParticleBuffer/index.js +0 -70
- package/build/esm/renderer/GPURenderer/common/TextureAtlas/constants.js +0 -2
- package/build/esm/renderer/GPURenderer/common/TextureAtlas/index.js +0 -206
- package/build/esm/renderer/GPURenderer/common/constants.js +0 -13
- package/build/esm/renderer/GPURenderer/common/index.js +0 -4
- package/build/esm/renderer/GPURenderer/common/shaders/constants.js +0 -2
- package/build/esm/renderer/GPURenderer/common/stores/Target.js +0 -26
- package/build/esm/renderer/GPURenderer/common/stores/UniqueList.js +0 -29
- package/build/esm/renderer/GPURenderer/common/stores/index.js +0 -3
- package/build/esm/renderer/GPURenderer/index.js +0 -57
- package/build/esm/renderer/MeshRenderer.js +0 -93
- package/build/esm/renderer/SpriteRenderer.js +0 -30
- package/build/esm/renderer/index.js +0 -5
- package/build/esm/renderer/types.js +0 -8
- package/build/esm/utils/ColorUtil.js +0 -32
- package/build/esm/utils/PUID.js +0 -19
- package/build/esm/utils/THREEUtil.js +0 -31
- package/build/esm/utils/Util.js +0 -60
- package/build/esm/utils/index.js +0 -13
- package/build/esm/utils/uid.js +0 -3
- package/build/esm/zone/BoxZone.js +0 -133
- package/build/esm/zone/LineZone.js +0 -61
- package/build/esm/zone/MeshZone.js +0 -60
- package/build/esm/zone/PointZone.js +0 -59
- package/build/esm/zone/ScreenZone.js +0 -116
- package/build/esm/zone/SphereZone.js +0 -113
- package/build/esm/zone/Zone.js +0 -141
- package/build/esm/zone/index.js +0 -7
- package/build/esm/zone/types.js +0 -8
- package/build/three-nebula.js +0 -2
- package/build/three-nebula.js.map +0 -1
|
@@ -1,451 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.Quaternion = Quaternion;
|
|
7
|
-
|
|
8
|
-
var _Math2 = require("./Math.js");
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* @author mikael emtinger / http://gomo.se/
|
|
12
|
-
* @author alteredq / http://alteredqualia.com/
|
|
13
|
-
* @author WestLangley / http://github.com/WestLangley
|
|
14
|
-
* @author bhouston / http://clara.io
|
|
15
|
-
*/
|
|
16
|
-
function Quaternion(x, y, z, w) {
|
|
17
|
-
this._x = x || 0;
|
|
18
|
-
this._y = y || 0;
|
|
19
|
-
this._z = z || 0;
|
|
20
|
-
this._w = w !== undefined ? w : 1;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
Object.assign(Quaternion, {
|
|
24
|
-
slerp: function slerp(qa, qb, qm, t) {
|
|
25
|
-
return qm.copy(qa).slerp(qb, t);
|
|
26
|
-
},
|
|
27
|
-
slerpFlat: function slerpFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t) {
|
|
28
|
-
// fuzz-free, array-based Quaternion SLERP operation
|
|
29
|
-
var x0 = src0[srcOffset0 + 0],
|
|
30
|
-
y0 = src0[srcOffset0 + 1],
|
|
31
|
-
z0 = src0[srcOffset0 + 2],
|
|
32
|
-
w0 = src0[srcOffset0 + 3],
|
|
33
|
-
x1 = src1[srcOffset1 + 0],
|
|
34
|
-
y1 = src1[srcOffset1 + 1],
|
|
35
|
-
z1 = src1[srcOffset1 + 2],
|
|
36
|
-
w1 = src1[srcOffset1 + 3];
|
|
37
|
-
|
|
38
|
-
if (w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1) {
|
|
39
|
-
var s = 1 - t,
|
|
40
|
-
cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,
|
|
41
|
-
dir = cos >= 0 ? 1 : -1,
|
|
42
|
-
sqrSin = 1 - cos * cos; // Skip the Slerp for tiny steps to avoid numeric problems:
|
|
43
|
-
|
|
44
|
-
if (sqrSin > Number.EPSILON) {
|
|
45
|
-
var sin = Math.sqrt(sqrSin),
|
|
46
|
-
len = Math.atan2(sin, cos * dir);
|
|
47
|
-
s = Math.sin(s * len) / sin;
|
|
48
|
-
t = Math.sin(t * len) / sin;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
var tDir = t * dir;
|
|
52
|
-
x0 = x0 * s + x1 * tDir;
|
|
53
|
-
y0 = y0 * s + y1 * tDir;
|
|
54
|
-
z0 = z0 * s + z1 * tDir;
|
|
55
|
-
w0 = w0 * s + w1 * tDir; // Normalize in case we just did a lerp:
|
|
56
|
-
|
|
57
|
-
if (s === 1 - t) {
|
|
58
|
-
var f = 1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0);
|
|
59
|
-
x0 *= f;
|
|
60
|
-
y0 *= f;
|
|
61
|
-
z0 *= f;
|
|
62
|
-
w0 *= f;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
dst[dstOffset] = x0;
|
|
67
|
-
dst[dstOffset + 1] = y0;
|
|
68
|
-
dst[dstOffset + 2] = z0;
|
|
69
|
-
dst[dstOffset + 3] = w0;
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
Object.defineProperties(Quaternion.prototype, {
|
|
73
|
-
x: {
|
|
74
|
-
get: function get() {
|
|
75
|
-
return this._x;
|
|
76
|
-
},
|
|
77
|
-
set: function set(value) {
|
|
78
|
-
this._x = value;
|
|
79
|
-
|
|
80
|
-
this._onChangeCallback();
|
|
81
|
-
}
|
|
82
|
-
},
|
|
83
|
-
y: {
|
|
84
|
-
get: function get() {
|
|
85
|
-
return this._y;
|
|
86
|
-
},
|
|
87
|
-
set: function set(value) {
|
|
88
|
-
this._y = value;
|
|
89
|
-
|
|
90
|
-
this._onChangeCallback();
|
|
91
|
-
}
|
|
92
|
-
},
|
|
93
|
-
z: {
|
|
94
|
-
get: function get() {
|
|
95
|
-
return this._z;
|
|
96
|
-
},
|
|
97
|
-
set: function set(value) {
|
|
98
|
-
this._z = value;
|
|
99
|
-
|
|
100
|
-
this._onChangeCallback();
|
|
101
|
-
}
|
|
102
|
-
},
|
|
103
|
-
w: {
|
|
104
|
-
get: function get() {
|
|
105
|
-
return this._w;
|
|
106
|
-
},
|
|
107
|
-
set: function set(value) {
|
|
108
|
-
this._w = value;
|
|
109
|
-
|
|
110
|
-
this._onChangeCallback();
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
Object.assign(Quaternion.prototype, {
|
|
115
|
-
isQuaternion: true,
|
|
116
|
-
set: function set(x, y, z, w) {
|
|
117
|
-
this._x = x;
|
|
118
|
-
this._y = y;
|
|
119
|
-
this._z = z;
|
|
120
|
-
this._w = w;
|
|
121
|
-
|
|
122
|
-
this._onChangeCallback();
|
|
123
|
-
|
|
124
|
-
return this;
|
|
125
|
-
},
|
|
126
|
-
clone: function clone() {
|
|
127
|
-
return new this.constructor(this._x, this._y, this._z, this._w);
|
|
128
|
-
},
|
|
129
|
-
copy: function copy(quaternion) {
|
|
130
|
-
this._x = quaternion.x;
|
|
131
|
-
this._y = quaternion.y;
|
|
132
|
-
this._z = quaternion.z;
|
|
133
|
-
this._w = quaternion.w;
|
|
134
|
-
|
|
135
|
-
this._onChangeCallback();
|
|
136
|
-
|
|
137
|
-
return this;
|
|
138
|
-
},
|
|
139
|
-
setFromEuler: function setFromEuler(euler, update) {
|
|
140
|
-
if (!(euler && euler.isEuler)) {
|
|
141
|
-
throw new Error('THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.');
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
var x = euler._x,
|
|
145
|
-
y = euler._y,
|
|
146
|
-
z = euler._z,
|
|
147
|
-
order = euler.order; // http://www.mathworks.com/matlabcentral/fileexchange/
|
|
148
|
-
// 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/
|
|
149
|
-
// content/SpinCalc.m
|
|
150
|
-
|
|
151
|
-
var cos = Math.cos;
|
|
152
|
-
var sin = Math.sin;
|
|
153
|
-
var c1 = cos(x / 2);
|
|
154
|
-
var c2 = cos(y / 2);
|
|
155
|
-
var c3 = cos(z / 2);
|
|
156
|
-
var s1 = sin(x / 2);
|
|
157
|
-
var s2 = sin(y / 2);
|
|
158
|
-
var s3 = sin(z / 2);
|
|
159
|
-
|
|
160
|
-
if (order === 'XYZ') {
|
|
161
|
-
this._x = s1 * c2 * c3 + c1 * s2 * s3;
|
|
162
|
-
this._y = c1 * s2 * c3 - s1 * c2 * s3;
|
|
163
|
-
this._z = c1 * c2 * s3 + s1 * s2 * c3;
|
|
164
|
-
this._w = c1 * c2 * c3 - s1 * s2 * s3;
|
|
165
|
-
} else if (order === 'YXZ') {
|
|
166
|
-
this._x = s1 * c2 * c3 + c1 * s2 * s3;
|
|
167
|
-
this._y = c1 * s2 * c3 - s1 * c2 * s3;
|
|
168
|
-
this._z = c1 * c2 * s3 - s1 * s2 * c3;
|
|
169
|
-
this._w = c1 * c2 * c3 + s1 * s2 * s3;
|
|
170
|
-
} else if (order === 'ZXY') {
|
|
171
|
-
this._x = s1 * c2 * c3 - c1 * s2 * s3;
|
|
172
|
-
this._y = c1 * s2 * c3 + s1 * c2 * s3;
|
|
173
|
-
this._z = c1 * c2 * s3 + s1 * s2 * c3;
|
|
174
|
-
this._w = c1 * c2 * c3 - s1 * s2 * s3;
|
|
175
|
-
} else if (order === 'ZYX') {
|
|
176
|
-
this._x = s1 * c2 * c3 - c1 * s2 * s3;
|
|
177
|
-
this._y = c1 * s2 * c3 + s1 * c2 * s3;
|
|
178
|
-
this._z = c1 * c2 * s3 - s1 * s2 * c3;
|
|
179
|
-
this._w = c1 * c2 * c3 + s1 * s2 * s3;
|
|
180
|
-
} else if (order === 'YZX') {
|
|
181
|
-
this._x = s1 * c2 * c3 + c1 * s2 * s3;
|
|
182
|
-
this._y = c1 * s2 * c3 + s1 * c2 * s3;
|
|
183
|
-
this._z = c1 * c2 * s3 - s1 * s2 * c3;
|
|
184
|
-
this._w = c1 * c2 * c3 - s1 * s2 * s3;
|
|
185
|
-
} else if (order === 'XZY') {
|
|
186
|
-
this._x = s1 * c2 * c3 - c1 * s2 * s3;
|
|
187
|
-
this._y = c1 * s2 * c3 - s1 * c2 * s3;
|
|
188
|
-
this._z = c1 * c2 * s3 + s1 * s2 * c3;
|
|
189
|
-
this._w = c1 * c2 * c3 + s1 * s2 * s3;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
if (update !== false) this._onChangeCallback();
|
|
193
|
-
return this;
|
|
194
|
-
},
|
|
195
|
-
setFromAxisAngle: function setFromAxisAngle(axis, angle) {
|
|
196
|
-
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm
|
|
197
|
-
// assumes axis is normalized
|
|
198
|
-
var halfAngle = angle / 2,
|
|
199
|
-
s = Math.sin(halfAngle);
|
|
200
|
-
this._x = axis.x * s;
|
|
201
|
-
this._y = axis.y * s;
|
|
202
|
-
this._z = axis.z * s;
|
|
203
|
-
this._w = Math.cos(halfAngle);
|
|
204
|
-
|
|
205
|
-
this._onChangeCallback();
|
|
206
|
-
|
|
207
|
-
return this;
|
|
208
|
-
},
|
|
209
|
-
setFromRotationMatrix: function setFromRotationMatrix(m) {
|
|
210
|
-
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm
|
|
211
|
-
// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
|
|
212
|
-
var te = m.elements,
|
|
213
|
-
m11 = te[0],
|
|
214
|
-
m12 = te[4],
|
|
215
|
-
m13 = te[8],
|
|
216
|
-
m21 = te[1],
|
|
217
|
-
m22 = te[5],
|
|
218
|
-
m23 = te[9],
|
|
219
|
-
m31 = te[2],
|
|
220
|
-
m32 = te[6],
|
|
221
|
-
m33 = te[10],
|
|
222
|
-
trace = m11 + m22 + m33,
|
|
223
|
-
s;
|
|
224
|
-
|
|
225
|
-
if (trace > 0) {
|
|
226
|
-
s = 0.5 / Math.sqrt(trace + 1.0);
|
|
227
|
-
this._w = 0.25 / s;
|
|
228
|
-
this._x = (m32 - m23) * s;
|
|
229
|
-
this._y = (m13 - m31) * s;
|
|
230
|
-
this._z = (m21 - m12) * s;
|
|
231
|
-
} else if (m11 > m22 && m11 > m33) {
|
|
232
|
-
s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33);
|
|
233
|
-
this._w = (m32 - m23) / s;
|
|
234
|
-
this._x = 0.25 * s;
|
|
235
|
-
this._y = (m12 + m21) / s;
|
|
236
|
-
this._z = (m13 + m31) / s;
|
|
237
|
-
} else if (m22 > m33) {
|
|
238
|
-
s = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33);
|
|
239
|
-
this._w = (m13 - m31) / s;
|
|
240
|
-
this._x = (m12 + m21) / s;
|
|
241
|
-
this._y = 0.25 * s;
|
|
242
|
-
this._z = (m23 + m32) / s;
|
|
243
|
-
} else {
|
|
244
|
-
s = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22);
|
|
245
|
-
this._w = (m21 - m12) / s;
|
|
246
|
-
this._x = (m13 + m31) / s;
|
|
247
|
-
this._y = (m23 + m32) / s;
|
|
248
|
-
this._z = 0.25 * s;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
this._onChangeCallback();
|
|
252
|
-
|
|
253
|
-
return this;
|
|
254
|
-
},
|
|
255
|
-
setFromUnitVectors: function setFromUnitVectors(vFrom, vTo) {
|
|
256
|
-
// assumes direction vectors vFrom and vTo are normalized
|
|
257
|
-
var EPS = 0.000001;
|
|
258
|
-
var r = vFrom.dot(vTo) + 1;
|
|
259
|
-
|
|
260
|
-
if (r < EPS) {
|
|
261
|
-
r = 0;
|
|
262
|
-
|
|
263
|
-
if (Math.abs(vFrom.x) > Math.abs(vFrom.z)) {
|
|
264
|
-
this._x = -vFrom.y;
|
|
265
|
-
this._y = vFrom.x;
|
|
266
|
-
this._z = 0;
|
|
267
|
-
this._w = r;
|
|
268
|
-
} else {
|
|
269
|
-
this._x = 0;
|
|
270
|
-
this._y = -vFrom.z;
|
|
271
|
-
this._z = vFrom.y;
|
|
272
|
-
this._w = r;
|
|
273
|
-
}
|
|
274
|
-
} else {
|
|
275
|
-
// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3
|
|
276
|
-
this._x = vFrom.y * vTo.z - vFrom.z * vTo.y;
|
|
277
|
-
this._y = vFrom.z * vTo.x - vFrom.x * vTo.z;
|
|
278
|
-
this._z = vFrom.x * vTo.y - vFrom.y * vTo.x;
|
|
279
|
-
this._w = r;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
return this.normalize();
|
|
283
|
-
},
|
|
284
|
-
angleTo: function angleTo(q) {
|
|
285
|
-
return 2 * Math.acos(Math.abs(_Math2._Math.clamp(this.dot(q), -1, 1)));
|
|
286
|
-
},
|
|
287
|
-
rotateTowards: function rotateTowards(q, step) {
|
|
288
|
-
var angle = this.angleTo(q);
|
|
289
|
-
if (angle === 0) return this;
|
|
290
|
-
var t = Math.min(1, step / angle);
|
|
291
|
-
this.slerp(q, t);
|
|
292
|
-
return this;
|
|
293
|
-
},
|
|
294
|
-
inverse: function inverse() {
|
|
295
|
-
// quaternion is assumed to have unit length
|
|
296
|
-
return this.conjugate();
|
|
297
|
-
},
|
|
298
|
-
conjugate: function conjugate() {
|
|
299
|
-
this._x *= -1;
|
|
300
|
-
this._y *= -1;
|
|
301
|
-
this._z *= -1;
|
|
302
|
-
|
|
303
|
-
this._onChangeCallback();
|
|
304
|
-
|
|
305
|
-
return this;
|
|
306
|
-
},
|
|
307
|
-
dot: function dot(v) {
|
|
308
|
-
return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;
|
|
309
|
-
},
|
|
310
|
-
lengthSq: function lengthSq() {
|
|
311
|
-
return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;
|
|
312
|
-
},
|
|
313
|
-
length: function length() {
|
|
314
|
-
return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w);
|
|
315
|
-
},
|
|
316
|
-
normalize: function normalize() {
|
|
317
|
-
var l = this.length();
|
|
318
|
-
|
|
319
|
-
if (l === 0) {
|
|
320
|
-
this._x = 0;
|
|
321
|
-
this._y = 0;
|
|
322
|
-
this._z = 0;
|
|
323
|
-
this._w = 1;
|
|
324
|
-
} else {
|
|
325
|
-
l = 1 / l;
|
|
326
|
-
this._x = this._x * l;
|
|
327
|
-
this._y = this._y * l;
|
|
328
|
-
this._z = this._z * l;
|
|
329
|
-
this._w = this._w * l;
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
this._onChangeCallback();
|
|
333
|
-
|
|
334
|
-
return this;
|
|
335
|
-
},
|
|
336
|
-
multiply: function multiply(q, p) {
|
|
337
|
-
if (p !== undefined) {
|
|
338
|
-
console.warn('THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.');
|
|
339
|
-
return this.multiplyQuaternions(q, p);
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
return this.multiplyQuaternions(this, q);
|
|
343
|
-
},
|
|
344
|
-
premultiply: function premultiply(q) {
|
|
345
|
-
return this.multiplyQuaternions(q, this);
|
|
346
|
-
},
|
|
347
|
-
multiplyQuaternions: function multiplyQuaternions(a, b) {
|
|
348
|
-
// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm
|
|
349
|
-
var qax = a._x,
|
|
350
|
-
qay = a._y,
|
|
351
|
-
qaz = a._z,
|
|
352
|
-
qaw = a._w;
|
|
353
|
-
var qbx = b._x,
|
|
354
|
-
qby = b._y,
|
|
355
|
-
qbz = b._z,
|
|
356
|
-
qbw = b._w;
|
|
357
|
-
this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;
|
|
358
|
-
this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;
|
|
359
|
-
this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;
|
|
360
|
-
this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;
|
|
361
|
-
|
|
362
|
-
this._onChangeCallback();
|
|
363
|
-
|
|
364
|
-
return this;
|
|
365
|
-
},
|
|
366
|
-
slerp: function slerp(qb, t) {
|
|
367
|
-
if (t === 0) return this;
|
|
368
|
-
if (t === 1) return this.copy(qb);
|
|
369
|
-
var x = this._x,
|
|
370
|
-
y = this._y,
|
|
371
|
-
z = this._z,
|
|
372
|
-
w = this._w; // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/
|
|
373
|
-
|
|
374
|
-
var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;
|
|
375
|
-
|
|
376
|
-
if (cosHalfTheta < 0) {
|
|
377
|
-
this._w = -qb._w;
|
|
378
|
-
this._x = -qb._x;
|
|
379
|
-
this._y = -qb._y;
|
|
380
|
-
this._z = -qb._z;
|
|
381
|
-
cosHalfTheta = -cosHalfTheta;
|
|
382
|
-
} else {
|
|
383
|
-
this.copy(qb);
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
if (cosHalfTheta >= 1.0) {
|
|
387
|
-
this._w = w;
|
|
388
|
-
this._x = x;
|
|
389
|
-
this._y = y;
|
|
390
|
-
this._z = z;
|
|
391
|
-
return this;
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
var sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;
|
|
395
|
-
|
|
396
|
-
if (sqrSinHalfTheta <= Number.EPSILON) {
|
|
397
|
-
var s = 1 - t;
|
|
398
|
-
this._w = s * w + t * this._w;
|
|
399
|
-
this._x = s * x + t * this._x;
|
|
400
|
-
this._y = s * y + t * this._y;
|
|
401
|
-
this._z = s * z + t * this._z;
|
|
402
|
-
this.normalize();
|
|
403
|
-
|
|
404
|
-
this._onChangeCallback();
|
|
405
|
-
|
|
406
|
-
return this;
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
var sinHalfTheta = Math.sqrt(sqrSinHalfTheta);
|
|
410
|
-
var halfTheta = Math.atan2(sinHalfTheta, cosHalfTheta);
|
|
411
|
-
var ratioA = Math.sin((1 - t) * halfTheta) / sinHalfTheta,
|
|
412
|
-
ratioB = Math.sin(t * halfTheta) / sinHalfTheta;
|
|
413
|
-
this._w = w * ratioA + this._w * ratioB;
|
|
414
|
-
this._x = x * ratioA + this._x * ratioB;
|
|
415
|
-
this._y = y * ratioA + this._y * ratioB;
|
|
416
|
-
this._z = z * ratioA + this._z * ratioB;
|
|
417
|
-
|
|
418
|
-
this._onChangeCallback();
|
|
419
|
-
|
|
420
|
-
return this;
|
|
421
|
-
},
|
|
422
|
-
equals: function equals(quaternion) {
|
|
423
|
-
return quaternion._x === this._x && quaternion._y === this._y && quaternion._z === this._z && quaternion._w === this._w;
|
|
424
|
-
},
|
|
425
|
-
fromArray: function fromArray(array, offset) {
|
|
426
|
-
if (offset === undefined) offset = 0;
|
|
427
|
-
this._x = array[offset];
|
|
428
|
-
this._y = array[offset + 1];
|
|
429
|
-
this._z = array[offset + 2];
|
|
430
|
-
this._w = array[offset + 3];
|
|
431
|
-
|
|
432
|
-
this._onChangeCallback();
|
|
433
|
-
|
|
434
|
-
return this;
|
|
435
|
-
},
|
|
436
|
-
toArray: function toArray(array, offset) {
|
|
437
|
-
if (array === undefined) array = [];
|
|
438
|
-
if (offset === undefined) offset = 0;
|
|
439
|
-
array[offset] = this._x;
|
|
440
|
-
array[offset + 1] = this._y;
|
|
441
|
-
array[offset + 2] = this._z;
|
|
442
|
-
array[offset + 3] = this._w;
|
|
443
|
-
return array;
|
|
444
|
-
},
|
|
445
|
-
_onChange: function _onChange(callback) {
|
|
446
|
-
this._onChangeCallback = callback;
|
|
447
|
-
return this;
|
|
448
|
-
},
|
|
449
|
-
_onChangeCallback: function _onChangeCallback() {}
|
|
450
|
-
});
|
|
451
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb3JlL3RocmVlL1F1YXRlcm5pb24uanMiXSwibmFtZXMiOlsiUXVhdGVybmlvbiIsIngiLCJ5IiwieiIsInciLCJfeCIsIl95IiwiX3oiLCJfdyIsInVuZGVmaW5lZCIsIk9iamVjdCIsImFzc2lnbiIsInNsZXJwIiwicWEiLCJxYiIsInFtIiwidCIsImNvcHkiLCJzbGVycEZsYXQiLCJkc3QiLCJkc3RPZmZzZXQiLCJzcmMwIiwic3JjT2Zmc2V0MCIsInNyYzEiLCJzcmNPZmZzZXQxIiwieDAiLCJ5MCIsInowIiwidzAiLCJ4MSIsInkxIiwiejEiLCJ3MSIsInMiLCJjb3MiLCJkaXIiLCJzcXJTaW4iLCJOdW1iZXIiLCJFUFNJTE9OIiwic2luIiwiTWF0aCIsInNxcnQiLCJsZW4iLCJhdGFuMiIsInREaXIiLCJmIiwiZGVmaW5lUHJvcGVydGllcyIsInByb3RvdHlwZSIsImdldCIsInNldCIsInZhbHVlIiwiX29uQ2hhbmdlQ2FsbGJhY2siLCJpc1F1YXRlcm5pb24iLCJjbG9uZSIsImNvbnN0cnVjdG9yIiwicXVhdGVybmlvbiIsInNldEZyb21FdWxlciIsImV1bGVyIiwidXBkYXRlIiwiaXNFdWxlciIsIkVycm9yIiwib3JkZXIiLCJjMSIsImMyIiwiYzMiLCJzMSIsInMyIiwiczMiLCJzZXRGcm9tQXhpc0FuZ2xlIiwiYXhpcyIsImFuZ2xlIiwiaGFsZkFuZ2xlIiwic2V0RnJvbVJvdGF0aW9uTWF0cml4IiwibSIsInRlIiwiZWxlbWVudHMiLCJtMTEiLCJtMTIiLCJtMTMiLCJtMjEiLCJtMjIiLCJtMjMiLCJtMzEiLCJtMzIiLCJtMzMiLCJ0cmFjZSIsInNldEZyb21Vbml0VmVjdG9ycyIsInZGcm9tIiwidlRvIiwiRVBTIiwiciIsImRvdCIsImFicyIsIm5vcm1hbGl6ZSIsImFuZ2xlVG8iLCJxIiwiYWNvcyIsIl9NYXRoIiwiY2xhbXAiLCJyb3RhdGVUb3dhcmRzIiwic3RlcCIsIm1pbiIsImludmVyc2UiLCJjb25qdWdhdGUiLCJ2IiwibGVuZ3RoU3EiLCJsZW5ndGgiLCJsIiwibXVsdGlwbHkiLCJwIiwiY29uc29sZSIsIndhcm4iLCJtdWx0aXBseVF1YXRlcm5pb25zIiwicHJlbXVsdGlwbHkiLCJhIiwiYiIsInFheCIsInFheSIsInFheiIsInFhdyIsInFieCIsInFieSIsInFieiIsInFidyIsImNvc0hhbGZUaGV0YSIsInNxclNpbkhhbGZUaGV0YSIsInNpbkhhbGZUaGV0YSIsImhhbGZUaGV0YSIsInJhdGlvQSIsInJhdGlvQiIsImVxdWFscyIsImZyb21BcnJheSIsImFycmF5Iiwib2Zmc2V0IiwidG9BcnJheSIsIl9vbkNoYW5nZSIsImNhbGxiYWNrIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBT0E7O0FBUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUEsU0FBU0EsVUFBVCxDQUFxQkMsQ0FBckIsRUFBd0JDLENBQXhCLEVBQTJCQyxDQUEzQixFQUE4QkMsQ0FBOUIsRUFBa0M7QUFFakMsT0FBS0MsRUFBTCxHQUFVSixDQUFDLElBQUksQ0FBZjtBQUNBLE9BQUtLLEVBQUwsR0FBVUosQ0FBQyxJQUFJLENBQWY7QUFDQSxPQUFLSyxFQUFMLEdBQVVKLENBQUMsSUFBSSxDQUFmO0FBQ0EsT0FBS0ssRUFBTCxHQUFZSixDQUFDLEtBQUtLLFNBQVIsR0FBc0JMLENBQXRCLEdBQTBCLENBQXBDO0FBRUE7O0FBRURNLE1BQU0sQ0FBQ0MsTUFBUCxDQUFlWCxVQUFmLEVBQTJCO0FBRTFCWSxFQUFBQSxLQUFLLEVBQUUsZUFBV0MsRUFBWCxFQUFlQyxFQUFmLEVBQW1CQyxFQUFuQixFQUF1QkMsQ0FBdkIsRUFBMkI7QUFFakMsV0FBT0QsRUFBRSxDQUFDRSxJQUFILENBQVNKLEVBQVQsRUFBY0QsS0FBZCxDQUFxQkUsRUFBckIsRUFBeUJFLENBQXpCLENBQVA7QUFFQSxHQU55QjtBQVExQkUsRUFBQUEsU0FBUyxFQUFFLG1CQUFXQyxHQUFYLEVBQWdCQyxTQUFoQixFQUEyQkMsSUFBM0IsRUFBaUNDLFVBQWpD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QTZILElBQUFBLEtBQUssQ0FBRUMsTUFBTSxHQUFHLENBQVgsQ0FBTCxHQUFzQixLQUFLN0gsRUFBM0I7QUFFQSxXQUFPNEgsS0FBUDtBQUVBLEdBMWNtQztBQTRjcENHLEVBQUFBLFNBQVMsRUFBRSxtQkFBV0MsUUFBWCxFQUFzQjtBQUVoQyxTQUFLckYsaUJBQUwsR0FBeUJxRixRQUF6QjtBQUVBLFdBQU8sSUFBUDtBQUVBLEdBbGRtQztBQW9kcENyRixFQUFBQSxpQkFBaUIsRUFBRSw2QkFBWSxDQUFFO0FBcGRHLENBQXJDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbmltcG9ydCB7IF9NYXRoIH0gZnJvbSAnLi9NYXRoLmpzJztcblxuZnVuY3Rpb24gUXVhdGVybmlvbiggeCwgeSwgeiwgdyApIHtcblxuXHR0aGlzLl94ID0geCB8fCAwO1xuXHR0aGlzLl95ID0geSB8fCAwO1xuXHR0aGlzLl96ID0geiB8fCAwO1xuXHR0aGlzLl93ID0gKCB3ICE9PSB1bmRlZmluZWQgKSA/IHcgOiAxO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFF1YXRlcm5pb24sIHtcblxuXHRzbGVycDogZnVuY3Rpb24gKCBxYSwgcWIsIHFtLCB0ICkge1xuXG5cdFx0cmV0dXJuIHFtLmNvcHkoIHFhICkuc2xlcnAoIHFiLCB0ICk7XG5cblx0fSxcblxuXHRzbGVycEZsYXQ6IGZ1bmN0aW9uICggZHN0LCBkc3RPZmZzZXQsIHNyYzAsIHNyY09mZnNldDAsIHNyYzEsIHNyY09mZnNldDEsIHQgKSB7XG5cblx0XHQvLyBmdXp6LWZyZWUsIGFycmF5LWJhc2VkIFF1YXRlcm5pb24gU0xFUlAgb3BlcmF0aW9uXG5cblx0XHR2YXIgeDAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMCBdLFxuXHRcdFx0eTAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMSBdLFxuXHRcdFx0ejAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMiBdLFxuXHRcdFx0dzAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMyBdLFxuXG5cdFx0XHR4MSA9IHNyYzFbIHNyY09mZnNldDEgKyAwIF0sXG5cdFx0XHR5MSA9IHNyYzFbIHNyY09mZnNldDEgKyAxIF0sXG5cdFx0XHR6MSA9IHNyYzFbIHNyY09mZnNldDEgKyAyIF0sXG5cdFx0XHR3MSA9IHNyYzFbIHNyY09mZnNldDEgKyAzIF07XG5cblx0XHRpZiAoIHcwICE9PSB3MSB8fCB4MCAhPT0geDEgfHwgeTAgIT09IHkxIHx8IHowICE9PSB6MSApIHtcblxuXHRcdFx0dmFyIHMgPSAxIC0gdCxcblxuXHRcdFx0XHRjb3MgPSB4MCAqIHgxICsgeTAgKiB5MSArIHowICogejEgKyB3MCAqIHcxLFxuXG5cdFx0XHRcdGRpciA9ICggY29zID49IDAgPyAxIDogLSAxICksXG5cdFx0XHRcdHNxclNpbiA9IDEgLSBjb3MgKiBjb3M7XG5cblx0XHRcdC8vIFNraXAgdGhlIFNsZXJwIGZvciB0aW55IHN0ZXBzIHRvIGF2b2lkIG51bWVyaWMgcHJvYmxlbXM6XG5cdFx0XHRpZiAoIHNxclNpbiA+IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdHZhciBzaW4gPSBNYXRoLnNxcnQoIHNxclNpbiApLFxuXHRcdFx0XHRcdGxlbiA9IE1hdGguYXRhbjIoIHNpbiwgY29zICogZGlyICk7XG5cblx0XHRcdFx0cyA9IE1hdGguc2luKCBzICogbGVuICkgLyBzaW47XG5cdFx0XHRcdHQgPSBNYXRoLnNpbiggdCAqIGxlbiApIC8gc2luO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciB0RGlyID0gdCAqIGRpcjtcblxuXHRcdFx0eDAgPSB4MCAqIHMgKyB4MSAqIHREaXI7XG5cdFx0XHR5MCA9IHkwICogcyArIHkxICogdERpcjtcblx0XHRcdHowID0gejAgKiBzICsgejEgKiB0RGlyO1xuXHRcdFx0dzAgPSB3MCAqIHMgKyB3MSAqIHREaXI7XG5cblx0XHRcdC8vIE5vcm1hbGl6ZSBpbiBjYXNlIHdlIGp1c3QgZGlkIGEgbGVycDpcblx0XHRcdGlmICggcyA9PT0gMSAtIHQgKSB7XG5cblx0XHRcdFx0dmFyIGYgPSAxIC8gTWF0aC5zcXJ0KCB4MCAqIHgwICsgeTAgKiB5MCArIHowICogejAgKyB3MCAqIHcwICk7XG5cblx0XHRcdFx0eDAgKj0gZjtcblx0XHRcdFx0eTAgKj0gZjtcblx0XHRcdFx0ejAgKj0gZjtcblx0XHRcdFx0dzAgKj0gZjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZHN0WyBkc3RPZmZzZXQgXSA9IHgwO1xuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMSBdID0geTA7XG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAyIF0gPSB6MDtcblx0XHRkc3RbIGRzdE9mZnNldCArIDMgXSA9IHcwO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggUXVhdGVybmlvbi5wcm90b3R5cGUsIHtcblxuXHR4OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3g7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl94ID0gdmFsdWU7XG5cdFx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR5OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3k7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl95ID0gdmFsdWU7XG5cdFx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR6OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3o7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl96ID0gdmFsdWU7XG5cdFx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR3OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3c7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl93ID0gdmFsdWU7XG5cdFx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFF1YXRlcm5pb24ucHJvdG90eXBlLCB7XG5cblx0aXNRdWF0ZXJuaW9uOiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCB4LCB5LCB6LCB3ICkge1xuXG5cdFx0dGhpcy5feCA9IHg7XG5cdFx0dGhpcy5feSA9IHk7XG5cdFx0dGhpcy5feiA9IHo7XG5cdFx0dGhpcy5fdyA9IHc7XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3osIHRoaXMuX3cgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggcXVhdGVybmlvbiApIHtcblxuXHRcdHRoaXMuX3ggPSBxdWF0ZXJuaW9uLng7XG5cdFx0dGhpcy5feSA9IHF1YXRlcm5pb24ueTtcblx0XHR0aGlzLl96ID0gcXVhdGVybmlvbi56O1xuXHRcdHRoaXMuX3cgPSBxdWF0ZXJuaW9uLnc7XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21FdWxlcjogZnVuY3Rpb24gKCBldWxlciwgdXBkYXRlICkge1xuXG5cdFx0aWYgKCAhICggZXVsZXIgJiYgZXVsZXIuaXNFdWxlciApICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5RdWF0ZXJuaW9uOiAuc2V0RnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7XG5cblx0XHR9XG5cblx0XHR2YXIgeCA9IGV1bGVyLl94LCB5ID0gZXVsZXIuX3ksIHogPSBldWxlci5feiwgb3JkZXIgPSBldWxlci5vcmRlcjtcblxuXHRcdC8vIGh0dHA6Ly93d3cubWF0aHdvcmtzLmNvbS9tYXRsYWJjZW50cmFsL2ZpbGVleGNoYW5nZS9cblx0XHQvLyBcdDIwNjk2LWZ1bmN0aW9uLXRvLWNvbnZlcnQtYmV0d2Vlbi1kY20tZXVsZXItYW5nbGVzLXF1YXRlcm5pb25zLWFuZC1ldWxlci12ZWN0b3JzL1xuXHRcdC8vXHRjb250ZW50L1NwaW5DYWxjLm1cblxuXHRcdHZhciBjb3MgPSBNYXRoLmNvcztcblx0XHR2YXIgc2luID0gTWF0aC5zaW47XG5cblx0XHR2YXIgYzEgPSBjb3MoIHggLyAyICk7XG5cdFx0dmFyIGMyID0gY29zKCB5IC8gMiApO1xuXHRcdHZhciBjMyA9IGNvcyggeiAvIDIgKTtcblxuXHRcdHZhciBzMSA9IHNpbiggeCAvIDIgKTtcblx0XHR2YXIgczIgPSBzaW4oIHkgLyAyICk7XG5cdFx0dmFyIHMzID0gc2luKCB6IC8gMiApO1xuXG5cdFx0aWYgKCBvcmRlciA9PT0gJ1hZWicgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgKyBjMSAqIHMyICogczM7XG5cdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzO1xuXHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyArIHMxICogczIgKiBjMztcblx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgLSBzMSAqIHMyICogczM7XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1lYWicgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgKyBjMSAqIHMyICogczM7XG5cdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzO1xuXHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMztcblx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgKyBzMSAqIHMyICogczM7XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1pYWScgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgLSBjMSAqIHMyICogczM7XG5cdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzICsgczEgKiBjMiAqIHMzO1xuXHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyArIHMxICogczIgKiBjMztcblx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgLSBzMSAqIHMyICogczM7XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1pZWCcgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgLSBjMSAqIHMyICogczM7XG5cdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzICsgczEgKiBjMiAqIHMzO1xuXHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMztcblx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgKyBzMSAqIHMyICogczM7XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1laWCcgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgKyBjMSAqIHMyICogczM7XG5cdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzICsgczEgKiBjMiAqIHMzO1xuXHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMztcblx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgLSBzMSAqIHMyICogczM7XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1haWScgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgLSBjMSAqIHMyICogczM7XG5cdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzO1xuXHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyArIHMxICogczIgKiBjMztcblx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgKyBzMSAqIHMyICogczM7XG5cblx0XHR9XG5cblx0XHRpZiAoIHVwZGF0ZSAhPT0gZmFsc2UgKSB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21BeGlzQW5nbGU6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvYW5nbGVUb1F1YXRlcm5pb24vaW5kZXguaHRtXG5cblx0XHQvLyBhc3N1bWVzIGF4aXMgaXMgbm9ybWFsaXplZFxuXG5cdFx0dmFyIGhhbGZBbmdsZSA9IGFuZ2xlIC8gMiwgcyA9IE1hdGguc2luKCBoYWxmQW5nbGUgKTtcblxuXHRcdHRoaXMuX3ggPSBheGlzLnggKiBzO1xuXHRcdHRoaXMuX3kgPSBheGlzLnkgKiBzO1xuXHRcdHRoaXMuX3ogPSBheGlzLnogKiBzO1xuXHRcdHRoaXMuX3cgPSBNYXRoLmNvcyggaGFsZkFuZ2xlICk7XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Sb3RhdGlvbk1hdHJpeDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL21hdHJpeFRvUXVhdGVybmlvbi9pbmRleC5odG1cblxuXHRcdC8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpXG5cblx0XHR2YXIgdGUgPSBtLmVsZW1lbnRzLFxuXG5cdFx0XHRtMTEgPSB0ZVsgMCBdLCBtMTIgPSB0ZVsgNCBdLCBtMTMgPSB0ZVsgOCBdLFxuXHRcdFx0bTIxID0gdGVbIDEgXSwgbTIyID0gdGVbIDUgXSwgbTIzID0gdGVbIDkgXSxcblx0XHRcdG0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRlWyAxMCBdLFxuXG5cdFx0XHR0cmFjZSA9IG0xMSArIG0yMiArIG0zMyxcblx0XHRcdHM7XG5cblx0XHRpZiAoIHRyYWNlID4gMCApIHtcblxuXHRcdFx0cyA9IDAuNSAvIE1hdGguc3FydCggdHJhY2UgKyAxLjAgKTtcblxuXHRcdFx0dGhpcy5fdyA9IDAuMjUgLyBzO1xuXHRcdFx0dGhpcy5feCA9ICggbTMyIC0gbTIzICkgKiBzO1xuXHRcdFx0dGhpcy5feSA9ICggbTEzIC0gbTMxICkgKiBzO1xuXHRcdFx0dGhpcy5feiA9ICggbTIxIC0gbTEyICkgKiBzO1xuXG5cdFx0fSBlbHNlIGlmICggbTExID4gbTIyICYmIG0xMSA+IG0zMyApIHtcblxuXHRcdFx0cyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTExIC0gbTIyIC0gbTMzICk7XG5cblx0XHRcdHRoaXMuX3cgPSAoIG0zMiAtIG0yMyApIC8gcztcblx0XHRcdHRoaXMuX3ggPSAwLjI1ICogcztcblx0XHRcdHRoaXMuX3kgPSAoIG0xMiArIG0yMSApIC8gcztcblx0XHRcdHRoaXMuX3ogPSAoIG0xMyArIG0zMSApIC8gcztcblxuXHRcdH0gZWxzZSBpZiAoIG0yMiA+IG0zMyApIHtcblxuXHRcdFx0cyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTIyIC0gbTExIC0gbTMzICk7XG5cblx0XHRcdHRoaXMuX3cgPSAoIG0xMyAtIG0zMSApIC8gcztcblx0XHRcdHRoaXMuX3ggPSAoIG0xMiArIG0yMSApIC8gcztcblx0XHRcdHRoaXMuX3kgPSAwLjI1ICogcztcblx0XHRcdHRoaXMuX3ogPSAoIG0yMyArIG0zMiApIC8gcztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHMgPSAyLjAgKiBNYXRoLnNxcnQoIDEuMCArIG0zMyAtIG0xMSAtIG0yMiApO1xuXG5cdFx0XHR0aGlzLl93ID0gKCBtMjEgLSBtMTIgKSAvIHM7XG5cdFx0XHR0aGlzLl94ID0gKCBtMTMgKyBtMzEgKSAvIHM7XG5cdFx0XHR0aGlzLl95ID0gKCBtMjMgKyBtMzIgKSAvIHM7XG5cdFx0XHR0aGlzLl96ID0gMC4yNSAqIHM7XG5cblx0XHR9XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Vbml0VmVjdG9yczogZnVuY3Rpb24gKCB2RnJvbSwgdlRvICkge1xuXG5cdFx0Ly8gYXNzdW1lcyBkaXJlY3Rpb24gdmVjdG9ycyB2RnJvbSBhbmQgdlRvIGFyZSBub3JtYWxpemVkXG5cblx0XHR2YXIgRVBTID0gMC4wMDAwMDE7XG5cblx0XHR2YXIgciA9IHZGcm9tLmRvdCggdlRvICkgKyAxO1xuXG5cdFx0aWYgKCByIDwgRVBTICkge1xuXG5cdFx0XHRyID0gMDtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggdkZyb20ueCApID4gTWF0aC5hYnMoIHZGcm9tLnogKSApIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gLSB2RnJvbS55O1xuXHRcdFx0XHR0aGlzLl95ID0gdkZyb20ueDtcblx0XHRcdFx0dGhpcy5feiA9IDA7XG5cdFx0XHRcdHRoaXMuX3cgPSByO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSAwO1xuXHRcdFx0XHR0aGlzLl95ID0gLSB2RnJvbS56O1xuXHRcdFx0XHR0aGlzLl96ID0gdkZyb20ueTtcblx0XHRcdFx0dGhpcy5fdyA9IHI7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGNyb3NzVmVjdG9ycyggdkZyb20sIHZUbyApOyAvLyBpbmxpbmVkIHRvIGF2b2lkIGN5Y2xpYyBkZXBlbmRlbmN5IG9uIFZlY3RvcjNcblxuXHRcdFx0dGhpcy5feCA9IHZGcm9tLnkgKiB2VG8ueiAtIHZGcm9tLnogKiB2VG8ueTtcblx0XHRcdHRoaXMuX3kgPSB2RnJvbS56ICogdlRvLnggLSB2RnJvbS54ICogdlRvLno7XG5cdFx0XHR0aGlzLl96ID0gdkZyb20ueCAqIHZUby55IC0gdkZyb20ueSAqIHZUby54O1xuXHRcdFx0dGhpcy5fdyA9IHI7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcblxuXHR9LFxuXG5cdGFuZ2xlVG86IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdHJldHVybiAyICogTWF0aC5hY29zKCBNYXRoLmFicyggX01hdGguY2xhbXAoIHRoaXMuZG90KCBxICksIC0gMSwgMSApICkgKTtcblxuXHR9LFxuXG5cdHJvdGF0ZVRvd2FyZHM6IGZ1bmN0aW9uICggcSwgc3RlcCApIHtcblxuXHRcdHZhciBhbmdsZSA9IHRoaXMuYW5nbGVUbyggcSApO1xuXG5cdFx0aWYgKCBhbmdsZSA9PT0gMCApIHJldHVybiB0aGlzO1xuXG5cdFx0dmFyIHQgPSBNYXRoLm1pbiggMSwgc3RlcCAvIGFuZ2xlICk7XG5cblx0XHR0aGlzLnNsZXJwKCBxLCB0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGludmVyc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHF1YXRlcm5pb24gaXMgYXNzdW1lZCB0byBoYXZlIHVuaXQgbGVuZ3RoXG5cblx0XHRyZXR1cm4gdGhpcy5jb25qdWdhdGUoKTtcblxuXHR9LFxuXG5cdGNvbmp1Z2F0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5feCAqPSAtIDE7XG5cdFx0dGhpcy5feSAqPSAtIDE7XG5cdFx0dGhpcy5feiAqPSAtIDE7XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRvdDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3ggKiB2Ll94ICsgdGhpcy5feSAqIHYuX3kgKyB0aGlzLl96ICogdi5feiArIHRoaXMuX3cgKiB2Ll93O1xuXG5cdH0sXG5cblx0bGVuZ3RoU3E6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl94ICogdGhpcy5feCArIHRoaXMuX3kgKiB0aGlzLl95ICsgdGhpcy5feiAqIHRoaXMuX3ogKyB0aGlzLl93ICogdGhpcy5fdztcblxuXHR9LFxuXG5cdGxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5feCAqIHRoaXMuX3ggKyB0aGlzLl95ICogdGhpcy5feSArIHRoaXMuX3ogKiB0aGlzLl96ICsgdGhpcy5fdyAqIHRoaXMuX3cgKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGwgPSB0aGlzLmxlbmd0aCgpO1xuXG5cdFx0aWYgKCBsID09PSAwICkge1xuXG5cdFx0XHR0aGlzLl94ID0gMDtcblx0XHRcdHRoaXMuX3kgPSAwO1xuXHRcdFx0dGhpcy5feiA9IDA7XG5cdFx0XHR0aGlzLl93ID0gMTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGwgPSAxIC8gbDtcblxuXHRcdFx0dGhpcy5feCA9IHRoaXMuX3ggKiBsO1xuXHRcdFx0dGhpcy5feSA9IHRoaXMuX3kgKiBsO1xuXHRcdFx0dGhpcy5feiA9IHRoaXMuX3ogKiBsO1xuXHRcdFx0dGhpcy5fdyA9IHRoaXMuX3cgKiBsO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseTogZnVuY3Rpb24gKCBxLCBwICkge1xuXG5cdFx0aWYgKCBwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlF1YXRlcm5pb246IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5UXVhdGVybmlvbnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoIHEsIHAgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoIHRoaXMsIHEgKTtcblxuXHR9LFxuXG5cdHByZW11bHRpcGx5OiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCBxLCB0aGlzICk7XG5cblx0fSxcblxuXHRtdWx0aXBseVF1YXRlcm5pb25zOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHQvLyBmcm9tIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvcmVhbE5vcm1lZEFsZ2VicmEvcXVhdGVybmlvbnMvY29kZS9pbmRleC5odG1cblxuXHRcdHZhciBxYXggPSBhLl94LCBxYXkgPSBhLl95LCBxYXogPSBhLl96LCBxYXcgPSBhLl93O1xuXHRcdHZhciBxYnggPSBiLl94LCBxYnkgPSBiLl95LCBxYnogPSBiLl96LCBxYncgPSBiLl93O1xuXG5cdFx0dGhpcy5feCA9IHFheCAqIHFidyArIHFhdyAqIHFieCArIHFheSAqIHFieiAtIHFheiAqIHFieTtcblx0XHR0aGlzLl95ID0gcWF5ICogcWJ3ICsgcWF3ICogcWJ5ICsgcWF6ICogcWJ4IC0gcWF4ICogcWJ6O1xuXHRcdHRoaXMuX3ogPSBxYXogKiBxYncgKyBxYXcgKiBxYnogKyBxYXggKiBxYnkgLSBxYXkgKiBxYng7XG5cdFx0dGhpcy5fdyA9IHFhdyAqIHFidyAtIHFheCAqIHFieCAtIHFheSAqIHFieSAtIHFheiAqIHFiejtcblxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2xlcnA6IGZ1bmN0aW9uICggcWIsIHQgKSB7XG5cblx0XHRpZiAoIHQgPT09IDAgKSByZXR1cm4gdGhpcztcblx0XHRpZiAoIHQgPT09IDEgKSByZXR1cm4gdGhpcy5jb3B5KCBxYiApO1xuXG5cdFx0dmFyIHggPSB0aGlzLl94LCB5ID0gdGhpcy5feSwgeiA9IHRoaXMuX3osIHcgPSB0aGlzLl93O1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9yZWFsTm9ybWVkQWxnZWJyYS9xdWF0ZXJuaW9ucy9zbGVycC9cblxuXHRcdHZhciBjb3NIYWxmVGhldGEgPSB3ICogcWIuX3cgKyB4ICogcWIuX3ggKyB5ICogcWIuX3kgKyB6ICogcWIuX3o7XG5cblx0XHRpZiAoIGNvc0hhbGZUaGV0YSA8IDAgKSB7XG5cblx0XHRcdHRoaXMuX3cgPSAtIHFiLl93O1xuXHRcdFx0dGhpcy5feCA9IC0gcWIuX3g7XG5cdFx0XHR0aGlzLl95ID0gLSBxYi5feTtcblx0XHRcdHRoaXMuX3ogPSAtIHFiLl96O1xuXG5cdFx0XHRjb3NIYWxmVGhldGEgPSAtIGNvc0hhbGZUaGV0YTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuY29weSggcWIgKTtcblxuXHRcdH1cblxuXHRcdGlmICggY29zSGFsZlRoZXRhID49IDEuMCApIHtcblxuXHRcdFx0dGhpcy5fdyA9IHc7XG5cdFx0XHR0aGlzLl94ID0geDtcblx0XHRcdHRoaXMuX3kgPSB5O1xuXHRcdFx0dGhpcy5feiA9IHo7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHNxclNpbkhhbGZUaGV0YSA9IDEuMCAtIGNvc0hhbGZUaGV0YSAqIGNvc0hhbGZUaGV0YTtcblxuXHRcdGlmICggc3FyU2luSGFsZlRoZXRhIDw9IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHR2YXIgcyA9IDEgLSB0O1xuXHRcdFx0dGhpcy5fdyA9IHMgKiB3ICsgdCAqIHRoaXMuX3c7XG5cdFx0XHR0aGlzLl94ID0gcyAqIHggKyB0ICogdGhpcy5feDtcblx0XHRcdHRoaXMuX3kgPSBzICogeSArIHQgKiB0aGlzLl95O1xuXHRcdFx0dGhpcy5feiA9IHMgKiB6ICsgdCAqIHRoaXMuX3o7XG5cblx0XHRcdHRoaXMubm9ybWFsaXplKCk7XG5cdFx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHNpbkhhbGZUaGV0YSA9IE1hdGguc3FydCggc3FyU2luSGFsZlRoZXRhICk7XG5cdFx0dmFyIGhhbGZUaGV0YSA9IE1hdGguYXRhbjIoIHNpbkhhbGZUaGV0YSwgY29zSGFsZlRoZXRhICk7XG5cdFx0dmFyIHJhdGlvQSA9IE1hdGguc2luKCAoIDEgLSB0ICkgKiBoYWxmVGhldGEgKSAvIHNpbkhhbGZUaGV0YSxcblx0XHRcdHJhdGlvQiA9IE1hdGguc2luKCB0ICogaGFsZlRoZXRhICkgLyBzaW5IYWxmVGhldGE7XG5cblx0XHR0aGlzLl93ID0gKCB3ICogcmF0aW9BICsgdGhpcy5fdyAqIHJhdGlvQiApO1xuXHRcdHRoaXMuX3ggPSAoIHggKiByYXRpb0EgKyB0aGlzLl94ICogcmF0aW9CICk7XG5cdFx0dGhpcy5feSA9ICggeSAqIHJhdGlvQSArIHRoaXMuX3kgKiByYXRpb0IgKTtcblx0XHR0aGlzLl96ID0gKCB6ICogcmF0aW9BICsgdGhpcy5feiAqIHJhdGlvQiApO1xuXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggcXVhdGVybmlvbiApIHtcblxuXHRcdHJldHVybiAoIHF1YXRlcm5pb24uX3ggPT09IHRoaXMuX3ggKSAmJiAoIHF1YXRlcm5pb24uX3kgPT09IHRoaXMuX3kgKSAmJiAoIHF1YXRlcm5pb24uX3ogPT09IHRoaXMuX3ogKSAmJiAoIHF1YXRlcm5pb24uX3cgPT09IHRoaXMuX3cgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLl94ID0gYXJyYXlbIG9mZnNldCBdO1xuXHRcdHRoaXMuX3kgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMuX3ogPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXHRcdHRoaXMuX3cgPSBhcnJheVsgb2Zmc2V0ICsgMyBdO1xuXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy5feDtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy5feTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy5fejtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGhpcy5fdztcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdF9vbkNoYW5nZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0X29uQ2hhbmdlQ2FsbGJhY2s6IGZ1bmN0aW9uICgpIHt9XG5cbn0gKTtcblxuXG5leHBvcnQgeyBRdWF0ZXJuaW9uIH07Il19
|