@wolsok/thanos 3.0.1 → 16.0.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/README.md +109 -107
- package/{esm2020 → esm2022}/index.mjs +10 -10
- package/esm2022/lib/create-ws-thanos-options.mjs +9 -0
- package/{esm2020 → esm2022}/lib/simplex-noise-options.mjs +1 -1
- package/esm2022/lib/simplex-noise.mjs +194 -0
- package/{esm2020 → esm2022}/lib/ws-thanos-options.token.mjs +13 -13
- package/esm2022/lib/ws-thanos.directive.mjs +62 -0
- package/{esm2020 → esm2022}/lib/ws-thanos.options.mjs +1 -1
- package/esm2022/lib/ws-thanos.service.mjs +257 -0
- package/{esm2020 → esm2022}/wolsok-thanos.mjs +4 -4
- package/index.d.ts +6 -6
- package/lib/create-ws-thanos-options.d.ts +2 -2
- package/lib/simplex-noise-options.d.ts +9 -9
- package/lib/simplex-noise.d.ts +18 -18
- package/lib/ws-thanos-options.token.d.ts +4 -4
- package/lib/ws-thanos.directive.d.ts +18 -18
- package/lib/ws-thanos.options.d.ts +5 -5
- package/lib/ws-thanos.service.d.ts +32 -32
- package/package.json +16 -17
- package/esm2020/lib/create-ws-thanos-options.mjs +0 -9
- package/esm2020/lib/simplex-noise.mjs +0 -199
- package/esm2020/lib/ws-thanos.directive.mjs +0 -56
- package/esm2020/lib/ws-thanos.service.mjs +0 -260
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { Inject, Injectable, NgZone } from '@angular/core';
|
|
2
|
+
import { default as html2canvas } from 'html2canvas';
|
|
3
|
+
import { animationFrameScheduler, from, interval, map, switchMap, takeWhile, tap, timeInterval, } from 'rxjs';
|
|
4
|
+
import { SimplexNoise } from './simplex-noise';
|
|
5
|
+
import { WS_THANOS_OPTIONS_TOKEN } from './ws-thanos-options.token';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
const PARTICLE_BYTE_LENGTH = 10;
|
|
8
|
+
const MIN_PARTICLE_ALPHA = ~~(255 * 0.01);
|
|
9
|
+
const HEIGHT_SCALE = 5;
|
|
10
|
+
const WIDTH_SCALE = 2;
|
|
11
|
+
const FLOW_FIELD_RES = 0.05;
|
|
12
|
+
class WsThanosService {
|
|
13
|
+
thanosOptions;
|
|
14
|
+
ngZone;
|
|
15
|
+
constructor(thanosOptions, ngZone) {
|
|
16
|
+
this.thanosOptions = thanosOptions;
|
|
17
|
+
this.ngZone = ngZone;
|
|
18
|
+
}
|
|
19
|
+
static getParticleIndicesForBase(base) {
|
|
20
|
+
return {
|
|
21
|
+
x: base,
|
|
22
|
+
y: base + 1,
|
|
23
|
+
dx: base + 2,
|
|
24
|
+
dy: base + 3,
|
|
25
|
+
ax: base + 4,
|
|
26
|
+
ay: base + 5,
|
|
27
|
+
r: base + 6,
|
|
28
|
+
g: base + 7,
|
|
29
|
+
b: base + 8,
|
|
30
|
+
a: base + 9,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
static getColorIndicesForCoord(x, y, width) {
|
|
34
|
+
const red = y * (width * 4) + x * 4;
|
|
35
|
+
return { r: red, g: red + 1, b: red + 2, a: red + 3 };
|
|
36
|
+
}
|
|
37
|
+
static updateParticles({ seed, noise, particlesData, thanosOptions, animationState, }) {
|
|
38
|
+
const { deltaTSec, animationT, maxWidth, maxHeight } = animationState;
|
|
39
|
+
const { particleAcceleration } = thanosOptions;
|
|
40
|
+
const { particles, maxParticleX, minParticleY } = particlesData;
|
|
41
|
+
// the time is used to calculate the vaporization front.
|
|
42
|
+
const time = Math.sin(animationT * (Math.PI / 2)) * 1.1;
|
|
43
|
+
const startAccelerateX = maxParticleX - time * maxParticleX;
|
|
44
|
+
const startAccelerateY = time * (maxHeight - minParticleY) + minParticleY;
|
|
45
|
+
const lengthY = maxHeight - startAccelerateY;
|
|
46
|
+
const accelerateRadiusPow = startAccelerateX * startAccelerateX + lengthY * lengthY;
|
|
47
|
+
for (let i = 0; i < particles.length; i += PARTICLE_BYTE_LENGTH) {
|
|
48
|
+
const { x, y, dx, dy, ax, ay, a } = WsThanosService.getParticleIndicesForBase(i);
|
|
49
|
+
const particleX = particles[x];
|
|
50
|
+
const particleY = particles[y];
|
|
51
|
+
// only update particles that are inside view and visible
|
|
52
|
+
if (particleX > maxWidth ||
|
|
53
|
+
particleX < 0 ||
|
|
54
|
+
particleY > maxHeight ||
|
|
55
|
+
particleY < 0 ||
|
|
56
|
+
particles[a] < MIN_PARTICLE_ALPHA) {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (!(Math.abs(particles[ax]) > 0 || Math.abs(particles[ay]) > 0)) {
|
|
60
|
+
let pYLength = maxHeight - particleY;
|
|
61
|
+
let pXLength = particleX;
|
|
62
|
+
// we calculate some random looking numbers and functions to have nice looking vaporizing front of particles
|
|
63
|
+
// todo consider to use noise;
|
|
64
|
+
pXLength += Math.tan((pXLength / 20.12) * time + seed) * 0.5;
|
|
65
|
+
pXLength += (particleX % deltaTSec) * 0.5;
|
|
66
|
+
pXLength += Math.sin((pXLength / 30 + 723.394) * time + seed * 12.5) * 11;
|
|
67
|
+
pYLength += Math.tan((pYLength / 0.45) * time + seed * 1.5) * 0.5;
|
|
68
|
+
pYLength += Math.cos((pYLength / 100 + 2323.234) * time + seed * 456.1) * 23;
|
|
69
|
+
const pLength = pXLength * pXLength + pYLength * pYLength;
|
|
70
|
+
if (pLength > accelerateRadiusPow) {
|
|
71
|
+
particles[ax] = Math.random();
|
|
72
|
+
particles[ay] = Math.random() * -1;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// use noise to flow along velocity field
|
|
77
|
+
const flowFieldAcc = WsThanosService.getXYFromFlowField(noise, seed, particleX, particleY);
|
|
78
|
+
const accelerationX = flowFieldAcc[0];
|
|
79
|
+
const accelerationY = flowFieldAcc[1];
|
|
80
|
+
particles[ax] += accelerationX;
|
|
81
|
+
particles[ay] += accelerationY;
|
|
82
|
+
}
|
|
83
|
+
// * Math.pow(1 + animationT, 4)
|
|
84
|
+
particles[dx] += particles[ax] * particleAcceleration * deltaTSec;
|
|
85
|
+
particles[dy] += particles[ay] * particleAcceleration * deltaTSec;
|
|
86
|
+
particles[x] += particles[dx] * deltaTSec;
|
|
87
|
+
particles[y] += particles[dy] * deltaTSec;
|
|
88
|
+
// fade particle out ( very late);
|
|
89
|
+
particles[a] *= 1 - Math.pow(animationT, 15); // 255 - Math.sqrt(particles[dx] * particles[dx] + particles[dy] * particles[dy]) / 1.2;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
static drawParticles(drawCtx, particles) {
|
|
93
|
+
const { width, height } = drawCtx.canvas;
|
|
94
|
+
drawCtx.clearRect(0, 0, width, height);
|
|
95
|
+
const image = drawCtx.getImageData(0, 0, width, height);
|
|
96
|
+
const imageData = image.data;
|
|
97
|
+
for (let i = 0; i < particles.length; i += PARTICLE_BYTE_LENGTH) {
|
|
98
|
+
const particleX = particles[i];
|
|
99
|
+
const particleY = particles[i + 1];
|
|
100
|
+
const pI = WsThanosService.getParticleIndicesForBase(i);
|
|
101
|
+
if (particleX > width ||
|
|
102
|
+
particleX < 0 ||
|
|
103
|
+
particleY > height ||
|
|
104
|
+
particleY < 0 ||
|
|
105
|
+
particles[pI.a] < MIN_PARTICLE_ALPHA) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const { r, g, b, a } = WsThanosService.getColorIndicesForCoord(~~particles[pI.x], ~~particles[pI.y], width);
|
|
109
|
+
imageData[r] = ~~particles[pI.r];
|
|
110
|
+
imageData[g] = ~~particles[pI.g];
|
|
111
|
+
imageData[b] = ~~particles[pI.b];
|
|
112
|
+
imageData[a] = ~~particles[pI.a];
|
|
113
|
+
}
|
|
114
|
+
drawCtx.putImageData(image, 0, 0);
|
|
115
|
+
}
|
|
116
|
+
static prepareCanvasForVaporize(divCanvas, maxParticleCount) {
|
|
117
|
+
const { width, height } = divCanvas;
|
|
118
|
+
// scale result canvas to have more room to draw particles while vaporizing;
|
|
119
|
+
const resultHeight = height * HEIGHT_SCALE;
|
|
120
|
+
const resultWidth = width * WIDTH_SCALE;
|
|
121
|
+
const resultCanvas = document.createElement('canvas');
|
|
122
|
+
resultCanvas.height = resultHeight;
|
|
123
|
+
resultCanvas.width = resultWidth;
|
|
124
|
+
const imageData = divCanvas.getContext('2d')?.getImageData(0, 0, width, height);
|
|
125
|
+
if (imageData == null) {
|
|
126
|
+
throw new Error('Could not get image data from canvas');
|
|
127
|
+
}
|
|
128
|
+
const particlesData = WsThanosService.createParticlesForImageData(imageData, maxParticleCount, resultHeight);
|
|
129
|
+
return { resultCanvas, particlesData };
|
|
130
|
+
}
|
|
131
|
+
static createParticlesForImageData(imageData, maxParticleCount, resultHeight) {
|
|
132
|
+
const { width, height } = imageData;
|
|
133
|
+
let particleCandidates = 0;
|
|
134
|
+
let particleCount = 0;
|
|
135
|
+
const particleCandiatesList = [];
|
|
136
|
+
for (let y = 0; y < height; y++) {
|
|
137
|
+
for (let x = 0; x < width; x++) {
|
|
138
|
+
const { a } = WsThanosService.getColorIndicesForCoord(x, y, width);
|
|
139
|
+
if (imageData.data[a] >= MIN_PARTICLE_ALPHA) {
|
|
140
|
+
particleCandidates++;
|
|
141
|
+
particleCandiatesList.push({ x, y });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const maxNumParticles = Math.min(particleCandidates, maxParticleCount);
|
|
146
|
+
const particles = new Float32Array(Float32Array.BYTES_PER_ELEMENT * maxNumParticles * PARTICLE_BYTE_LENGTH);
|
|
147
|
+
let maxParticleX = 0;
|
|
148
|
+
let minParticleY = resultHeight;
|
|
149
|
+
while (particleCount < maxNumParticles) {
|
|
150
|
+
// select random index from candiates
|
|
151
|
+
const index = ~~(Math.random() * particleCandiatesList.length);
|
|
152
|
+
const { x, y } = particleCandiatesList[index];
|
|
153
|
+
// overwrite index with last element to prevent double selection of particles
|
|
154
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
155
|
+
particleCandiatesList[index] = particleCandiatesList.pop();
|
|
156
|
+
maxParticleX = Math.max(maxParticleX, x);
|
|
157
|
+
minParticleY = Math.min(minParticleY, y);
|
|
158
|
+
const { dx, dy, ax, ay, r, g, b, a, ...xy } = WsThanosService.getParticleIndicesForBase(particleCount * PARTICLE_BYTE_LENGTH);
|
|
159
|
+
particles[xy.x] = x;
|
|
160
|
+
particles[xy.y] = y + resultHeight - height;
|
|
161
|
+
particles[dx] = 0;
|
|
162
|
+
particles[dy] = 0;
|
|
163
|
+
particles[ax] = 0;
|
|
164
|
+
particles[ay] = 0;
|
|
165
|
+
const indicesImage = WsThanosService.getColorIndicesForCoord(x, y, width);
|
|
166
|
+
particles[r] = imageData.data[indicesImage.r];
|
|
167
|
+
particles[g] = imageData.data[indicesImage.g];
|
|
168
|
+
particles[b] = imageData.data[indicesImage.b];
|
|
169
|
+
particles[a] = imageData.data[indicesImage.a];
|
|
170
|
+
particleCount++;
|
|
171
|
+
}
|
|
172
|
+
return { particles, maxParticleX, minParticleY };
|
|
173
|
+
}
|
|
174
|
+
static getXYFromFlowField(noise, seed, x, y) {
|
|
175
|
+
const sampleX = noise.scaled3D(x, y, seed + 33.23, FLOW_FIELD_RES);
|
|
176
|
+
const sampleY = noise.scaled3D(x, seed / 13.23, y, FLOW_FIELD_RES) * -1;
|
|
177
|
+
return [sampleX, sampleY];
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* start the vaporize-effect.
|
|
181
|
+
*
|
|
182
|
+
* It's running outside the ngZone.
|
|
183
|
+
*/
|
|
184
|
+
vaporize(elem) {
|
|
185
|
+
return this.ngZone.runOutsideAngular(() => this.vaporizeIntern(elem));
|
|
186
|
+
}
|
|
187
|
+
vaporizeIntern(elem) {
|
|
188
|
+
elem.style.opacity = elem.style.opacity || '1';
|
|
189
|
+
elem.style.transition = `opacity ${Math.floor(this.thanosOptions.animationLength * 0.8)}ms ease-out`;
|
|
190
|
+
const noise = new SimplexNoise({ frequency: 0.01, min: 0 });
|
|
191
|
+
const seed = new Date().getDate() * Math.random();
|
|
192
|
+
const html2CanvasPromise = html2canvas(elem, {
|
|
193
|
+
backgroundColor: null,
|
|
194
|
+
scale: 1,
|
|
195
|
+
allowTaint: true,
|
|
196
|
+
windowHeight: window.innerHeight,
|
|
197
|
+
windowWidth: window.innerWidth,
|
|
198
|
+
scrollY: -window.scrollY,
|
|
199
|
+
});
|
|
200
|
+
return from(html2CanvasPromise).pipe(map((canvasFromHtmlElem) => {
|
|
201
|
+
const canvasAndParticles = WsThanosService.prepareCanvasForVaporize(canvasFromHtmlElem, this.thanosOptions.maxParticleCount);
|
|
202
|
+
const { resultCanvas } = canvasAndParticles;
|
|
203
|
+
if (elem.parentElement) {
|
|
204
|
+
elem.parentElement.style.position = elem.parentElement.style.position || 'relative';
|
|
205
|
+
}
|
|
206
|
+
resultCanvas.style.position = 'absolute';
|
|
207
|
+
resultCanvas.style.left = 0 + 'px';
|
|
208
|
+
resultCanvas.style.top = '-' + elem.getBoundingClientRect().height * (HEIGHT_SCALE - 1) + 'px';
|
|
209
|
+
resultCanvas.style.zIndex = '2000';
|
|
210
|
+
resultCanvas.style.pointerEvents = 'none';
|
|
211
|
+
elem.insertAdjacentElement('beforebegin', resultCanvas);
|
|
212
|
+
// this should start the transition above defined
|
|
213
|
+
elem.style.opacity = '0';
|
|
214
|
+
return canvasAndParticles;
|
|
215
|
+
}), switchMap(({ resultCanvas, particlesData }) => {
|
|
216
|
+
let time = 0;
|
|
217
|
+
const { animationLength, maxParticleCount, particleAcceleration } = this.thanosOptions;
|
|
218
|
+
return interval(1000 / 60, animationFrameScheduler).pipe(timeInterval(), tap((deltaT) => (time += deltaT.interval)), map((deltaT) => ({
|
|
219
|
+
deltaTSec: deltaT.interval / 1000,
|
|
220
|
+
animationT: time / animationLength,
|
|
221
|
+
maxWidth: resultCanvas.width,
|
|
222
|
+
maxHeight: resultCanvas.height,
|
|
223
|
+
})), tap((animationState) => {
|
|
224
|
+
WsThanosService.updateParticles({
|
|
225
|
+
particlesData,
|
|
226
|
+
animationState,
|
|
227
|
+
thanosOptions: {
|
|
228
|
+
animationLength,
|
|
229
|
+
maxParticleCount,
|
|
230
|
+
particleAcceleration,
|
|
231
|
+
},
|
|
232
|
+
noise,
|
|
233
|
+
seed,
|
|
234
|
+
});
|
|
235
|
+
const context = resultCanvas.getContext('2d');
|
|
236
|
+
if (context) {
|
|
237
|
+
WsThanosService.drawParticles(context, particlesData.particles);
|
|
238
|
+
}
|
|
239
|
+
}), takeWhile((animationState) => animationState.animationT <= 1), tap({
|
|
240
|
+
complete: () => {
|
|
241
|
+
return resultCanvas.remove();
|
|
242
|
+
},
|
|
243
|
+
}));
|
|
244
|
+
}));
|
|
245
|
+
}
|
|
246
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: WsThanosService, deps: [{ token: WS_THANOS_OPTIONS_TOKEN }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
247
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: WsThanosService, providedIn: 'root' });
|
|
248
|
+
}
|
|
249
|
+
export { WsThanosService };
|
|
250
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: WsThanosService, decorators: [{
|
|
251
|
+
type: Injectable,
|
|
252
|
+
args: [{ providedIn: 'root' }]
|
|
253
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
254
|
+
type: Inject,
|
|
255
|
+
args: [WS_THANOS_OPTIONS_TOKEN]
|
|
256
|
+
}] }, { type: i0.NgZone }]; } });
|
|
257
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtdGhhbm9zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3B1YmxpYy93cy10aGFub3Mvc3JjL2xpYi93cy10aGFub3Muc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0QsT0FBTyxFQUFFLE9BQU8sSUFBSSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDckQsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixJQUFJLEVBQ0osUUFBUSxFQUNSLEdBQUcsRUFFSCxTQUFTLEVBQ1QsU0FBUyxFQUNULEdBQUcsRUFDSCxZQUFZLEdBQ2IsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBR3BFLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQzFDLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQztBQUN2QixNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFDdEIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDO0FBb0M1QixNQUNhLGVBQWU7SUFHaEI7SUFDQTtJQUhWLFlBRVUsYUFBOEIsRUFDOUIsTUFBYztRQURkLGtCQUFhLEdBQWIsYUFBYSxDQUFpQjtRQUM5QixXQUFNLEdBQU4sTUFBTSxDQUFRO0lBQ3JCLENBQUM7SUFFSSxNQUFNLENBQUMseUJBQXlCLENBQUMsSUFBWTtRQUNuRCxPQUFPO1lBQ0wsQ0FBQyxFQUFFLElBQUk7WUFDUCxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUM7WUFDWCxFQUFFLEVBQUUsSUFBSSxH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O3dCQUNmLGdCQUFnQjt3QkFDaEIsb0JBQW9CO3FCQUNyQjtvQkFDRCxLQUFLO29CQUNMLElBQUk7aUJBQ0wsQ0FBQyxDQUFDO2dCQUNILE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzlDLElBQUksT0FBTyxFQUFFO29CQUNYLGVBQWUsQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDakU7WUFDSCxDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLEVBQzdELEdBQUcsQ0FBQztnQkFDRixRQUFRLEVBQUUsR0FBRyxFQUFFO29CQUNiLE9BQU8sWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUMvQixDQUFDO2FBQ0YsQ0FBQyxDQUNILENBQUM7UUFDSixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQzt1R0E5U1UsZUFBZSxrQkFFaEIsdUJBQXVCOzJHQUZ0QixlQUFlLGNBREYsTUFBTTs7U0FDbkIsZUFBZTsyRkFBZixlQUFlO2tCQUQzQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBRzdCLE1BQU07MkJBQUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZGVmYXVsdCBhcyBodG1sMmNhbnZhcyB9IGZyb20gJ2h0bWwyY2FudmFzJztcbmltcG9ydCB7XG4gIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLFxuICBmcm9tLFxuICBpbnRlcnZhbCxcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBzd2l0Y2hNYXAsXG4gIHRha2VXaGlsZSxcbiAgdGFwLFxuICB0aW1lSW50ZXJ2YWwsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU2ltcGxleE5vaXNlIH0gZnJvbSAnLi9zaW1wbGV4LW5vaXNlJztcbmltcG9ydCB7IFdTX1RIQU5PU19PUFRJT05TX1RPS0VOIH0gZnJvbSAnLi93cy10aGFub3Mtb3B0aW9ucy50b2tlbic7XG5pbXBvcnQgdHlwZSB7IFdzVGhhbm9zT3B0aW9ucyB9IGZyb20gJy4vd3MtdGhhbm9zLm9wdGlvbnMnO1xuXG5jb25zdCBQQVJUSUNMRV9CWVRFX0xFTkdUSCA9IDEwO1xuY29uc3QgTUlOX1BBUlRJQ0xFX0FMUEhBID0gfn4oMjU1ICogMC4wMSk7XG5jb25zdCBIRUlHSFRfU0NBTEUgPSA1O1xuY29uc3QgV0lEVEhfU0NBTEUgPSAyO1xuY29uc3QgRkxPV19GSUVMRF9SRVMgPSAwLjA1O1xuXG5pbnRlcmZhY2UgUGFydGljbGVzRGF0YSB7XG4gIHBhcnRpY2xlczogRmxvYXQzMkFycmF5O1xuICBtYXhQYXJ0aWNsZVg6IG51bWJlcjtcbiAgbWluUGFydGljbGVZOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBBbmltYXRpb25TdGF0ZSB7XG4gIGRlbHRhVFNlYzogbnVtYmVyO1xuICBhbmltYXRpb25UOiBudW1iZXI7XG4gIG1heFdpZHRoOiBudW1iZXI7XG4gIG1heEhlaWdodDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgVXBkYXRlUGFydGljbGVQYXJhbXMge1xuICBwYXJ0aWNsZXNEYXRhOiBQYXJ0aWNsZXNEYXRhO1xuICBhbmltYXRpb25TdGF0ZTogQW5pbWF0aW9uU3RhdGU7XG4gIHRoYW5vc09wdGlvbnM6IFdzVGhhbm9zT3B0aW9ucztcbiAgbm9pc2U6IFNpbXBsZXhOb2lzZTtcbiAgc2VlZDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUGFydGljbGVJbmRpY2VzIHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIGR4OiBudW1iZXI7XG4gIGR5OiBudW1iZXI7XG4gIGF4OiBudW1iZXI7XG4gIGF5OiBudW1iZXI7XG4gIHI6IG51bWJlcjtcbiAgZzogbnVtYmVyO1xuICBiOiBudW1iZXI7XG4gIGE6IG51bWJlcjtcbn1cblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBXc1RoYW5vc1NlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFdTX1RIQU5PU19PUFRJT05TX1RPS0VOKVxuICAgIHByaXZhdGUgdGhhbm9zT3B0aW9uczogV3NUaGFub3NPcHRpb25zLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcbiAgKSB7fVxuXG4gIHByaXZhdGUgc3RhdGljIGdldFBhcnRpY2xlSW5kaWNlc0ZvckJhc2UoYmFzZTogbnVtYmVyKTogUGFydGljbGVJbmRpY2VzIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogYmFzZSxcbiAgICAgIHk6IGJhc2UgKyAxLFxuICAgICAgZHg6IGJhc2UgKyAyLFxuICAgICAgZHk6IGJhc2UgKyAzLFxuICAgICAgYXg6IGJhc2UgKyA0LFxuICAgICAgYXk6IGJhc2UgKyA1LFxuICAgICAgcjogYmFzZSArIDYsXG4gICAgICBnOiBiYXNlICsgNyxcbiAgICAgIGI6IGJhc2UgKyA4LFxuICAgICAgYTogYmFzZSArIDksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldENvbG9ySW5kaWNlc0ZvckNvb3JkKFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgd2lkdGg6IG51bWJlclxuICApOiB7IGE6IG51bWJlcjsgcjogbnVtYmVyOyBiOiBudW1iZXI7IGc6IG51bWJlciB9IHtcbiAgICBjb25zdCByZWQgPSB5ICogKHdpZHRoICogNCkgKyB4ICogNDtcbiAgICByZXR1cm4geyByOiByZWQsIGc6IHJlZCArIDEsIGI6IHJlZCArIDIsIGE6IHJlZCArIDMgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHVwZGF0ZVBhcnRpY2xlcyh7XG4gICAgc2VlZCxcbiAgICBub2lzZSxcbiAgICBwYXJ0aWNsZXNEYXRhLFxuICAgIHRoYW5vc09wdGlvbnMsXG4gICAgYW5pbWF0aW9uU3RhdGUsXG4gIH06IFVwZGF0ZVBhcnRpY2xlUGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3QgeyBkZWx0YVRTZWMsIGFuaW1hdGlvblQsIG1heFdpZHRoLCBtYXhIZWlnaHQgfSA9IGFuaW1hdGlvblN0YXRlO1xuICAgIGNvbnN0IHsgcGFydGljbGVBY2NlbGVyYXRpb24gfSA9IHRoYW5vc09wdGlvbnM7XG4gICAgY29uc3QgeyBwYXJ0aWNsZXMsIG1heFBhcnRpY2xlWCwgbWluUGFydGljbGVZIH0gPSBwYXJ0aWNsZXNEYXRhO1xuXG4gICAgLy8gdGhlIHRpbWUgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHZhcG9yaXphdGlvbiBmcm9udC5cbiAgICBjb25zdCB0aW1lID0gTWF0aC5zaW4oYW5pbWF0aW9uVCAqIChNYXRoLlBJIC8gMikpICogMS4xO1xuXG4gICAgY29uc3Qgc3RhcnRBY2NlbGVyYXRlWCA9IG1heFBhcnRpY2xlWCAtIHRpbWUgKiBtYXhQYXJ0aWNsZVg7XG4gICAgY29uc3Qgc3RhcnRBY2NlbGVyYXRlWSA9IHRpbWUgKiAobWF4SGVpZ2h0IC0gbWluUGFydGljbGVZKSArIG1pblBhcnRpY2xlWTtcblxuICAgIGNvbnN0IGxlbmd0aFkgPSBtYXhIZWlnaHQgLSBzdGFydEFjY2VsZXJhdGVZO1xuICAgIGNvbnN0IGFjY2VsZXJhdGVSYWRpdXNQb3cgPSBzdGFydEFjY2VsZXJhdGVYICogc3RhcnRBY2NlbGVyYXRlWCArIGxlbmd0aFkgKiBsZW5ndGhZO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0aWNsZXMubGVuZ3RoOyBpICs9IFBBUlRJQ0xFX0JZVEVfTEVOR1RIKSB7XG4gICAgICBjb25zdCB7IHgsIHksIGR4LCBkeSwgYXgsIGF5LCBhIH0gPSBXc1RoYW5vc1NlcnZpY2UuZ2V0UGFydGljbGVJbmRpY2VzRm9yQmFzZShpKTtcbiAgICAgIGNvbnN0IHBhcnRpY2xlWCA9IHBhcnRpY2xlc1t4XTtcbiAgICAgIGNvbnN0IHBhcnRpY2xlWSA9IHBhcnRpY2xlc1t5XTtcblxuICAgICAgLy8gb25seSB1cGRhdGUgcGFydGljbGVzIHRoYXQgYXJlIGluc2lkZSB2aWV3IGFuZCB2aXNpYmxlXG4gICAgICBpZiAoXG4gICAgICAgIHBhcnRpY2xlWCA+IG1heFdpZHRoIHx8XG4gICAgICAgIHBhcnRpY2xlWCA8IDAgfHxcbiAgICAgICAgcGFydGljbGVZID4gbWF4SGVpZ2h0IHx8XG4gICAgICAgIHBhcnRpY2xlWSA8IDAgfHxcbiAgICAgICAgcGFydGljbGVzW2FdIDwgTUlOX1BBUlRJQ0xFX0FMUEhBXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghKE1hdGguYWJzKHBhcnRpY2xlc1theF0pID4gMCB8fCBNYXRoLmFicyhwYXJ0aWNsZXNbYXldKSA+IDApKSB7XG4gICAgICAgIGxldCBwWUxlbmd0aCA9IG1heEhlaWdodCAtIHBhcnRpY2xlWTtcbiAgICAgICAgbGV0IHBYTGVuZ3RoID0gcGFydGljbGVYO1xuXG4gICAgICAgIC8vIHdlIGNhbGN1bGF0ZSBzb21lIHJhbmRvbSBsb29raW5nIG51bWJlcnMgYW5kIGZ1bmN0aW9ucyB0byBoYXZlIG5pY2UgbG9va2luZyB2YXBvcml6aW5nIGZyb250IG9mIHBhcnRpY2xlc1xuICAgICAgICAvLyB0b2RvIGNvbnNpZGVyIHRvIHVzZSBub2lzZTtcbiAgICAgICAgcFhMZW5ndGggKz0gTWF0aC50YW4oKHBYTGVuZ3RoIC8gMjAuMTIpICogdGltZSArIHNlZWQpICogMC41O1xuICAgICAgICBwWExlbmd0aCArPSAocGFydGljbGVYICUgZGVsdGFUU2VjKSAqIDAuNTtcbiAgICAgICAgcFhMZW5ndGggKz0gTWF0aC5zaW4oKHBYTGVuZ3RoIC8gMzAgKyA3MjMuMzk0KSAqIHRpbWUgKyBzZWVkICogMTIuNSkgKiAxMTtcbiAgICAgICAgcFlMZW5ndGggKz0gTWF0aC50YW4oKHBZTGVuZ3RoIC8gMC40NSkgKiB0aW1lICsgc2VlZCAqIDEuNSkgKiAwLjU7XG4gICAgICAgIHBZTGVuZ3RoICs9IE1hdGguY29zKChwWUxlbmd0aCAvIDEwMCArIDIzMjMuMjM0KSAqIHRpbWUgKyBzZWVkICogNDU2LjEpICogMjM7XG5cbiAgICAgICAgY29uc3QgcExlbmd0aCA9IHBYTGVuZ3RoICogcFhMZW5ndGggKyBwWUxlbmd0aCAqIHBZTGVuZ3RoO1xuICAgICAgICBpZiAocExlbmd0aCA+IGFjY2VsZXJhdGVSYWRpdXNQb3cpIHtcbiAgICAgICAgICBwYXJ0aWNsZXNbYXhdID0gTWF0aC5yYW5kb20oKTtcbiAgICAgICAgICBwYXJ0aWNsZXNbYXldID0gTWF0aC5yYW5kb20oKSAqIC0xO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB1c2Ugbm9pc2UgdG8gZmxvdyBhbG9uZyB2ZWxvY2l0eSBmaWVsZFxuICAgICAgICBjb25zdCBmbG93RmllbGRBY2MgPSBXc1RoYW5vc1NlcnZpY2UuZ2V0WFlGcm9tRmxvd0ZpZWxkKG5vaXNlLCBzZWVkLCBwYXJ0aWNsZVgsIHBhcnRpY2xlWSk7XG4gICAgICAgIGNvbnN0IGFjY2VsZXJhdGlvblggPSBmbG93RmllbGRBY2NbMF07XG4gICAgICAgIGNvbnN0IGFjY2VsZXJhdGlvblkgPSBmbG93RmllbGRBY2NbMV07XG4gICAgICAgIHBhcnRpY2xlc1theF0gKz0gYWNjZWxlcmF0aW9uWDtcbiAgICAgICAgcGFydGljbGVzW2F5XSArPSBhY2NlbGVyYXRpb25ZO1xuICAgICAgfVxuXG4gICAgICAvLyAqIE1hdGgucG93KDEgKyBhbmltYXRpb25ULCA0KVxuICAgICAgcGFydGljbGVzW2R4XSArPSBwYXJ0aWNsZXNbYXhdICogcGFydGljbGVBY2NlbGVyYXRpb24gKiBkZWx0YVRTZWM7XG4gICAgICBwYXJ0aWNsZXNbZHldICs9IHBhcnRpY2xlc1theV0gKiBwYXJ0aWNsZUFjY2VsZXJhdGlvbiAqIGRlbHRhVFNlYztcbiAgICAgIHBhcnRpY2xlc1t4XSArPSBwYXJ0aWNsZXNbZHhdICogZGVsdGFUU2VjO1xuICAgICAgcGFydGljbGVzW3ldICs9IHBhcnRpY2xlc1tkeV0gKiBkZWx0YVRTZWM7XG4gICAgICAvLyBmYWRlIHBhcnRpY2xlIG91dCAoIHZlcnkgbGF0ZSk7XG4gICAgICBwYXJ0aWNsZXNbYV0gKj0gMSAtIE1hdGgucG93KGFuaW1hdGlvblQsIDE1KTsgLy8gMjU1IC0gTWF0aC5zcXJ0KHBhcnRpY2xlc1tkeF0gKiBwYXJ0aWNsZXNbZHhdICsgcGFydGljbGVzW2R5XSAqIHBhcnRpY2xlc1tkeV0pIC8gMS4yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGRyYXdQYXJ0aWNsZXMoZHJhd0N0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBwYXJ0aWNsZXM6IEZsb2F0MzJBcnJheSk6IHZvaWQge1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gZHJhd0N0eC5jYW52YXM7XG4gICAgZHJhd0N0eC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgY29uc3QgaW1hZ2UgPSBkcmF3Q3R4LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZS5kYXRhO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydGljbGVzLmxlbmd0aDsgaSArPSBQQVJUSUNMRV9CWVRFX0xFTkdUSCkge1xuICAgICAgY29uc3QgcGFydGljbGVYID0gcGFydGljbGVzW2ldO1xuICAgICAgY29uc3QgcGFydGljbGVZID0gcGFydGljbGVzW2kgKyAxXTtcbiAgICAgIGNvbnN0IHBJID0gV3NUaGFub3NTZXJ2aWNlLmdldFBhcnRpY2xlSW5kaWNlc0ZvckJhc2UoaSk7XG4gICAgICBpZiAoXG4gICAgICAgIHBhcnRpY2xlWCA+IHdpZHRoIHx8XG4gICAgICAgIHBhcnRpY2xlWCA8IDAgfHxcbiAgICAgICAgcGFydGljbGVZID4gaGVpZ2h0IHx8XG4gICAgICAgIHBhcnRpY2xlWSA8IDAgfHxcbiAgICAgICAgcGFydGljbGVzW3BJLmFdIDwgTUlOX1BBUlRJQ0xFX0FMUEhBXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCB7IHIsIGcsIGIsIGEgfSA9IFdzVGhhbm9zU2VydmljZS5nZXRDb2xvckluZGljZXNGb3JDb29yZCh+fnBhcnRpY2xlc1twSS54XSwgfn5wYXJ0aWNsZXNbcEkueV0sIHdpZHRoKTtcbiAgICAgIGltYWdlRGF0YVtyXSA9IH5+cGFydGljbGVzW3BJLnJdO1xuICAgICAgaW1hZ2VEYXRhW2ddID0gfn5wYXJ0aWNsZXNbcEkuZ107XG4gICAgICBpbWFnZURhdGFbYl0gPSB+fnBhcnRpY2xlc1twSS5iXTtcbiAgICAgIGltYWdlRGF0YVthXSA9IH5+cGFydGljbGVzW3BJLmFdO1xuICAgIH1cbiAgICBkcmF3Q3R4LnB1dEltYWdlRGF0YShpbWFnZSwgMCwgMCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwcmVwYXJlQ2FudmFzRm9yVmFwb3JpemUoXG4gICAgZGl2Q2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCxcbiAgICBtYXhQYXJ0aWNsZUNvdW50OiBudW1iZXJcbiAgKToge1xuICAgIHBhcnRpY2xlc0RhdGE6IFBhcnRpY2xlc0RhdGE7XG4gICAgcmVzdWx0Q2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgfSB7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBkaXZDYW52YXM7XG5cbiAgICAvLyBzY2FsZSByZXN1bHQgY2FudmFzIHRvIGhhdmUgbW9yZSByb29tIHRvIGRyYXcgcGFydGljbGVzIHdoaWxlIHZhcG9yaXppbmc7XG4gICAgY29uc3QgcmVzdWx0SGVpZ2h0ID0gaGVpZ2h0ICogSEVJR0hUX1NDQUxFO1xuICAgIGNvbnN0IHJlc3VsdFdpZHRoID0gd2lkdGggKiBXSURUSF9TQ0FMRTtcbiAgICBjb25zdCByZXN1bHRDYW52YXM6IEhUTUxDYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgcmVzdWx0Q2FudmFzLmhlaWdodCA9IHJlc3VsdEhlaWdodDtcbiAgICByZXN1bHRDYW52YXMud2lkdGggPSByZXN1bHRXaWR0aDtcblxuICAgIGNvbnN0IGltYWdlRGF0YSA9IGRpdkNhbnZhcy5nZXRDb250ZXh0KCcyZCcpPy5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgaWYgKGltYWdlRGF0YSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBnZXQgaW1hZ2UgZGF0YSBmcm9tIGNhbnZhcycpO1xuICAgIH1cbiAgICBjb25zdCBwYXJ0aWNsZXNEYXRhID0gV3NUaGFub3NTZXJ2aWNlLmNyZWF0ZVBhcnRpY2xlc0ZvckltYWdlRGF0YShpbWFnZURhdGEsIG1heFBhcnRpY2xlQ291bnQsIHJlc3VsdEhlaWdodCk7XG4gICAgcmV0dXJuIHsgcmVzdWx0Q2FudmFzLCBwYXJ0aWNsZXNEYXRhIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVQYXJ0aWNsZXNGb3JJbWFnZURhdGEoXG4gICAgaW1hZ2VEYXRhOiBJbWFnZURhdGEsXG4gICAgbWF4UGFydGljbGVDb3VudDogbnVtYmVyLFxuICAgIHJlc3VsdEhlaWdodDogbnVtYmVyXG4gICk6IHsgbWluUGFydGljbGVZOiBudW1iZXI7IG1heFBhcnRpY2xlWDogbnVtYmVyOyBwYXJ0aWNsZXM6IEZsb2F0MzJBcnJheSB9IHtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGltYWdlRGF0YTtcbiAgICBsZXQgcGFydGljbGVDYW5kaWRhdGVzID0gMDtcbiAgICBsZXQgcGFydGljbGVDb3VudCA9IDA7XG5cbiAgICBjb25zdCBwYXJ0aWNsZUNhbmRpYXRlc0xpc3Q6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfVtdID0gW107XG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgIGNvbnN0IHsgYSB9ID0gV3NUaGFub3NTZXJ2aWNlLmdldENvbG9ySW5kaWNlc0ZvckNvb3JkKHgsIHksIHdpZHRoKTtcbiAgICAgICAgaWYgKGltYWdlRGF0YS5kYXRhW2FdID49IE1JTl9QQVJUSUNMRV9BTFBIQSkge1xuICAgICAgICAgIHBhcnRpY2xlQ2FuZGlkYXRlcysrO1xuICAgICAgICAgIHBhcnRpY2xlQ2FuZGlhdGVzTGlzdC5wdXNoKHsgeCwgeSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1heE51bVBhcnRpY2xlcyA9IE1hdGgubWluKHBhcnRpY2xlQ2FuZGlkYXRlcywgbWF4UGFydGljbGVDb3VudCk7XG4gICAgY29uc3QgcGFydGljbGVzID0gbmV3IEZsb2F0MzJBcnJheShGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiBtYXhOdW1QYXJ0aWNsZXMgKiBQQVJUSUNMRV9CWVRFX0xFTkdUSCk7XG5cbiAgICBsZXQgbWF4UGFydGljbGVYID0gMDtcbiAgICBsZXQgbWluUGFydGljbGVZID0gcmVzdWx0SGVpZ2h0O1xuICAgIHdoaWxlIChwYXJ0aWNsZUNvdW50IDwgbWF4TnVtUGFydGljbGVzKSB7XG4gICAgICAvLyBzZWxlY3QgcmFuZG9tIGluZGV4IGZyb20gY2FuZGlhdGVzXG4gICAgICBjb25zdCBpbmRleCA9IH5+KE1hdGgucmFuZG9tKCkgKiBwYXJ0aWNsZUNhbmRpYXRlc0xpc3QubGVuZ3RoKTtcbiAgICAgIGNvbnN0IHsgeCwgeSB9ID0gcGFydGljbGVDYW5kaWF0ZXNMaXN0W2luZGV4XTtcblxuICAgICAgLy8gb3ZlcndyaXRlIGluZGV4IHdpdGggbGFzdCBlbGVtZW50IHRvIHByZXZlbnQgZG91YmxlIHNlbGVjdGlvbiBvZiBwYXJ0aWNsZXNcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICBwYXJ0aWNsZUNhbmRpYXRlc0xpc3RbaW5kZXhdID0gcGFydGljbGVDYW5kaWF0ZXNMaXN0LnBvcCgpITtcblxuICAgICAgbWF4UGFydGljbGVYID0gTWF0aC5tYXgobWF4UGFydGljbGVYLCB4KTtcbiAgICAgIG1pblBhcnRpY2xlWSA9IE1hdGgubWluKG1pblBhcnRpY2xlWSwgeSk7XG4gICAgICBjb25zdCB7IGR4LCBkeSwgYXgsIGF5LCByLCBnLCBiLCBhLCAuLi54eSB9ID0gV3NUaGFub3NTZXJ2aWNlLmdldFBhcnRpY2xlSW5kaWNlc0ZvckJhc2UoXG4gICAgICAgIHBhcnRpY2xlQ291bnQgKiBQQVJUSUNMRV9CWVRFX0xFTkdUSFxuICAgICAgKTtcbiAgICAgIHBhcnRpY2xlc1t4eS54XSA9IHg7XG4gICAgICBwYXJ0aWNsZXNbeHkueV0gPSB5ICsgcmVzdWx0SGVpZ2h0IC0gaGVpZ2h0O1xuICAgICAgcGFydGljbGVzW2R4XSA9IDA7XG4gICAgICBwYXJ0aWNsZXNbZHldID0gMDtcbiAgICAgIHBhcnRpY2xlc1theF0gPSAwO1xuICAgICAgcGFydGljbGVzW2F5XSA9IDA7XG5cbiAgICAgIGNvbnN0IGluZGljZXNJbWFnZSA9IFdzVGhhbm9zU2VydmljZS5nZXRDb2xvckluZGljZXNGb3JDb29yZCh4LCB5LCB3aWR0aCk7XG5cbiAgICAgIHBhcnRpY2xlc1tyXSA9IGltYWdlRGF0YS5kYXRhW2luZGljZXNJbWFnZS5yXTtcbiAgICAgIHBhcnRpY2xlc1tnXSA9IGltYWdlRGF0YS5kYXRhW2luZGljZXNJbWFnZS5nXTtcbiAgICAgIHBhcnRpY2xlc1tiXSA9IGltYWdlRGF0YS5kYXRhW2luZGljZXNJbWFnZS5iXTtcbiAgICAgIHBhcnRpY2xlc1thXSA9IGltYWdlRGF0YS5kYXRhW2luZGljZXNJbWFnZS5hXTtcbiAgICAgIHBhcnRpY2xlQ291bnQrKztcbiAgICB9XG4gICAgcmV0dXJuIHsgcGFydGljbGVzLCBtYXhQYXJ0aWNsZVgsIG1pblBhcnRpY2xlWSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0WFlGcm9tRmxvd0ZpZWxkKG5vaXNlOiBTaW1wbGV4Tm9pc2UsIHNlZWQ6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICBjb25zdCBzYW1wbGVYID0gbm9pc2Uuc2NhbGVkM0QoeCwgeSwgc2VlZCArIDMzLjIzLCBGTE9XX0ZJRUxEX1JFUyk7XG4gICAgY29uc3Qgc2FtcGxlWSA9IG5vaXNlLnNjYWxlZDNEKHgsIHNlZWQgLyAxMy4yMywgeSwgRkxPV19GSUVMRF9SRVMpICogLTE7XG4gICAgcmV0dXJuIFtzYW1wbGVYLCBzYW1wbGVZXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzdGFydCB0aGUgdmFwb3JpemUtZWZmZWN0LlxuICAgKlxuICAgKiBJdCdzIHJ1bm5pbmcgb3V0c2lkZSB0aGUgbmdab25lLlxuICAgKi9cbiAgdmFwb3JpemUoZWxlbTogSFRNTEVsZW1lbnQpOiBPYnNlcnZhYmxlPEFuaW1hdGlvblN0YXRlPiB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHRoaXMudmFwb3JpemVJbnRlcm4oZWxlbSkpO1xuICB9XG5cbiAgcHJpdmF0ZSB2YXBvcml6ZUludGVybihlbGVtOiBIVE1MRWxlbWVudCk6IE9ic2VydmFibGU8QW5pbWF0aW9uU3RhdGU+IHtcbiAgICBlbGVtLnN0eWxlLm9wYWNpdHkgPSBlbGVtLnN0eWxlLm9wYWNpdHkgfHwgJzEnO1xuICAgIGVsZW0uc3R5bGUudHJhbnNpdGlvbiA9IGBvcGFjaXR5ICR7TWF0aC5mbG9vcih0aGlzLnRoYW5vc09wdGlvbnMuYW5pbWF0aW9uTGVuZ3RoICogMC44KX1tcyBlYXNlLW91dGA7XG4gICAgY29uc3Qgbm9pc2UgPSBuZXcgU2ltcGxleE5vaXNlKHsgZnJlcXVlbmN5OiAwLjAxLCBtaW46IDAgfSk7XG4gICAgY29uc3Qgc2VlZCA9IG5ldyBEYXRlKCkuZ2V0RGF0ZSgpICogTWF0aC5yYW5kb20oKTtcbiAgICBjb25zdCBodG1sMkNhbnZhc1Byb21pc2U6IFByb21pc2U8SFRNTENhbnZhc0VsZW1lbnQ+ID0gaHRtbDJjYW52YXMoZWxlbSwge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiBudWxsLFxuICAgICAgc2NhbGU6IDEsXG4gICAgICBhbGxvd1RhaW50OiB0cnVlLFxuICAgICAgd2luZG93SGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG4gICAgICB3aW5kb3dXaWR0aDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgICBzY3JvbGxZOiAtd2luZG93LnNjcm9sbFksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnJvbShodG1sMkNhbnZhc1Byb21pc2UpLnBpcGUoXG4gICAgICBtYXAoKGNhbnZhc0Zyb21IdG1sRWxlbSkgPT4ge1xuICAgICAgICBjb25zdCBjYW52YXNBbmRQYXJ0aWNsZXMgPSBXc1RoYW5vc1NlcnZpY2UucHJlcGFyZUNhbnZhc0ZvclZhcG9yaXplKFxuICAgICAgICAgIGNhbnZhc0Zyb21IdG1sRWxlbSxcbiAgICAgICAgICB0aGlzLnRoYW5vc09wdGlvbnMubWF4UGFydGljbGVDb3VudFxuICAgICAgICApO1xuICAgICAgICBjb25zdCB7IHJlc3VsdENhbnZhcyB9ID0gY2FudmFzQW5kUGFydGljbGVzO1xuICAgICAgICBpZiAoZWxlbS5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgZWxlbS5wYXJlbnRFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gZWxlbS5wYXJlbnRFbGVtZW50LnN0eWxlLnBvc2l0aW9uIHx8ICdyZWxhdGl2ZSc7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0Q2FudmFzLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgcmVzdWx0Q2FudmFzLnN0eWxlLmxlZnQgPSAwICsgJ3B4JztcbiAgICAgICAgcmVzdWx0Q2FudmFzLnN0eWxlLnRvcCA9ICctJyArIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ICogKEhFSUdIVF9TQ0FMRSAtIDEpICsgJ3B4JztcbiAgICAgICAgcmVzdWx0Q2FudmFzLnN0eWxlLnpJbmRleCA9ICcyMDAwJztcbiAgICAgICAgcmVzdWx0Q2FudmFzLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG5cbiAgICAgICAgZWxlbS5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2JlZm9yZWJlZ2luJywgcmVzdWx0Q2FudmFzKTtcbiAgICAgICAgLy8gdGhpcyBzaG91bGQgc3RhcnQgdGhlIHRyYW5zaXRpb24gYWJvdmUgZGVmaW5lZFxuICAgICAgICBlbGVtLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHJldHVybiBjYW52YXNBbmRQYXJ0aWNsZXM7XG4gICAgICB9KSxcbiAgICAgIHN3aXRjaE1hcCgoeyByZXN1bHRDYW52YXMsIHBhcnRpY2xlc0RhdGEgfSkgPT4ge1xuICAgICAgICBsZXQgdGltZSA9IDA7XG4gICAgICAgIGNvbnN0IHsgYW5pbWF0aW9uTGVuZ3RoLCBtYXhQYXJ0aWNsZUNvdW50LCBwYXJ0aWNsZUFjY2VsZXJhdGlvbiB9ID0gdGhpcy50aGFub3NPcHRpb25zO1xuICAgICAgICByZXR1cm4gaW50ZXJ2YWwoMTAwMCAvIDYwLCBhbmltYXRpb25GcmFtZVNjaGVkdWxlcikucGlwZShcbiAgICAgICAgICB0aW1lSW50ZXJ2YWwoKSxcbiAgICAgICAgICB0YXAoKGRlbHRhVCkgPT4gKHRpbWUgKz0gZGVsdGFULmludGVydmFsKSksXG4gICAgICAgICAgbWFwKFxuICAgICAgICAgICAgKGRlbHRhVCkgPT5cbiAgICAgICAgICAgICAgKHtcbiAgICAgICAgICAgICAgICBkZWx0YVRTZWM6IGRlbHRhVC5pbnRlcnZhbCAvIDEwMDAsXG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uVDogdGltZSAvIGFuaW1hdGlvbkxlbmd0aCxcbiAgICAgICAgICAgICAgICBtYXhXaWR0aDogcmVzdWx0Q2FudmFzLndpZHRoLFxuICAgICAgICAgICAgICAgIG1heEhlaWdodDogcmVzdWx0Q2FudmFzLmhlaWdodCxcbiAgICAgICAgICAgICAgfSBhcyBBbmltYXRpb25TdGF0ZSlcbiAgICAgICAgICApLFxuICAgICAgICAgIHRhcCgoYW5pbWF0aW9uU3RhdGUpID0+IHtcbiAgICAgICAgICAgIFdzVGhhbm9zU2VydmljZS51cGRhdGVQYXJ0aWNsZXMoe1xuICAgICAgICAgICAgICBwYXJ0aWNsZXNEYXRhLFxuICAgICAgICAgICAgICBhbmltYXRpb25TdGF0ZSxcbiAgICAgICAgICAgICAgdGhhbm9zT3B0aW9uczoge1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbkxlbmd0aCxcbiAgICAgICAgICAgICAgICBtYXhQYXJ0aWNsZUNvdW50LFxuICAgICAgICAgICAgICAgIHBhcnRpY2xlQWNjZWxlcmF0aW9uLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBub2lzZSxcbiAgICAgICAgICAgICAgc2VlZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHJlc3VsdENhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICAgICAgaWYgKGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgV3NUaGFub3NTZXJ2aWNlLmRyYXdQYXJ0aWNsZXMoY29udGV4dCwgcGFydGljbGVzRGF0YS5wYXJ0aWNsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VXaGlsZSgoYW5pbWF0aW9uU3RhdGUpID0+IGFuaW1hdGlvblN0YXRlLmFuaW1hdGlvblQgPD0gMSksXG4gICAgICAgICAgdGFwKHtcbiAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHRDYW52YXMucmVtb3ZlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './index';
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './index';
|
|
5
5
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29sc29rLXRoYW5vcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvcHVibGljL3dzLXRoYW5vcy9zcmMvd29sc29rLXRoYW5vcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
|
package/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export * from './lib/ws-thanos.service';
|
|
2
|
-
export * from './lib/ws-thanos.directive';
|
|
3
|
-
export * from './lib/ws-thanos-options.token';
|
|
4
|
-
export * from './lib/ws-thanos.options';
|
|
5
|
-
export * from './lib/create-ws-thanos-options';
|
|
6
|
-
export * from './lib/simplex-noise';
|
|
1
|
+
export * from './lib/ws-thanos.service';
|
|
2
|
+
export * from './lib/ws-thanos.directive';
|
|
3
|
+
export * from './lib/ws-thanos-options.token';
|
|
4
|
+
export * from './lib/ws-thanos.options';
|
|
5
|
+
export * from './lib/create-ws-thanos-options';
|
|
6
|
+
export * from './lib/simplex-noise';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { WsThanosOptions } from './ws-thanos.options';
|
|
2
|
-
export declare function createWsThanosOptions(options?: Partial<WsThanosOptions>): WsThanosOptions;
|
|
1
|
+
import { WsThanosOptions } from './ws-thanos.options';
|
|
2
|
+
export declare function createWsThanosOptions(options?: Partial<WsThanosOptions>): WsThanosOptions;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export interface SimplexNoiseOptions {
|
|
2
|
-
amplitude: number;
|
|
3
|
-
frequency: number;
|
|
4
|
-
max: number;
|
|
5
|
-
min: number;
|
|
6
|
-
octaves: number;
|
|
7
|
-
persistence: number;
|
|
8
|
-
random: () => number;
|
|
9
|
-
}
|
|
1
|
+
export interface SimplexNoiseOptions {
|
|
2
|
+
amplitude: number;
|
|
3
|
+
frequency: number;
|
|
4
|
+
max: number;
|
|
5
|
+
min: number;
|
|
6
|
+
octaves: number;
|
|
7
|
+
persistence: number;
|
|
8
|
+
random: () => number;
|
|
9
|
+
}
|
package/lib/simplex-noise.d.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import type { SimplexNoiseOptions } from './simplex-noise-options';
|
|
2
|
-
export declare class SimplexNoise {
|
|
3
|
-
constructor(options?: Partial<SimplexNoiseOptions>);
|
|
4
|
-
static G3: number;
|
|
5
|
-
static GRAD3D: number[][];
|
|
6
|
-
readonly amplitude: number;
|
|
7
|
-
readonly frequency: number;
|
|
8
|
-
readonly octaves: number;
|
|
9
|
-
readonly perm: Uint8Array;
|
|
10
|
-
readonly permMod12: Uint8Array;
|
|
11
|
-
readonly persistence: number;
|
|
12
|
-
readonly random: () => number;
|
|
13
|
-
readonly scale: (value: number) => number;
|
|
14
|
-
private memScale3D;
|
|
15
|
-
dot(gs: number[], coords: number[]): number;
|
|
16
|
-
raw3D(x: number, y: number, z: number): number;
|
|
17
|
-
scaled3D(x: number, y: number, z: number, resolution: number): number;
|
|
18
|
-
}
|
|
1
|
+
import type { SimplexNoiseOptions } from './simplex-noise-options';
|
|
2
|
+
export declare class SimplexNoise {
|
|
3
|
+
constructor(options?: Partial<SimplexNoiseOptions>);
|
|
4
|
+
static G3: number;
|
|
5
|
+
static GRAD3D: number[][];
|
|
6
|
+
readonly amplitude: number;
|
|
7
|
+
readonly frequency: number;
|
|
8
|
+
readonly octaves: number;
|
|
9
|
+
readonly perm: Uint8Array;
|
|
10
|
+
readonly permMod12: Uint8Array;
|
|
11
|
+
readonly persistence: number;
|
|
12
|
+
readonly random: () => number;
|
|
13
|
+
readonly scale: (value: number) => number;
|
|
14
|
+
private memScale3D;
|
|
15
|
+
dot(gs: number[], coords: number[]): number;
|
|
16
|
+
raw3D(x: number, y: number, z: number): number;
|
|
17
|
+
scaled3D(x: number, y: number, z: number, resolution: number): number;
|
|
18
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { InjectionToken, Provider } from '@angular/core';
|
|
2
|
-
import type { WsThanosOptions } from './ws-thanos.options';
|
|
3
|
-
export declare const WS_THANOS_OPTIONS_TOKEN: InjectionToken<WsThanosOptions>;
|
|
4
|
-
export declare function provideWsThanosOptions(options?: Partial<WsThanosOptions>): Provider;
|
|
1
|
+
import { InjectionToken, Provider } from '@angular/core';
|
|
2
|
+
import type { WsThanosOptions } from './ws-thanos.options';
|
|
3
|
+
export declare const WS_THANOS_OPTIONS_TOKEN: InjectionToken<WsThanosOptions>;
|
|
4
|
+
export declare function provideWsThanosOptions(options?: Partial<WsThanosOptions>): Provider;
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { ElementRef, NgZone, OnDestroy } from '@angular/core';
|
|
2
|
-
import { Observable } from 'rxjs';
|
|
3
|
-
import type { WsThanosOptions } from './ws-thanos.options';
|
|
4
|
-
import { WsThanosService } from './ws-thanos.service';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
export declare class WsThanosDirective implements OnDestroy {
|
|
7
|
-
private readonly vaporizeDomElem;
|
|
8
|
-
private readonly thanosService;
|
|
9
|
-
private readonly thanosOptions;
|
|
10
|
-
private readonly ngZone;
|
|
11
|
-
private subscription?;
|
|
12
|
-
private wsThanosComplete;
|
|
13
|
-
constructor(vaporizeDomElem: ElementRef<HTMLElement>, thanosService: WsThanosService, thanosOptions: WsThanosOptions, ngZone: NgZone);
|
|
14
|
-
vaporize(removeElem?: boolean): Observable<void>;
|
|
15
|
-
ngOnDestroy(): void;
|
|
16
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<WsThanosDirective, never>;
|
|
17
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<WsThanosDirective, "[wsThanos], ws-thanos", ["thanos"], {}, { "wsThanosComplete": "wsThanosComplete"; }, never, never, true>;
|
|
18
|
-
}
|
|
1
|
+
import { ElementRef, NgZone, OnDestroy } from '@angular/core';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import type { WsThanosOptions } from './ws-thanos.options';
|
|
4
|
+
import { WsThanosService } from './ws-thanos.service';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export declare class WsThanosDirective implements OnDestroy {
|
|
7
|
+
private readonly vaporizeDomElem;
|
|
8
|
+
private readonly thanosService;
|
|
9
|
+
private readonly thanosOptions;
|
|
10
|
+
private readonly ngZone;
|
|
11
|
+
private subscription?;
|
|
12
|
+
private wsThanosComplete;
|
|
13
|
+
constructor(vaporizeDomElem: ElementRef<HTMLElement>, thanosService: WsThanosService, thanosOptions: WsThanosOptions, ngZone: NgZone);
|
|
14
|
+
vaporize(removeElem?: boolean): Observable<void>;
|
|
15
|
+
ngOnDestroy(): void;
|
|
16
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<WsThanosDirective, never>;
|
|
17
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<WsThanosDirective, "[wsThanos], ws-thanos", ["thanos"], {}, { "wsThanosComplete": "wsThanosComplete"; }, never, never, true, never>;
|
|
18
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export interface WsThanosOptions {
|
|
2
|
-
animationLength: number;
|
|
3
|
-
maxParticleCount: number;
|
|
4
|
-
particleAcceleration: number;
|
|
5
|
-
}
|
|
1
|
+
export interface WsThanosOptions {
|
|
2
|
+
animationLength: number;
|
|
3
|
+
maxParticleCount: number;
|
|
4
|
+
particleAcceleration: number;
|
|
5
|
+
}
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
import { NgZone } from '@angular/core';
|
|
2
|
-
import { Observable } from 'rxjs';
|
|
3
|
-
import type { WsThanosOptions } from './ws-thanos.options';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
interface AnimationState {
|
|
6
|
-
deltaTSec: number;
|
|
7
|
-
animationT: number;
|
|
8
|
-
maxWidth: number;
|
|
9
|
-
maxHeight: number;
|
|
10
|
-
}
|
|
11
|
-
export declare class WsThanosService {
|
|
12
|
-
private thanosOptions;
|
|
13
|
-
private ngZone;
|
|
14
|
-
constructor(thanosOptions: WsThanosOptions, ngZone: NgZone);
|
|
15
|
-
private static getParticleIndicesForBase;
|
|
16
|
-
private static getColorIndicesForCoord;
|
|
17
|
-
private static updateParticles;
|
|
18
|
-
private static drawParticles;
|
|
19
|
-
private static prepareCanvasForVaporize;
|
|
20
|
-
private static createParticlesForImageData;
|
|
21
|
-
private static getXYFromFlowField;
|
|
22
|
-
/**
|
|
23
|
-
* start the vaporize-effect.
|
|
24
|
-
*
|
|
25
|
-
* It's running outside the ngZone.
|
|
26
|
-
*/
|
|
27
|
-
vaporize(elem: HTMLElement): Observable<AnimationState>;
|
|
28
|
-
private vaporizeIntern;
|
|
29
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<WsThanosService, never>;
|
|
30
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<WsThanosService>;
|
|
31
|
-
}
|
|
32
|
-
export {};
|
|
1
|
+
import { NgZone } from '@angular/core';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import type { WsThanosOptions } from './ws-thanos.options';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
interface AnimationState {
|
|
6
|
+
deltaTSec: number;
|
|
7
|
+
animationT: number;
|
|
8
|
+
maxWidth: number;
|
|
9
|
+
maxHeight: number;
|
|
10
|
+
}
|
|
11
|
+
export declare class WsThanosService {
|
|
12
|
+
private thanosOptions;
|
|
13
|
+
private ngZone;
|
|
14
|
+
constructor(thanosOptions: WsThanosOptions, ngZone: NgZone);
|
|
15
|
+
private static getParticleIndicesForBase;
|
|
16
|
+
private static getColorIndicesForCoord;
|
|
17
|
+
private static updateParticles;
|
|
18
|
+
private static drawParticles;
|
|
19
|
+
private static prepareCanvasForVaporize;
|
|
20
|
+
private static createParticlesForImageData;
|
|
21
|
+
private static getXYFromFlowField;
|
|
22
|
+
/**
|
|
23
|
+
* start the vaporize-effect.
|
|
24
|
+
*
|
|
25
|
+
* It's running outside the ngZone.
|
|
26
|
+
*/
|
|
27
|
+
vaporize(elem: HTMLElement): Observable<AnimationState>;
|
|
28
|
+
private vaporizeIntern;
|
|
29
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<WsThanosService, never>;
|
|
30
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<WsThanosService>;
|
|
31
|
+
}
|
|
32
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wolsok/thanos",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "16.0.0",
|
|
4
|
+
"description": "Wolf Soko's implementation of a cool Thanos snapping vaporizing effect for destroying dom elements",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/WolfSoko/wol-sok-mono/issues"
|
|
7
7
|
},
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"repository": "https://github.com/WolfSoko/wol-sok-mono/tree/main/libs/public/ws-thanos",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"keywords": [
|
|
12
|
+
"wolf soko",
|
|
12
13
|
"wolsok",
|
|
13
14
|
"angular",
|
|
14
15
|
"angular-lib",
|
|
@@ -19,33 +20,31 @@
|
|
|
19
20
|
"vaporize",
|
|
20
21
|
"vaporizing",
|
|
21
22
|
"Avengers",
|
|
22
|
-
"Marvel"
|
|
23
|
+
"Marvel",
|
|
24
|
+
"npm"
|
|
23
25
|
],
|
|
24
26
|
"peerDependencies": {
|
|
25
|
-
"@angular/common": "^
|
|
26
|
-
"@angular/core": "^
|
|
27
|
+
"@angular/common": "^16.0.0",
|
|
28
|
+
"@angular/core": "^16.0.0",
|
|
27
29
|
"html2canvas": "^1.4.1",
|
|
28
|
-
"@angular/platform-browser": "
|
|
29
|
-
"rxjs": "7.
|
|
30
|
-
"zone.js": "0.
|
|
31
|
-
"@angular/platform-browser-dynamic": "
|
|
30
|
+
"@angular/platform-browser": "16.0.0",
|
|
31
|
+
"rxjs": "7.8.1",
|
|
32
|
+
"zone.js": "0.13.0",
|
|
33
|
+
"@angular/platform-browser-dynamic": "16.0.0"
|
|
32
34
|
},
|
|
33
35
|
"dependencies": {
|
|
34
|
-
"tslib": "2.
|
|
36
|
+
"tslib": "2.5.0"
|
|
35
37
|
},
|
|
36
|
-
"module": "
|
|
37
|
-
"es2020": "esm2020/wolsok-thanos.mjs",
|
|
38
|
-
"esm2020": "esm2020/wolsok-thanos.mjs",
|
|
38
|
+
"module": "esm2022/wolsok-thanos.mjs",
|
|
39
39
|
"typings": "index.d.ts",
|
|
40
40
|
"exports": {
|
|
41
41
|
"./package.json": {
|
|
42
42
|
"default": "./package.json"
|
|
43
43
|
},
|
|
44
44
|
".": {
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"default": "./esm2020/wolsok-thanos.mjs"
|
|
45
|
+
"esm2022": "./esm2022/wolsok-thanos.mjs",
|
|
46
|
+
"esm": "./esm2022/wolsok-thanos.mjs",
|
|
47
|
+
"default": "./esm2022/wolsok-thanos.mjs"
|
|
49
48
|
}
|
|
50
49
|
},
|
|
51
50
|
"sideEffects": false
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export function createWsThanosOptions(options) {
|
|
2
|
-
return {
|
|
3
|
-
animationLength: 5000,
|
|
4
|
-
maxParticleCount: 400000,
|
|
5
|
-
particleAcceleration: 30,
|
|
6
|
-
...options,
|
|
7
|
-
};
|
|
8
|
-
}
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXdzLXRoYW5vcy1vcHRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wdWJsaWMvd3MtdGhhbm9zL3NyYy9saWIvY3JlYXRlLXdzLXRoYW5vcy1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsT0FBa0M7SUFFbEMsT0FBTztRQUNMLGVBQWUsRUFBRSxJQUFJO1FBQ3JCLGdCQUFnQixFQUFFLE1BQU07UUFDeEIsb0JBQW9CLEVBQUUsRUFBRTtRQUN4QixHQUFHLE9BQU87S0FDWCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdzVGhhbm9zT3B0aW9ucyB9IGZyb20gJy4vd3MtdGhhbm9zLm9wdGlvbnMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV3NUaGFub3NPcHRpb25zKFxuICBvcHRpb25zPzogUGFydGlhbDxXc1RoYW5vc09wdGlvbnM+XG4pOiBXc1RoYW5vc09wdGlvbnMge1xuICByZXR1cm4ge1xuICAgIGFuaW1hdGlvbkxlbmd0aDogNTAwMCxcbiAgICBtYXhQYXJ0aWNsZUNvdW50OiA0MDAwMDAsXG4gICAgcGFydGljbGVBY2NlbGVyYXRpb246IDMwLFxuICAgIC4uLm9wdGlvbnMsXG4gIH07XG59XG4iXX0=
|