@esotericsoftware/spine-pixi-v8 4.2.100 → 4.2.102
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.
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/******************************************************************************
|
|
2
|
+
* Spine Runtimes License Agreement
|
|
3
|
+
* Last updated April 5, 2025. Replaces all prior versions.
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2013-2025, Esoteric Software LLC
|
|
6
|
+
*
|
|
7
|
+
* Integration of the Spine Runtimes into software or otherwise creating
|
|
8
|
+
* derivative works of the Spine Runtimes is permitted under the terms and
|
|
9
|
+
* conditions of Section 2 of the Spine Editor License Agreement:
|
|
10
|
+
* http://esotericsoftware.com/spine-editor-license
|
|
11
|
+
*
|
|
12
|
+
* Otherwise, it is permitted to integrate the Spine Runtimes into software
|
|
13
|
+
* or otherwise create derivative works of the Spine Runtimes (collectively,
|
|
14
|
+
* "Products"), provided that each user of the Products must obtain their own
|
|
15
|
+
* Spine Editor license and redistribution of the Products in any form must
|
|
16
|
+
* include this license and copyright notice.
|
|
17
|
+
*
|
|
18
|
+
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
|
19
|
+
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
20
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
21
|
+
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
|
22
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
23
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
|
24
|
+
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
|
25
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
26
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
27
|
+
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28
|
+
*****************************************************************************/
|
|
29
|
+
import { Skeleton } from "@esotericsoftware/spine-core";
|
|
30
|
+
export declare class CanvasSkeletonRenderer {
|
|
31
|
+
static QUAD_TRIANGLES: number[];
|
|
32
|
+
static VERTEX_SIZE: number;
|
|
33
|
+
private ctx;
|
|
34
|
+
triangleRendering: boolean;
|
|
35
|
+
debugRendering: boolean;
|
|
36
|
+
private vertices;
|
|
37
|
+
private tempColor;
|
|
38
|
+
constructor(context: CanvasRenderingContext2D);
|
|
39
|
+
draw(skeleton: Skeleton): void;
|
|
40
|
+
private drawImages;
|
|
41
|
+
private drawTriangles;
|
|
42
|
+
private drawTriangle;
|
|
43
|
+
private computeRegionVertices;
|
|
44
|
+
private computeMeshVertices;
|
|
45
|
+
}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/******************************************************************************
|
|
2
|
+
* Spine Runtimes License Agreement
|
|
3
|
+
* Last updated April 5, 2025. Replaces all prior versions.
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2013-2025, Esoteric Software LLC
|
|
6
|
+
*
|
|
7
|
+
* Integration of the Spine Runtimes into software or otherwise creating
|
|
8
|
+
* derivative works of the Spine Runtimes is permitted under the terms and
|
|
9
|
+
* conditions of Section 2 of the Spine Editor License Agreement:
|
|
10
|
+
* http://esotericsoftware.com/spine-editor-license
|
|
11
|
+
*
|
|
12
|
+
* Otherwise, it is permitted to integrate the Spine Runtimes into software
|
|
13
|
+
* or otherwise create derivative works of the Spine Runtimes (collectively,
|
|
14
|
+
* "Products"), provided that each user of the Products must obtain their own
|
|
15
|
+
* Spine Editor license and redistribution of the Products in any form must
|
|
16
|
+
* include this license and copyright notice.
|
|
17
|
+
*
|
|
18
|
+
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
|
19
|
+
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
20
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
21
|
+
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
|
22
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
23
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
|
24
|
+
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
|
25
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
26
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
27
|
+
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28
|
+
*****************************************************************************/
|
|
29
|
+
import { Utils, Color, RegionAttachment, MeshAttachment } from "@esotericsoftware/spine-core";
|
|
30
|
+
const worldVertices = Utils.newFloatArray(8);
|
|
31
|
+
export class CanvasSkeletonRenderer {
|
|
32
|
+
static QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0];
|
|
33
|
+
static VERTEX_SIZE = 2 + 2 + 4;
|
|
34
|
+
ctx;
|
|
35
|
+
triangleRendering = false;
|
|
36
|
+
debugRendering = false;
|
|
37
|
+
vertices = Utils.newFloatArray(8 * 1024);
|
|
38
|
+
tempColor = new Color();
|
|
39
|
+
constructor(context) {
|
|
40
|
+
this.ctx = context;
|
|
41
|
+
}
|
|
42
|
+
draw(skeleton) {
|
|
43
|
+
if (this.triangleRendering)
|
|
44
|
+
this.drawTriangles(skeleton);
|
|
45
|
+
else
|
|
46
|
+
this.drawImages(skeleton);
|
|
47
|
+
}
|
|
48
|
+
drawImages(skeleton) {
|
|
49
|
+
let ctx = this.ctx;
|
|
50
|
+
let color = this.tempColor;
|
|
51
|
+
let skeletonColor = skeleton.color;
|
|
52
|
+
let drawOrder = skeleton.drawOrder;
|
|
53
|
+
if (this.debugRendering)
|
|
54
|
+
ctx.strokeStyle = "green";
|
|
55
|
+
for (let i = 0, n = drawOrder.length; i < n; i++) {
|
|
56
|
+
let slot = drawOrder[i];
|
|
57
|
+
let bone = slot.bone;
|
|
58
|
+
if (!bone.active)
|
|
59
|
+
continue;
|
|
60
|
+
let attachment = slot.getAttachment();
|
|
61
|
+
if (!(attachment instanceof RegionAttachment))
|
|
62
|
+
continue;
|
|
63
|
+
attachment.computeWorldVertices(slot, worldVertices, 0, 2);
|
|
64
|
+
let region = attachment.region;
|
|
65
|
+
let image = (region.texture).getImage();
|
|
66
|
+
let slotColor = slot.color;
|
|
67
|
+
let regionColor = attachment.color;
|
|
68
|
+
color.set(skeletonColor.r * slotColor.r * regionColor.r, skeletonColor.g * slotColor.g * regionColor.g, skeletonColor.b * slotColor.b * regionColor.b, skeletonColor.a * slotColor.a * regionColor.a);
|
|
69
|
+
ctx.save();
|
|
70
|
+
ctx.transform(bone.a, bone.c, bone.b, bone.d, bone.worldX, bone.worldY);
|
|
71
|
+
ctx.translate(attachment.offset[0], attachment.offset[1]);
|
|
72
|
+
ctx.rotate(attachment.rotation * Math.PI / 180);
|
|
73
|
+
let atlasScale = attachment.width / region.originalWidth;
|
|
74
|
+
ctx.scale(atlasScale * attachment.scaleX, atlasScale * attachment.scaleY);
|
|
75
|
+
let w = region.width, h = region.height;
|
|
76
|
+
ctx.translate(w / 2, h / 2);
|
|
77
|
+
if (attachment.region.degrees == 90) {
|
|
78
|
+
let t = w;
|
|
79
|
+
w = h;
|
|
80
|
+
h = t;
|
|
81
|
+
ctx.rotate(-Math.PI / 2);
|
|
82
|
+
}
|
|
83
|
+
ctx.scale(1, -1);
|
|
84
|
+
ctx.translate(-w / 2, -h / 2);
|
|
85
|
+
ctx.globalAlpha = color.a;
|
|
86
|
+
ctx.drawImage(image, image.width * region.u, image.height * region.v, w, h, 0, 0, w, h);
|
|
87
|
+
if (this.debugRendering)
|
|
88
|
+
ctx.strokeRect(0, 0, w, h);
|
|
89
|
+
ctx.restore();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
drawTriangles(skeleton) {
|
|
93
|
+
let ctx = this.ctx;
|
|
94
|
+
let color = this.tempColor;
|
|
95
|
+
let skeletonColor = skeleton.color;
|
|
96
|
+
let drawOrder = skeleton.drawOrder;
|
|
97
|
+
let blendMode = null;
|
|
98
|
+
let vertices = this.vertices;
|
|
99
|
+
let triangles = null;
|
|
100
|
+
for (let i = 0, n = drawOrder.length; i < n; i++) {
|
|
101
|
+
let slot = drawOrder[i];
|
|
102
|
+
let attachment = slot.getAttachment();
|
|
103
|
+
let texture;
|
|
104
|
+
let region;
|
|
105
|
+
if (attachment instanceof RegionAttachment) {
|
|
106
|
+
let regionAttachment = attachment;
|
|
107
|
+
vertices = this.computeRegionVertices(slot, regionAttachment, false);
|
|
108
|
+
triangles = CanvasSkeletonRenderer.QUAD_TRIANGLES;
|
|
109
|
+
texture = (regionAttachment.region.texture).getImage();
|
|
110
|
+
}
|
|
111
|
+
else if (attachment instanceof MeshAttachment) {
|
|
112
|
+
let mesh = attachment;
|
|
113
|
+
vertices = this.computeMeshVertices(slot, mesh, false);
|
|
114
|
+
triangles = mesh.triangles;
|
|
115
|
+
texture = (mesh.region.texture).getImage();
|
|
116
|
+
}
|
|
117
|
+
else
|
|
118
|
+
continue;
|
|
119
|
+
if (texture) {
|
|
120
|
+
if (slot.data.blendMode != blendMode)
|
|
121
|
+
blendMode = slot.data.blendMode;
|
|
122
|
+
let slotColor = slot.color;
|
|
123
|
+
let attachmentColor = attachment.color;
|
|
124
|
+
color.set(skeletonColor.r * slotColor.r * attachmentColor.r, skeletonColor.g * slotColor.g * attachmentColor.g, skeletonColor.b * slotColor.b * attachmentColor.b, skeletonColor.a * slotColor.a * attachmentColor.a);
|
|
125
|
+
ctx.globalAlpha = color.a;
|
|
126
|
+
for (var j = 0; j < triangles.length; j += 3) {
|
|
127
|
+
let t1 = triangles[j] * 8, t2 = triangles[j + 1] * 8, t3 = triangles[j + 2] * 8;
|
|
128
|
+
let x0 = vertices[t1], y0 = vertices[t1 + 1], u0 = vertices[t1 + 6], v0 = vertices[t1 + 7];
|
|
129
|
+
let x1 = vertices[t2], y1 = vertices[t2 + 1], u1 = vertices[t2 + 6], v1 = vertices[t2 + 7];
|
|
130
|
+
let x2 = vertices[t3], y2 = vertices[t3 + 1], u2 = vertices[t3 + 6], v2 = vertices[t3 + 7];
|
|
131
|
+
this.drawTriangle(texture, x0, y0, u0, v0, x1, y1, u1, v1, x2, y2, u2, v2);
|
|
132
|
+
if (this.debugRendering) {
|
|
133
|
+
ctx.strokeStyle = "green";
|
|
134
|
+
ctx.beginPath();
|
|
135
|
+
ctx.moveTo(x0, y0);
|
|
136
|
+
ctx.lineTo(x1, y1);
|
|
137
|
+
ctx.lineTo(x2, y2);
|
|
138
|
+
ctx.lineTo(x0, y0);
|
|
139
|
+
ctx.stroke();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
this.ctx.globalAlpha = 1;
|
|
145
|
+
}
|
|
146
|
+
// Adapted from http://extremelysatisfactorytotalitarianism.com/blog/?p=2120
|
|
147
|
+
// Apache 2 licensed
|
|
148
|
+
drawTriangle(img, x0, y0, u0, v0, x1, y1, u1, v1, x2, y2, u2, v2) {
|
|
149
|
+
let ctx = this.ctx;
|
|
150
|
+
const width = img.width - 1;
|
|
151
|
+
const height = img.height - 1;
|
|
152
|
+
u0 *= width;
|
|
153
|
+
v0 *= height;
|
|
154
|
+
u1 *= width;
|
|
155
|
+
v1 *= height;
|
|
156
|
+
u2 *= width;
|
|
157
|
+
v2 *= height;
|
|
158
|
+
ctx.beginPath();
|
|
159
|
+
ctx.moveTo(x0, y0);
|
|
160
|
+
ctx.lineTo(x1, y1);
|
|
161
|
+
ctx.lineTo(x2, y2);
|
|
162
|
+
ctx.closePath();
|
|
163
|
+
x1 -= x0;
|
|
164
|
+
y1 -= y0;
|
|
165
|
+
x2 -= x0;
|
|
166
|
+
y2 -= y0;
|
|
167
|
+
u1 -= u0;
|
|
168
|
+
v1 -= v0;
|
|
169
|
+
u2 -= u0;
|
|
170
|
+
v2 -= v0;
|
|
171
|
+
let det = u1 * v2 - u2 * v1;
|
|
172
|
+
if (det == 0)
|
|
173
|
+
return;
|
|
174
|
+
det = 1 / det;
|
|
175
|
+
// linear transformation
|
|
176
|
+
const a = (v2 * x1 - v1 * x2) * det;
|
|
177
|
+
const b = (v2 * y1 - v1 * y2) * det;
|
|
178
|
+
const c = (u1 * x2 - u2 * x1) * det;
|
|
179
|
+
const d = (u1 * y2 - u2 * y1) * det;
|
|
180
|
+
// translation
|
|
181
|
+
const e = x0 - a * u0 - c * v0;
|
|
182
|
+
const f = y0 - b * u0 - d * v0;
|
|
183
|
+
ctx.save();
|
|
184
|
+
ctx.transform(a, b, c, d, e, f);
|
|
185
|
+
ctx.clip();
|
|
186
|
+
ctx.drawImage(img, 0, 0);
|
|
187
|
+
ctx.restore();
|
|
188
|
+
}
|
|
189
|
+
computeRegionVertices(slot, region, pma) {
|
|
190
|
+
let skeletonColor = slot.bone.skeleton.color;
|
|
191
|
+
let slotColor = slot.color;
|
|
192
|
+
let regionColor = region.color;
|
|
193
|
+
let alpha = skeletonColor.a * slotColor.a * regionColor.a;
|
|
194
|
+
let multiplier = pma ? alpha : 1;
|
|
195
|
+
let color = this.tempColor;
|
|
196
|
+
color.set(skeletonColor.r * slotColor.r * regionColor.r * multiplier, skeletonColor.g * slotColor.g * regionColor.g * multiplier, skeletonColor.b * slotColor.b * regionColor.b * multiplier, alpha);
|
|
197
|
+
region.computeWorldVertices(slot, this.vertices, 0, CanvasSkeletonRenderer.VERTEX_SIZE);
|
|
198
|
+
let vertices = this.vertices;
|
|
199
|
+
let uvs = region.uvs;
|
|
200
|
+
vertices[RegionAttachment.C1R] = color.r;
|
|
201
|
+
vertices[RegionAttachment.C1G] = color.g;
|
|
202
|
+
vertices[RegionAttachment.C1B] = color.b;
|
|
203
|
+
vertices[RegionAttachment.C1A] = color.a;
|
|
204
|
+
vertices[RegionAttachment.U1] = uvs[0];
|
|
205
|
+
vertices[RegionAttachment.V1] = uvs[1];
|
|
206
|
+
vertices[RegionAttachment.C2R] = color.r;
|
|
207
|
+
vertices[RegionAttachment.C2G] = color.g;
|
|
208
|
+
vertices[RegionAttachment.C2B] = color.b;
|
|
209
|
+
vertices[RegionAttachment.C2A] = color.a;
|
|
210
|
+
vertices[RegionAttachment.U2] = uvs[2];
|
|
211
|
+
vertices[RegionAttachment.V2] = uvs[3];
|
|
212
|
+
vertices[RegionAttachment.C3R] = color.r;
|
|
213
|
+
vertices[RegionAttachment.C3G] = color.g;
|
|
214
|
+
vertices[RegionAttachment.C3B] = color.b;
|
|
215
|
+
vertices[RegionAttachment.C3A] = color.a;
|
|
216
|
+
vertices[RegionAttachment.U3] = uvs[4];
|
|
217
|
+
vertices[RegionAttachment.V3] = uvs[5];
|
|
218
|
+
vertices[RegionAttachment.C4R] = color.r;
|
|
219
|
+
vertices[RegionAttachment.C4G] = color.g;
|
|
220
|
+
vertices[RegionAttachment.C4B] = color.b;
|
|
221
|
+
vertices[RegionAttachment.C4A] = color.a;
|
|
222
|
+
vertices[RegionAttachment.U4] = uvs[6];
|
|
223
|
+
vertices[RegionAttachment.V4] = uvs[7];
|
|
224
|
+
return vertices;
|
|
225
|
+
}
|
|
226
|
+
computeMeshVertices(slot, mesh, pma) {
|
|
227
|
+
let skeletonColor = slot.bone.skeleton.color;
|
|
228
|
+
let slotColor = slot.color;
|
|
229
|
+
let regionColor = mesh.color;
|
|
230
|
+
let alpha = skeletonColor.a * slotColor.a * regionColor.a;
|
|
231
|
+
let multiplier = pma ? alpha : 1;
|
|
232
|
+
let color = this.tempColor;
|
|
233
|
+
color.set(skeletonColor.r * slotColor.r * regionColor.r * multiplier, skeletonColor.g * slotColor.g * regionColor.g * multiplier, skeletonColor.b * slotColor.b * regionColor.b * multiplier, alpha);
|
|
234
|
+
let vertexCount = mesh.worldVerticesLength / 2;
|
|
235
|
+
let vertices = this.vertices;
|
|
236
|
+
if (vertices.length < mesh.worldVerticesLength)
|
|
237
|
+
this.vertices = vertices = Utils.newFloatArray(mesh.worldVerticesLength);
|
|
238
|
+
mesh.computeWorldVertices(slot, 0, mesh.worldVerticesLength, vertices, 0, CanvasSkeletonRenderer.VERTEX_SIZE);
|
|
239
|
+
let uvs = mesh.uvs;
|
|
240
|
+
for (let i = 0, u = 0, v = 2; i < vertexCount; i++) {
|
|
241
|
+
vertices[v++] = color.r;
|
|
242
|
+
vertices[v++] = color.g;
|
|
243
|
+
vertices[v++] = color.b;
|
|
244
|
+
vertices[v++] = color.a;
|
|
245
|
+
vertices[v++] = uvs[u++];
|
|
246
|
+
vertices[v++] = uvs[u++];
|
|
247
|
+
v += 2;
|
|
248
|
+
}
|
|
249
|
+
return vertices;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FudmFzU2tlbGV0b25SZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9DYW52YXNTa2VsZXRvblJlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUUvRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBWSxnQkFBZ0IsRUFBYSxjQUFjLEVBQTJDLE1BQU0sOEJBQThCLENBQUM7QUFFNUosTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUU3QyxNQUFNLE9BQU8sc0JBQXNCO0lBQ2xDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFdkIsR0FBRyxDQUEyQjtJQUUvQixpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDMUIsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUN0QixRQUFRLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDekMsU0FBUyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7SUFFaEMsWUFBYSxPQUFpQztRQUM3QyxJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxDQUFFLFFBQWtCO1FBQ3ZCLElBQUksSUFBSSxDQUFDLGlCQUFpQjtZQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7O1lBQ3BELElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVPLFVBQVUsQ0FBRSxRQUFrQjtRQUNyQyxJQUFJLEdBQUcsR0FBRyxJQUFJ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Q3pDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV2QyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN6QyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN6QyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN6QyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN6QyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdkMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDekMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDekMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7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Q0FBQztZQUN4QixRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDeEIsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN4QixRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6QixRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ1IsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEFwcmlsIDUsIDIwMjUuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyNSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFV0aWxzLCBDb2xvciwgU2tlbGV0b24sIFJlZ2lvbkF0dGFjaG1lbnQsIEJsZW5kTW9kZSwgTWVzaEF0dGFjaG1lbnQsIFNsb3QsIFRleHR1cmVSZWdpb24sIFRleHR1cmVBdGxhc1JlZ2lvbiB9IGZyb20gXCJAZXNvdGVyaWNzb2Z0d2FyZS9zcGluZS1jb3JlXCI7XG5cbmNvbnN0IHdvcmxkVmVydGljZXMgPSBVdGlscy5uZXdGbG9hdEFycmF5KDgpO1xuXG5leHBvcnQgY2xhc3MgQ2FudmFzU2tlbGV0b25SZW5kZXJlciB7XG5cdHN0YXRpYyBRVUFEX1RSSUFOR0xFUyA9IFswLCAxLCAyLCAyLCAzLCAwXTtcblx0c3RhdGljIFZFUlRFWF9TSVpFID0gMiArIDIgKyA0O1xuXG5cdHByaXZhdGUgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG5cblx0cHVibGljIHRyaWFuZ2xlUmVuZGVyaW5nID0gZmFsc2U7XG5cdHB1YmxpYyBkZWJ1Z1JlbmRlcmluZyA9IGZhbHNlO1xuXHRwcml2YXRlIHZlcnRpY2VzID0gVXRpbHMubmV3RmxvYXRBcnJheSg4ICogMTAyNCk7XG5cdHByaXZhdGUgdGVtcENvbG9yID0gbmV3IENvbG9yKCk7XG5cblx0Y29uc3RydWN0b3IgKGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCkge1xuXHRcdHRoaXMuY3R4ID0gY29udGV4dDtcblx0fVxuXG5cdGRyYXcgKHNrZWxldG9uOiBTa2VsZXRvbikge1xuXHRcdGlmICh0aGlzLnRyaWFuZ2xlUmVuZGVyaW5nKSB0aGlzLmRyYXdUcmlhbmdsZXMoc2tlbGV0b24pO1xuXHRcdGVsc2UgdGhpcy5kcmF3SW1hZ2VzKHNrZWxldG9uKTtcblx0fVxuXG5cdHByaXZhdGUgZHJhd0ltYWdlcyAoc2tlbGV0b246IFNrZWxldG9uKSB7XG5cdFx0bGV0IGN0eCA9IHRoaXMuY3R4O1xuXHRcdGxldCBjb2xvciA9IHRoaXMudGVtcENvbG9yO1xuXHRcdGxldCBza2VsZXRvbkNvbG9yID0gc2tlbGV0b24uY29sb3I7XG5cdFx0bGV0IGRyYXdPcmRlciA9IHNrZWxldG9uLmRyYXdPcmRlcjtcblxuXHRcdGlmICh0aGlzLmRlYnVnUmVuZGVyaW5nKSBjdHguc3Ryb2tlU3R5bGUgPSBcImdyZWVuXCI7XG5cblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IGRyYXdPcmRlci5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGxldCBzbG90ID0gZHJhd09yZGVyW2ldO1xuXHRcdFx0bGV0IGJvbmUgPSBzbG90LmJvbmU7XG5cdFx0XHRpZiAoIWJvbmUuYWN0aXZlKSBjb250aW51ZTtcblxuXHRcdFx0bGV0IGF0dGFjaG1lbnQgPSBzbG90LmdldEF0dGFjaG1lbnQoKTtcblx0XHRcdGlmICghKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBSZWdpb25BdHRhY2htZW50KSkgY29udGludWU7XG5cdFx0XHRhdHRhY2htZW50LmNvbXB1dGVXb3JsZFZlcnRpY2VzKHNsb3QsIHdvcmxkVmVydGljZXMsIDAsIDIpO1xuXHRcdFx0bGV0IHJlZ2lvbjogVGV4dHVyZVJlZ2lvbiA9IDxUZXh0dXJlUmVnaW9uPmF0dGFjaG1lbnQucmVnaW9uO1xuXG5cdFx0XHRsZXQgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQgPSAocmVnaW9uLnRleHR1cmUpLmdldEltYWdlKCkgYXMgSFRNTEltYWdlRWxlbWVudDtcblxuXHRcdFx0bGV0IHNsb3RDb2xvciA9IHNsb3QuY29sb3I7XG5cdFx0XHRsZXQgcmVnaW9uQ29sb3IgPSBhdHRhY2htZW50LmNvbG9yO1xuXHRcdFx0Y29sb3Iuc2V0KHNrZWxldG9uQ29sb3IuciAqIHNsb3RDb2xvci5yICogcmVnaW9uQ29sb3Iucixcblx0XHRcdFx0c2tlbGV0b25Db2xvci5nICogc2xvdENvbG9yLmcgKiByZWdpb25Db2xvci5nLFxuXHRcdFx0XHRza2VsZXRvbkNvbG9yLmIgKiBzbG90Q29sb3IuYiAqIHJlZ2lvbkNvbG9yLmIsXG5cdFx0XHRcdHNrZWxldG9uQ29sb3IuYSAqIHNsb3RDb2xvci5hICogcmVnaW9uQ29sb3IuYSk7XG5cblx0XHRcdGN0eC5zYXZlKCk7XG5cdFx0XHRjdHgudHJhbnNmb3JtKGJvbmUuYSwgYm9uZS5jLCBib25lLmIsIGJvbmUuZCwgYm9uZS53b3JsZFgsIGJvbmUud29ybGRZKTtcblx0XHRcdGN0eC50cmFuc2xhdGUoYXR0YWNobWVudC5vZmZzZXRbMF0sIGF0dGFjaG1lbnQub2Zmc2V0WzFdKTtcblx0XHRcdGN0eC5yb3RhdGUoYXR0YWNobWVudC5yb3RhdGlvbiAqIE1hdGguUEkgLyAxODApO1xuXG5cdFx0XHRsZXQgYXRsYXNTY2FsZSA9IGF0dGFjaG1lbnQud2lkdGggLyByZWdpb24ub3JpZ2luYWxXaWR0aDtcblx0XHRcdGN0eC5zY2FsZShhdGxhc1NjYWxlICogYXR0YWNobWVudC5zY2FsZVgsIGF0bGFzU2NhbGUgKiBhdHRhY2htZW50LnNjYWxlWSk7XG5cblx0XHRcdGxldCB3ID0gcmVnaW9uLndpZHRoLCBoID0gcmVnaW9uLmhlaWdodDtcblx0XHRcdGN0eC50cmFuc2xhdGUodyAvIDIsIGggLyAyKTtcblx0XHRcdGlmIChhdHRhY2htZW50LnJlZ2lvbiEuZGVncmVlcyA9PSA5MCkge1xuXHRcdFx0XHRsZXQgdCA9IHc7XG5cdFx0XHRcdHcgPSBoO1xuXHRcdFx0XHRoID0gdDtcblx0XHRcdFx0Y3R4LnJvdGF0ZSgtTWF0aC5QSSAvIDIpO1xuXHRcdFx0fVxuXHRcdFx0Y3R4LnNjYWxlKDEsIC0xKTtcblx0XHRcdGN0eC50cmFuc2xhdGUoLXcgLyAyLCAtaCAvIDIpO1xuXG5cdFx0XHRjdHguZ2xvYmFsQWxwaGEgPSBjb2xvci5hO1xuXHRcdFx0Y3R4LmRyYXdJbWFnZShpbWFnZSwgaW1hZ2Uud2lkdGggKiByZWdpb24udSwgaW1hZ2UuaGVpZ2h0ICogcmVnaW9uLnYsIHcsIGgsIDAsIDAsIHcsIGgpO1xuXHRcdFx0aWYgKHRoaXMuZGVidWdSZW5kZXJpbmcpIGN0eC5zdHJva2VSZWN0KDAsIDAsIHcsIGgpO1xuXHRcdFx0Y3R4LnJlc3RvcmUoKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGRyYXdUcmlhbmdsZXMgKHNrZWxldG9uOiBTa2VsZXRvbikge1xuXHRcdGxldCBjdHggPSB0aGlzLmN0eDtcblx0XHRsZXQgY29sb3IgPSB0aGlzLnRlbXBDb2xvcjtcblx0XHRsZXQgc2tlbGV0b25Db2xvciA9IHNrZWxldG9uLmNvbG9yO1xuXHRcdGxldCBkcmF3T3JkZXIgPSBza2VsZXRvbi5kcmF3T3JkZXI7XG5cblx0XHRsZXQgYmxlbmRNb2RlOiBCbGVuZE1vZGUgfCBudWxsID0gbnVsbDtcblx0XHRsZXQgdmVydGljZXM6IEFycmF5TGlrZTxudW1iZXI+ID0gdGhpcy52ZXJ0aWNlcztcblx0XHRsZXQgdHJpYW5nbGVzOiBBcnJheTxudW1iZXI+IHwgbnVsbCA9IG51bGw7XG5cblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IGRyYXdPcmRlci5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGxldCBzbG90ID0gZHJhd09yZGVyW2ldO1xuXHRcdFx0bGV0IGF0dGFjaG1lbnQgPSBzbG90LmdldEF0dGFjaG1lbnQoKTtcblxuXHRcdFx0bGV0IHRleHR1cmU6IEhUTUxJbWFnZUVsZW1lbnQ7XG5cdFx0XHRsZXQgcmVnaW9uOiBUZXh0dXJlQXRsYXNSZWdpb247XG5cdFx0XHRpZiAoYXR0YWNobWVudCBpbnN0YW5jZW9mIFJlZ2lvbkF0dGFjaG1lbnQpIHtcblx0XHRcdFx0bGV0IHJlZ2lvbkF0dGFjaG1lbnQgPSA8UmVnaW9uQXR0YWNobWVudD5hdHRhY2htZW50O1xuXHRcdFx0XHR2ZXJ0aWNlcyA9IHRoaXMuY29tcHV0ZVJlZ2lvblZlcnRpY2VzKHNsb3QsIHJlZ2lvbkF0dGFjaG1lbnQsIGZhbHNlKTtcblx0XHRcdFx0dHJpYW5nbGVzID0gQ2FudmFzU2tlbGV0b25SZW5kZXJlci5RVUFEX1RSSUFOR0xFUztcblx0XHRcdFx0dGV4dHVyZSA9IChyZWdpb25BdHRhY2htZW50LnJlZ2lvbiEudGV4dHVyZSkuZ2V0SW1hZ2UoKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuXHRcdFx0fSBlbHNlIGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgTWVzaEF0dGFjaG1lbnQpIHtcblx0XHRcdFx0bGV0IG1lc2ggPSA8TWVzaEF0dGFjaG1lbnQ+YXR0YWNobWVudDtcblx0XHRcdFx0dmVydGljZXMgPSB0aGlzLmNvbXB1dGVNZXNoVmVydGljZXMoc2xvdCwgbWVzaCwgZmFsc2UpO1xuXHRcdFx0XHR0cmlhbmdsZXMgPSBtZXNoLnRyaWFuZ2xlcztcblx0XHRcdFx0dGV4dHVyZSA9IChtZXNoLnJlZ2lvbiEudGV4dHVyZSkuZ2V0SW1hZ2UoKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuXHRcdFx0fSBlbHNlXG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRpZiAodGV4dHVyZSkge1xuXHRcdFx0XHRpZiAoc2xvdC5kYXRhLmJsZW5kTW9kZSAhPSBibGVuZE1vZGUpIGJsZW5kTW9kZSA9IHNsb3QuZGF0YS5ibGVuZE1vZGU7XG5cblx0XHRcdFx0bGV0IHNsb3RDb2xvciA9IHNsb3QuY29sb3I7XG5cdFx0XHRcdGxldCBhdHRhY2htZW50Q29sb3IgPSBhdHRhY2htZW50LmNvbG9yO1xuXHRcdFx0XHRjb2xvci5zZXQoc2tlbGV0b25Db2xvci5yICogc2xvdENvbG9yLnIgKiBhdHRhY2htZW50Q29sb3Iucixcblx0XHRcdFx0XHRza2VsZXRvbkNvbG9yLmcgKiBzbG90Q29sb3IuZyAqIGF0dGFjaG1lbnRDb2xvci5nLFxuXHRcdFx0XHRcdHNrZWxldG9uQ29sb3IuYiAqIHNsb3RDb2xvci5iICogYXR0YWNobWVudENvbG9yLmIsXG5cdFx0XHRcdFx0c2tlbGV0b25Db2xvci5hICogc2xvdENvbG9yLmEgKiBhdHRhY2htZW50Q29sb3IuYSk7XG5cblx0XHRcdFx0Y3R4Lmdsb2JhbEFscGhhID0gY29sb3IuYTtcblxuXHRcdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IHRyaWFuZ2xlcy5sZW5ndGg7IGogKz0gMykge1xuXHRcdFx0XHRcdGxldCB0MSA9IHRyaWFuZ2xlc1tqXSAqIDgsIHQyID0gdHJpYW5nbGVzW2ogKyAxXSAqIDgsIHQzID0gdHJpYW5nbGVzW2ogKyAyXSAqIDg7XG5cblx0XHRcdFx0XHRsZXQgeDAgPSB2ZXJ0aWNlc1t0MV0sIHkwID0gdmVydGljZXNbdDEgKyAxXSwgdTAgPSB2ZXJ0aWNlc1t0MSArIDZdLCB2MCA9IHZlcnRpY2VzW3QxICsgN107XG5cdFx0XHRcdFx0bGV0IHgxID0gdmVydGljZXNbdDJdLCB5MSA9IHZlcnRpY2VzW3QyICsgMV0sIHUxID0gdmVydGljZXNbdDIgKyA2XSwgdjEgPSB2ZXJ0aWNlc1t0MiArIDddO1xuXHRcdFx0XHRcdGxldCB4MiA9IHZlcnRpY2VzW3QzXSwgeTIgPSB2ZXJ0aWNlc1t0MyArIDFdLCB1MiA9IHZlcnRpY2VzW3QzICsgNl0sIHYyID0gdmVydGljZXNbdDMgKyA3XTtcblxuXHRcdFx0XHRcdHRoaXMuZHJhd1RyaWFuZ2xlKHRleHR1cmUsIHgwLCB5MCwgdTAsIHYwLCB4MSwgeTEsIHUxLCB2MSwgeDIsIHkyLCB1MiwgdjIpO1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuZGVidWdSZW5kZXJpbmcpIHtcblx0XHRcdFx0XHRcdGN0eC5zdHJva2VTdHlsZSA9IFwiZ3JlZW5cIjtcblx0XHRcdFx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRcdGN0eC5tb3ZlVG8oeDAsIHkwKTtcblx0XHRcdFx0XHRcdGN0eC5saW5lVG8oeDEsIHkxKTtcblx0XHRcdFx0XHRcdGN0eC5saW5lVG8oeDIsIHkyKTtcblx0XHRcdFx0XHRcdGN0eC5saW5lVG8oeDAsIHkwKTtcblx0XHRcdFx0XHRcdGN0eC5zdHJva2UoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmN0eC5nbG9iYWxBbHBoYSA9IDE7XG5cdH1cblxuXHQvLyBBZGFwdGVkIGZyb20gaHR0cDovL2V4dHJlbWVseXNhdGlzZmFjdG9yeXRvdGFsaXRhcmlhbmlzbS5jb20vYmxvZy8/cD0yMTIwXG5cdC8vIEFwYWNoZSAyIGxpY2Vuc2VkXG5cdHByaXZhdGUgZHJhd1RyaWFuZ2xlIChpbWc6IEhUTUxJbWFnZUVsZW1lbnQsIHgwOiBudW1iZXIsIHkwOiBudW1iZXIsIHUwOiBudW1iZXIsIHYwOiBudW1iZXIsXG5cdFx0eDE6IG51bWJlciwgeTE6IG51bWJlciwgdTE6IG51bWJlciwgdjE6IG51bWJlcixcblx0XHR4MjogbnVtYmVyLCB5MjogbnVtYmVyLCB1MjogbnVtYmVyLCB2MjogbnVtYmVyKSB7XG5cdFx0bGV0IGN0eCA9IHRoaXMuY3R4O1xuXG5cdFx0Y29uc3Qgd2lkdGggPSBpbWcud2lkdGggLSAxO1xuXHRcdGNvbnN0IGhlaWdodCA9IGltZy5oZWlnaHQgLSAxO1xuXHRcdHUwICo9IHdpZHRoO1xuXHRcdHYwICo9IGhlaWdodDtcblx0XHR1MSAqPSB3aWR0aDtcblx0XHR2MSAqPSBoZWlnaHQ7XG5cdFx0dTIgKj0gd2lkdGg7XG5cdFx0djIgKj0gaGVpZ2h0O1xuXG5cdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdGN0eC5tb3ZlVG8oeDAsIHkwKTtcblx0XHRjdHgubGluZVRvKHgxLCB5MSk7XG5cdFx0Y3R4LmxpbmVUbyh4MiwgeTIpO1xuXHRcdGN0eC5jbG9zZVBhdGgoKTtcblxuXHRcdHgxIC09IHgwO1xuXHRcdHkxIC09IHkwO1xuXHRcdHgyIC09IHgwO1xuXHRcdHkyIC09IHkwO1xuXG5cdFx0dTEgLT0gdTA7XG5cdFx0djEgLT0gdjA7XG5cdFx0dTIgLT0gdTA7XG5cdFx0djIgLT0gdjA7XG5cblx0XHRsZXQgZGV0ID0gdTEgKiB2MiAtIHUyICogdjE7XG5cdFx0aWYgKGRldCA9PSAwKSByZXR1cm47XG5cdFx0ZGV0ID0gMSAvIGRldDtcblxuXHRcdC8vIGxpbmVhciB0cmFuc2Zvcm1hdGlvblxuXHRcdGNvbnN0IGEgPSAodjIgKiB4MSAtIHYxICogeDIpICogZGV0O1xuXHRcdGNvbnN0IGIgPSAodjIgKiB5MSAtIHYxICogeTIpICogZGV0O1xuXHRcdGNvbnN0IGMgPSAodTEgKiB4MiAtIHUyICogeDEpICogZGV0O1xuXHRcdGNvbnN0IGQgPSAodTEgKiB5MiAtIHUyICogeTEpICogZGV0O1xuXG5cdFx0Ly8gdHJhbnNsYXRpb25cblx0XHRjb25zdCBlID0geDAgLSBhICogdTAgLSBjICogdjA7XG5cdFx0Y29uc3QgZiA9IHkwIC0gYiAqIHUwIC0gZCAqIHYwO1xuXG5cdFx0Y3R4LnNhdmUoKTtcblx0XHRjdHgudHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpO1xuXHRcdGN0eC5jbGlwKCk7XG5cdFx0Y3R4LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuXHRcdGN0eC5yZXN0b3JlKCk7XG5cdH1cblxuXHRwcml2YXRlIGNvbXB1dGVSZWdpb25WZXJ0aWNlcyAoc2xvdDogU2xvdCwgcmVnaW9uOiBSZWdpb25BdHRhY2htZW50LCBwbWE6IGJvb2xlYW4pIHtcblx0XHRsZXQgc2tlbGV0b25Db2xvciA9IHNsb3QuYm9uZS5za2VsZXRvbi5jb2xvcjtcblx0XHRsZXQgc2xvdENvbG9yID0gc2xvdC5jb2xvcjtcblx0XHRsZXQgcmVnaW9uQ29sb3IgPSByZWdpb24uY29sb3I7XG5cdFx0bGV0IGFscGhhID0gc2tlbGV0b25Db2xvci5hICogc2xvdENvbG9yLmEgKiByZWdpb25Db2xvci5hO1xuXHRcdGxldCBtdWx0aXBsaWVyID0gcG1hID8gYWxwaGEgOiAxO1xuXHRcdGxldCBjb2xvciA9IHRoaXMudGVtcENvbG9yO1xuXHRcdGNvbG9yLnNldChza2VsZXRvbkNvbG9yLnIgKiBzbG90Q29sb3IuciAqIHJlZ2lvbkNvbG9yLnIgKiBtdWx0aXBsaWVyLFxuXHRcdFx0c2tlbGV0b25Db2xvci5nICogc2xvdENvbG9yLmcgKiByZWdpb25Db2xvci5nICogbXVsdGlwbGllcixcblx0XHRcdHNrZWxldG9uQ29sb3IuYiAqIHNsb3RDb2xvci5iICogcmVnaW9uQ29sb3IuYiAqIG11bHRpcGxpZXIsXG5cdFx0XHRhbHBoYSk7XG5cblx0XHRyZWdpb24uY29tcHV0ZVdvcmxkVmVydGljZXMoc2xvdCwgdGhpcy52ZXJ0aWNlcywgMCwgQ2FudmFzU2tlbGV0b25SZW5kZXJlci5WRVJURVhfU0laRSk7XG5cblx0XHRsZXQgdmVydGljZXMgPSB0aGlzLnZlcnRpY2VzO1xuXHRcdGxldCB1dnMgPSByZWdpb24udXZzO1xuXG5cdFx0dmVydGljZXNbUmVnaW9uQXR0YWNobWVudC5DMVJdID0gY29sb3Iucjtcblx0XHR2ZXJ0aWNlc1tSZWdpb25BdHRhY2htZW50LkMxR10gPSBjb2xvci5nO1xuXHRcdHZlcnRpY2VzW1JlZ2lvbkF0dGFjaG1lbnQuQzFCXSA9IGNvbG9yLmI7XG5cdFx0dmVydGljZXNbUmVnaW9uQXR0YWNobWVudC5DMUFdID0gY29sb3IuYTtcblx0XHR2ZXJ0aWNlc1tSZWdpb25BdHRhY2htZW50LlUxXSA9IHV2c1swXTtcblx0XHR2ZXJ0aWNlc1tSZWdpb25BdHRhY2htZW50LlYxXSA9IHV2c1sxXTtcblxuXHRcdHZlcnRpY2VzW1JlZ2lvbkF0dGFjaG1lbnQuQzJSXSA9IGNvbG9yLnI7XG5cdFx0dmVydGljZXNbUmVnaW9uQXR0YWNobWVudC5DMkddID0gY29sb3IuZztcblx0XHR2ZXJ0aWNlc1tSZWdpb25BdHRhY2htZW50LkMyQl0gPSBjb2xvci5iO1xuXHRcdHZlcnRpY2VzW1JlZ2lvbkF0dGFjaG1lbnQuQzJBXSA9IGNvbG9yLmE7XG5cdFx0dmVydGljZXNbUmVnaW9uQXR0YWNobWVudC5VMl0gPSB1dnNbMl07XG5cdFx0dmVydGljZXNbUmVnaW9uQXR0YWNobWVudC5WMl0gPSB1dnNbM107XG5cblx0XHR2ZXJ0aWNlc1tSZWdpb25BdHRhY2htZW50LkMzUl0gPSBjb2xvci5yO1xuXHRcdHZlcnRpY2VzW1JlZ2lvbkF0dGFjaG1lbnQuQzNHXSA9IGNvbG9yLmc7XG5cdFx0dmVydGljZXNbUmVnaW9uQXR0YWNobWVudC5DM0JdID0gY29sb3IuYjtcblx0XHR2ZXJ0aWNlc1tSZWdpb25BdHRhY2htZW50LkMzQV0gPSBjb2xvci5hO1xuXHRcdHZlcnRpY2VzW1JlZ2lvbkF0dGFjaG1lbnQuVTNdID0gdXZzWzRdO1xuXHRcdHZlcnRpY2VzW1JlZ2lvbkF0dGFjaG1lbnQuVjNdID0gdXZzWzVdO1xuXG5cdFx0dmVydGljZXNbUmVnaW9uQXR0YWNobWVudC5DNFJdID0gY29sb3Iucjtcblx0XHR2ZXJ0aWNlc1tSZWdpb25BdHRhY2htZW50LkM0R10gPSBjb2xvci5nO1xuXHRcdHZlcnRpY2VzW1JlZ2lvbkF0dGFjaG1lbnQuQzRCXSA9IGNvbG9yLmI7XG5cdFx0dmVydGljZXNbUmVnaW9uQXR0YWNobWVudC5DNEFdID0gY29sb3IuYTtcblx0XHR2ZXJ0aWNlc1tSZWdpb25BdHRhY2htZW50LlU0XSA9IHV2c1s2XTtcblx0XHR2ZXJ0aWNlc1tSZWdpb25BdHRhY2htZW50LlY0XSA9IHV2c1s3XTtcblxuXHRcdHJldHVybiB2ZXJ0aWNlcztcblx0fVxuXG5cdHByaXZhdGUgY29tcHV0ZU1lc2hWZXJ0aWNlcyAoc2xvdDogU2xvdCwgbWVzaDogTWVzaEF0dGFjaG1lbnQsIHBtYTogYm9vbGVhbikge1xuXHRcdGxldCBza2VsZXRvbkNvbG9yID0gc2xvdC5ib25lLnNrZWxldG9uLmNvbG9yO1xuXHRcdGxldCBzbG90Q29sb3IgPSBzbG90LmNvbG9yO1xuXHRcdGxldCByZWdpb25Db2xvciA9IG1lc2guY29sb3I7XG5cdFx0bGV0IGFscGhhID0gc2tlbGV0b25Db2xvci5hICogc2xvdENvbG9yLmEgKiByZWdpb25Db2xvci5hO1xuXHRcdGxldCBtdWx0aXBsaWVyID0gcG1hID8gYWxwaGEgOiAxO1xuXHRcdGxldCBjb2xvciA9IHRoaXMudGVtcENvbG9yO1xuXHRcdGNvbG9yLnNldChza2VsZXRvbkNvbG9yLnIgKiBzbG90Q29sb3IuciAqIHJlZ2lvbkNvbG9yLnIgKiBtdWx0aXBsaWVyLFxuXHRcdFx0c2tlbGV0b25Db2xvci5nICogc2xvdENvbG9yLmcgKiByZWdpb25Db2xvci5nICogbXVsdGlwbGllcixcblx0XHRcdHNrZWxldG9uQ29sb3IuYiAqIHNsb3RDb2xvci5iICogcmVnaW9uQ29sb3IuYiAqIG11bHRpcGxpZXIsXG5cdFx0XHRhbHBoYSk7XG5cblx0XHRsZXQgdmVydGV4Q291bnQgPSBtZXNoLndvcmxkVmVydGljZXNMZW5ndGggLyAyO1xuXHRcdGxldCB2ZXJ0aWNlcyA9IHRoaXMudmVydGljZXM7XG5cdFx0aWYgKHZlcnRpY2VzLmxlbmd0aCA8IG1lc2gud29ybGRWZXJ0aWNlc0xlbmd0aCkgdGhpcy52ZXJ0aWNlcyA9IHZlcnRpY2VzID0gVXRpbHMubmV3RmxvYXRBcnJheShtZXNoLndvcmxkVmVydGljZXNMZW5ndGgpO1xuXHRcdG1lc2guY29tcHV0ZVdvcmxkVmVydGljZXMoc2xvdCwgMCwgbWVzaC53b3JsZFZlcnRpY2VzTGVuZ3RoLCB2ZXJ0aWNlcywgMCwgQ2FudmFzU2tlbGV0b25SZW5kZXJlci5WRVJURVhfU0laRSk7XG5cblx0XHRsZXQgdXZzID0gbWVzaC51dnM7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIHUgPSAwLCB2ID0gMjsgaSA8IHZlcnRleENvdW50OyBpKyspIHtcblx0XHRcdHZlcnRpY2VzW3YrK10gPSBjb2xvci5yO1xuXHRcdFx0dmVydGljZXNbdisrXSA9IGNvbG9yLmc7XG5cdFx0XHR2ZXJ0aWNlc1t2KytdID0gY29sb3IuYjtcblx0XHRcdHZlcnRpY2VzW3YrK10gPSBjb2xvci5hO1xuXHRcdFx0dmVydGljZXNbdisrXSA9IHV2c1t1KytdO1xuXHRcdFx0dmVydGljZXNbdisrXSA9IHV2c1t1KytdO1xuXHRcdFx0diArPSAyO1xuXHRcdH1cblxuXHRcdHJldHVybiB2ZXJ0aWNlcztcblx0fVxufVxuIl19
|