dcl-npc-toolkit 0.0.0 → 1.0.5

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/dist/npc.js ADDED
@@ -0,0 +1,365 @@
1
+ import { Animator, AvatarShape, Billboard, engine, GltfContainer, MeshCollider, MeshRenderer, pointerEventsSystem, Transform } from '@dcl/sdk/ecs';
2
+ import { Color3, Quaternion, Vector3 } from '@dcl/sdk/math';
3
+ import { NPCPathType, NPCState, NPCType } from './types';
4
+ import * as utils from '@dcl-sdk/utils';
5
+ import { IsFollowingPath } from './components';
6
+ import { handleDialogTyping, handlePathTimes } from './systems';
7
+ import { createDialog } from './ui';
8
+ import { addDialog, closeDialog, npcDialogComponent } from './dialog';
9
+ export const walkingTimers = new Map();
10
+ export const npcDataComponent = new Map();
11
+ export let activeNPC = 0;
12
+ const walkingSystem = engine.addSystem(handlePathTimes);
13
+ const dialogSystem = engine.addSystem(handleDialogTyping);
14
+ const isCooldown = new Map();
15
+ const onActivateCbs = new Map();
16
+ const onWalkAwayCbs = new Map();
17
+ const animTimers = new Map();
18
+ const pointReachedCallbacks = new Map();
19
+ const onFinishCallbacks = new Map();
20
+ export function showDebug(debug) {
21
+ utils.triggers.enableDebugDraw(debug);
22
+ }
23
+ export function getData(npc) {
24
+ return npcDataComponent.get(npc);
25
+ }
26
+ export function create(transform, data) {
27
+ let npc = engine.addEntity();
28
+ let t = { position: transform.position ? transform.position : Vector3.create(0, 0, 0), rotation: transform.rotation ? transform.rotation : Quaternion.Zero(), scale: transform.scale ? transform.scale : Vector3.One() };
29
+ Transform.create(npc, t);
30
+ npcDataComponent.set(npc, {
31
+ introduced: false,
32
+ inCooldown: false,
33
+ coolDownDuration: data && data.coolDownDuration ? data.coolDownDuration : 5,
34
+ faceUser: data.faceUser,
35
+ walkingSpeed: 2,
36
+ walkingAnim: data && data.walkingAnim ? data.walkingAnim : undefined,
37
+ bubbleHeight: 2,
38
+ pathData: data.pathData ? data.pathData : undefined,
39
+ currentPathData: [],
40
+ manualStop: false,
41
+ pathIndex: 0,
42
+ state: NPCState.STANDING
43
+ });
44
+ if (data && data.noUI) { }
45
+ else if (data && data.portrait) { }
46
+ else {
47
+ addDialog(npc, data && data.dialogSound ? data.dialogSound : undefined);
48
+ createDialog(npc);
49
+ }
50
+ onActivateCbs.set(npc, () => {
51
+ data.onActivate();
52
+ });
53
+ if (data && data.hasOwnProperty("onWalkAway")) {
54
+ onWalkAwayCbs.set(npc, () => {
55
+ if (!data || !data.continueOnWalkAway) {
56
+ if (npcDialogComponent.has(npc)) {
57
+ npcDialogComponent.get(npc).visible = false;
58
+ }
59
+ }
60
+ else {
61
+ if (npcDialogComponent.has(npc)) {
62
+ npcDialogComponent.get(npc).visible = false;
63
+ }
64
+ }
65
+ data.onWalkAway();
66
+ });
67
+ }
68
+ addNPCBones(npc, data);
69
+ addClickReactions(npc, data);
70
+ addTriggerArea(npc, data);
71
+ if (data && data.pathData && data.pathData.speed) {
72
+ let npcData = npcDataComponent.get(npc);
73
+ npcData.walkingSpeed = data.pathData.speed;
74
+ }
75
+ if (data && data.coolDownDuration) {
76
+ let npcData = npcDataComponent.get(npc);
77
+ npcData.coolDownDuration = data.coolDownDuration;
78
+ }
79
+ if (data && data.pathData) {
80
+ let npcData = npcDataComponent.get(npc);
81
+ followPath(npc, npcData.pathData);
82
+ }
83
+ return npc;
84
+ }
85
+ function addNPCBones(npc, data) {
86
+ switch (data.type) {
87
+ case NPCType.AVATAR:
88
+ AvatarShape.create(npc, {
89
+ id: "npc",
90
+ name: "NPC",
91
+ bodyShape: "urn:decentraland:off-chain:base-avatars:BaseMale",
92
+ emotes: [],
93
+ wearables: [
94
+ "urn:decentraland:off-chain:base-avatars:f_eyes_00",
95
+ "urn:decentraland:off-chain:base-avatars:f_eyebrows_00",
96
+ "urn:decentraland:off-chain:base-avatars:f_mouth_00",
97
+ "urn:decentraland:off-chain:base-avatars:comfy_sport_sandals",
98
+ "urn:decentraland:off-chain:base-avatars:soccer_pants",
99
+ "urn:decentraland:off-chain:base-avatars:elegant_sweater",
100
+ ],
101
+ });
102
+ break;
103
+ case NPCType.CUSTOM:
104
+ GltfContainer.create(npc, {
105
+ src: data && data.model ? data.model : ""
106
+ });
107
+ Animator.create(npc, {
108
+ states: [{
109
+ name: data && data.idleAnim ? data.idleAnim : 'Idle',
110
+ clip: data && data.idleAnim ? data.idleAnim : 'Idle',
111
+ loop: true
112
+ }]
113
+ });
114
+ npcDataComponent.get(npc).idleAnim = data && data.idleAnim ? data.idleAnim : 'Idle';
115
+ Animator.playSingleAnimation(npc, npcDataComponent.get(npc).idleAnim);
116
+ let npcData = npcDataComponent.get(npc);
117
+ npcData.lastPlayedAnim = npcDataComponent.get(npc).idleAnim;
118
+ if (data && data.walkingAnim) {
119
+ npcDataComponent.get(npc).walkingAnim = data.walkingAnim;
120
+ let animations = Animator.getMutable(npc);
121
+ animations.states.push({ name: data.walkingAnim, clip: data.walkingAnim, loop: true });
122
+ }
123
+ break;
124
+ case NPCType.BLANK:
125
+ MeshRenderer.setBox(npc);
126
+ MeshCollider.setBox(npc);
127
+ break;
128
+ }
129
+ }
130
+ function addClickReactions(npc, data) {
131
+ let activateButton = data && data.onlyClickTrigger ? 0 : 1;
132
+ pointerEventsSystem.onPointerDown(npc, function () {
133
+ if (isCooldown.has(npc) || (npcDialogComponent.get(npc).visible))
134
+ return;
135
+ activate(npc);
136
+ }, {
137
+ button: activateButton,
138
+ hoverText: data && data.hoverText ? data.hoverText : 'Talk',
139
+ showFeedback: data && data.onlyExternalTrigger ? false : true,
140
+ });
141
+ if (data && data.onlyExternalTrigger) {
142
+ pointerEventsSystem.removeOnPointerDown(npc);
143
+ }
144
+ }
145
+ function addTriggerArea(npc, data) {
146
+ let triggerData = {};
147
+ if (!data || (data && !data.onlyExternalTrigger && !data.onlyClickTrigger && !data.onlyETrigger)) {
148
+ onActivateCbs.set(npc, () => {
149
+ if (isCooldown.has(npc)) {
150
+ console.log(npc, ' in cooldown');
151
+ return;
152
+ }
153
+ else if ((npcDialogComponent.has(npc) && npcDialogComponent.get(npc).visible) ||
154
+ (data && data.onlyExternalTrigger) ||
155
+ (data && data.onlyClickTrigger)) {
156
+ return;
157
+ }
158
+ data.onActivate();
159
+ });
160
+ triggerData.onCameraEnter = onActivateCbs.get(npc);
161
+ }
162
+ if (!data || (data && !data.continueOnWalkAway)) {
163
+ triggerData.onCameraExit = () => {
164
+ handleWalkAway(npc);
165
+ };
166
+ }
167
+ if (!data ||
168
+ (data && !data.onlyExternalTrigger && !data.onlyClickTrigger && !data.onlyETrigger)) {
169
+ triggerData.onCameraEnter = () => {
170
+ if (isCooldown.has(npc)) {
171
+ console.log(npc, ' in cooldown');
172
+ return;
173
+ }
174
+ activate(npc);
175
+ };
176
+ }
177
+ if (triggerData.onCameraEnter || triggerData.onCameraExit) {
178
+ utils.triggers.addTrigger(npc, 254, 1, [{ type: 'sphere', position: Vector3.Zero(), radius: data.reactDistance != undefined ? data.reactDistance : 6 }], triggerData.onCameraEnter ? triggerData.onCameraEnter : undefined, triggerData.onCameraExit ? triggerData.onCameraExit : undefined, Color3.Red());
179
+ }
180
+ }
181
+ export function followPath(npc, data) {
182
+ let npcData = npcDataComponent.get(npc);
183
+ let path = [];
184
+ if (data) {
185
+ npcData.pathData = data;
186
+ if (npcData.faceUser) {
187
+ Billboard.deleteFrom(npc);
188
+ }
189
+ if (data.startingPoint) {
190
+ data.path?.splice(0, data.startingPoint - 1);
191
+ }
192
+ let pos = Transform.get(npc).position;
193
+ path.push(Vector3.create(pos.x, pos.y, pos.z));
194
+ data.path?.forEach((p) => {
195
+ path.push(p);
196
+ });
197
+ onFinishCallbacks.set(npc, () => {
198
+ console.log('on finished callback');
199
+ if (data && data.onFinishCallback && !data.loop) {
200
+ data.onFinishCallback;
201
+ }
202
+ stopPath(npc);
203
+ });
204
+ pointReachedCallbacks.set(npc, () => {
205
+ console.log('on point reached callback');
206
+ let data = npcDataComponent.get(npc);
207
+ data.pathIndex += 1;
208
+ data.onReachedPointCallback ? data.onReachedPointCallback : undefined;
209
+ });
210
+ walkNPC(npc, npcData, data.pathType, data.totalDuration, path, pointReachedCallbacks.get(npc), onFinishCallbacks.get(npc));
211
+ }
212
+ else {
213
+ if (npcData.manualStop) {
214
+ console.log('we have manual stop, need to pick back up where we left off');
215
+ }
216
+ else {
217
+ console.log('we are trying to follow a path witout starting one prior');
218
+ }
219
+ }
220
+ }
221
+ function walkNPC(npc, npcData, type, duration, path, pointReachedCallback, finishedCallback) {
222
+ if (IsFollowingPath.has(npc)) {
223
+ IsFollowingPath.deleteFrom(npc);
224
+ walkingTimers.delete(npc);
225
+ }
226
+ IsFollowingPath.create(npc);
227
+ if (type) {
228
+ if (type == NPCPathType.RIGID_PATH) {
229
+ utils.paths.startStraightPath(npc, path, duration, true, () => { finishedCallback(); }, () => { pointReachedCallback(); });
230
+ }
231
+ else {
232
+ utils.paths.startSmoothPath(npc, path, duration, 30, true, () => { finishedCallback(); }, () => { pointReachedCallback(); });
233
+ }
234
+ }
235
+ else {
236
+ utils.paths.startSmoothPath(npc, path, duration, 20, true, () => { finishedCallback(); }, () => { pointReachedCallback(); });
237
+ }
238
+ if (npcData.walkingAnim) {
239
+ Animator.playSingleAnimation(npc, npcDataComponent.get(npc).walkingAnim, true);
240
+ npcData.lastPlayedAnim = npcDataComponent.get(npc).walkingAnim;
241
+ }
242
+ npcData.state = NPCState.FOLLOWPATH;
243
+ console.log('debug here');
244
+ }
245
+ export function stopWalking(npc, duration, finished) {
246
+ let npcData = npcDataComponent.get(npc);
247
+ npcData.state = NPCState.STANDING;
248
+ npcData.manualStop = true;
249
+ stopPath(npc);
250
+ if (duration) {
251
+ utils.timers.setTimeout(() => {
252
+ if (npcData.path) {
253
+ Animator.stopAllAnimations(npc, true);
254
+ if (npcDataComponent.get(npc).walkingAnim) {
255
+ Animator.playSingleAnimation(npc, npcDataComponent.get(npc).walkingAnim, true);
256
+ npcData.lastPlayedAnim = npcDataComponent.get(npc).walkingAnim;
257
+ }
258
+ let duration = npcData.pathData.totalDuration;
259
+ let currentTimer = walkingTimers.get(npc);
260
+ console.log('current time is', currentTimer);
261
+ if (currentTimer) {
262
+ duration -= currentTimer;
263
+ }
264
+ let path = [];
265
+ npcData.pathData.path.forEach((p) => {
266
+ path.push(p);
267
+ });
268
+ path.splice(0, npcData.pathIndex);
269
+ let pos = Transform.get(npc).position;
270
+ path.unshift(Vector3.create(pos.x, pos.y, pos.z));
271
+ npcData.manualStop = false;
272
+ walkNPC(npc, npcData, npcData.pathData.pathType, duration, path, pointReachedCallbacks.get(npc), onFinishCallbacks.get(npc));
273
+ }
274
+ }, duration * 1000);
275
+ }
276
+ }
277
+ function stopPath(npc) {
278
+ utils.paths.stopPath(npc);
279
+ IsFollowingPath.deleteFrom(npc);
280
+ let npcData = npcDataComponent.get(npc);
281
+ if (npcData.walkingAnim) {
282
+ Animator.playSingleAnimation(npc, npcDataComponent.get(npc).walkingAnim);
283
+ npcData.lastPlayedAnim = npcData.idleAnim;
284
+ }
285
+ if (!npcData.manualStop) {
286
+ if (npcData.pathData.loop) {
287
+ npcData.pathIndex = 0;
288
+ walkingTimers.delete(npc);
289
+ console.log('we are looping path', npcData);
290
+ followPath(npc, npcData.pathData);
291
+ console.log(npcData);
292
+ }
293
+ }
294
+ }
295
+ export function activate(npc) {
296
+ activeNPC = npc;
297
+ onActivateCbs.get(npc)();
298
+ let npcData = npcDataComponent.get(npc);
299
+ if (npcData.faceUser) {
300
+ Billboard.create(npc, {
301
+ billboardMode: 2
302
+ });
303
+ }
304
+ isCooldown.set(npc, true);
305
+ npcData.inCooldown = true;
306
+ utils.timers.setTimeout(function () {
307
+ isCooldown.delete(npc);
308
+ npcDataComponent.get(npc).inCooldown = false;
309
+ if (Billboard.has(npc)) {
310
+ Billboard.deleteFrom(npc);
311
+ }
312
+ }, 1000 * npcData.coolDownDuration);
313
+ console.log('activated npc,', npcDataComponent.get(npc));
314
+ }
315
+ function endInteraction(npc) {
316
+ let npcData = npcDataComponent.get(npc);
317
+ npcData.state = NPCState.STANDING;
318
+ if (npcDialogComponent.has(npc) && npcDialogComponent.get(npc).visible) {
319
+ closeDialog(npc);
320
+ }
321
+ if (npcData.faceUser) {
322
+ Billboard.deleteFrom(npc);
323
+ }
324
+ }
325
+ export function handleWalkAway(npc) {
326
+ let npcData = npcDataComponent.get(npc);
327
+ if (npcData.state == NPCState.FOLLOWPATH) {
328
+ return;
329
+ }
330
+ endInteraction(npc);
331
+ if (onWalkAwayCbs.get(npc)) {
332
+ onWalkAwayCbs.get(npc)();
333
+ }
334
+ }
335
+ export function playAnimation(npc, anim, noLoop, duration) {
336
+ let animations = Animator.getMutable(npc);
337
+ if (animations.states.filter((animation) => animation.name === anim).length == 0) {
338
+ animations.states.push({ name: anim, clip: anim, loop: noLoop ? false : true });
339
+ }
340
+ let npcData = npcDataComponent.get(npc);
341
+ if (npcData.state == NPCState.FOLLOWPATH) {
342
+ utils.paths.stopPath(npc);
343
+ }
344
+ if (animTimers.has(npc)) {
345
+ utils.timers.clearTimeout(animTimers.get(npc));
346
+ animTimers.delete(npc);
347
+ }
348
+ Animator.stopAllAnimations(npc);
349
+ Animator.playSingleAnimation(npc, anim, true);
350
+ if (duration) {
351
+ animTimers.set(npc, utils.timers.setTimeout(() => {
352
+ animTimers.delete(npc);
353
+ }, 1000 * duration));
354
+ }
355
+ npcData.lastPlayedAnim = anim;
356
+ }
357
+ export function changeIdleAnim(npc, animation, play) {
358
+ let npcData = npcDataComponent.get(npc);
359
+ npcData.idleAnim = animation;
360
+ if (play) {
361
+ playAnimation(npc, animation, true);
362
+ npcDataComponent.get(npc).lastPlayedAnim = animation;
363
+ }
364
+ }
365
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25wYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQWlCLE1BQU0sRUFBVSxhQUFhLEVBQWMsWUFBWSxFQUFDLFlBQVksRUFBQyxtQkFBbUIsRUFBQyxTQUFTLEVBQWlCLE1BQU0sY0FBYyxDQUFBO0FBQ2pNLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUMzRCxPQUFPLEVBQTJCLFdBQVcsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFlLE1BQU0sU0FBUyxDQUFDO0FBQy9GLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUE7QUFDdkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFdEUsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUF1QixJQUFJLEdBQUcsRUFBRSxDQUFBO0FBQzFELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFxQixJQUFJLEdBQUcsRUFBRSxDQUFBO0FBQzNELE1BQU0sQ0FBQyxJQUFJLFNBQVMsR0FBVSxDQUFDLENBQUE7QUFFL0IsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQTtBQUN2RCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUE7QUFFekQsTUFBTSxVQUFVLEdBQXFCLElBQUksR0FBRyxFQUFFLENBQUE7QUFDOUMsTUFBTSxhQUFhLEdBQXFCLElBQUksR0FBRyxFQUFFLENBQUE7QUFDakQsTUFBTSxhQUFhLEdBQXFCLElBQUksR0FBRyxFQUFFLENBQUE7QUFDakQsTUFBTSxVQUFVLEdBQW9CLElBQUksR0FBRyxFQUFFLENBQUE7QUFDN0MsTUFBTSxxQkFBcUIsR0FBcUIsSUFBSSxHQUFHLEVBQUUsQ0FBQTtBQUN6RCxNQUFNLGlCQUFpQixHQUFxQixJQUFJLEdBQUcsRUFBRSxDQUFBO0FBRXJELE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBYTtJQUNuQyxLQUFLLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUN6QyxDQUFDO0FBRUQsTUFBTSxVQUFVLE9BQU8sQ0FBQyxHQUFVO0lBQzlCLE9BQU8sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ3BDLENBQUM7QUFFRCxNQUFNLFVBQVUsTUFBTSxDQUNsQixTQUFjLEVBQ2QsSUFBYTtJQUViLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQTtJQUU1QixJQUFJLENBQUMsR0FBaUIsRUFBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBQyxDQUFBO0lBQ2xPLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBRXhCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUM7UUFDckIsVUFBVSxFQUFFLEtBQUs7UUFDakIsVUFBVSxFQUFFLEtBQUs7UUFDakIsZ0JBQWdCLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNFLFFBQVEsRUFBQyxJQUFJLENBQUMsUUFBUTtRQUN0QixZQUFZLEVBQUMsQ0FBQztRQUNkLFdBQVcsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUNwRSxZQUFZLEVBQUMsQ0FBQztRQUNkLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ25ELGVBQWUsRUFBRSxFQUFFO1FBQ25CLFVBQVUsRUFBQyxLQUFLO1FBQ2hCLFNBQVMsRUFBQyxDQUFDO1FBQ1gsS0FBSyxFQUFDLFFBQVEsQ0FBQyxRQUFRO0tBQzFCLENBQUMsQ0FBQTtJQUVGLElBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUMsR0FBRTtTQUNsQixJQUFHLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFDLEdBQUU7U0FDNUI7UUFDQSxTQUFTLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN2RSxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUE7S0FDcEI7SUFFRCxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFFLEVBQUU7UUFDdkIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFBO0lBQ3JCLENBQUMsQ0FBQyxDQUFBO0lBRUYsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsRUFBRTtRQUMzQyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFFLEVBQUU7WUFDdkIsSUFBRyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBQztnQkFDakMsSUFBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUM7b0JBQzNCLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFBO2lCQUM5QzthQUNKO2lCQUNHO2dCQUNBLElBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFDO29CQUMzQixrQkFBa0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQTtpQkFDOUM7YUFDSjtZQUNELElBQUksQ0FBQyxVQUFXLEVBQUUsQ0FBQTtRQUN0QixDQUFDLENBQUMsQ0FBQTtLQUNMO0lBRUQsV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUN0QixpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDNUIsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUV6QixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO1FBQzlDLElBQUksT0FBTyxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUN2QyxPQUFPLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFBO0tBQzdDO0lBRUQsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1FBQy9CLElBQUksT0FBTyxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUN2QyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFBO0tBQ25EO0lBRUQsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBQztRQUN0QixJQUFJLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7UUFFdkMsVUFBVSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7S0FDcEM7SUFFRCxPQUFPLEdBQUcsQ0FBQTtBQUNkLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxHQUFVLEVBQUUsSUFBWTtJQUN6QyxRQUFPLElBQUksQ0FBQyxJQUFJLEVBQUM7UUFDYixLQUFLLE9BQU8sQ0FBQyxNQUFNO1lBQ2YsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ3BCLEVBQUUsRUFBRSxLQUFLO2dCQUNULElBQUksRUFBRSxLQUFLO2dCQUNYLFNBQVMsRUFBQyxrREFBa0Q7Z0JBQzVELE1BQU0sRUFBRSxFQUFFO2dCQUNWLFNBQVMsRUFBRTtvQkFDUCxtREFBbUQ7b0JBQ25ELHVEQUF1RDtvQkFDdkQsb0RBQW9EO29CQUNwRCw2REFBNkQ7b0JBQzdELHNEQUFzRDtvQkFDdEQseURBQXlEO2lCQUN4RDthQUNSLENBQUMsQ0FBQTtZQUNGLE1BQU07UUFFVixLQUFLLE9BQU8sQ0FBQyxNQUFNO1lBQ2YsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ3RCLEdBQUcsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTthQUM1QyxDQUFDLENBQUE7WUFDRixRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDakIsTUFBTSxFQUFDLENBQUM7d0JBQ0osSUFBSSxFQUFDLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNO3dCQUNuRCxJQUFJLEVBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU07d0JBQ25ELElBQUksRUFBQyxJQUFJO3FCQUNaLENBQUM7YUFDTCxDQUFDLENBQUE7WUFFRixnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUE7WUFDbkYsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUE7WUFFckUsSUFBSSxPQUFPLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3ZDLE9BQU8sQ0FBQyxjQUFjLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQTtZQUUzRCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUMxQixnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUE7Z0JBQ3hELElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ3pDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxDQUFDLENBQUE7YUFDckY7WUFFRCxNQUFNO1FBRVYsS0FBSyxPQUFPLENBQUMsS0FBSztZQUNkLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDeEIsWUFBWSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN4QixNQUFNO0tBRWI7QUFDTCxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxHQUFVLEVBQUUsSUFBWTtJQUMvQyxJQUFJLGNBQWMsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBd0IsQ0FBQyxFQUF1QixDQUFBO0lBRXBHLG1CQUFtQixDQUFDLGFBQWEsQ0FDN0IsR0FBRyxFQUNIO1FBQ0ksSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUFFLE9BQU07UUFDeEUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2pCLENBQUMsRUFDRDtRQUNJLE1BQU0sRUFBRSxjQUFjO1FBQ3RCLFNBQVMsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTTtRQUMzRCxZQUFZLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJO0tBQ2hFLENBQ0EsQ0FBQTtJQUVELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtRQUN0QyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQTtLQUMzQztBQUNULENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxHQUFVLEVBQUUsSUFBWTtJQUV4QyxJQUFJLFdBQVcsR0FBZ0IsRUFBRSxDQUFBO0lBRWpDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUM7UUFDakcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRSxFQUFFO1lBQ3ZCLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUE7Z0JBQ2hDLE9BQU07YUFDVDtpQkFDSSxJQUNELENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ3BFLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztnQkFDbEMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQ2pDO2dCQUNFLE9BQU07YUFDVDtZQUNELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUNyQixDQUFDLENBQUMsQ0FBQTtRQUNGLFdBQVcsQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtLQUNqRDtJQUdMLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRTtRQUM3QyxXQUFXLENBQUMsWUFBWSxHQUFHLEdBQUcsRUFBRTtZQUM1QixjQUFjLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDdkIsQ0FBQyxDQUFBO0tBQ0o7SUFHRCxJQUNJLENBQUMsSUFBSTtRQUNMLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUNyRjtRQUNFLFdBQVcsQ0FBQyxhQUFhLEdBQUcsR0FBRyxFQUFFO1lBQzdCLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUE7Z0JBQ2hDLE9BQU07YUFDVDtZQVFELFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNqQixDQUFDLENBQUE7S0FDSjtJQUdELElBQUksV0FBVyxDQUFDLGFBQWEsSUFBSSxXQUFXLENBQUMsWUFBWSxFQUFFO1FBQ3ZELEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxhQUFhLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUE7S0FDdlM7QUFDTCxDQUFDO0FBRUQsTUFBTSxVQUFVLFVBQVUsQ0FBQyxHQUFVLEVBQUUsSUFBb0I7SUFFdkQsSUFBSSxPQUFPLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3ZDLElBQUksSUFBSSxHQUFRLEVBQUUsQ0FBQTtJQUVsQixJQUFHLElBQUksRUFBQztRQUNKLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFBO1FBRXZCLElBQUcsT0FBTyxDQUFDLFFBQVEsRUFBQztZQUNoQixTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1NBQzVCO1FBRUQsSUFBRyxJQUFJLENBQUMsYUFBYSxFQUFDO1lBQ2xCLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBQyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFBO1NBQzlDO1FBRUQsSUFBSSxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUE7UUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUM5QyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBQyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDaEIsQ0FBQyxDQUFDLENBQUE7UUFFRixpQkFBaUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFDLEdBQUUsRUFBRTtZQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUE7WUFDbkMsSUFBRyxJQUFJLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBQztnQkFDM0MsSUFBSSxDQUFDLGdCQUFnQixDQUFBO2FBQ3hCO1lBQ0QsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2pCLENBQUMsQ0FBQyxDQUFBO1FBRUYscUJBQXFCLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFFLEVBQUU7WUFDL0IsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFBO1lBQ3hDLElBQUksSUFBSSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNwQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQTtZQUNuQixJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO1FBQ3pFLENBQUMsQ0FBQyxDQUFBO1FBQ0YsT0FBTyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVMsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7S0FDOUg7U0FBSTtRQUNELElBQUcsT0FBTyxDQUFDLFVBQVUsRUFBQztZQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLDZEQUE2RCxDQUFDLENBQUE7U0FDN0U7YUFDRztZQUNBLE9BQU8sQ0FBQyxHQUFHLENBQUMsMERBQTBELENBQUMsQ0FBQTtTQUMxRTtLQUNKO0FBQ0QsQ0FBQztBQUVMLFNBQVMsT0FBTyxDQUFDLEdBQVUsRUFBRSxPQUFXLEVBQUUsSUFBZ0IsRUFBRSxRQUFlLEVBQUUsSUFBYyxFQUFFLG9CQUF5QixFQUFFLGdCQUFxQjtJQUV6SSxJQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUM7UUFDeEIsZUFBZSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMvQixhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0tBQzVCO0lBQ0QsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUUzQixJQUFHLElBQUksRUFBQztRQUNKLElBQUcsSUFBSSxJQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUM7WUFDN0IsS0FBSyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBQyxJQUFJLEVBQ2xELEdBQUUsRUFBRSxHQUFDLGdCQUFnQixFQUFFLENBQUEsQ0FBQSxDQUFDLEVBQUUsR0FBRSxFQUFFLEdBQUMsb0JBQW9CLEVBQUUsQ0FBQSxDQUFBLENBQUMsQ0FBQyxDQUFBO1NBQzlEO2FBQ0c7WUFDQSxLQUFLLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUNyRCxHQUFFLEVBQUUsR0FBQyxnQkFBZ0IsRUFBRSxDQUFBLENBQUEsQ0FBQyxFQUFFLEdBQUUsRUFBRSxHQUFDLG9CQUFvQixFQUFFLENBQUEsQ0FBQSxDQUFDLENBQUMsQ0FBQTtTQUMxRDtLQUNSO1NBQ0c7UUFDQSxLQUFLLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUNyRCxHQUFFLEVBQUUsR0FBQyxnQkFBZ0IsRUFBRSxDQUFBLENBQUEsQ0FBQyxFQUFFLEdBQUUsRUFBRSxHQUFDLG9CQUFvQixFQUFFLENBQUEsQ0FBQSxDQUFDLENBQUMsQ0FBQTtLQUM5RDtJQUVELElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRTtRQUlyQixRQUFRLENBQUMsbUJBQW1CLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDOUUsT0FBTyxDQUFDLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFBO0tBQy9EO0lBQ0gsT0FBTyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFBO0lBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUE7QUFDN0IsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsR0FBVSxFQUFFLFFBQWlCLEVBQUUsUUFBaUI7SUFDeEUsSUFBSSxPQUFPLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3ZDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQTtJQUNqQyxPQUFPLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQTtJQUV6QixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUE7SUFFYixJQUFJLFFBQVEsRUFBRTtRQUNWLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUUsRUFBRTtZQUV4QixJQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUM7Z0JBQ1osUUFBUSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQTtnQkFDckMsSUFBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFDO29CQUNyQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUMsSUFBSSxDQUFDLENBQUE7b0JBQzdFLE9BQU8sQ0FBQyxjQUFjLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQTtpQkFDakU7Z0JBQ0QsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUE7Z0JBQzdDLElBQUksWUFBWSxHQUFVLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFFLENBQUE7Z0JBQ2pELE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxDQUFDLENBQUE7Z0JBQzVDLElBQUcsWUFBWSxFQUFDO29CQUNaLFFBQVEsSUFBSSxZQUFZLENBQUE7aUJBQzNCO2dCQUVELElBQUksSUFBSSxHQUFTLEVBQUUsQ0FBQTtnQkFDbkIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBSyxFQUFDLEVBQUU7b0JBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQ2hCLENBQUMsQ0FBQyxDQUFBO2dCQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtnQkFFaEMsSUFBSSxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUE7Z0JBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBRWpELE9BQU8sQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFBO2dCQUMxQixPQUFPLENBQUMsR0FBRyxFQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTthQUM5SDtRQUVMLENBQUMsRUFBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUE7S0FDckI7QUFDTCxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsR0FBVTtJQUN4QixLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN6QixlQUFlLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBRS9CLElBQUksT0FBTyxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN2QyxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUU7UUFDckIsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDeEUsT0FBTyxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFBO0tBQzVDO0lBRUQsSUFBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUM7UUFDbkIsSUFBRyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBQztZQUNyQixPQUFPLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQTtZQUNyQixhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFDM0MsVUFBVSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDakMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtTQUN2QjtLQUNKO0FBQ0wsQ0FBQztBQUtELE1BQU0sVUFBVSxRQUFRLENBQUMsR0FBVTtJQUMvQixTQUFTLEdBQUcsR0FBRyxDQUFBO0lBQ2YsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFBO0lBRXhCLElBQUksT0FBTyxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN2QyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUU7UUFDbEIsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDbEIsYUFBYSxHQUFtQjtTQUNuQyxDQUFDLENBQUE7S0FDTDtJQUNELFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3pCLE9BQU8sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFBO0lBRXpCLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUNuQjtRQUNJLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDdEIsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUE7UUFDNUMsSUFBRyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFDO1lBQ2xCLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUE7U0FDNUI7SUFDTCxDQUFDLEVBQ0QsSUFBSSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FDbEMsQ0FBQTtJQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7QUFDNUQsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLEdBQVU7SUFDN0IsSUFBSSxPQUFPLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3ZDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQTtJQUU5QixJQUFJLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFO1FBQ3BFLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtLQUNuQjtJQUVELElBQUcsT0FBTyxDQUFDLFFBQVEsRUFBQztRQUNoQixTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0tBQzVCO0FBS1QsQ0FBQztBQUtELE1BQU0sVUFBVSxjQUFjLENBQUMsR0FBVTtJQUNyQyxJQUFJLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDdkMsSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUU7UUFDdEMsT0FBTTtLQUNUO0lBRUQsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBRW5CLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUN4QixhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUE7S0FDM0I7QUFDTCxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxHQUFVLEVBQUUsSUFBVyxFQUFFLE1BQWUsRUFBRSxRQUFnQjtJQUNwRixJQUFJLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3pDLElBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBQztRQUMzRSxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFBLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBQyxDQUFDLENBQUE7S0FDN0U7SUFFRCxJQUFJLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDdkMsSUFBRyxPQUFPLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUM7UUFDcEMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUE7S0FDNUI7SUFFRCxJQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUM7UUFDbkIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQzlDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7S0FDekI7SUFFRCxRQUFRLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDL0IsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDN0MsSUFBRyxRQUFRLEVBQUM7UUFDUixVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFFLEVBQUU7WUFDNUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMxQixDQUFDLEVBQUUsSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUE7S0FDdkI7SUFFRCxPQUFPLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQTtBQUNqQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFVLEVBQUUsU0FBZ0IsRUFBRSxJQUFhO0lBQ3RFLElBQUksT0FBTyxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN2QyxPQUFPLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQTtJQUM1QixJQUFHLElBQUksRUFBQztRQUNKLGFBQWEsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ25DLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFBO0tBQ3ZEO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFuaW1hdG9yLCBBdmF0YXJTaGFwZSwgQmlsbGJvYXJkLCBCaWxsYm9hcmRNb2RlLCBlbmdpbmUsIEVudGl0eSwgR2x0ZkNvbnRhaW5lciwgSW5wdXRBY3Rpb24sTWVzaENvbGxpZGVyLE1lc2hSZW5kZXJlcixwb2ludGVyRXZlbnRzU3lzdGVtLFRyYW5zZm9ybSwgVHJhbnNmb3JtVHlwZSB9IGZyb20gJ0BkY2wvc2RrL2VjcydcbmltcG9ydCB7IENvbG9yMywgUXVhdGVybmlvbiwgVmVjdG9yMyB9IGZyb20gJ0BkY2wvc2RrL21hdGgnXG5pbXBvcnQgeyBGb2xsb3dQYXRoRGF0YSwgTlBDRGF0YSwgTlBDUGF0aFR5cGUsIE5QQ1N0YXRlLCBOUENUeXBlLCBUcmlnZ2VyRGF0YSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnQGRjbC1zZGsvdXRpbHMnXG5pbXBvcnQgeyBJc0ZvbGxvd2luZ1BhdGggfSBmcm9tICcuL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgaGFuZGxlRGlhbG9nVHlwaW5nLCBoYW5kbGVQYXRoVGltZXMgfSBmcm9tICcuL3N5c3RlbXMnO1xuaW1wb3J0IHsgY3JlYXRlRGlhbG9nIH0gZnJvbSAnLi91aSc7XG5pbXBvcnQgeyBhZGREaWFsb2csIGNsb3NlRGlhbG9nLCBucGNEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2RpYWxvZyc7XG5cbmV4cG9ydCBjb25zdCB3YWxraW5nVGltZXJzOiBNYXA8RW50aXR5LG51bWJlcj4gPSBuZXcgTWFwKClcbmV4cG9ydCBjb25zdCBucGNEYXRhQ29tcG9uZW50OiBNYXA8RW50aXR5LCBhbnk+ID0gbmV3IE1hcCgpXG5leHBvcnQgbGV0IGFjdGl2ZU5QQzpudW1iZXIgPSAwXG5cbmNvbnN0IHdhbGtpbmdTeXN0ZW0gPSBlbmdpbmUuYWRkU3lzdGVtKGhhbmRsZVBhdGhUaW1lcylcbmNvbnN0IGRpYWxvZ1N5c3RlbSA9IGVuZ2luZS5hZGRTeXN0ZW0oaGFuZGxlRGlhbG9nVHlwaW5nKVxuXG5jb25zdCBpc0Nvb2xkb3duOiBNYXA8RW50aXR5LCBhbnk+ID0gbmV3IE1hcCgpXG5jb25zdCBvbkFjdGl2YXRlQ2JzOiBNYXA8RW50aXR5LCBhbnk+ID0gbmV3IE1hcCgpXG5jb25zdCBvbldhbGtBd2F5Q2JzOiBNYXA8RW50aXR5LCBhbnk+ID0gbmV3IE1hcCgpXG5jb25zdCBhbmltVGltZXJzOiBNYXA8RW50aXR5LGFueT4gPSBuZXcgTWFwKClcbmNvbnN0IHBvaW50UmVhY2hlZENhbGxiYWNrczogTWFwPEVudGl0eSwgYW55PiA9IG5ldyBNYXAoKVxuY29uc3Qgb25GaW5pc2hDYWxsYmFja3M6IE1hcDxFbnRpdHksIGFueT4gPSBuZXcgTWFwKClcblxuZXhwb3J0IGZ1bmN0aW9uIHNob3dEZWJ1ZyhkZWJ1Zzpib29sZWFuKXtcbiAgICB1dGlscy50cmlnZ2Vycy5lbmFibGVEZWJ1Z0RyYXcoZGVidWcpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhKG5wYzpFbnRpdHkpe1xuICAgIHJldHVybiBucGNEYXRhQ29tcG9uZW50LmdldChucGMpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoXG4gICAgdHJhbnNmb3JtOiBhbnksXG4gICAgZGF0YTogTlBDRGF0YVxuKXtcbiAgICBsZXQgbnBjID0gZW5naW5lLmFkZEVudGl0eSgpXG5cbiAgICBsZXQgdDpUcmFuc2Zvcm1UeXBlID0ge3Bvc2l0aW9uOiB0cmFuc2Zvcm0ucG9zaXRpb24gPyB0cmFuc2Zvcm0ucG9zaXRpb24gOiBWZWN0b3IzLmNyZWF0ZSgwLDAsMCksIHJvdGF0aW9uOiB0cmFuc2Zvcm0ucm90YXRpb24gPyB0cmFuc2Zvcm0ucm90YXRpb24gOiBRdWF0ZXJuaW9uLlplcm8oKSwgc2NhbGU6IHRyYW5zZm9ybS5zY2FsZSA/IHRyYW5zZm9ybS5zY2FsZSA6IFZlY3RvcjMuT25lKCl9XG4gICAgVHJhbnNmb3JtLmNyZWF0ZShucGMsIHQpXG5cbiAgICBucGNEYXRhQ29tcG9uZW50LnNldChucGMse1xuICAgICAgICBpbnRyb2R1Y2VkOiBmYWxzZSxcbiAgICAgICAgaW5Db29sZG93bjogZmFsc2UsXG4gICAgICAgIGNvb2xEb3duRHVyYXRpb246IGRhdGEgJiYgZGF0YS5jb29sRG93bkR1cmF0aW9uID8gZGF0YS5jb29sRG93bkR1cmF0aW9uIDogNSxcbiAgICAgICAgZmFjZVVzZXI6ZGF0YS5mYWNlVXNlcixcbiAgICAgICAgd2Fsa2luZ1NwZWVkOjIsXG4gICAgICAgIHdhbGtpbmdBbmltOiBkYXRhICYmIGRhdGEud2Fsa2luZ0FuaW0gPyBkYXRhLndhbGtpbmdBbmltIDogdW5kZWZpbmVkLFxuICAgICAgICBidWJibGVIZWlnaHQ6MixcbiAgICAgICAgcGF0aERhdGE6IGRhdGEucGF0aERhdGEgPyBkYXRhLnBhdGhEYXRhIDogdW5kZWZpbmVkLFxuICAgICAgICBjdXJyZW50UGF0aERhdGE6IFtdLFxuICAgICAgICBtYW51YWxTdG9wOmZhbHNlLFxuICAgICAgICBwYXRoSW5kZXg6MCxcbiAgICAgICAgc3RhdGU6TlBDU3RhdGUuU1RBTkRJTkdcbiAgICB9KVxuXG4gICAgaWYoZGF0YSAmJiBkYXRhLm5vVUkpe31cbiAgICBlbHNlIGlmKGRhdGEgJiYgZGF0YS5wb3J0cmFpdCl7fVxuICAgIGVsc2V7XG4gICAgICAgIGFkZERpYWxvZyhucGMsIGRhdGEgJiYgZGF0YS5kaWFsb2dTb3VuZCA/IGRhdGEuZGlhbG9nU291bmQgOiB1bmRlZmluZWQpXG4gICAgICAgIGNyZWF0ZURpYWxvZyhucGMpXG4gICAgfVxuXG4gICAgb25BY3RpdmF0ZUNicy5zZXQobnBjLCAoKT0+e1xuICAgICAgICBkYXRhLm9uQWN0aXZhdGUoKVxuICAgIH0pXG5cbiAgICBpZiAoZGF0YSAmJiBkYXRhLmhhc093blByb3BlcnR5KFwib25XYWxrQXdheVwiKSkge1xuICAgICAgICBvbldhbGtBd2F5Q2JzLnNldChucGMsICgpPT57XG4gICAgICAgICAgICBpZighZGF0YSB8fCAhZGF0YS5jb250aW51ZU9uV2Fsa0F3YXkpe1xuICAgICAgICAgICAgICAgIGlmKG5wY0RpYWxvZ0NvbXBvbmVudC5oYXMobnBjKSl7XG4gICAgICAgICAgICAgICAgICAgIG5wY0RpYWxvZ0NvbXBvbmVudC5nZXQobnBjKS52aXNpYmxlID0gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgIGlmKG5wY0RpYWxvZ0NvbXBvbmVudC5oYXMobnBjKSl7XG4gICAgICAgICAgICAgICAgICAgIG5wY0RpYWxvZ0NvbXBvbmVudC5nZXQobnBjKS52aXNpYmxlID0gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhLm9uV2Fsa0F3YXkhKClcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBhZGROUENCb25lcyhucGMsIGRhdGEpXG4gICAgYWRkQ2xpY2tSZWFjdGlvbnMobnBjLCBkYXRhKVxuICAgIGFkZFRyaWdnZXJBcmVhKG5wYywgZGF0YSlcbiAgICBcbiAgICBpZiAoZGF0YSAmJiBkYXRhLnBhdGhEYXRhICYmIGRhdGEucGF0aERhdGEuc3BlZWQpIHtcbiAgICAgICAgbGV0IG5wY0RhdGEgPSBucGNEYXRhQ29tcG9uZW50LmdldChucGMpXG4gICAgICAgIG5wY0RhdGEud2Fsa2luZ1NwZWVkID0gZGF0YS5wYXRoRGF0YS5zcGVlZFxuICAgIH1cblxuICAgIGlmIChkYXRhICYmIGRhdGEuY29vbERvd25EdXJhdGlvbikge1xuICAgICAgICBsZXQgbnBjRGF0YSA9IG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYylcbiAgICAgICAgbnBjRGF0YS5jb29sRG93bkR1cmF0aW9uID0gZGF0YS5jb29sRG93bkR1cmF0aW9uXG4gICAgfVxuXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5wYXRoRGF0YSl7XG4gICAgICAgIGxldCBucGNEYXRhID0gbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKVxuICAgICAgICAvL25wY0RhdGEuY3VycmVudFBhdGhEYXRhID0gbnBjRGF0YS5wYXRoRGF0YVxuICAgICAgICBmb2xsb3dQYXRoKG5wYywgbnBjRGF0YS5wYXRoRGF0YSlcbiAgICB9XG5cbiAgICByZXR1cm4gbnBjXG59XG5cbmZ1bmN0aW9uIGFkZE5QQ0JvbmVzKG5wYzpFbnRpdHksIGRhdGE6TlBDRGF0YSl7XG4gICAgc3dpdGNoKGRhdGEudHlwZSl7XG4gICAgICAgIGNhc2UgTlBDVHlwZS5BVkFUQVI6XG4gICAgICAgICAgICBBdmF0YXJTaGFwZS5jcmVhdGUobnBjLCB7XG4gICAgICAgICAgICAgICAgaWQ6IFwibnBjXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJOUENcIixcbiAgICAgICAgICAgICAgICBib2R5U2hhcGU6XCJ1cm46ZGVjZW50cmFsYW5kOm9mZi1jaGFpbjpiYXNlLWF2YXRhcnM6QmFzZU1hbGVcIixcbiAgICAgICAgICAgICAgICBlbW90ZXM6IFtdLFxuICAgICAgICAgICAgICAgIHdlYXJhYmxlczogW1xuICAgICAgICAgICAgICAgICAgICBcInVybjpkZWNlbnRyYWxhbmQ6b2ZmLWNoYWluOmJhc2UtYXZhdGFyczpmX2V5ZXNfMDBcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ1cm46ZGVjZW50cmFsYW5kOm9mZi1jaGFpbjpiYXNlLWF2YXRhcnM6Zl9leWVicm93c18wMFwiLFxuICAgICAgICAgICAgICAgICAgICBcInVybjpkZWNlbnRyYWxhbmQ6b2ZmLWNoYWluOmJhc2UtYXZhdGFyczpmX21vdXRoXzAwXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidXJuOmRlY2VudHJhbGFuZDpvZmYtY2hhaW46YmFzZS1hdmF0YXJzOmNvbWZ5X3Nwb3J0X3NhbmRhbHNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ1cm46ZGVjZW50cmFsYW5kOm9mZi1jaGFpbjpiYXNlLWF2YXRhcnM6c29jY2VyX3BhbnRzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidXJuOmRlY2VudHJhbGFuZDpvZmYtY2hhaW46YmFzZS1hdmF0YXJzOmVsZWdhbnRfc3dlYXRlclwiLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgTlBDVHlwZS5DVVNUT006XG4gICAgICAgICAgICBHbHRmQ29udGFpbmVyLmNyZWF0ZShucGMsIHsgXG4gICAgICAgICAgICAgICAgc3JjOiBkYXRhICYmIGRhdGEubW9kZWwgPyBkYXRhLm1vZGVsIDogXCJcIiBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBBbmltYXRvci5jcmVhdGUobnBjLCB7XG4gICAgICAgICAgICAgICAgc3RhdGVzOlt7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ZGF0YSAmJiBkYXRhLmlkbGVBbmltID8gZGF0YS5pZGxlQW5pbSA6ICdJZGxlJyxcbiAgICAgICAgICAgICAgICAgICAgY2xpcDpkYXRhICYmIGRhdGEuaWRsZUFuaW0gPyBkYXRhLmlkbGVBbmltIDogJ0lkbGUnLFxuICAgICAgICAgICAgICAgICAgICBsb29wOnRydWVcbiAgICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKS5pZGxlQW5pbSA9IGRhdGEgJiYgZGF0YS5pZGxlQW5pbSA/IGRhdGEuaWRsZUFuaW0gOiAnSWRsZSdcbiAgICAgICAgICAgIEFuaW1hdG9yLnBsYXlTaW5nbGVBbmltYXRpb24obnBjLCBucGNEYXRhQ29tcG9uZW50LmdldChucGMpLmlkbGVBbmltKVxuXG4gICAgICAgICAgICBsZXQgbnBjRGF0YSA9IG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYylcbiAgICAgICAgICAgIG5wY0RhdGEubGFzdFBsYXllZEFuaW0gPSBucGNEYXRhQ29tcG9uZW50LmdldChucGMpLmlkbGVBbmltXG5cbiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEud2Fsa2luZ0FuaW0pIHtcbiAgICAgICAgICAgICAgICBucGNEYXRhQ29tcG9uZW50LmdldChucGMpLndhbGtpbmdBbmltID0gZGF0YS53YWxraW5nQW5pbVxuICAgICAgICAgICAgICAgIGxldCBhbmltYXRpb25zID0gQW5pbWF0b3IuZ2V0TXV0YWJsZShucGMpXG4gICAgICAgICAgICAgICAgYW5pbWF0aW9ucy5zdGF0ZXMucHVzaCh7bmFtZTpkYXRhLndhbGtpbmdBbmltLCBjbGlwOiBkYXRhLndhbGtpbmdBbmltLCBsb29wOnRydWV9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIE5QQ1R5cGUuQkxBTks6XG4gICAgICAgICAgICBNZXNoUmVuZGVyZXIuc2V0Qm94KG5wYylcbiAgICAgICAgICAgIE1lc2hDb2xsaWRlci5zZXRCb3gobnBjKVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGFkZENsaWNrUmVhY3Rpb25zKG5wYzpFbnRpdHksIGRhdGE6TlBDRGF0YSl7XG4gICAgbGV0IGFjdGl2YXRlQnV0dG9uID0gZGF0YSAmJiBkYXRhLm9ubHlDbGlja1RyaWdnZXIgPyBJbnB1dEFjdGlvbi5JQV9QT0lOVEVSIDogSW5wdXRBY3Rpb24uSUFfUFJJTUFSWVxuXG4gICAgcG9pbnRlckV2ZW50c1N5c3RlbS5vblBvaW50ZXJEb3duKFxuICAgICAgICBucGMsXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChpc0Nvb2xkb3duLmhhcyhucGMpIHx8IChucGNEaWFsb2dDb21wb25lbnQuZ2V0KG5wYykudmlzaWJsZSkpIHJldHVyblxuICAgICAgICAgICAgYWN0aXZhdGUobnBjKVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBidXR0b246IGFjdGl2YXRlQnV0dG9uLFxuICAgICAgICAgICAgaG92ZXJUZXh0OiBkYXRhICYmIGRhdGEuaG92ZXJUZXh0ID8gZGF0YS5ob3ZlclRleHQgOiAnVGFsaycsXG4gICAgICAgICAgICBzaG93RmVlZGJhY2s6IGRhdGEgJiYgZGF0YS5vbmx5RXh0ZXJuYWxUcmlnZ2VyID8gZmFsc2UgOiB0cnVlLFxuICAgICAgICB9XG4gICAgICAgIClcblxuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLm9ubHlFeHRlcm5hbFRyaWdnZXIpIHtcbiAgICAgICAgcG9pbnRlckV2ZW50c1N5c3RlbS5yZW1vdmVPblBvaW50ZXJEb3duKG5wYylcbiAgICAgICAgfSBcbn1cblxuZnVuY3Rpb24gYWRkVHJpZ2dlckFyZWEobnBjOkVudGl0eSwgZGF0YTpOUENEYXRhKXtcblxuICAgICAgICBsZXQgdHJpZ2dlckRhdGE6IFRyaWdnZXJEYXRhID0ge31cblxuICAgICAgICBpZiAoIWRhdGEgfHwgKGRhdGEgJiYgIWRhdGEub25seUV4dGVybmFsVHJpZ2dlciAmJiAhZGF0YS5vbmx5Q2xpY2tUcmlnZ2VyICYmICFkYXRhLm9ubHlFVHJpZ2dlcikpe1xuICAgICAgICBvbkFjdGl2YXRlQ2JzLnNldChucGMsICgpPT57XG4gICAgICAgICAgICBpZiAoaXNDb29sZG93bi5oYXMobnBjKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG5wYywgJyBpbiBjb29sZG93bicpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9IFxuICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgKG5wY0RpYWxvZ0NvbXBvbmVudC5oYXMobnBjKSAmJiBucGNEaWFsb2dDb21wb25lbnQuZ2V0KG5wYykudmlzaWJsZSkgfHxcbiAgICAgICAgICAgICAgICAoZGF0YSAmJiBkYXRhLm9ubHlFeHRlcm5hbFRyaWdnZXIpIHx8XG4gICAgICAgICAgICAgICAgKGRhdGEgJiYgZGF0YS5vbmx5Q2xpY2tUcmlnZ2VyKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhLm9uQWN0aXZhdGUoKVxuICAgICAgICB9KVxuICAgICAgICB0cmlnZ2VyRGF0YS5vbkNhbWVyYUVudGVyID0gb25BY3RpdmF0ZUNicy5nZXQobnBjKVxuICAgICAgICB9XG5cbiAgICAvLyB3aGVuIGV4aXRpbmcgdHJpZ2dlclxuICAgIGlmICghZGF0YSB8fCAoZGF0YSAmJiAhZGF0YS5jb250aW51ZU9uV2Fsa0F3YXkpKSB7XG4gICAgICAgIHRyaWdnZXJEYXRhLm9uQ2FtZXJhRXhpdCA9ICgpID0+IHtcbiAgICAgICAgICAgIGhhbmRsZVdhbGtBd2F5KG5wYylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHdoZW4gZW50ZXJpbmcgdHJpZ2dlclxuICAgIGlmIChcbiAgICAgICAgIWRhdGEgfHxcbiAgICAgICAgKGRhdGEgJiYgIWRhdGEub25seUV4dGVybmFsVHJpZ2dlciAmJiAhZGF0YS5vbmx5Q2xpY2tUcmlnZ2VyICYmICFkYXRhLm9ubHlFVHJpZ2dlcilcbiAgICApIHtcbiAgICAgICAgdHJpZ2dlckRhdGEub25DYW1lcmFFbnRlciA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChpc0Nvb2xkb3duLmhhcyhucGMpKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cobnBjLCAnIGluIGNvb2xkb3duJylcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAvLyBlbHNlIGlmIChcbiAgICAgICAgICAgIC8vICAgICAodGhpcy5kaWFsb2cgJiYgdGhpcy5kaWFsb2cuaXNEaWFsb2dPcGVuKSB8fFxuICAgICAgICAgICAgLy8gICAgIChkYXRhICYmIGRhdGEub25seUV4dGVybmFsVHJpZ2dlcikgfHxcbiAgICAgICAgICAgIC8vICAgICAoZGF0YSAmJiBkYXRhLm9ubHlDbGlja1RyaWdnZXIpXG4gICAgICAgICAgICAvLyApIHtcbiAgICAgICAgICAgIC8vICAgICByZXR1cm5cbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGFjdGl2YXRlKG5wYylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFkZCB0cmlnZ2VyXG4gICAgaWYgKHRyaWdnZXJEYXRhLm9uQ2FtZXJhRW50ZXIgfHwgdHJpZ2dlckRhdGEub25DYW1lcmFFeGl0KSB7XG4gICAgICAgIHV0aWxzLnRyaWdnZXJzLmFkZFRyaWdnZXIobnBjLDI1NCwxLFt7dHlwZTonc3BoZXJlJywgcG9zaXRpb246IFZlY3RvcjMuWmVybygpLCByYWRpdXM6IGRhdGEucmVhY3REaXN0YW5jZSAhPSB1bmRlZmluZWQgPyBkYXRhLnJlYWN0RGlzdGFuY2UgOiA2fV0sIHRyaWdnZXJEYXRhLm9uQ2FtZXJhRW50ZXIgPyB0cmlnZ2VyRGF0YS5vbkNhbWVyYUVudGVyIDogdW5kZWZpbmVkLCB0cmlnZ2VyRGF0YS5vbkNhbWVyYUV4aXQgPyB0cmlnZ2VyRGF0YS5vbkNhbWVyYUV4aXQgOiB1bmRlZmluZWQsIENvbG9yMy5SZWQoKSlcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb2xsb3dQYXRoKG5wYzpFbnRpdHksIGRhdGE/OkZvbGxvd1BhdGhEYXRhKXtcbiAgICAgICAgXG4gICAgbGV0IG5wY0RhdGEgPSBucGNEYXRhQ29tcG9uZW50LmdldChucGMpXG4gICAgbGV0IHBhdGg6YW55W10gPVtdXG5cbiAgICBpZihkYXRhKXtcbiAgICAgICAgbnBjRGF0YS5wYXRoRGF0YSA9IGRhdGFcblxuICAgICAgICBpZihucGNEYXRhLmZhY2VVc2VyKXtcbiAgICAgICAgICAgIEJpbGxib2FyZC5kZWxldGVGcm9tKG5wYylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGRhdGEuc3RhcnRpbmdQb2ludCl7XG4gICAgICAgICAgICBkYXRhLnBhdGg/LnNwbGljZSgwLGRhdGEuc3RhcnRpbmdQb2ludCAtIDEpXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcG9zID0gVHJhbnNmb3JtLmdldChucGMpLnBvc2l0aW9uXG4gICAgICAgIHBhdGgucHVzaChWZWN0b3IzLmNyZWF0ZShwb3MueCwgcG9zLnksIHBvcy56KSlcbiAgICAgICAgZGF0YS5wYXRoPy5mb3JFYWNoKChwKT0+e1xuICAgICAgICAgICAgcGF0aC5wdXNoKHApXG4gICAgICAgIH0pXG5cbiAgICAgICAgb25GaW5pc2hDYWxsYmFja3Muc2V0KG5wYywoKT0+e1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ29uIGZpbmlzaGVkIGNhbGxiYWNrJylcbiAgICAgICAgICAgIGlmKGRhdGEgJiYgZGF0YS5vbkZpbmlzaENhbGxiYWNrICYmICFkYXRhLmxvb3Ape1xuICAgICAgICAgICAgICAgIGRhdGEub25GaW5pc2hDYWxsYmFja1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RvcFBhdGgobnBjKVxuICAgICAgICB9KVxuXG4gICAgICAgIHBvaW50UmVhY2hlZENhbGxiYWNrcy5zZXQobnBjLCAoKT0+e1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ29uIHBvaW50IHJlYWNoZWQgY2FsbGJhY2snKVxuICAgICAgICAgICAgbGV0IGRhdGEgPSBucGNEYXRhQ29tcG9uZW50LmdldChucGMpXG4gICAgICAgICAgICBkYXRhLnBhdGhJbmRleCArPSAxXG4gICAgICAgICAgICBkYXRhLm9uUmVhY2hlZFBvaW50Q2FsbGJhY2sgPyBkYXRhLm9uUmVhY2hlZFBvaW50Q2FsbGJhY2sgOiB1bmRlZmluZWRcbiAgICAgICAgfSlcbiAgICAgICAgd2Fsa05QQyhucGMsIG5wY0RhdGEsIGRhdGEucGF0aFR5cGUhLCBkYXRhLnRvdGFsRHVyYXRpb24sIHBhdGgsIHBvaW50UmVhY2hlZENhbGxiYWNrcy5nZXQobnBjKSwgb25GaW5pc2hDYWxsYmFja3MuZ2V0KG5wYykpXG4gICAgfWVsc2V7XG4gICAgICAgIGlmKG5wY0RhdGEubWFudWFsU3RvcCl7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnd2UgaGF2ZSBtYW51YWwgc3RvcCwgbmVlZCB0byBwaWNrIGJhY2sgdXAgd2hlcmUgd2UgbGVmdCBvZmYnKVxuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnd2UgYXJlIHRyeWluZyB0byBmb2xsb3cgYSBwYXRoIHdpdG91dCBzdGFydGluZyBvbmUgcHJpb3InKVxuICAgICAgICB9XG4gICAgfVxuICAgIH1cbi8vXG5mdW5jdGlvbiB3YWxrTlBDKG5wYzpFbnRpdHksIG5wY0RhdGE6YW55LCB0eXBlOk5QQ1BhdGhUeXBlLCBkdXJhdGlvbjpudW1iZXIsIHBhdGg6VmVjdG9yM1tdLCBwb2ludFJlYWNoZWRDYWxsYmFjaz86YW55LCBmaW5pc2hlZENhbGxiYWNrPzphbnkpe1xuICAgIC8vXG4gICAgaWYoSXNGb2xsb3dpbmdQYXRoLmhhcyhucGMpKXtcbiAgICAgICAgSXNGb2xsb3dpbmdQYXRoLmRlbGV0ZUZyb20obnBjKVxuICAgICAgICB3YWxraW5nVGltZXJzLmRlbGV0ZShucGMpXG4gICAgfVxuICAgIElzRm9sbG93aW5nUGF0aC5jcmVhdGUobnBjKVxuXG4gICAgaWYodHlwZSl7XG4gICAgICAgIGlmKHR5cGU9PSBOUENQYXRoVHlwZS5SSUdJRF9QQVRIKXtcbiAgICAgICAgICAgIHV0aWxzLnBhdGhzLnN0YXJ0U3RyYWlnaHRQYXRoKG5wYywgcGF0aCwgZHVyYXRpb24sdHJ1ZSxcbiAgICAgICAgICAgICAgICAoKT0+e2ZpbmlzaGVkQ2FsbGJhY2soKX0sICgpPT57cG9pbnRSZWFjaGVkQ2FsbGJhY2soKX0pXG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIHV0aWxzLnBhdGhzLnN0YXJ0U21vb3RoUGF0aChucGMsIHBhdGgsIGR1cmF0aW9uLCAzMCwgdHJ1ZSwgXG4gICAgICAgICAgICAgICAgKCk9PntmaW5pc2hlZENhbGxiYWNrKCl9LCAoKT0+e3BvaW50UmVhY2hlZENhbGxiYWNrKCl9KVxuICAgICAgICAgICAgfVxuICAgIH1cbiAgICBlbHNle1xuICAgICAgICB1dGlscy5wYXRocy5zdGFydFNtb290aFBhdGgobnBjLCBwYXRoLCBkdXJhdGlvbiwgMjAsIHRydWUsIFxuICAgICAgICAgICAgKCk9PntmaW5pc2hlZENhbGxiYWNrKCl9LCAoKT0+e3BvaW50UmVhY2hlZENhbGxiYWNrKCl9KVxuICAgIH0gICBcblxuICAgIGlmIChucGNEYXRhLndhbGtpbmdBbmltKSB7XG4gICAgICAgIC8vIGlmICh0aGlzLmVuZEFuaW1UaW1lci5oYXNDb21wb25lbnQoTlBDRGVsYXkpKSB7XG4gICAgICAgIC8vICAgdGhpcy5lbmRBbmltVGltZXIucmVtb3ZlQ29tcG9uZW50KE5QQ0RlbGF5KVxuICAgICAgICAvLyB9XG4gICAgICAgIEFuaW1hdG9yLnBsYXlTaW5nbGVBbmltYXRpb24obnBjLCBucGNEYXRhQ29tcG9uZW50LmdldChucGMpLndhbGtpbmdBbmltLCB0cnVlKVxuICAgICAgICBucGNEYXRhLmxhc3RQbGF5ZWRBbmltID0gbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKS53YWxraW5nQW5pbVxuICAgICAgfVxuICAgIG5wY0RhdGEuc3RhdGUgPSBOUENTdGF0ZS5GT0xMT1dQQVRIXG4gICAgY29uc29sZS5sb2coJ2RlYnVnIGhlcmUnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RvcFdhbGtpbmcobnBjOkVudGl0eSwgZHVyYXRpb24/OiBudW1iZXIsIGZpbmlzaGVkPzpib29sZWFuKSB7XG4gICAgbGV0IG5wY0RhdGEgPSBucGNEYXRhQ29tcG9uZW50LmdldChucGMpXG4gICAgbnBjRGF0YS5zdGF0ZSA9IE5QQ1N0YXRlLlNUQU5ESU5HXG4gICAgbnBjRGF0YS5tYW51YWxTdG9wID0gdHJ1ZVxuXG4gICAgc3RvcFBhdGgobnBjKVxuXG4gICAgaWYgKGR1cmF0aW9uKSB7XG4gICAgICAgIHV0aWxzLnRpbWVycy5zZXRUaW1lb3V0KCgpPT57XG4gICAgICAgICAgICAvL2lmICh0aGlzLmRpYWxvZyAmJiB0aGlzLmRpYWxvZy5pc0RpYWxvZ09wZW4pIHJldHVyblxuICAgICAgICAgICAgaWYobnBjRGF0YS5wYXRoKXtcbiAgICAgICAgICAgICAgICBBbmltYXRvci5zdG9wQWxsQW5pbWF0aW9ucyhucGMsIHRydWUpXG4gICAgICAgICAgICAgICAgaWYobnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKS53YWxraW5nQW5pbSl7XG4gICAgICAgICAgICAgICAgICAgIEFuaW1hdG9yLnBsYXlTaW5nbGVBbmltYXRpb24obnBjLCBucGNEYXRhQ29tcG9uZW50LmdldChucGMpLndhbGtpbmdBbmltLHRydWUpXG4gICAgICAgICAgICAgICAgICAgIG5wY0RhdGEubGFzdFBsYXllZEFuaW0gPSBucGNEYXRhQ29tcG9uZW50LmdldChucGMpLndhbGtpbmdBbmltXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBkdXJhdGlvbiA9IG5wY0RhdGEucGF0aERhdGEudG90YWxEdXJhdGlvblxuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50VGltZXI6bnVtYmVyID0gd2Fsa2luZ1RpbWVycy5nZXQobnBjKSFcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY3VycmVudCB0aW1lIGlzJywgY3VycmVudFRpbWVyKVxuICAgICAgICAgICAgICAgIGlmKGN1cnJlbnRUaW1lcil7XG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uIC09IGN1cnJlbnRUaW1lclxuICAgICAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgICAgICBsZXQgcGF0aDphbnlbXSA9IFtdXG4gICAgICAgICAgICAgICAgbnBjRGF0YS5wYXRoRGF0YS5wYXRoLmZvckVhY2goKHA6YW55KT0+e1xuICAgICAgICAgICAgICAgICAgICBwYXRoLnB1c2gocClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHBhdGguc3BsaWNlKDAsbnBjRGF0YS5wYXRoSW5kZXgpXG4gICAgXG4gICAgICAgICAgICAgICAgbGV0IHBvcyA9IFRyYW5zZm9ybS5nZXQobnBjKS5wb3NpdGlvblxuICAgICAgICAgICAgICAgIHBhdGgudW5zaGlmdChWZWN0b3IzLmNyZWF0ZShwb3MueCwgcG9zLnksIHBvcy56KSlcbiAgICBcbiAgICAgICAgICAgICAgICBucGNEYXRhLm1hbnVhbFN0b3AgPSBmYWxzZVxuICAgICAgICAgICAgICAgIHdhbGtOUEMobnBjLG5wY0RhdGEsIG5wY0RhdGEucGF0aERhdGEucGF0aFR5cGUsIGR1cmF0aW9uLCBwYXRoLCBwb2ludFJlYWNoZWRDYWxsYmFja3MuZ2V0KG5wYyksIG9uRmluaXNoQ2FsbGJhY2tzLmdldChucGMpKSAgICBcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LGR1cmF0aW9uICogMTAwMClcbiAgICB9XG59Ly9cblxuZnVuY3Rpb24gc3RvcFBhdGgobnBjOkVudGl0eSl7XG4gICAgdXRpbHMucGF0aHMuc3RvcFBhdGgobnBjKVxuICAgIElzRm9sbG93aW5nUGF0aC5kZWxldGVGcm9tKG5wYylcblxuICAgIGxldCBucGNEYXRhID0gbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKVxuICAgIGlmIChucGNEYXRhLndhbGtpbmdBbmltKSB7XG4gICAgICAgIEFuaW1hdG9yLnBsYXlTaW5nbGVBbmltYXRpb24obnBjLCBucGNEYXRhQ29tcG9uZW50LmdldChucGMpLndhbGtpbmdBbmltKVxuICAgICAgICBucGNEYXRhLmxhc3RQbGF5ZWRBbmltID0gbnBjRGF0YS5pZGxlQW5pbVxuICAgIH1cblxuICAgIGlmKCFucGNEYXRhLm1hbnVhbFN0b3Ape1xuICAgICAgICBpZihucGNEYXRhLnBhdGhEYXRhLmxvb3Ape1xuICAgICAgICAgICAgbnBjRGF0YS5wYXRoSW5kZXggPSAwXG4gICAgICAgICAgICB3YWxraW5nVGltZXJzLmRlbGV0ZShucGMpXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnd2UgYXJlIGxvb3BpbmcgcGF0aCcsIG5wY0RhdGEpXG4gICAgICAgICAgICBmb2xsb3dQYXRoKG5wYywgbnBjRGF0YS5wYXRoRGF0YSlcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG5wY0RhdGEpXG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQ2FsbHMgdGhlIE5QQydzIGFjdGl2YXRpb24gZnVuY3Rpb24gKHNldCBvbiBOUEMgZGVmaW5pdGlvbikuIElmIE5QQyBoYXMgYGZhY2VVc2VyYCA9IHRydWUsIGl0IHdpbGwgcm90YXRlIHRvIGZhY2UgdGhlIHBsYXllci4gSXQgc3RhcnRzIGEgY29vbGRvd24gY291bnRlciB0byBhdm9pZCByZWFjdGl2YXRpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhY3RpdmF0ZShucGM6RW50aXR5KSB7XG4gICAgYWN0aXZlTlBDID0gbnBjXG4gICAgb25BY3RpdmF0ZUNicy5nZXQobnBjKSgpXG5cbiAgICBsZXQgbnBjRGF0YSA9IG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYylcbiAgICBpZiAobnBjRGF0YS5mYWNlVXNlcikge1xuICAgICAgICBCaWxsYm9hcmQuY3JlYXRlKG5wYywge1xuICAgICAgICAgICAgYmlsbGJvYXJkTW9kZTpCaWxsYm9hcmRNb2RlLkJNX1lcbiAgICAgICAgfSlcbiAgICB9XG4gICAgaXNDb29sZG93bi5zZXQobnBjLCB0cnVlKVxuICAgIG5wY0RhdGEuaW5Db29sZG93biA9IHRydWVcblxuICAgIHV0aWxzLnRpbWVycy5zZXRUaW1lb3V0KFxuICAgICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzQ29vbGRvd24uZGVsZXRlKG5wYylcbiAgICAgICAgICAgIG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYykuaW5Db29sZG93biA9IGZhbHNlXG4gICAgICAgICAgICBpZihCaWxsYm9hcmQuaGFzKG5wYykpe1xuICAgICAgICAgICAgICAgIEJpbGxib2FyZC5kZWxldGVGcm9tKG5wYylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgMTAwMCAqIG5wY0RhdGEuY29vbERvd25EdXJhdGlvblxuICAgIClcbiAgICBjb25zb2xlLmxvZygnYWN0aXZhdGVkIG5wYywnLCBucGNEYXRhQ29tcG9uZW50LmdldChucGMpKVxufVxuXG5mdW5jdGlvbiBlbmRJbnRlcmFjdGlvbihucGM6RW50aXR5KSB7XG4gICAgIGxldCBucGNEYXRhID0gbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKVxuICAgICBucGNEYXRhLnN0YXRlID0gTlBDU3RhdGUuU1RBTkRJTkdcblxuICAgICAgICBpZiAobnBjRGlhbG9nQ29tcG9uZW50LmhhcyhucGMpICYmIG5wY0RpYWxvZ0NvbXBvbmVudC5nZXQobnBjKS52aXNpYmxlKSB7XG4gICAgICAgICAgICBjbG9zZURpYWxvZyhucGMpXG4gICAgICAgIH1cblxuICAgICAgICBpZihucGNEYXRhLmZhY2VVc2VyKXtcbiAgICAgICAgICAgIEJpbGxib2FyZC5kZWxldGVGcm9tKG5wYylcbiAgICAgICAgfVxuXG4gICAgLy8gaWYgKHRoaXMuYnViYmxlICYmIHRoaXMuYnViYmxlLmlzQnVibGVPcGVuKSB7XG4gICAgLy8gICB0aGlzLmJ1YmJsZS5jbG9zZURpYWxvZ1dpbmRvdygpXG4gICAgLy8gfVxufVxuXG4vKipcbiAqIEVuZHMgaW50ZXJhY3Rpb24gYW5kIGNhbGxzIHRoZSBvbldhbGtBd2F5IGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVXYWxrQXdheShucGM6RW50aXR5KSB7XG4gICAgbGV0IG5wY0RhdGEgPSBucGNEYXRhQ29tcG9uZW50LmdldChucGMpXG4gICAgaWYgKG5wY0RhdGEuc3RhdGUgPT0gTlBDU3RhdGUuRk9MTE9XUEFUSCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBlbmRJbnRlcmFjdGlvbihucGMpXG5cbiAgICBpZiAob25XYWxrQXdheUNicy5nZXQobnBjKSkge1xuICAgICAgICBvbldhbGtBd2F5Q2JzLmdldChucGMpKClcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwbGF5QW5pbWF0aW9uKG5wYzpFbnRpdHksIGFuaW06c3RyaW5nLCBub0xvb3A/OmJvb2xlYW4sIGR1cmF0aW9uPzpudW1iZXIpe1xuICAgIGxldCBhbmltYXRpb25zID0gQW5pbWF0b3IuZ2V0TXV0YWJsZShucGMpXG4gICAgaWYoYW5pbWF0aW9ucy5zdGF0ZXMuZmlsdGVyKChhbmltYXRpb24pPT4gYW5pbWF0aW9uLm5hbWUgPT09IGFuaW0pLmxlbmd0aCA9PSAwKXtcbiAgICAgICAgYW5pbWF0aW9ucy5zdGF0ZXMucHVzaCh7bmFtZTphbmltLCBjbGlwOmFuaW0sIGxvb3A6IG5vTG9vcD8gZmFsc2UgOiB0cnVlfSlcbiAgICB9XG5cbiAgICBsZXQgbnBjRGF0YSA9IG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYylcbiAgICBpZihucGNEYXRhLnN0YXRlID09IE5QQ1N0YXRlLkZPTExPV1BBVEgpe1xuICAgICAgICB1dGlscy5wYXRocy5zdG9wUGF0aChucGMpXG4gICAgfVxuXG4gICAgaWYoYW5pbVRpbWVycy5oYXMobnBjKSl7XG4gICAgICAgIHV0aWxzLnRpbWVycy5jbGVhclRpbWVvdXQoYW5pbVRpbWVycy5nZXQobnBjKSlcbiAgICAgICAgYW5pbVRpbWVycy5kZWxldGUobnBjKVxuICAgIH1cblxuICAgIEFuaW1hdG9yLnN0b3BBbGxBbmltYXRpb25zKG5wYylcbiAgICBBbmltYXRvci5wbGF5U2luZ2xlQW5pbWF0aW9uKG5wYywgYW5pbSwgdHJ1ZSlcbiAgICBpZihkdXJhdGlvbil7XG4gICAgICAgIGFuaW1UaW1lcnMuc2V0KG5wYywgdXRpbHMudGltZXJzLnNldFRpbWVvdXQoKCk9PntcbiAgICAgICAgICAgIGFuaW1UaW1lcnMuZGVsZXRlKG5wYylcbiAgICAgICAgfSwgMTAwMCAqIGR1cmF0aW9uKSlcbiAgICB9IFxuXG4gICAgbnBjRGF0YS5sYXN0UGxheWVkQW5pbSA9IGFuaW1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZUlkbGVBbmltKG5wYzpFbnRpdHksIGFuaW1hdGlvbjpzdHJpbmcsIHBsYXk/OmJvb2xlYW4pe1xuICAgIGxldCBucGNEYXRhID0gbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKVxuICAgIG5wY0RhdGEuaWRsZUFuaW0gPSBhbmltYXRpb25cbiAgICBpZihwbGF5KXtcbiAgICAgICAgcGxheUFuaW1hdGlvbihucGMsIGFuaW1hdGlvbiwgdHJ1ZSlcbiAgICAgICAgbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKS5sYXN0UGxheWVkQW5pbSA9IGFuaW1hdGlvblxuICAgIH1cbn0iXX0=
@@ -0,0 +1,13 @@
1
+ export declare const NPCDataComponent: import("@dcl/sdk/ecs").MapComponentDefinition<import("@dcl/sdk/ecs").MapResult<{
2
+ introduced: import("@dcl/sdk/ecs").ISchema<boolean>;
3
+ inCooldown: import("@dcl/sdk/ecs").ISchema<boolean>;
4
+ coolDownDuration: import("@dcl/sdk/ecs").ISchema<number>;
5
+ faceUser: import("@dcl/sdk/ecs").ISchema<boolean>;
6
+ walkingSpeed: import("@dcl/sdk/ecs").ISchema<number>;
7
+ bubbleHeight: import("@dcl/sdk/ecs").ISchema<number>;
8
+ state: import("@dcl/sdk/ecs").ISchema<string>;
9
+ walkingAnim: import("@dcl/sdk/ecs").ISchema<string>;
10
+ idleAnim: import("@dcl/sdk/ecs").ISchema<string>;
11
+ lastPlayedAnim: import("@dcl/sdk/ecs").ISchema<string>;
12
+ path: import("@dcl/sdk/ecs").ISchema<import("@dcl/sdk/ecs").Vector3Type[]>;
13
+ }>>;
@@ -0,0 +1,15 @@
1
+ import { Schemas, engine } from "@dcl/sdk/ecs";
2
+ export const NPCDataComponent = engine.defineComponent("npcdatacomponent", {
3
+ introduced: Schemas.Boolean,
4
+ inCooldown: Schemas.Boolean,
5
+ coolDownDuration: Schemas.Number,
6
+ faceUser: Schemas.Boolean,
7
+ walkingSpeed: Schemas.Number,
8
+ bubbleHeight: Schemas.Number,
9
+ state: Schemas.String,
10
+ walkingAnim: Schemas.String,
11
+ idleAnim: Schemas.String,
12
+ lastPlayedAnim: Schemas.String,
13
+ path: Schemas.Array(Schemas.Vector3)
14
+ });
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBjRGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ucGNEYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9DLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQ3JELGtCQUFrQixFQUNsQjtJQUNDLFVBQVUsRUFBRSxPQUFPLENBQUMsT0FBTztJQUMzQixVQUFVLEVBQUUsT0FBTyxDQUFDLE9BQU87SUFDckIsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLE1BQU07SUFDaEMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxPQUFPO0lBQ3pCLFlBQVksRUFBRSxPQUFPLENBQUMsTUFBTTtJQUM1QixZQUFZLEVBQUUsT0FBTyxDQUFDLE1BQU07SUFDNUIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFNO0lBQ3JCLFdBQVcsRUFBRSxPQUFPLENBQUMsTUFBTTtJQUMzQixRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU07SUFDeEIsY0FBYyxFQUFFLE9BQU8sQ0FBQyxNQUFNO0lBQzlCLElBQUksRUFBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7Q0FDekMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2NoZW1hcywgZW5naW5lIH0gZnJvbSBcIkBkY2wvc2RrL2Vjc1wiO1xuZXhwb3J0IGNvbnN0IE5QQ0RhdGFDb21wb25lbnQgPSBlbmdpbmUuZGVmaW5lQ29tcG9uZW50KFxuXHRcIm5wY2RhdGFjb21wb25lbnRcIixcblx0e1xuXHRcdGludHJvZHVjZWQ6IFNjaGVtYXMuQm9vbGVhbixcblx0XHRpbkNvb2xkb3duOiBTY2hlbWFzLkJvb2xlYW4sXG4gICAgICAgIGNvb2xEb3duRHVyYXRpb246IFNjaGVtYXMuTnVtYmVyLFxuICAgICAgICBmYWNlVXNlcjogU2NoZW1hcy5Cb29sZWFuLFxuICAgICAgICB3YWxraW5nU3BlZWQ6IFNjaGVtYXMuTnVtYmVyLFxuICAgICAgICBidWJibGVIZWlnaHQ6IFNjaGVtYXMuTnVtYmVyLFxuICAgICAgICBzdGF0ZTogU2NoZW1hcy5TdHJpbmcsXG4gICAgICAgIHdhbGtpbmdBbmltOiBTY2hlbWFzLlN0cmluZyxcbiAgICAgICAgaWRsZUFuaW06IFNjaGVtYXMuU3RyaW5nLFxuICAgICAgICBsYXN0UGxheWVkQW5pbTogU2NoZW1hcy5TdHJpbmcsXG4gICAgICAgIHBhdGg6U2NoZW1hcy5BcnJheShTY2hlbWFzLlZlY3RvcjMpXG5cdH0pIl19
@@ -0,0 +1,2 @@
1
+ export declare function handlePathTimes(dt: number): void;
2
+ export declare function handleDialogTyping(dt: number): void;
@@ -0,0 +1,37 @@
1
+ import { engine } from "@dcl/sdk/ecs";
2
+ import { IsFollowingPath, IsTypingDialog } from "./components";
3
+ import { walkingTimers } from "./npc";
4
+ import { npcDialogComponent } from "./dialog";
5
+ export function handlePathTimes(dt) {
6
+ for (const [entity] of engine.getEntitiesWith(IsFollowingPath)) {
7
+ if (walkingTimers.has(entity)) {
8
+ let elapsed = walkingTimers.get(entity);
9
+ elapsed += dt;
10
+ walkingTimers.set(entity, walkingTimers.get(entity) + dt);
11
+ }
12
+ else {
13
+ walkingTimers.set(entity, dt);
14
+ }
15
+ }
16
+ }
17
+ export function handleDialogTyping(dt) {
18
+ for (const [entity] of engine.getEntitiesWith(IsTypingDialog)) {
19
+ let dialogData = npcDialogComponent.get(entity);
20
+ if (!dialogData.typing) {
21
+ return;
22
+ }
23
+ dialogData.timer += dt;
24
+ if (dialogData.timer >= 2 / dialogData.speed) {
25
+ let charsToAdd = Math.floor(dialogData.timer / (1 / dialogData.speed));
26
+ dialogData.timer = 0;
27
+ dialogData.visibleChars += charsToAdd;
28
+ if (dialogData.visibleChars >= dialogData.fullText.length) {
29
+ dialogData.typing = false;
30
+ dialogData.visibleChars = dialogData.fullText.length;
31
+ IsTypingDialog.deleteFrom(entity);
32
+ }
33
+ dialogData.visibleText = dialogData.fullText.substr(0, dialogData.visibleChars);
34
+ }
35
+ }
36
+ }
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zeXN0ZW1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUN0QyxPQUFPLEVBQUUsa0JBQWtCLEVBQTBCLE1BQU0sVUFBVSxDQUFDO0FBRXRFLE1BQU0sVUFBVSxlQUFlLENBQUMsRUFBUztJQUNyQyxLQUFLLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1FBQzVELElBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBQztZQUN6QixJQUFJLE9BQU8sR0FBVSxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBRSxDQUFBO1lBQy9DLE9BQU8sSUFBSSxFQUFFLENBQUE7WUFDYixhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBRSxHQUFHLEVBQUUsQ0FBQyxDQUFBO1NBQzdEO2FBQ0c7WUFDQSxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQTtTQUNoQztLQUNKO0FBQ0gsQ0FBQztBQUVILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxFQUFTO0lBQ3hDLEtBQUssTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLEVBQUU7UUFDM0QsSUFBSSxVQUFVLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQy9DLElBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFDO1lBQ2xCLE9BQU07U0FDVDtRQUVELFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFBO1FBQ3RCLElBQUksVUFBVSxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFBRTtZQUMxQyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFDdEUsVUFBVSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUE7WUFDcEIsVUFBVSxDQUFDLFlBQVksSUFBSSxVQUFVLENBQUE7WUFFckMsSUFBSSxVQUFVLENBQUMsWUFBWSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO2dCQUN2RCxVQUFVLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQTtnQkFDekIsVUFBVSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQTtnQkFDcEQsY0FBYyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQTthQUVwQztZQUVELFVBQVUsQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQTtTQUNsRjtLQUNKO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVuZ2luZSB9IGZyb20gXCJAZGNsL3Nkay9lY3NcIjtcbmltcG9ydCB7IElzRm9sbG93aW5nUGF0aCwgSXNUeXBpbmdEaWFsb2cgfSBmcm9tIFwiLi9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyB3YWxraW5nVGltZXJzIH0gZnJvbSBcIi4vbnBjXCI7XG5pbXBvcnQgeyBucGNEaWFsb2dDb21wb25lbnQsIG5wY0RpYWxvZ1R5cGluZ1N5c3RlbXMgfSBmcm9tIFwiLi9kaWFsb2dcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVBhdGhUaW1lcyhkdDpudW1iZXIpIHtcbiAgICBmb3IgKGNvbnN0IFtlbnRpdHldIG9mIGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoSXNGb2xsb3dpbmdQYXRoKSkge1xuICAgICAgICBpZih3YWxraW5nVGltZXJzLmhhcyhlbnRpdHkpKXtcbiAgICAgICAgICAgIGxldCBlbGFwc2VkOm51bWJlciA9IHdhbGtpbmdUaW1lcnMuZ2V0KGVudGl0eSkhXG4gICAgICAgICAgICBlbGFwc2VkICs9IGR0XG4gICAgICAgICAgICB3YWxraW5nVGltZXJzLnNldChlbnRpdHksIHdhbGtpbmdUaW1lcnMuZ2V0KGVudGl0eSkhICsgZHQpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIHdhbGtpbmdUaW1lcnMuc2V0KGVudGl0eSwgZHQpXG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZURpYWxvZ1R5cGluZyhkdDpudW1iZXIpIHtcbiAgICBmb3IgKGNvbnN0IFtlbnRpdHldIG9mIGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoSXNUeXBpbmdEaWFsb2cpKSB7XG4gICAgICAgIGxldCBkaWFsb2dEYXRhID0gbnBjRGlhbG9nQ29tcG9uZW50LmdldChlbnRpdHkpXG4gICAgICAgIGlmKCFkaWFsb2dEYXRhLnR5cGluZyl7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGRpYWxvZ0RhdGEudGltZXIgKz0gZHRcbiAgICAgICAgaWYgKGRpYWxvZ0RhdGEudGltZXIgPj0gMiAvIGRpYWxvZ0RhdGEuc3BlZWQpIHtcbiAgICAgICAgICAgIGxldCBjaGFyc1RvQWRkID0gTWF0aC5mbG9vcihkaWFsb2dEYXRhLnRpbWVyIC8gKDEgLyBkaWFsb2dEYXRhLnNwZWVkKSlcbiAgICAgICAgICAgIGRpYWxvZ0RhdGEudGltZXIgPSAwXG4gICAgICAgICAgICBkaWFsb2dEYXRhLnZpc2libGVDaGFycyArPSBjaGFyc1RvQWRkXG4gICAgICAgIFxuICAgICAgICAgICAgaWYgKGRpYWxvZ0RhdGEudmlzaWJsZUNoYXJzID49IGRpYWxvZ0RhdGEuZnVsbFRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZGlhbG9nRGF0YS50eXBpbmcgPSBmYWxzZVxuICAgICAgICAgICAgICAgIGRpYWxvZ0RhdGEudmlzaWJsZUNoYXJzID0gZGlhbG9nRGF0YS5mdWxsVGV4dC5sZW5ndGhcbiAgICAgICAgICAgICAgICBJc1R5cGluZ0RpYWxvZy5kZWxldGVGcm9tKGVudGl0eSlcbiAgICAgICAgICAgICAgICAvL2VuZ2luZS5yZW1vdmVTeXN0ZW0obnBjRGlhbG9nVHlwaW5nU3lzdGVtcy5nZXQoZW50aXR5KSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGlhbG9nRGF0YS52aXNpYmxlVGV4dCA9IGRpYWxvZ0RhdGEuZnVsbFRleHQuc3Vic3RyKDAsIGRpYWxvZ0RhdGEudmlzaWJsZUNoYXJzKVxuICAgICAgICB9XG4gICAgfVxuICB9Il19
@@ -0,0 +1,119 @@
1
+ import { Vector3 } from "@dcl/sdk/math";
2
+ export type Dialog = {
3
+ text: string;
4
+ name?: string;
5
+ fontSize?: number;
6
+ offsetX?: number;
7
+ offsetY?: number;
8
+ typeSpeed?: number;
9
+ isEndOfDialog?: boolean;
10
+ triggeredByNext?: () => void;
11
+ portrait?: ImageData;
12
+ image?: ImageData;
13
+ isQuestion?: boolean;
14
+ isFixedScreen?: boolean;
15
+ buttons?: ButtonData[];
16
+ audio?: string;
17
+ skipable?: boolean;
18
+ timeOn?: number;
19
+ };
20
+ export type TriggerData = {
21
+ layer?: number;
22
+ triggeredByLayer?: number;
23
+ onTriggerEnter?: () => void;
24
+ onTriggerExit?: () => void;
25
+ onCameraEnter?: () => void;
26
+ onCameraExit?: () => void;
27
+ enableDebug?: boolean;
28
+ };
29
+ export type ButtonData = {
30
+ goToDialog: number | string;
31
+ label: string;
32
+ triggeredActions?: () => void;
33
+ fontSize?: number;
34
+ offsetX?: number;
35
+ offsetY?: number;
36
+ };
37
+ export declare enum ButtonStyles {
38
+ E = "e",
39
+ F = "f",
40
+ DARK = "dark",
41
+ RED = "red",
42
+ ROUNDBLACK = "roundblack",
43
+ ROUNDWHITE = "roundwhite",
44
+ ROUNDSILVER = "roundsilver",
45
+ ROUNDGOLD = "roundgold",
46
+ SQUAREBLACK = "squareblack",
47
+ SQUAREWHITE = "squarewhite",
48
+ SQUARESILVER = "squaresilver",
49
+ SQUAREGOLD = "squaregold",
50
+ WHITE = "white"
51
+ }
52
+ export type NPCData = {
53
+ type: NPCType;
54
+ body?: NPCBodyType;
55
+ model?: string;
56
+ walkingAnim?: string;
57
+ portrait?: string | ImageData;
58
+ reactDistance?: number;
59
+ idleAnim?: string;
60
+ faceUser?: boolean;
61
+ turningSpeed?: number;
62
+ onlyExternalTrigger?: boolean;
63
+ onlyClickTrigger?: boolean;
64
+ onlyETrigger?: boolean;
65
+ onActivate: () => void;
66
+ onWalkAway?: () => void;
67
+ continueOnWalkAway?: boolean;
68
+ darkUI?: boolean;
69
+ coolDownDuration?: number;
70
+ hoverText?: string;
71
+ dialogSound?: string;
72
+ textBubble?: boolean;
73
+ bubbleHeight?: number;
74
+ noUI?: boolean;
75
+ pathData?: FollowPathData;
76
+ };
77
+ export type FollowPathData = {
78
+ startingPoint?: number;
79
+ loop?: boolean;
80
+ curve?: boolean;
81
+ totalDuration: number;
82
+ speed?: number;
83
+ path?: Vector3[];
84
+ pathType?: NPCPathType;
85
+ onFinishCallback?: () => void;
86
+ onReachedPointCallback?: () => void;
87
+ };
88
+ export type ImageSection = {
89
+ sourceWidth: number;
90
+ sourceHeight: number;
91
+ sourceLeft?: number;
92
+ sourceTop?: number;
93
+ };
94
+ export type ImageData = {
95
+ path: string;
96
+ offsetX?: number;
97
+ offsetY?: number;
98
+ height?: number;
99
+ width?: number;
100
+ section?: ImageSection;
101
+ };
102
+ export declare enum NPCState {
103
+ STANDING = "standing",
104
+ TALKING = "talking",
105
+ FOLLOWPATH = "followPath"
106
+ }
107
+ export declare enum NPCBodyType {
108
+ MALE = "BaseMale",
109
+ FEMALE = "BaseFemale"
110
+ }
111
+ export declare enum NPCType {
112
+ BLANK = "blank",
113
+ CUSTOM = "custom",
114
+ AVATAR = "avatar"
115
+ }
116
+ export declare enum NPCPathType {
117
+ SMOOTH_PATH = "smooth",
118
+ RIGID_PATH = "rigid"
119
+ }