@overlap.ai/react-video-subtitles 1.0.2

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,2509 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import React, { memo, useMemo, useEffect } from 'react';
3
+ import { Player } from '@remotion/player';
4
+ import { spring, random, useCurrentFrame } from 'remotion';
5
+
6
+ /******************************************************************************
7
+ Copyright (c) Microsoft Corporation.
8
+
9
+ Permission to use, copy, modify, and/or distribute this software for any
10
+ purpose with or without fee is hereby granted.
11
+
12
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
13
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
14
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
15
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
16
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
17
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
18
+ PERFORMANCE OF THIS SOFTWARE.
19
+ ***************************************************************************** */
20
+ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
21
+
22
+
23
+ var __assign = function() {
24
+ __assign = Object.assign || function __assign(t) {
25
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
26
+ s = arguments[i];
27
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
28
+ }
29
+ return t;
30
+ };
31
+ return __assign.apply(this, arguments);
32
+ };
33
+
34
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
35
+ var e = new Error(message);
36
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
37
+ };
38
+
39
+ function _arrayLikeToArray(r, a) {
40
+ (null == a || a > r.length) && (a = r.length);
41
+ for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
42
+ return n;
43
+ }
44
+ function _arrayWithHoles(r) {
45
+ if (Array.isArray(r)) return r;
46
+ }
47
+ function _arrayWithoutHoles(r) {
48
+ if (Array.isArray(r)) return _arrayLikeToArray(r);
49
+ }
50
+ function asyncGeneratorStep(n, t, e, r, o, a, c) {
51
+ try {
52
+ var i = n[a](c),
53
+ u = i.value;
54
+ } catch (n) {
55
+ return void e(n);
56
+ }
57
+ i.done ? t(u) : Promise.resolve(u).then(r, o);
58
+ }
59
+ function _asyncToGenerator(n) {
60
+ return function () {
61
+ var t = this,
62
+ e = arguments;
63
+ return new Promise(function (r, o) {
64
+ var a = n.apply(t, e);
65
+ function _next(n) {
66
+ asyncGeneratorStep(a, r, o, _next, _throw, "next", n);
67
+ }
68
+ function _throw(n) {
69
+ asyncGeneratorStep(a, r, o, _next, _throw, "throw", n);
70
+ }
71
+ _next(void 0);
72
+ });
73
+ };
74
+ }
75
+ function _defineProperty(e, r, t) {
76
+ return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
77
+ value: t,
78
+ enumerable: !0,
79
+ configurable: !0,
80
+ writable: !0
81
+ }) : e[r] = t, e;
82
+ }
83
+ function _iterableToArray(r) {
84
+ if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r);
85
+ }
86
+ function _iterableToArrayLimit(r, l) {
87
+ var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
88
+ if (null != t) {
89
+ var e,
90
+ n,
91
+ i,
92
+ u,
93
+ a = [],
94
+ f = !0,
95
+ o = !1;
96
+ try {
97
+ if (i = (t = t.call(r)).next, 0 === l) {
98
+ if (Object(t) !== t) return;
99
+ f = !1;
100
+ } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);
101
+ } catch (r) {
102
+ o = !0, n = r;
103
+ } finally {
104
+ try {
105
+ if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;
106
+ } finally {
107
+ if (o) throw n;
108
+ }
109
+ }
110
+ return a;
111
+ }
112
+ }
113
+ function _nonIterableRest() {
114
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
115
+ }
116
+ function _nonIterableSpread() {
117
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
118
+ }
119
+ function ownKeys(e, r) {
120
+ var t = Object.keys(e);
121
+ if (Object.getOwnPropertySymbols) {
122
+ var o = Object.getOwnPropertySymbols(e);
123
+ r && (o = o.filter(function (r) {
124
+ return Object.getOwnPropertyDescriptor(e, r).enumerable;
125
+ })), t.push.apply(t, o);
126
+ }
127
+ return t;
128
+ }
129
+ function _objectSpread2(e) {
130
+ for (var r = 1; r < arguments.length; r++) {
131
+ var t = null != arguments[r] ? arguments[r] : {};
132
+ r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {
133
+ _defineProperty(e, r, t[r]);
134
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {
135
+ Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
136
+ });
137
+ }
138
+ return e;
139
+ }
140
+ function _regeneratorRuntime() {
141
+ _regeneratorRuntime = function () {
142
+ return e;
143
+ };
144
+ var t,
145
+ e = {},
146
+ r = Object.prototype,
147
+ n = r.hasOwnProperty,
148
+ o = Object.defineProperty || function (t, e, r) {
149
+ t[e] = r.value;
150
+ },
151
+ i = "function" == typeof Symbol ? Symbol : {},
152
+ a = i.iterator || "@@iterator",
153
+ c = i.asyncIterator || "@@asyncIterator",
154
+ u = i.toStringTag || "@@toStringTag";
155
+ function define(t, e, r) {
156
+ return Object.defineProperty(t, e, {
157
+ value: r,
158
+ enumerable: !0,
159
+ configurable: !0,
160
+ writable: !0
161
+ }), t[e];
162
+ }
163
+ try {
164
+ define({}, "");
165
+ } catch (t) {
166
+ define = function (t, e, r) {
167
+ return t[e] = r;
168
+ };
169
+ }
170
+ function wrap(t, e, r, n) {
171
+ var i = e && e.prototype instanceof Generator ? e : Generator,
172
+ a = Object.create(i.prototype),
173
+ c = new Context(n || []);
174
+ return o(a, "_invoke", {
175
+ value: makeInvokeMethod(t, r, c)
176
+ }), a;
177
+ }
178
+ function tryCatch(t, e, r) {
179
+ try {
180
+ return {
181
+ type: "normal",
182
+ arg: t.call(e, r)
183
+ };
184
+ } catch (t) {
185
+ return {
186
+ type: "throw",
187
+ arg: t
188
+ };
189
+ }
190
+ }
191
+ e.wrap = wrap;
192
+ var h = "suspendedStart",
193
+ l = "suspendedYield",
194
+ f = "executing",
195
+ s = "completed",
196
+ y = {};
197
+ function Generator() {}
198
+ function GeneratorFunction() {}
199
+ function GeneratorFunctionPrototype() {}
200
+ var p = {};
201
+ define(p, a, function () {
202
+ return this;
203
+ });
204
+ var d = Object.getPrototypeOf,
205
+ v = d && d(d(values([])));
206
+ v && v !== r && n.call(v, a) && (p = v);
207
+ var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p);
208
+ function defineIteratorMethods(t) {
209
+ ["next", "throw", "return"].forEach(function (e) {
210
+ define(t, e, function (t) {
211
+ return this._invoke(e, t);
212
+ });
213
+ });
214
+ }
215
+ function AsyncIterator(t, e) {
216
+ function invoke(r, o, i, a) {
217
+ var c = tryCatch(t[r], t, o);
218
+ if ("throw" !== c.type) {
219
+ var u = c.arg,
220
+ h = u.value;
221
+ return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) {
222
+ invoke("next", t, i, a);
223
+ }, function (t) {
224
+ invoke("throw", t, i, a);
225
+ }) : e.resolve(h).then(function (t) {
226
+ u.value = t, i(u);
227
+ }, function (t) {
228
+ return invoke("throw", t, i, a);
229
+ });
230
+ }
231
+ a(c.arg);
232
+ }
233
+ var r;
234
+ o(this, "_invoke", {
235
+ value: function (t, n) {
236
+ function callInvokeWithMethodAndArg() {
237
+ return new e(function (e, r) {
238
+ invoke(t, n, e, r);
239
+ });
240
+ }
241
+ return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
242
+ }
243
+ });
244
+ }
245
+ function makeInvokeMethod(e, r, n) {
246
+ var o = h;
247
+ return function (i, a) {
248
+ if (o === f) throw Error("Generator is already running");
249
+ if (o === s) {
250
+ if ("throw" === i) throw a;
251
+ return {
252
+ value: t,
253
+ done: !0
254
+ };
255
+ }
256
+ for (n.method = i, n.arg = a;;) {
257
+ var c = n.delegate;
258
+ if (c) {
259
+ var u = maybeInvokeDelegate(c, n);
260
+ if (u) {
261
+ if (u === y) continue;
262
+ return u;
263
+ }
264
+ }
265
+ if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) {
266
+ if (o === h) throw o = s, n.arg;
267
+ n.dispatchException(n.arg);
268
+ } else "return" === n.method && n.abrupt("return", n.arg);
269
+ o = f;
270
+ var p = tryCatch(e, r, n);
271
+ if ("normal" === p.type) {
272
+ if (o = n.done ? s : l, p.arg === y) continue;
273
+ return {
274
+ value: p.arg,
275
+ done: n.done
276
+ };
277
+ }
278
+ "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg);
279
+ }
280
+ };
281
+ }
282
+ function maybeInvokeDelegate(e, r) {
283
+ var n = r.method,
284
+ o = e.iterator[n];
285
+ if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y;
286
+ var i = tryCatch(o, e.iterator, r.arg);
287
+ if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y;
288
+ var a = i.arg;
289
+ return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y);
290
+ }
291
+ function pushTryEntry(t) {
292
+ var e = {
293
+ tryLoc: t[0]
294
+ };
295
+ 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e);
296
+ }
297
+ function resetTryEntry(t) {
298
+ var e = t.completion || {};
299
+ e.type = "normal", delete e.arg, t.completion = e;
300
+ }
301
+ function Context(t) {
302
+ this.tryEntries = [{
303
+ tryLoc: "root"
304
+ }], t.forEach(pushTryEntry, this), this.reset(!0);
305
+ }
306
+ function values(e) {
307
+ if (e || "" === e) {
308
+ var r = e[a];
309
+ if (r) return r.call(e);
310
+ if ("function" == typeof e.next) return e;
311
+ if (!isNaN(e.length)) {
312
+ var o = -1,
313
+ i = function next() {
314
+ for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next;
315
+ return next.value = t, next.done = !0, next;
316
+ };
317
+ return i.next = i;
318
+ }
319
+ }
320
+ throw new TypeError(typeof e + " is not iterable");
321
+ }
322
+ return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", {
323
+ value: GeneratorFunctionPrototype,
324
+ configurable: !0
325
+ }), o(GeneratorFunctionPrototype, "constructor", {
326
+ value: GeneratorFunction,
327
+ configurable: !0
328
+ }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) {
329
+ var e = "function" == typeof t && t.constructor;
330
+ return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name));
331
+ }, e.mark = function (t) {
332
+ return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t;
333
+ }, e.awrap = function (t) {
334
+ return {
335
+ __await: t
336
+ };
337
+ }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () {
338
+ return this;
339
+ }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) {
340
+ void 0 === i && (i = Promise);
341
+ var a = new AsyncIterator(wrap(t, r, n, o), i);
342
+ return e.isGeneratorFunction(r) ? a : a.next().then(function (t) {
343
+ return t.done ? t.value : a.next();
344
+ });
345
+ }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () {
346
+ return this;
347
+ }), define(g, "toString", function () {
348
+ return "[object Generator]";
349
+ }), e.keys = function (t) {
350
+ var e = Object(t),
351
+ r = [];
352
+ for (var n in e) r.push(n);
353
+ return r.reverse(), function next() {
354
+ for (; r.length;) {
355
+ var t = r.pop();
356
+ if (t in e) return next.value = t, next.done = !1, next;
357
+ }
358
+ return next.done = !0, next;
359
+ };
360
+ }, e.values = values, Context.prototype = {
361
+ constructor: Context,
362
+ reset: function (e) {
363
+ if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t);
364
+ },
365
+ stop: function () {
366
+ this.done = !0;
367
+ var t = this.tryEntries[0].completion;
368
+ if ("throw" === t.type) throw t.arg;
369
+ return this.rval;
370
+ },
371
+ dispatchException: function (e) {
372
+ if (this.done) throw e;
373
+ var r = this;
374
+ function handle(n, o) {
375
+ return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o;
376
+ }
377
+ for (var o = this.tryEntries.length - 1; o >= 0; --o) {
378
+ var i = this.tryEntries[o],
379
+ a = i.completion;
380
+ if ("root" === i.tryLoc) return handle("end");
381
+ if (i.tryLoc <= this.prev) {
382
+ var c = n.call(i, "catchLoc"),
383
+ u = n.call(i, "finallyLoc");
384
+ if (c && u) {
385
+ if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);
386
+ if (this.prev < i.finallyLoc) return handle(i.finallyLoc);
387
+ } else if (c) {
388
+ if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);
389
+ } else {
390
+ if (!u) throw Error("try statement without catch or finally");
391
+ if (this.prev < i.finallyLoc) return handle(i.finallyLoc);
392
+ }
393
+ }
394
+ }
395
+ },
396
+ abrupt: function (t, e) {
397
+ for (var r = this.tryEntries.length - 1; r >= 0; --r) {
398
+ var o = this.tryEntries[r];
399
+ if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) {
400
+ var i = o;
401
+ break;
402
+ }
403
+ }
404
+ i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null);
405
+ var a = i ? i.completion : {};
406
+ return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a);
407
+ },
408
+ complete: function (t, e) {
409
+ if ("throw" === t.type) throw t.arg;
410
+ return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y;
411
+ },
412
+ finish: function (t) {
413
+ for (var e = this.tryEntries.length - 1; e >= 0; --e) {
414
+ var r = this.tryEntries[e];
415
+ if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y;
416
+ }
417
+ },
418
+ catch: function (t) {
419
+ for (var e = this.tryEntries.length - 1; e >= 0; --e) {
420
+ var r = this.tryEntries[e];
421
+ if (r.tryLoc === t) {
422
+ var n = r.completion;
423
+ if ("throw" === n.type) {
424
+ var o = n.arg;
425
+ resetTryEntry(r);
426
+ }
427
+ return o;
428
+ }
429
+ }
430
+ throw Error("illegal catch attempt");
431
+ },
432
+ delegateYield: function (e, r, n) {
433
+ return this.delegate = {
434
+ iterator: values(e),
435
+ resultName: r,
436
+ nextLoc: n
437
+ }, "next" === this.method && (this.arg = t), y;
438
+ }
439
+ }, e;
440
+ }
441
+ function _slicedToArray(r, e) {
442
+ return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();
443
+ }
444
+ function _toConsumableArray(r) {
445
+ return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();
446
+ }
447
+ function _toPrimitive(t, r) {
448
+ if ("object" != typeof t || !t) return t;
449
+ var e = t[Symbol.toPrimitive];
450
+ if (void 0 !== e) {
451
+ var i = e.call(t, r || "default");
452
+ if ("object" != typeof i) return i;
453
+ throw new TypeError("@@toPrimitive must return a primitive value.");
454
+ }
455
+ return ("string" === r ? String : Number)(t);
456
+ }
457
+ function _toPropertyKey(t) {
458
+ var i = _toPrimitive(t, "string");
459
+ return "symbol" == typeof i ? i : i + "";
460
+ }
461
+ function _typeof(o) {
462
+ "@babel/helpers - typeof";
463
+
464
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
465
+ return typeof o;
466
+ } : function (o) {
467
+ return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
468
+ }, _typeof(o);
469
+ }
470
+ function _unsupportedIterableToArray(r, a) {
471
+ if (r) {
472
+ if ("string" == typeof r) return _arrayLikeToArray(r, a);
473
+ var t = {}.toString.call(r).slice(8, -1);
474
+ return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
475
+ }
476
+ }
477
+
478
+ // Helper function to estimate text width
479
+ var estimateTextWidth = function estimateTextWidth(text, fontSize, fontFamily) {
480
+ var canvas = document.createElement('canvas');
481
+ var context = canvas.getContext('2d');
482
+ context.font = "".concat(fontSize, "px ").concat(fontFamily);
483
+ return context.measureText(text).width;
484
+ };
485
+
486
+ // Helper function to generate outline shadow
487
+ var generateOutlineShadow = function () {
488
+ var cache = new Map();
489
+ return function (color, width) {
490
+ var outlineStyle = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "round";
491
+ var key = "".concat(color, "-").concat(width, "-").concat(outlineStyle);
492
+ if (cache.has(key)) {
493
+ return cache.get(key);
494
+ }
495
+ var shadows = [];
496
+ var parsedWidth = parseInt(width, 10);
497
+ if (outlineStyle === "angular") {
498
+ // Create sharp corners by using perpendicular lines
499
+ // Top, right, bottom, left
500
+ shadows.push("0 -".concat(parsedWidth, "px 0 ").concat(color)); // Top
501
+ shadows.push("".concat(parsedWidth, "px 0 0 ").concat(color)); // Right
502
+ shadows.push("0 ".concat(parsedWidth, "px 0 ").concat(color)); // Bottom
503
+ shadows.push("-".concat(parsedWidth, "px 0 0 ").concat(color)); // Left
504
+
505
+ // Add diagonal points for corners
506
+ shadows.push("".concat(parsedWidth, "px -").concat(parsedWidth, "px 0 ").concat(color)); // Top-right
507
+ shadows.push("".concat(parsedWidth, "px ").concat(parsedWidth, "px 0 ").concat(color)); // Bottom-right
508
+ shadows.push("-".concat(parsedWidth, "px ").concat(parsedWidth, "px 0 ").concat(color)); // Bottom-left
509
+ shadows.push("-".concat(parsedWidth, "px -").concat(parsedWidth, "px 0 ").concat(color)); // Top-left
510
+
511
+ // Add intermediate points for better coverage
512
+ var halfWidth = Math.round(parsedWidth * 0.7071); // cos(45°) ≈ 0.7071
513
+ shadows.push("".concat(halfWidth, "px -").concat(parsedWidth, "px 0 ").concat(color)); // Top-right intermediate
514
+ shadows.push("".concat(parsedWidth, "px -").concat(halfWidth, "px 0 ").concat(color)); // Right-top intermediate
515
+ shadows.push("".concat(parsedWidth, "px ").concat(halfWidth, "px 0 ").concat(color)); // Right-bottom intermediate
516
+ shadows.push("".concat(halfWidth, "px ").concat(parsedWidth, "px 0 ").concat(color)); // Bottom-right intermediate
517
+ shadows.push("-".concat(halfWidth, "px ").concat(parsedWidth, "px 0 ").concat(color)); // Bottom-left intermediate
518
+ shadows.push("-".concat(parsedWidth, "px ").concat(halfWidth, "px 0 ").concat(color)); // Left-bottom intermediate
519
+ shadows.push("-".concat(parsedWidth, "px -").concat(halfWidth, "px 0 ").concat(color)); // Left-top intermediate
520
+ shadows.push("-".concat(halfWidth, "px -").concat(parsedWidth, "px 0 ").concat(color)); // Top-left intermediate
521
+ } else {
522
+ // Original round style
523
+ for (var i = 0; i < 360; i += 22.5) {
524
+ var angle = i * Math.PI / 180;
525
+ var x = Math.round(Math.cos(angle) * parsedWidth);
526
+ var y = Math.round(Math.sin(angle) * parsedWidth);
527
+ shadows.push("".concat(x, "px ").concat(y, "px 0 ").concat(color));
528
+ }
529
+ }
530
+ var result = shadows.join(',');
531
+ cache.set(key, result);
532
+ return result;
533
+ };
534
+ }();
535
+ var SubtitleText = /*#__PURE__*/memo(function (_ref) {
536
+ var text = _ref.text,
537
+ style = _ref.style,
538
+ animationStyle = _ref.animationStyle,
539
+ frame = _ref.frame,
540
+ startFrame = _ref.startFrame,
541
+ randomColors = _ref.randomColors,
542
+ words = _ref.words,
543
+ fps = _ref.fps,
544
+ highlightWordsColor = _ref.highlightWordsColor;
545
+ var relativeFrame = frame - startFrame;
546
+ var scale = useMemo(function () {
547
+ if (animationStyle === "pleasure-pod-animation") {
548
+ return spring({
549
+ frame: relativeFrame,
550
+ from: 0.95,
551
+ to: 1.0,
552
+ fps: 30,
553
+ config: {
554
+ damping: 20,
555
+ stiffness: 400
556
+ }
557
+ });
558
+ }
559
+ if (animationStyle === "spring") {
560
+ var springValue = spring({
561
+ frame: relativeFrame,
562
+ from: 0.9,
563
+ to: 1,
564
+ fps: fps,
565
+ config: {
566
+ mass: 0.5,
567
+ stiffness: 150,
568
+ damping: 15
569
+ }
570
+ });
571
+ return springValue;
572
+ }
573
+ return 1;
574
+ }, [animationStyle, relativeFrame, fps]);
575
+ var translateY = useMemo(function () {
576
+ if (animationStyle === "spring") {
577
+ var translateValue = spring({
578
+ frame: relativeFrame,
579
+ from: 10,
580
+ to: 0,
581
+ fps: fps,
582
+ config: {
583
+ mass: 0.5,
584
+ stiffness: 150,
585
+ damping: 15
586
+ }
587
+ });
588
+ return translateValue;
589
+ }
590
+ return 0;
591
+ }, [animationStyle, relativeFrame, fps]);
592
+
593
+ // Calculate adjusted font size based on text width
594
+ var adjustedFontSize = useMemo(function () {
595
+ var maxLineWidth = style.maxLineWidth || 1080; // Default max width
596
+ var baseFontSize = style.fontSize * 2 || 64; // Default font size
597
+ var fontFamily = style.fontFamily || 'Arial';
598
+ var textWidth = estimateTextWidth(text, baseFontSize, fontFamily);
599
+ if (textWidth > maxLineWidth) {
600
+ var scaleFactor = maxLineWidth / textWidth;
601
+ return Math.floor(baseFontSize * scaleFactor);
602
+ }
603
+ return baseFontSize;
604
+ }, [text, style.maxLineWidth, style.fontSize, style.fontFamily]);
605
+
606
+ // Calculate adjusted font size based on text width
607
+ var animatedStyle = useMemo(function () {
608
+ var basePadding = style.backgroundPadding || '15';
609
+
610
+ // Create text shadow based on intensity
611
+ var shadowIntensity = style.shadowIntensity || 1;
612
+ var shadowColor = style.shadowColor || '#000000';
613
+ var shadowBlur = style.shadowBlur || '2';
614
+ var shadowOffsetX = style.shadowOffsetX || '0';
615
+ var shadowOffsetY = style.shadowOffsetY || '0';
616
+
617
+ // Stack multiple shadows based on intensity
618
+ var shadows = [];
619
+ for (var i = 0; i < shadowIntensity; i++) {
620
+ shadows.push("".concat(shadowOffsetX, "px ").concat(shadowOffsetY, "px ").concat(shadowBlur, "px ").concat(shadowColor));
621
+ }
622
+ var textShadow = shadows.join(', ');
623
+
624
+ // Convert hex to rgba for background color
625
+ var hexToRgba = function hexToRgba(hex, opacity) {
626
+ var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
627
+ hex = hex.replace(shorthandRegex, function (m, r, g, b) {
628
+ return r + r + g + g + b + b;
629
+ });
630
+ var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
631
+ if (!result) return hex;
632
+ var r = parseInt(result[1], 16);
633
+ var g = parseInt(result[2], 16);
634
+ var b = parseInt(result[3], 16);
635
+ return "rgba(".concat(r, ", ").concat(g, ", ").concat(b, ", ").concat(opacity, ")");
636
+ };
637
+ var backgroundColor = style.backgroundColor || '#000000';
638
+ var opacity = typeof style.backgroundOpacity === 'string' ? parseFloat(style.backgroundOpacity.trim()) : parseFloat(style.backgroundOpacity) || 0;
639
+ var background = hexToRgba(backgroundColor, opacity);
640
+ var hasBackground = opacity > 0;
641
+ var hasShadow = shadowIntensity > 0 && (shadowBlur !== '0' || shadowOffsetX !== '0' || shadowOffsetY !== '0');
642
+
643
+ // Handle border radius properly
644
+ var borderRadius = style.backgroundBorderRadius ? "".concat(parseInt(style.backgroundBorderRadius, 10), "px") : '0px';
645
+
646
+ // Handle background wrapping
647
+ var isWrapped = style.backgroundFillStyle === "wrap";
648
+ var paddingValue = parseInt(basePadding, 10);
649
+
650
+ // For wrapped style, use uniform padding
651
+ var padding = isWrapped ? "".concat(paddingValue, "px ").concat(Math.round(paddingValue * 1.2), "px") : "".concat(paddingValue, "px ").concat(paddingValue * 3, "px");
652
+ var width = isWrapped ? "auto" : style.width;
653
+ var display = isWrapped ? "inline-block" : style.display || "block";
654
+ var baseStyle = _objectSpread2(_objectSpread2({
655
+ padding: padding,
656
+ background: background,
657
+ borderRadius: borderRadius,
658
+ width: width,
659
+ display: display,
660
+ overflow: 'hidden'
661
+ }, style), {}, {
662
+ // Keep fontFamily in the inline styles now
663
+ textShadow: 'none',
664
+ boxShadow: hasBackground && hasShadow ? textShadow : 'none',
665
+ transform: animationStyle === "spring" ? "".concat(style.transform ? "".concat(style.transform, " ") : '', "translate3d(0, ").concat(translateY, "px, 0) scale(").concat(scale, ")") : style.transform || 'none',
666
+ fontSize: typeof style.fontSize === 'string' ? adjustedFontSize : adjustedFontSize
667
+ });
668
+ return baseStyle;
669
+ }, [style, scale, translateY, adjustedFontSize, animationStyle]);
670
+ var wrapperStyle = useMemo(function () {
671
+ return {
672
+ position: 'relative',
673
+ transform: "scaleY(".concat(style.verticalStretch || 1, ")"),
674
+ whiteSpace: 'nowrap',
675
+ display: 'flex',
676
+ alignItems: 'center',
677
+ width: 'fit-content',
678
+ willChange: 'transform'
679
+ };
680
+ }, [style.verticalStretch]);
681
+ var outlineStyle = useMemo(function () {
682
+ return {
683
+ position: 'absolute',
684
+ left: 0,
685
+ top: 0,
686
+ right: 0,
687
+ bottom: 0,
688
+ color: style.outlineColor,
689
+ textShadow: generateOutlineShadow(style.outlineColor, style.outlineWidth, style.outlineStyle),
690
+ WebkitTextFillColor: 'transparent',
691
+ zIndex: 0
692
+ };
693
+ }, [style.outlineColor, style.outlineWidth, style.outlineStyle]);
694
+ var mainTextStyle = useMemo(function () {
695
+ return {
696
+ position: 'relative',
697
+ zIndex: 1,
698
+ WebkitTextStroke: 'unset',
699
+ color: style.color
700
+ };
701
+ }, [style.color]);
702
+
703
+ // Split text into words and calculate current time
704
+ var textWords = useMemo(function () {
705
+ return text.split(' ');
706
+ }, [text]);
707
+ var currentWordTime = frame / fps;
708
+
709
+ // Find currently spoken word
710
+
711
+ // Create amplified gradient style if amplifiedColor is a gradient array
712
+ var phraseAmplifiedStyle = useMemo(function () {
713
+ if (Array.isArray(style.amplifiedColors)) {
714
+ var firstWord = words[0].word;
715
+ var gradientIndex = Math.floor(random("amplified-phrase-".concat(firstWord)) * style.amplifiedColors.length);
716
+ var gradient = style.amplifiedColors[gradientIndex];
717
+ return {
718
+ background: "linear-gradient(".concat(gradient.angle, "deg, ").concat(gradient.colors.join(", "), ")"),
719
+ backgroundClip: "text",
720
+ WebkitTextFillColor: "transparent",
721
+ WebkitBackgroundClip: "text",
722
+ display: "inline-block",
723
+ position: "relative",
724
+ zIndex: 1
725
+ };
726
+ }
727
+ console.log("highlight words color:", highlightWordsColor);
728
+ if (_typeof(style.amplifiedColor) === 'object' && style.amplifiedColor.type === 'gradient') {
729
+ return {
730
+ background: "linear-gradient(".concat(style.amplifiedColor.colors[0].angle, "deg, ").concat(style.amplifiedColor.colors[0].colors.join(", "), ")"),
731
+ backgroundClip: "text",
732
+ WebkitTextFillColor: "transparent",
733
+ WebkitBackgroundClip: "text",
734
+ display: "inline-block",
735
+ position: "relative",
736
+ zIndex: 1
737
+ };
738
+ }
739
+ return {
740
+ color: style.amplifiedColor,
741
+ WebkitTextFillColor: style.amplifiedColor
742
+ };
743
+ }, [style.amplifiedColors, style.amplifiedColor, words]);
744
+
745
+ // Handle random colors if enabled
746
+ var randomColorData = useMemo(function () {
747
+ if (!(randomColors !== null && randomColors !== void 0 && randomColors.enabled) || !words) return null;
748
+ var shouldColor = random("should-color-".concat(words[0].word)) < randomColors.pctApplied;
749
+ if (!shouldColor) return null;
750
+ var _ref2 = (randomColors === null || randomColors === void 0 ? void 0 : randomColors.randomWordCountRange) || [0, 0],
751
+ _ref3 = _slicedToArray(_ref2, 2),
752
+ minWords = _ref3[0],
753
+ maxWords = _ref3[1];
754
+ var range = maxWords - minWords + 1;
755
+ var randomWordCount = Math.floor(random("word-count-".concat(words[0].word)) * range) + minWords;
756
+ var maxStartIndex = Math.max(0, textWords.length - randomWordCount);
757
+ var startIndex = Math.floor(random("start-index-".concat(words[0].word)) * (maxStartIndex + 1));
758
+ var randomColorObj = randomColors.colors[Math.floor(random("color-".concat(words[0].word)) * randomColors.colors.length)];
759
+ return {
760
+ shouldColor: shouldColor,
761
+ randomWordCount: randomWordCount,
762
+ startIndex: startIndex,
763
+ randomColorObj: randomColorObj
764
+ };
765
+ }, [randomColors, words, textWords.length]);
766
+ var phraseStyle = useMemo(function () {
767
+ if (!randomColorData) {
768
+ return {
769
+ color: style.color,
770
+ WebkitTextFillColor: style.color
771
+ };
772
+ }
773
+ var randomColorObj = randomColorData.randomColorObj;
774
+ return randomColorObj.type === "gradient" ? {
775
+ background: "linear-gradient(".concat(randomColorObj.angle, "deg, ").concat(randomColorObj.colors.join(", "), ")"),
776
+ backgroundClip: "text",
777
+ WebkitTextFillColor: "transparent",
778
+ WebkitBackgroundClip: "text",
779
+ display: "inline-block",
780
+ position: "relative",
781
+ zIndex: 1
782
+ } : {
783
+ color: randomColorObj.color,
784
+ WebkitTextFillColor: randomColorObj.color
785
+ };
786
+ }, [randomColorData, style.color]);
787
+ var wordContent = useMemo(function () {
788
+ return textWords.map(function (word, index) {
789
+ // Check if the word is surrounded by <h> tags
790
+ var highlightedMatch = word.match(/^<h>(.*?)<\/h>$/);
791
+ var isHighlighted = highlightedMatch !== null;
792
+ var displayWord = isHighlighted ? highlightedMatch[1] : word;
793
+ var shouldColorThisWord = randomColorData && index >= randomColorData.startIndex && index < randomColorData.startIndex + randomColorData.randomWordCount && index < textWords.length;
794
+ var wordTiming = words === null || words === void 0 ? void 0 : words[index];
795
+ var hasBeenSpoken = wordTiming && currentWordTime >= wordTiming.end;
796
+ var isCurrentlySpoken = wordTiming && currentWordTime >= wordTiming.start && currentWordTime < wordTiming.end;
797
+ var textHighlightPersists = style.textHighlightPersists ? true : false;
798
+ var shouldHighlight = style.amplifySpokenWords && (isCurrentlySpoken || textHighlightPersists && hasBeenSpoken);
799
+
800
+ // Modified logic to prioritize <h> tag highlighting
801
+ var wordStyle = isHighlighted ? {
802
+ color: highlightWordsColor,
803
+ WebkitTextFillColor: highlightWordsColor,
804
+ opacity: style.opacity || 1,
805
+ position: 'relative'
806
+ } : shouldHighlight ? _objectSpread2(_objectSpread2({}, phraseAmplifiedStyle), {}, {
807
+ opacity: style.amplifiedOpacity || 1,
808
+ position: 'relative'
809
+ }) : shouldColorThisWord ? _objectSpread2(_objectSpread2({}, phraseStyle), {}, {
810
+ opacity: style.opacity || 1,
811
+ position: 'relative'
812
+ }) : {
813
+ color: style.color,
814
+ WebkitTextFillColor: style.color,
815
+ opacity: style.unAmplifiedOpacity || 1,
816
+ position: 'relative'
817
+ };
818
+
819
+ // Add z-index to ensure proper stacking of word blocks
820
+ var containerStyle = _objectSpread2(_objectSpread2({}, wordStyle), {}, {
821
+ display: 'inline-block',
822
+ marginRight: index < textWords.length - 1 ? '0.25em' : 0,
823
+ position: 'relative',
824
+ zIndex: isCurrentlySpoken ? 2 : 1,
825
+ whiteSpace: 'nowrap'
826
+ });
827
+ return /*#__PURE__*/React.createElement("span", {
828
+ key: index,
829
+ style: containerStyle
830
+ }, style.currentWordBlock && isCurrentlySpoken && /*#__PURE__*/React.createElement("span", {
831
+ style: {
832
+ position: 'absolute',
833
+ content: '""',
834
+ left: "-".concat((style.currentWordBlockPadding || 5) * 2, "px"),
835
+ right: "-".concat((style.currentWordBlockPadding || 5) * 2, "px"),
836
+ top: 0,
837
+ height: '70%',
838
+ backgroundColor: style.currentWordBlockBackgroundColor || '#000000',
839
+ opacity: style.currentWordBlockOpacity || 1,
840
+ borderRadius: "".concat(style.currentWordBlockBorderRadius || 15, "px"),
841
+ zIndex: -1,
842
+ pointerEvents: 'none',
843
+ transform: 'translateY(2px)',
844
+ padding: "".concat(style.currentWordBlockPadding || 5, "px 0"),
845
+ boxSizing: 'content-box'
846
+ }
847
+ }), displayWord, " ");
848
+ });
849
+ }, [textWords, randomColorData, words, currentWordTime, style.amplifySpokenWords, style.textHighlightPersists, phraseAmplifiedStyle, phraseStyle, style.color, style.currentWordBlock, style.currentWordBlockBackgroundColor, style.currentWordBlockOpacity, style.currentWordBlockPadding, style.currentWordBlockBorderRadius, highlightWordsColor]);
850
+ // console.log('SubtitleText - received style fontFamily:', style.fontFamily);
851
+ return /*#__PURE__*/React.createElement("div", {
852
+ style: _objectSpread2(_objectSpread2({}, animatedStyle), {}, {
853
+ whiteSpace: 'nowrap',
854
+ width: 'fit-content',
855
+ display: 'block'
856
+ })
857
+ }, /*#__PURE__*/React.createElement("div", {
858
+ style: wrapperStyle
859
+ }, /*#__PURE__*/React.createElement("div", {
860
+ style: _objectSpread2(_objectSpread2({}, outlineStyle), {}, {
861
+ whiteSpace: 'nowrap'
862
+ })
863
+ }, wordContent), /*#__PURE__*/React.createElement("div", {
864
+ style: _objectSpread2(_objectSpread2({}, mainTextStyle), {}, {
865
+ whiteSpace: 'nowrap'
866
+ })
867
+ }, wordContent)));
868
+ }, function (prevProps, nextProps) {
869
+ // Only re-render if these essential props have changed
870
+ var essentialProps = ['frame', 'text', 'startFrame'];
871
+ var hasEssentialPropsChanged = essentialProps.some(function (prop) {
872
+ return prevProps[prop] !== nextProps[prop];
873
+ });
874
+
875
+ // Deep compare style and randomColors only if essential props haven't changed
876
+ if (!hasEssentialPropsChanged) {
877
+ return JSON.stringify(prevProps.style) === JSON.stringify(nextProps.style) && JSON.stringify(prevProps.randomColors) === JSON.stringify(nextProps.randomColors);
878
+ }
879
+ return false;
880
+ });
881
+
882
+ var findPhrasesInRange = function findPhrasesInRange(time, phrases) {
883
+ // Binary search to find the first phrase that ends after current time
884
+ var start = 0;
885
+ var end = phrases.length - 1;
886
+ while (start <= end) {
887
+ var mid = Math.floor((start + end) / 2);
888
+ var phrase = phrases[mid];
889
+ if (phrase.start <= time && time <= phrase.end) {
890
+ // Found a phrase that contains current time
891
+ return [phrase];
892
+ } else if (phrase.end < time) {
893
+ start = mid + 1;
894
+ } else {
895
+ end = mid - 1;
896
+ }
897
+ }
898
+ return [];
899
+ };
900
+
901
+ // Helper to convert hex to rgb
902
+ var hexToRgb = function hexToRgb(hex) {
903
+ // Remove # if present
904
+ hex = hex.replace('#', '');
905
+
906
+ // Handle both 3-digit and 6-digit hex
907
+ var r = parseInt(hex.length === 3 ? hex[0] + hex[0] : hex.slice(0, 2), 16);
908
+ var g = parseInt(hex.length === 3 ? hex[1] + hex[1] : hex.slice(2, 4), 16);
909
+ var b = parseInt(hex.length === 3 ? hex[2] + hex[2] : hex.slice(4, 6), 16);
910
+ return "".concat(r, ", ").concat(g, ", ").concat(b);
911
+ };
912
+ var useTextStyle = function useTextStyle(preset, x, adjustedY, videoWidth) {
913
+ return useMemo(function () {
914
+ // Create text shadow based on intensity
915
+ var shadowIntensity = preset.shadowIntensity || 1;
916
+ var shadowColor = preset.shadowColor || '#000000';
917
+ var shadowBlur = preset.shadowBlur || '2';
918
+ var shadowOffsetX = preset.shadowOffsetX || '0';
919
+ var shadowOffsetY = preset.shadowOffsetY || '0';
920
+
921
+ // Stack multiple shadows based on intensity
922
+ var shadows = [];
923
+ for (var i = 0; i < shadowIntensity; i++) {
924
+ shadows.push("".concat(shadowOffsetX, "px ").concat(shadowOffsetY, "px ").concat(shadowBlur, "px ").concat(shadowColor));
925
+ }
926
+ var textShadow = shadows.join(', ');
927
+ var dropShadow = preset.shadowEnabled !== false && (preset.shadowOffsetX || preset.shadowOffsetY || preset.shadowBlur) ? "drop-shadow(".concat(preset.shadowOffsetX, "px ").concat(preset.shadowOffsetY, "px ").concat(preset.shadowBlur, "px ").concat(preset.shadowColor, ")") : 'none';
928
+ var backgroundColor = preset.backgroundColor === 'transparent' ? 'transparent' : preset.backgroundColor && preset.backgroundOpacity ? "rgba(".concat(hexToRgb(preset.backgroundColor), ", ").concat(preset.backgroundOpacity, ")") : preset.backgroundColor || '#000000';
929
+
930
+ // Handle both directional and uniform padding
931
+ var paddingX = preset.backgroundPaddingX || preset.backgroundPadding || '10';
932
+ var paddingY = preset.backgroundPaddingY || preset.backgroundPadding || '10';
933
+ var basePadding = "".concat(paddingY, "px ").concat(paddingX, "px");
934
+ var style = {
935
+ position: "absolute",
936
+ left: "".concat(x, "px"),
937
+ top: "".concat(adjustedY, "px"),
938
+ transform: "translate(-50%, -50%)",
939
+ fontFamily: preset.fontFamily,
940
+ fontSize: "".concat(preset.fontSize, "px"),
941
+ fontWeight: preset.fontWeight,
942
+ color: preset.fontColor,
943
+ amplifiedColor: preset.amplifiedColor,
944
+ amplifiedColors: preset.amplifiedColors,
945
+ amplifySpokenWords: preset.amplifySpokenWords,
946
+ textTransform: preset.textCase,
947
+ fontStyle: preset.isItalic ? "italic" : "normal",
948
+ textAlign: "center",
949
+ letterSpacing: "".concat(preset.textSpacing, "px"),
950
+ backgroundColor: backgroundColor,
951
+ backgroundPadding: basePadding,
952
+ backgroundBorderRadius: preset.backgroundBorderRadius,
953
+ verticalStretch: preset.verticalStretch || 1,
954
+ transformOrigin: "center center",
955
+ width: "auto",
956
+ maxWidth: "".concat(videoWidth * 0.9, "px"),
957
+ whiteSpace: "pre-wrap",
958
+ overflow: "visible",
959
+ outlineColor: preset.outlineColor,
960
+ outlineWidth: preset.outlineWidth,
961
+ filter: dropShadow,
962
+ display: "inline-block",
963
+ textHighlightPersists: preset.textHighlightPersists,
964
+ amplifiedOpacity: preset.amplifiedOpacity,
965
+ unAmplifiedOpacity: preset.opacity,
966
+ currentWordBlock: preset.currentWordBlock,
967
+ currentWordBlockBackgroundColor: preset.currentWordBlockBackgroundColor,
968
+ currentWordBlockOpacity: preset.currentWordBlockOpacity,
969
+ currentWordBlockPadding: preset.currentWordBlockPadding,
970
+ currentWordBlockBorderRadius: preset.currentWordBlockBorderRadius,
971
+ amplifyOpacityTransitionDuration: preset.amplifyOpacityTransitionDuration,
972
+ textShadow: textShadow,
973
+ shadowIntensity: preset.shadowIntensity
974
+ };
975
+
976
+ // console.log('useTextStyle - output style fontFamily:', style.fontFamily);
977
+ return style;
978
+ }, [preset, x, adjustedY, videoWidth]);
979
+ };
980
+
981
+ // Font map that matches CSS font-family names to their font files and weights
982
+ var FONT_MAP = {
983
+ 'Posterama-1927-W01-UltraBlack': [{
984
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/Posterama-1927-W01-UltraBlack.ttf?alt=media',
985
+ weight: 900,
986
+ style: 'normal'
987
+ }],
988
+ 'Stapel-Narrow': [{
989
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/NeueHaasDisplay/NeueHaasDisplayRoman.ttf?alt=media',
990
+ weight: 400,
991
+ style: 'normal'
992
+ }],
993
+ 'Stapel-NarrowMedium': [{
994
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/stapel/Stapel-NarrowMedium.ttf?alt=media',
995
+ weight: 500,
996
+ style: 'normal'
997
+ }],
998
+ 'NeueHaasDisplayBold': [{
999
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/NeueHaasDisplayBold.ttf?alt=media',
1000
+ weight: 700,
1001
+ style: 'normal'
1002
+ }],
1003
+ 'TheBoldFont': [{
1004
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/theboldfont.ttf?alt=media',
1005
+ weight: 700,
1006
+ style: 'normal'
1007
+ }],
1008
+ 'Mercadillo Black': [{
1009
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/mercadillo/Mercadillo-Black.ttf?alt=media',
1010
+ weight: 900,
1011
+ style: 'normal'
1012
+ }],
1013
+ 'Mercadillo Bold': [{
1014
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/mercadillo/Mercadillo-Bold.ttf?alt=media',
1015
+ weight: 700,
1016
+ style: 'normal'
1017
+ }],
1018
+ // need to add inter font variations
1019
+ // Inter font variations
1020
+ 'Inter': [{
1021
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/Inter/Inter-Thin.woff2?alt=media',
1022
+ weight: 100,
1023
+ style: 'normal'
1024
+ }, {
1025
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/Inter/Inter-ExtraLight.woff2?alt=media',
1026
+ weight: 200,
1027
+ style: 'normal'
1028
+ }, {
1029
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/Inter/Inter-Light.woff2?alt=media',
1030
+ weight: 300,
1031
+ style: 'normal'
1032
+ }, {
1033
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/Inter/Inter-Regular.woff2?alt=media',
1034
+ weight: 400,
1035
+ style: 'normal'
1036
+ }, {
1037
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/Inter/Inter-Medium.woff2?alt=media',
1038
+ weight: 500,
1039
+ style: 'normal'
1040
+ }, {
1041
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/Inter/Inter-SemiBold.woff2?alt=media',
1042
+ weight: 600,
1043
+ style: 'normal'
1044
+ }, {
1045
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/Inter/Inter-Bold.woff2?alt=media',
1046
+ weight: 700,
1047
+ style: 'normal'
1048
+ }, {
1049
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/Inter/Inter-ExtraBold.woff2?alt=media',
1050
+ weight: 800,
1051
+ style: 'normal'
1052
+ }, {
1053
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/Inter/Inter-Black.woff2?alt=media',
1054
+ weight: 900,
1055
+ style: 'normal'
1056
+ }],
1057
+ // Milliard font variations
1058
+ 'Milliard': [{
1059
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Thin.otf?alt=media',
1060
+ weight: 100,
1061
+ style: 'normal'
1062
+ }, {
1063
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Thin%20Italic.otf?alt=media',
1064
+ weight: 100,
1065
+ style: 'italic'
1066
+ }, {
1067
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20ExtraLight.otf?alt=media',
1068
+ weight: 200,
1069
+ style: 'normal'
1070
+ }, {
1071
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20ExtraLight%20Italic.otf?alt=media',
1072
+ weight: 200,
1073
+ style: 'italic'
1074
+ }, {
1075
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Light.otf?alt=media',
1076
+ weight: 300,
1077
+ style: 'normal'
1078
+ }, {
1079
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Light%20Italic.otf?alt=media',
1080
+ weight: 300,
1081
+ style: 'italic'
1082
+ }, {
1083
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Book.otf?alt=media',
1084
+ weight: 400,
1085
+ style: 'normal'
1086
+ }, {
1087
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Book%20Italic.otf?alt=media',
1088
+ weight: 400,
1089
+ style: 'italic'
1090
+ }, {
1091
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Medium.otf?alt=media',
1092
+ weight: 500,
1093
+ style: 'normal'
1094
+ }, {
1095
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Medium%20Italic.otf?alt=media',
1096
+ weight: 500,
1097
+ style: 'italic'
1098
+ }, {
1099
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20SemiBold.otf?alt=media',
1100
+ weight: 600,
1101
+ style: 'normal'
1102
+ }, {
1103
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20SemiBold%20Italic.otf?alt=media',
1104
+ weight: 600,
1105
+ style: 'italic'
1106
+ }, {
1107
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Bold.otf?alt=media',
1108
+ weight: 700,
1109
+ style: 'normal'
1110
+ }, {
1111
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Bold%20Italic.otf?alt=media',
1112
+ weight: 700,
1113
+ style: 'italic'
1114
+ }, {
1115
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20ExtraBold.otf?alt=media',
1116
+ weight: 800,
1117
+ style: 'normal'
1118
+ }, {
1119
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20ExtraBold%20Italic.otf?alt=media',
1120
+ weight: 800,
1121
+ style: 'italic'
1122
+ }, {
1123
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Black.otf?alt=media',
1124
+ weight: 900,
1125
+ style: 'normal'
1126
+ }, {
1127
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/milliard/Rene%20Bieder%20%20Milliard%20Black%20Italic.otf?alt=media',
1128
+ weight: 900,
1129
+ style: 'italic'
1130
+ }],
1131
+ 'Arial Black': [{
1132
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/Arial%20Black.ttf?alt=media',
1133
+ weight: 900,
1134
+ style: 'normal'
1135
+ }],
1136
+ // Sofia Pro font variations
1137
+ 'Sofia Pro': [{
1138
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Light%20Az.otf?alt=media',
1139
+ weight: 300,
1140
+ style: 'normal'
1141
+ }, {
1142
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Light%20Italic%20Az.otf?alt=media',
1143
+ weight: 300,
1144
+ style: 'italic'
1145
+ }, {
1146
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Regular%20Az.otf?alt=media',
1147
+ weight: 400,
1148
+ style: 'normal'
1149
+ }, {
1150
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Regular%20Italic%20Az.otf?alt=media',
1151
+ weight: 400,
1152
+ style: 'italic'
1153
+ }, {
1154
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Medium%20Az.otf?alt=media',
1155
+ weight: 500,
1156
+ style: 'normal'
1157
+ }, {
1158
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Medium%20Italic%20Az.otf?alt=media',
1159
+ weight: 500,
1160
+ style: 'italic'
1161
+ }, {
1162
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Semi%20Bold%20Az.otf?alt=media',
1163
+ weight: 600,
1164
+ style: 'normal'
1165
+ }, {
1166
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Semi%20Bold%20Italic%20Az.otf?alt=media',
1167
+ weight: 600,
1168
+ style: 'italic'
1169
+ }, {
1170
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Bold%20Az.otf?alt=media',
1171
+ weight: 700,
1172
+ style: 'normal'
1173
+ }, {
1174
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Bold%20Italic%20Az.otf?alt=media',
1175
+ weight: 700,
1176
+ style: 'italic'
1177
+ }, {
1178
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Black%20Az.otf?alt=media',
1179
+ weight: 900,
1180
+ style: 'normal'
1181
+ }, {
1182
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20Black%20Italic%20Az.otf?alt=media',
1183
+ weight: 900,
1184
+ style: 'italic'
1185
+ }, {
1186
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20ExtraLight%20Az.otf?alt=media',
1187
+ weight: 200,
1188
+ style: 'normal'
1189
+ }, {
1190
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20ExtraLight%20Italic%20Az.otf?alt=media',
1191
+ weight: 200,
1192
+ style: 'italic'
1193
+ }, {
1194
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20UltraLight%20Az.otf?alt=media',
1195
+ weight: 100,
1196
+ style: 'normal'
1197
+ }, {
1198
+ src: 'https://storage.googleapis.com/overlap-fonts/fonts/sofia-pro/Sofia%20Pro%20UltraLight%20Italic%20Az.otf?alt=media',
1199
+ weight: 100,
1200
+ style: 'italic'
1201
+ }]
1202
+ };
1203
+ var loadDocumentFonts = /*#__PURE__*/function () {
1204
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(fontFamily) {
1205
+ var cleanFontFamily, fontVariations, loadPromises;
1206
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
1207
+ while (1) switch (_context2.prev = _context2.next) {
1208
+ case 0:
1209
+ if (!(fontFamily === 'Arial')) {
1210
+ _context2.next = 4;
1211
+ break;
1212
+ }
1213
+ return _context2.abrupt("return");
1214
+ case 4:
1215
+ if (!(!fontFamily || typeof document === 'undefined')) {
1216
+ _context2.next = 7;
1217
+ break;
1218
+ }
1219
+ console.warn('Font family is not provided or document is undefined.');
1220
+ return _context2.abrupt("return");
1221
+ case 7:
1222
+ // Clean the font family name (remove quotes and fallbacks)
1223
+ cleanFontFamily = fontFamily.replace(/['"]/g, '').split(',')[0].trim(); // console.log(`Cleaned font family name: ${cleanFontFamily}`);
1224
+ // Get font variations for this family
1225
+ fontVariations = FONT_MAP[cleanFontFamily];
1226
+ if (fontVariations) {
1227
+ _context2.next = 12;
1228
+ break;
1229
+ }
1230
+ console.warn("Font family \"".concat(cleanFontFamily, "\" not found in font map"));
1231
+ return _context2.abrupt("return");
1232
+ case 12:
1233
+ _context2.prev = 12;
1234
+ // Load all variations of the font family
1235
+ loadPromises = fontVariations.map(/*#__PURE__*/function () {
1236
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref2) {
1237
+ var src, weight, style, font, loadedFont;
1238
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
1239
+ while (1) switch (_context.prev = _context.next) {
1240
+ case 0:
1241
+ src = _ref2.src, weight = _ref2.weight, style = _ref2.style;
1242
+ font = new FontFace(cleanFontFamily, "url(".concat(src, ")"), {
1243
+ weight: weight,
1244
+ style: style
1245
+ });
1246
+ _context.next = 4;
1247
+ return font.load();
1248
+ case 4:
1249
+ loadedFont = _context.sent;
1250
+ document.fonts.add(loadedFont);
1251
+ return _context.abrupt("return", loadedFont);
1252
+ case 7:
1253
+ case "end":
1254
+ return _context.stop();
1255
+ }
1256
+ }, _callee);
1257
+ }));
1258
+ return function (_x2) {
1259
+ return _ref3.apply(this, arguments);
1260
+ };
1261
+ }());
1262
+ _context2.next = 16;
1263
+ return Promise.all(loadPromises);
1264
+ case 16:
1265
+ _context2.next = 21;
1266
+ break;
1267
+ case 18:
1268
+ _context2.prev = 18;
1269
+ _context2.t0 = _context2["catch"](12);
1270
+ console.error("Error loading font family \"".concat(cleanFontFamily, "\":"), _context2.t0);
1271
+ case 21:
1272
+ case "end":
1273
+ return _context2.stop();
1274
+ }
1275
+ }, _callee2, null, [[12, 18]]);
1276
+ }));
1277
+ return function loadDocumentFonts(_x) {
1278
+ return _ref.apply(this, arguments);
1279
+ };
1280
+ }();
1281
+
1282
+ var addPixelUnit = function addPixelUnit(value) {
1283
+ if (typeof value === 'string' && value.endsWith('px')) {
1284
+ return value;
1285
+ }
1286
+ return "".concat(value, "px");
1287
+ };
1288
+ var SubtitlesComposition = function SubtitlesComposition(_a) {
1289
+ var phrases = _a.phrases,
1290
+ styleConfig = _a.styleConfig,
1291
+ x = _a.x,
1292
+ y = _a.y,
1293
+ currentFrame = _a.currentFrame,
1294
+ currentTime = _a.currentTime,
1295
+ fps = _a.fps,
1296
+ highlightWordsColor = _a.highlightWordsColor;
1297
+ useEffect(function () {
1298
+ if (styleConfig.fontFamily) {
1299
+ loadDocumentFonts(styleConfig.fontFamily);
1300
+ }
1301
+ }, [styleConfig.fontFamily]);
1302
+ var style = useTextStyle(styleConfig);
1303
+ var currentPhrases = useMemo(function () {
1304
+ return findPhrasesInRange(currentTime, phrases);
1305
+ }, [currentTime, phrases]);
1306
+ return jsx("div", __assign({
1307
+ style: {
1308
+ position: 'absolute',
1309
+ top: 0,
1310
+ left: 0,
1311
+ width: '100%',
1312
+ height: '100%',
1313
+ boxSizing: 'border-box'
1314
+ }
1315
+ }, {
1316
+ children: jsx("div", __assign({
1317
+ style: {
1318
+ position: 'absolute',
1319
+ top: 0,
1320
+ left: 0,
1321
+ width: '100%',
1322
+ height: '100%'
1323
+ }
1324
+ }, {
1325
+ children: currentPhrases.map(function (phrase) {
1326
+ var props = {
1327
+ text: phrase.text,
1328
+ style: style,
1329
+ animationStyle: styleConfig.animationStyle,
1330
+ frame: currentFrame,
1331
+ startFrame: Math.floor(phrase.start * fps),
1332
+ randomColors: styleConfig.randomColors,
1333
+ words: phrase.words,
1334
+ fps: fps,
1335
+ highlightWordsColor: highlightWordsColor
1336
+ };
1337
+ var top = addPixelUnit(y);
1338
+ var left = addPixelUnit(x);
1339
+ return jsx("div", __assign({
1340
+ style: {
1341
+ position: 'absolute',
1342
+ top: top,
1343
+ left: left
1344
+ }
1345
+ }, {
1346
+ children: jsx(SubtitleText, __assign({}, props))
1347
+ }), "".concat(phrase.start, "-").concat(phrase.end));
1348
+ })
1349
+ }))
1350
+ }));
1351
+ };
1352
+ var Subtitles = function Subtitles(props) {
1353
+ var width = props.width,
1354
+ height = props.height,
1355
+ fps = props.fps,
1356
+ devMode = props.devMode;
1357
+ return jsx("div", __assign({
1358
+ style: {
1359
+ width: '100%',
1360
+ height: '100%'
1361
+ }
1362
+ }, {
1363
+ children: jsx(Player, {
1364
+ component: SubtitlesComposition,
1365
+ inputProps: __assign({}, props),
1366
+ durationInFrames: 1000000,
1367
+ compositionWidth: width,
1368
+ compositionHeight: height,
1369
+ fps: fps ? fps : 30,
1370
+ style: {
1371
+ width: '100%',
1372
+ height: '100%'
1373
+ },
1374
+ controls: false,
1375
+ autoPlay: false,
1376
+ loop: devMode
1377
+ })
1378
+ }));
1379
+ };
1380
+
1381
+ var useStyleConfig = function useStyleConfig(subtitleStyle, baseStyle, textStyle) {
1382
+ return useMemo(function () {
1383
+ if (subtitleStyle === "kp-upgrade") {
1384
+ return __assign(__assign({}, baseStyle), {
1385
+ name: "kp-upgrade",
1386
+ captionPosition: "middle",
1387
+ fontSize: "50",
1388
+ fontFamily: "Arial",
1389
+ fontWeight: "800",
1390
+ fontColor: "#ffffff",
1391
+ textCase: "sentence",
1392
+ outlineColor: "#000000",
1393
+ outlineWidth: "2",
1394
+ outlineStyle: "round",
1395
+ shadowEnabled: true,
1396
+ shadowColor: "#000000",
1397
+ shadowBlur: "2",
1398
+ shadowOffsetX: "0",
1399
+ shadowOffsetY: "2",
1400
+ verticalStretch: "1.4",
1401
+ amplifySpokenWords: true,
1402
+ amplifiedColor: "#ffff00"
1403
+ });
1404
+ }
1405
+ return textStyle;
1406
+ }, [subtitleStyle, baseStyle, textStyle]);
1407
+ };
1408
+
1409
+ var useAdjustedPosition = function useAdjustedPosition(y, faceData) {
1410
+ var currentFrame = useCurrentFrame();
1411
+
1412
+ // Memoize face event lookup
1413
+ var currentFaceEvent = useMemo(function () {
1414
+ var _faceData$events;
1415
+ if (!(faceData !== null && faceData !== void 0 && (_faceData$events = faceData.events) !== null && _faceData$events !== void 0 && _faceData$events.length)) {
1416
+ return {
1417
+ numPeople: 2
1418
+ };
1419
+ }
1420
+ return faceData.events.findLast(function (event) {
1421
+ return event.frame <= currentFrame;
1422
+ }) || {
1423
+ numPeople: 2
1424
+ };
1425
+ }, [currentFrame, faceData === null || faceData === void 0 ? void 0 : faceData.events]);
1426
+
1427
+ // Adjust Y position only if face detection data is available
1428
+ var adjustedY = useMemo(function () {
1429
+ if (currentFaceEvent.numPeople === 2) {
1430
+ return y;
1431
+ }
1432
+ if (y === 960) {
1433
+ return y * 2 - 300;
1434
+ }
1435
+ return y;
1436
+ }, [y, currentFaceEvent.numPeople]);
1437
+ return {
1438
+ currentFaceEvent: currentFaceEvent,
1439
+ adjustedY: adjustedY
1440
+ };
1441
+ };
1442
+
1443
+ var useAdjustedPhrases = function useAdjustedPhrases(subtitlesData, maxCharsPerLine, fps) {
1444
+ var segmentData = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
1445
+ return useMemo(function () {
1446
+ // If no segment data, return empty array
1447
+ if (!segmentData || segmentData.length === 0) {
1448
+ return [];
1449
+ }
1450
+ var getMissingWordPhrasesIfExist = function getMissingWordPhrasesIfExist(startTime, endTime) {
1451
+ // Find words that fall in the gap
1452
+ var gapWords = subtitlesData.filter(function (word) {
1453
+ return word.start >= startTime && word.end <= endTime;
1454
+ });
1455
+ if (gapWords.length === 0) return [];
1456
+
1457
+ // Create phrases from gap words using same logic as segment phrases
1458
+ var gapPhrases = [];
1459
+ var currentPhrase = {
1460
+ text: "",
1461
+ words: [],
1462
+ start: null,
1463
+ end: null,
1464
+ segmentIndex: -1,
1465
+ // Special index for gap phrases
1466
+ durationInFrames: 0
1467
+ };
1468
+ gapWords.forEach(function (word, wordIndex) {
1469
+ var wordWithSpace = wordIndex === 0 ? word.word : " ".concat(word.word);
1470
+ var newLength = currentPhrase.text.length + wordWithSpace.length;
1471
+ if (newLength <= maxCharsPerLine) {
1472
+ // Add to current phrase
1473
+ currentPhrase.text += wordWithSpace;
1474
+ currentPhrase.words.push(word);
1475
+ currentPhrase.start = currentPhrase.start === null ? word.start : currentPhrase.start;
1476
+ currentPhrase.end = word.end;
1477
+ } else {
1478
+ // Finalize current phrase
1479
+ if (currentPhrase.words.length > 0) {
1480
+ gapPhrases.push(currentPhrase);
1481
+ }
1482
+
1483
+ // Start new phrase with current word
1484
+ currentPhrase = {
1485
+ text: word.word,
1486
+ words: [word],
1487
+ start: word.start,
1488
+ end: word.end,
1489
+ segmentIndex: -1
1490
+ };
1491
+ }
1492
+ });
1493
+
1494
+ // Add the last phrase if it has words
1495
+ if (currentPhrase.words.length > 0) {
1496
+ gapPhrases.push(currentPhrase);
1497
+ }
1498
+
1499
+ // Process timing for gap phrases
1500
+ var processedGapPhrases = gapPhrases.map(function (phrase, phraseIndex) {
1501
+ var startFrame = Math.floor(phrase.start * fps);
1502
+ var endFrame;
1503
+ if (phraseIndex < gapPhrases.length - 1) {
1504
+ var nextPhrase = gapPhrases[phraseIndex + 1];
1505
+ var timeDiff = nextPhrase.start - phrase.end;
1506
+ endFrame = timeDiff > 0.3 ? Math.floor(phrase.end * fps) : Math.floor(nextPhrase.start * fps);
1507
+ } else {
1508
+ endFrame = Math.floor(phrase.end * fps);
1509
+ }
1510
+ return _objectSpread2(_objectSpread2({}, phrase), {}, {
1511
+ startFrame: startFrame,
1512
+ endFrame: endFrame,
1513
+ durationInFrames: endFrame - startFrame + 1
1514
+ });
1515
+ });
1516
+ return processedGapPhrases;
1517
+ };
1518
+ var masterPhrases = [];
1519
+
1520
+ // Check for words before the first segment
1521
+ if (segmentData.length > 0 && subtitlesData.length > 0) {
1522
+ var firstSegmentStart = segmentData[0].start;
1523
+ var firstWordStart = 0; // Start from the beginning
1524
+ var preSegmentPhrases = getMissingWordPhrasesIfExist(firstWordStart, firstSegmentStart);
1525
+ if (preSegmentPhrases.length > 0) {
1526
+ masterPhrases.push.apply(masterPhrases, _toConsumableArray(preSegmentPhrases));
1527
+ }
1528
+ }
1529
+
1530
+ // Process each segment and gaps between segments
1531
+ segmentData.forEach(function (segment, segmentIndex) {
1532
+ // 1. Get words for this segment
1533
+ var segmentWords = subtitlesData.filter(function (word) {
1534
+ return word.segmentId === segmentIndex;
1535
+ });
1536
+
1537
+ // Process segment phrases
1538
+ if (segmentWords.length > 0) {
1539
+ // 2. Create phrases for this segment
1540
+ var currentSegmentPhrases = [];
1541
+ var currentPhrase = {
1542
+ text: "",
1543
+ words: [],
1544
+ start: null,
1545
+ end: null,
1546
+ segmentIndex: segmentIndex
1547
+ };
1548
+ segmentWords.forEach(function (word, wordIndex) {
1549
+ var wordWithSpace = wordIndex === 0 ? word.word : " ".concat(word.word);
1550
+ var newLength = currentPhrase.text.length + wordWithSpace.length;
1551
+ if (newLength <= maxCharsPerLine) {
1552
+ // Add to current phrase
1553
+ currentPhrase.text += wordWithSpace;
1554
+ currentPhrase.words.push(word);
1555
+ currentPhrase.start = currentPhrase.start === null ? word.start : currentPhrase.start;
1556
+ currentPhrase.end = word.end;
1557
+ } else {
1558
+ // Finalize current phrase
1559
+ if (currentPhrase.words.length > 0) {
1560
+ currentSegmentPhrases.push(currentPhrase);
1561
+ }
1562
+
1563
+ // Start new phrase with current word
1564
+ currentPhrase = {
1565
+ text: word.word,
1566
+ words: [word],
1567
+ start: word.start,
1568
+ end: word.end,
1569
+ segmentIndex: segmentIndex
1570
+ };
1571
+ }
1572
+ });
1573
+
1574
+ // Add the last phrase if it has words
1575
+ if (currentPhrase.words.length > 0) {
1576
+ currentSegmentPhrases.push(currentPhrase);
1577
+ }
1578
+
1579
+ // 3. Process timing for phrases
1580
+ var processedPhrases = currentSegmentPhrases.map(function (phrase, phraseIndex) {
1581
+ var startFrame = Math.floor(phrase.start * fps);
1582
+ var endFrame;
1583
+
1584
+ // Calculate end frame based on next phrase or segment end
1585
+ if (phraseIndex < currentSegmentPhrases.length - 1) {
1586
+ var nextPhrase = currentSegmentPhrases[phraseIndex + 1];
1587
+ var timeDiff = nextPhrase.start - phrase.end;
1588
+ endFrame = timeDiff > 0.3 ? Math.floor(phrase.end * fps) : Math.floor(nextPhrase.start * fps);
1589
+ } else {
1590
+ endFrame = Math.floor(phrase.end * fps);
1591
+ }
1592
+
1593
+ // Ensure phrase doesn't extend beyond segment boundaries
1594
+ endFrame = Math.min(endFrame, Math.floor(segment.end * fps));
1595
+ var processedPhrase = _objectSpread2(_objectSpread2({}, phrase), {}, {
1596
+ startFrame: startFrame,
1597
+ endFrame: endFrame,
1598
+ durationInFrames: endFrame - startFrame + 1
1599
+ });
1600
+ return processedPhrase;
1601
+ });
1602
+
1603
+ // 4. Add to master array
1604
+ masterPhrases.push.apply(masterPhrases, _toConsumableArray(processedPhrases));
1605
+ }
1606
+
1607
+ // Check for gap after this segment
1608
+ if (segmentIndex < segmentData.length - 1) {
1609
+ var nextSegment = segmentData[segmentIndex + 1];
1610
+ var gapPhrases = getMissingWordPhrasesIfExist(segment.end, nextSegment.start);
1611
+ if (gapPhrases.length > 0) {
1612
+ masterPhrases.push.apply(masterPhrases, _toConsumableArray(gapPhrases));
1613
+ }
1614
+ }
1615
+ });
1616
+
1617
+ // Sort final phrases by start time
1618
+ masterPhrases.sort(function (a, b) {
1619
+ return a.start - b.start;
1620
+ });
1621
+ return masterPhrases;
1622
+ }, [subtitlesData, maxCharsPerLine, fps, segmentData]);
1623
+ };
1624
+
1625
+ var presets = [
1626
+ {
1627
+ name: "tvShow",
1628
+ captionPosition: "middle",
1629
+ amplifiedColor: "#ffff00",
1630
+ amplifySpokenWords: false,
1631
+ fontFamily: "Arial",
1632
+ fontWeight: "800",
1633
+ fontColor: "#ffffff",
1634
+ fontSize: "50",
1635
+ textCase: "lowercase",
1636
+ outlineColor: "#000000",
1637
+ outlineWidth: "3",
1638
+ shadowColor: "#000000",
1639
+ shadowBlur: "1",
1640
+ shadowOffsetX: "2",
1641
+ shadowOffsetY: "2",
1642
+ backgroundColor: "#808080",
1643
+ backgroundOpacity: "0",
1644
+ backgroundBorderRadius: "10",
1645
+ textSpacing: "0",
1646
+ animationStyle: "spring",
1647
+ isItalic: true,
1648
+ shinyWordHighlight: true,
1649
+ shinySegmentHighlight: true
1650
+ },
1651
+ {
1652
+ name: "youtubeShort",
1653
+ captionPosition: "middle",
1654
+ amplifiedColor: "#FFFF00",
1655
+ amplifySpokenWords: false,
1656
+ fontFamily: "Mercadillo Black",
1657
+ fontWeight: "700",
1658
+ fontColor: "#FFFFFF",
1659
+ fontSize: "42",
1660
+ textCase: "uppercase",
1661
+ outlineColor: "#000000",
1662
+ outlineWidth: "0.5",
1663
+ shadowColor: "#000000",
1664
+ shadowBlur: "0",
1665
+ shadowOffsetX: "0",
1666
+ shadowOffsetY: "0",
1667
+ backgroundColor: "#000000",
1668
+ backgroundOpacity: "0.0",
1669
+ backgroundBorderRadius: "0",
1670
+ textSpacing: "0",
1671
+ animationStyle: "spring",
1672
+ isItalic: false,
1673
+ shinyWordHighlight: true,
1674
+ shinySegmentHighlight: true
1675
+ },
1676
+ {
1677
+ name: "podcast",
1678
+ captionPosition: "bottom",
1679
+ amplifiedColor: "#ffff00",
1680
+ amplifySpokenWords: false,
1681
+ fontFamily: "Arial",
1682
+ fontWeight: "700",
1683
+ fontColor: "#ffffff",
1684
+ fontSize: "28",
1685
+ textCase: "lowercase",
1686
+ outlineColor: "#000000",
1687
+ outlineWidth: "0",
1688
+ shadowColor: "#000000",
1689
+ shadowBlur: "0",
1690
+ shadowOffsetX: "0",
1691
+ shadowOffsetY: "0",
1692
+ backgroundColor: "#000000",
1693
+ backgroundOpacity: "0.7",
1694
+ backgroundBorderRadius: "5",
1695
+ textSpacing: "0",
1696
+ animationStyle: "none",
1697
+ isItalic: false,
1698
+ shinyWordHighlight: false,
1699
+ shinySegmentHighlight: false
1700
+ },
1701
+ {
1702
+ name: "podcastWhite",
1703
+ captionPosition: "bottom",
1704
+ amplifiedColor: "#ffffff",
1705
+ amplifySpokenWords: false,
1706
+ fontFamily: "Arial",
1707
+ fontWeight: "700",
1708
+ fontColor: "#ffffff",
1709
+ fontSize: "28",
1710
+ textCase: "lowercase",
1711
+ outlineColor: "#000000",
1712
+ outlineWidth: "0",
1713
+ shadowColor: "#000000",
1714
+ shadowBlur: "0",
1715
+ shadowOffsetX: "0",
1716
+ shadowOffsetY: "0",
1717
+ backgroundColor: "#000000",
1718
+ backgroundOpacity: "0.7",
1719
+ backgroundBorderRadius: "5",
1720
+ textSpacing: "0",
1721
+ animationStyle: "none",
1722
+ isItalic: false,
1723
+ shinyWordHighlight: true,
1724
+ shinySegmentHighlight: true
1725
+ },
1726
+ {
1727
+ name: "tiktokBold",
1728
+ captionPosition: "middle",
1729
+ amplifiedColor: "#00ffff",
1730
+ amplifySpokenWords: false,
1731
+ fontFamily: "Mercadillo Black",
1732
+ fontWeight: "800",
1733
+ fontColor: "#ffffff",
1734
+ fontSize: "48",
1735
+ textCase: "uppercase",
1736
+ outlineColor: "#000000",
1737
+ outlineWidth: "2",
1738
+ shadowColor: "#000000",
1739
+ shadowBlur: "0",
1740
+ shadowOffsetX: "0",
1741
+ shadowOffsetY: "0",
1742
+ backgroundColor: "#000000",
1743
+ backgroundOpacity: "0",
1744
+ backgroundBorderRadius: "0",
1745
+ textSpacing: "1",
1746
+ animationStyle: "spring",
1747
+ isItalic: false,
1748
+ shinyWordHighlight: true,
1749
+ shinySegmentHighlight: true
1750
+ },
1751
+ {
1752
+ name: "instagramStory",
1753
+ captionPosition: "bottom",
1754
+ amplifiedColor: "#ff3399",
1755
+ amplifySpokenWords: false,
1756
+ fontFamily: "Arial Black",
1757
+ fontWeight: "900",
1758
+ fontColor: "#ffffff",
1759
+ fontSize: "36",
1760
+ textCase: "uppercase",
1761
+ outlineColor: "#000000",
1762
+ outlineWidth: "1",
1763
+ shadowColor: "#000000",
1764
+ shadowBlur: "0",
1765
+ shadowOffsetX: "0",
1766
+ shadowOffsetY: "0",
1767
+ backgroundColor: "#000000",
1768
+ backgroundOpacity: "0.5",
1769
+ backgroundBorderRadius: "8",
1770
+ textSpacing: "0",
1771
+ animationStyle: "spring",
1772
+ isItalic: false,
1773
+ shinyWordHighlight: true,
1774
+ shinySegmentHighlight: true
1775
+ },
1776
+ {
1777
+ name: "reelsCasual",
1778
+ captionPosition: "middle",
1779
+ amplifiedColor: "#ff6600",
1780
+ amplifySpokenWords: false,
1781
+ fontFamily: "Mercadillo Black",
1782
+ fontWeight: "700",
1783
+ fontColor: "#ffffff",
1784
+ fontSize: "38",
1785
+ textCase: "lowercase",
1786
+ outlineColor: "#000000",
1787
+ outlineWidth: "1.5",
1788
+ shadowColor: "#000000",
1789
+ shadowBlur: "1",
1790
+ shadowOffsetX: "1",
1791
+ shadowOffsetY: "1",
1792
+ backgroundColor: "#000000",
1793
+ backgroundOpacity: "0.3",
1794
+ backgroundBorderRadius: "5",
1795
+ textSpacing: "0",
1796
+ animationStyle: "spring",
1797
+ isItalic: false,
1798
+ shinyWordHighlight: true,
1799
+ shinySegmentHighlight: true
1800
+ },
1801
+ {
1802
+ name: "youtubeGaming",
1803
+ captionPosition: "bottom",
1804
+ amplifiedColor: "#33ff33",
1805
+ amplifySpokenWords: false,
1806
+ fontFamily: "Arial Black",
1807
+ fontWeight: "900",
1808
+ fontColor: "#ffffff",
1809
+ fontSize: "44",
1810
+ textCase: "uppercase",
1811
+ outlineColor: "#000000",
1812
+ outlineWidth: "2.5",
1813
+ shadowColor: "#000000",
1814
+ shadowBlur: "2",
1815
+ shadowOffsetX: "2",
1816
+ shadowOffsetY: "2",
1817
+ backgroundColor: "#000000",
1818
+ backgroundOpacity: "0",
1819
+ backgroundBorderRadius: "0",
1820
+ textSpacing: "1",
1821
+ animationStyle: "spring",
1822
+ isItalic: false,
1823
+ shinyWordHighlight: true,
1824
+ shinySegmentHighlight: true
1825
+ },
1826
+ {
1827
+ name: "tutorialStyle",
1828
+ captionPosition: "bottom",
1829
+ amplifiedColor: "#00ccff",
1830
+ amplifySpokenWords: false,
1831
+ fontFamily: "Arial Black",
1832
+ fontWeight: "900",
1833
+ fontColor: "#ffffff",
1834
+ fontSize: "32",
1835
+ textCase: "sentence",
1836
+ outlineColor: "#000000",
1837
+ outlineWidth: "1",
1838
+ shadowColor: "#000000",
1839
+ shadowBlur: "0",
1840
+ shadowOffsetX: "1",
1841
+ shadowOffsetY: "1",
1842
+ backgroundColor: "#000000",
1843
+ backgroundOpacity: "0.6",
1844
+ backgroundBorderRadius: "4",
1845
+ textSpacing: "0",
1846
+ animationStyle: "spring",
1847
+ isItalic: false,
1848
+ shinyWordHighlight: true,
1849
+ shinySegmentHighlight: true
1850
+ },
1851
+ {
1852
+ name: "motivationalQuote",
1853
+ captionPosition: "middle",
1854
+ amplifiedColor: "#ffcc00",
1855
+ amplifySpokenWords: false,
1856
+ fontFamily: "Mercadillo Black",
1857
+ fontWeight: "800",
1858
+ fontColor: "#ffffff",
1859
+ fontSize: "46",
1860
+ textCase: "uppercase",
1861
+ outlineColor: "#000000",
1862
+ outlineWidth: "2",
1863
+ shadowColor: "#000000",
1864
+ shadowBlur: "1",
1865
+ shadowOffsetX: "2",
1866
+ shadowOffsetY: "2",
1867
+ backgroundColor: "#000000",
1868
+ backgroundOpacity: "0.4",
1869
+ backgroundBorderRadius: "10",
1870
+ textSpacing: "2",
1871
+ animationStyle: "spring",
1872
+ isItalic: false,
1873
+ shinyWordHighlight: true,
1874
+ shinySegmentHighlight: true
1875
+ },
1876
+ {
1877
+ name: "neonGlow",
1878
+ captionPosition: "middle",
1879
+ amplifiedColor: "#ff00ff",
1880
+ amplifySpokenWords: false,
1881
+ fontFamily: "Arial Black",
1882
+ fontWeight: "900",
1883
+ fontColor: "#ffffff",
1884
+ fontSize: "40",
1885
+ textCase: "uppercase",
1886
+ outlineColor: "#ff00ff",
1887
+ outlineWidth: "3",
1888
+ shadowColor: "#ff00ff",
1889
+ shadowBlur: "15",
1890
+ shadowOffsetX: "0",
1891
+ shadowOffsetY: "0",
1892
+ backgroundColor: "#000000",
1893
+ backgroundOpacity: "0",
1894
+ backgroundBorderRadius: "0",
1895
+ textSpacing: "2",
1896
+ animationStyle: "spring",
1897
+ isItalic: false,
1898
+ shinyWordHighlight: true,
1899
+ shinySegmentHighlight: true
1900
+ },
1901
+ {
1902
+ name: "retroWave",
1903
+ captionPosition: "bottom",
1904
+ amplifiedColor: "#00ffff",
1905
+ amplifySpokenWords: false,
1906
+ fontFamily: "Arial Black",
1907
+ fontWeight: "800",
1908
+ fontColor: "#ff69b4",
1909
+ fontSize: "38",
1910
+ textCase: "uppercase",
1911
+ outlineColor: "#00ffff",
1912
+ outlineWidth: "2",
1913
+ shadowColor: "#ff00ff",
1914
+ shadowBlur: "4",
1915
+ shadowOffsetX: "4",
1916
+ shadowOffsetY: "4",
1917
+ backgroundColor: "#000000",
1918
+ backgroundOpacity: "0.3",
1919
+ backgroundBorderRadius: "0",
1920
+ textSpacing: "3",
1921
+ animationStyle: "spring",
1922
+ isItalic: false,
1923
+ shinyWordHighlight: true,
1924
+ shinySegmentHighlight: true
1925
+ },
1926
+ {
1927
+ name: "comicBook",
1928
+ captionPosition: "middle",
1929
+ amplifiedColor: "#ffff00",
1930
+ amplifySpokenWords: false,
1931
+ fontFamily: "Arial Black",
1932
+ fontWeight: "900",
1933
+ fontColor: "#ffffff",
1934
+ fontSize: "42",
1935
+ textCase: "uppercase",
1936
+ outlineColor: "#000000",
1937
+ outlineWidth: "4",
1938
+ shadowColor: "#000000",
1939
+ shadowBlur: "0",
1940
+ shadowOffsetX: "3",
1941
+ shadowOffsetY: "3",
1942
+ backgroundColor: "#ff0000",
1943
+ backgroundOpacity: "0.2",
1944
+ backgroundBorderRadius: "15",
1945
+ textSpacing: "1",
1946
+ animationStyle: "spring",
1947
+ isItalic: false,
1948
+ shinyWordHighlight: true,
1949
+ shinySegmentHighlight: true
1950
+ },
1951
+ {
1952
+ name: "Pleasure Pod",
1953
+ captionPosition: "middle",
1954
+ amplifiedColor: "#0572ff",
1955
+ amplifySpokenWords: false,
1956
+ fontFamily: "Arial Black",
1957
+ fontWeight: "bold",
1958
+ fontColor: "#0572ff",
1959
+ fontSize: "60",
1960
+ textCase: "uppercase",
1961
+ outlineColor: "#000000",
1962
+ outlineWidth: "8",
1963
+ shadowColor: "#000000",
1964
+ shadowBlur: "0",
1965
+ shadowOffsetX: "3",
1966
+ shadowOffsetY: "3",
1967
+ backgroundColor: "#ff0000",
1968
+ backgroundOpacity: "0.0",
1969
+ backgroundBorderRadius: "15",
1970
+ textSpacing: "-2",
1971
+ animationStyle: "pleasure-pod-animation",
1972
+ verticalStretch: "1.3"
1973
+ },
1974
+ {
1975
+ name: "Grit",
1976
+ captionPosition: "middle",
1977
+ amplifiedColor: "#ffffff",
1978
+ amplifySpokenWords: false,
1979
+ fontFamily: "Posterama-1927-W01-UltraBlack",
1980
+ fontWeight: "900",
1981
+ fontColor: "#ffffff",
1982
+ fontSize: "80",
1983
+ textCase: "uppercase",
1984
+ outlineColor: "#000000",
1985
+ outlineWidth: "8",
1986
+ shadowColor: "#000000",
1987
+ shadowBlur: "20",
1988
+ shadowOffsetX: "10",
1989
+ shadowOffsetY: "10",
1990
+ backgroundColor: "#000000",
1991
+ backgroundOpacity: "0",
1992
+ backgroundBorderRadius: "0",
1993
+ textSpacing: "0",
1994
+ animationStyle: "spring",
1995
+ isItalic: false,
1996
+ shinyWordHighlight: false,
1997
+ shinySegmentHighlight: false,
1998
+ randomColors: {
1999
+ enabled: "true",
2000
+ colors: [
2001
+ {
2002
+ type: "still",
2003
+ color: "#59a3eb"
2004
+ }
2005
+ ],
2006
+ avoidFillers: true,
2007
+ pctApplied: 0.5,
2008
+ randomWordCountRange: [
2009
+ 2,
2010
+ 3
2011
+ ]
2012
+ }
2013
+ },
2014
+ {
2015
+ name: "abc",
2016
+ captionPosition: "middle",
2017
+ amplifiedColor: "#ffffff",
2018
+ amplifySpokenWords: false,
2019
+ fontFamily: "Posterama-1927-W01-UltraBlack",
2020
+ fontWeight: "900",
2021
+ fontColor: "#ffffff",
2022
+ fontSize: "80",
2023
+ textCase: "uppercase",
2024
+ outlineColor: "#000000",
2025
+ outlineWidth: "8",
2026
+ shadowColor: "#000000",
2027
+ shadowBlur: "20",
2028
+ shadowOffsetX: "10",
2029
+ shadowOffsetY: "10",
2030
+ backgroundColor: "#000000",
2031
+ backgroundOpacity: "0",
2032
+ backgroundBorderRadius: "0",
2033
+ textSpacing: "0",
2034
+ animationStyle: "spring",
2035
+ isItalic: false,
2036
+ shinyWordHighlight: false,
2037
+ shinySegmentHighlight: false,
2038
+ randomColors: {
2039
+ enabled: false,
2040
+ colors: [
2041
+ {
2042
+ type: "still",
2043
+ color: "#fff"
2044
+ }
2045
+ ],
2046
+ avoidFillers: true,
2047
+ pctApplied: 0.5,
2048
+ randomWordCountRange: [
2049
+ 2,
2050
+ 3
2051
+ ]
2052
+ }
2053
+ },
2054
+ {
2055
+ name: "eth",
2056
+ captionPosition: "middle",
2057
+ amplifiedColors: [
2058
+ {
2059
+ type: "gradient",
2060
+ colors: [
2061
+ "#ff86b2",
2062
+ "#ffe1dd"
2063
+ ],
2064
+ angle: 0
2065
+ },
2066
+ {
2067
+ type: "gradient",
2068
+ colors: [
2069
+ "#f5bd9b",
2070
+ "#feba99",
2071
+ "#e76e93"
2072
+ ],
2073
+ angle: 45
2074
+ },
2075
+ {
2076
+ type: "gradient",
2077
+ colors: [
2078
+ "#cdfbca",
2079
+ "#adf8e2"
2080
+ ],
2081
+ angle: 90
2082
+ },
2083
+ {
2084
+ type: "gradient",
2085
+ colors: [
2086
+ "#eba9b9",
2087
+ "#bc9fff"
2088
+ ],
2089
+ angle: 135
2090
+ }
2091
+ ],
2092
+ amplifySpokenWords: true,
2093
+ fontFamily: "Posterama-1927-W01-UltraBlack",
2094
+ fontWeight: "900",
2095
+ fontColor: "#ffffff",
2096
+ fontSize: "80",
2097
+ textCase: "uppercase",
2098
+ outlineColor: "#000000",
2099
+ outlineWidth: "4",
2100
+ shadowColor: "#000000",
2101
+ shadowBlur: "8",
2102
+ shadowOffsetX: "8",
2103
+ shadowOffsetY: "8",
2104
+ backgroundColor: "#000000",
2105
+ backgroundOpacity: "0",
2106
+ backgroundBorderRadius: "0",
2107
+ textSpacing: "0",
2108
+ animationStyle: "spring",
2109
+ isItalic: false,
2110
+ shinyWordHighlight: false,
2111
+ shinySegmentHighlight: false
2112
+ },
2113
+ {
2114
+ name: "lion-tree",
2115
+ captionPosition: "middle",
2116
+ amplifiedColor: "#4e0c72",
2117
+ amplifySpokenWords: false,
2118
+ fontFamily: "Arial",
2119
+ fontWeight: "bold",
2120
+ fontColor: "#4e0c72",
2121
+ fontSize: "60",
2122
+ textCase: "lowercase",
2123
+ outlineColor: "#000000",
2124
+ outlineWidth: "0",
2125
+ shadowColor: "#000000",
2126
+ shadowEnabled: false,
2127
+ shadowBlur: "0",
2128
+ shadowOffsetX: "3",
2129
+ shadowOffsetY: "3",
2130
+ backgroundColor: "#fff",
2131
+ backgroundOpacity: "1",
2132
+ backgroundPadding: "5",
2133
+ backgroundBorderRadius: "15",
2134
+ textSpacing: "1",
2135
+ animationStyle: "none",
2136
+ isItalic: false,
2137
+ shinyWordHighlight: false,
2138
+ shinySegmentHighlight: false
2139
+ },
2140
+ {
2141
+ name: "kp-upgrade",
2142
+ captionPosition: "middle",
2143
+ fontFamily: "NeueHaasDisplayBold",
2144
+ amplifiedColor: "#fff",
2145
+ amplifySpokenWords: false,
2146
+ fontWeight: "700",
2147
+ fontColor: "#fff",
2148
+ fontSize: "75px",
2149
+ textCase: "lowercase",
2150
+ outlineColor: "#000000",
2151
+ outlineWidth: "0",
2152
+ shadowColor: "rgba(0, 0, 0, 0.7)",
2153
+ shadowEnabled: true,
2154
+ backgroundFillStyle: "wrap",
2155
+ shadowBlur: "2",
2156
+ shadowOffsetX: "3",
2157
+ shadowOffsetY: "3",
2158
+ backgroundColor: "#000",
2159
+ backgroundOpacity: "1 ",
2160
+ backgroundPadding: "24",
2161
+ backgroundBorderRadius: "15",
2162
+ textSpacing: "1",
2163
+ animationStyle: "none",
2164
+ isItalic: false
2165
+ },
2166
+ {
2167
+ name: "partner-path",
2168
+ captionPosition: "middle",
2169
+ fontFamily: "TheBoldFont",
2170
+ amplifiedColor: "#fff",
2171
+ amplifySpokenWords: false,
2172
+ fontWeight: "700",
2173
+ fontColor: "#fff",
2174
+ fontSize: "74",
2175
+ textCase: "uppercase",
2176
+ outlineColor: "#000000",
2177
+ outlineWidth: "0",
2178
+ shadowColor: "rgba(0, 0, 0, 0.7)",
2179
+ shadowEnabled: true,
2180
+ backgroundFillStyle: "wrap",
2181
+ shadowBlur: "10",
2182
+ shadowOffsetX: "2",
2183
+ shadowOffsetY: "2",
2184
+ backgroundColor: "#000000",
2185
+ backgroundOpacity: "0",
2186
+ backgroundPadding: "24",
2187
+ backgroundBorderRadius: "15",
2188
+ textSpacing: "1",
2189
+ animationStyle: "none",
2190
+ isItalic: false
2191
+ },
2192
+ {
2193
+ name: "fidelity",
2194
+ captionPosition: "middle",
2195
+ amplifiedColor: "#ffffff",
2196
+ amplifySpokenWords: false,
2197
+ fontFamily: "Milliard",
2198
+ fontWeight: "500",
2199
+ fontColor: "#ffffff",
2200
+ fontSize: "50",
2201
+ textCase: "sentence",
2202
+ outlineColor: "#000000",
2203
+ outlineWidth: "0",
2204
+ shadowColor: "#000000",
2205
+ shadowBlur: "0",
2206
+ backgroundFillStyle: "wrap",
2207
+ shadowEnabled: false,
2208
+ shadowOffsetX: "0",
2209
+ shadowOffsetY: "0",
2210
+ backgroundColor: "#00830a",
2211
+ backgroundOpacity: "1",
2212
+ backgroundPadding: "10",
2213
+ backgroundBorderRadius: "30",
2214
+ textSpacing: "0",
2215
+ animationStyle: "spring",
2216
+ isItalic: false,
2217
+ shinyWordHighlight: false,
2218
+ shinySegmentHighlight: false
2219
+ },
2220
+ {
2221
+ name: "black-fill",
2222
+ captionPosition: "middle",
2223
+ amplifiedColor: "#000000",
2224
+ amplifySpokenWords: true,
2225
+ fontFamily: "Inter",
2226
+ fontWeight: "800",
2227
+ fontColor: "#E5E5E5",
2228
+ fontSize: "64",
2229
+ textCase: "sentence",
2230
+ shadowColor: "#000000",
2231
+ shadowBlur: "0",
2232
+ shadowOffsetX: "0",
2233
+ shadowOffsetY: "0",
2234
+ shadowEnabled: false,
2235
+ textSpacing: "-4",
2236
+ animationStyle: "none",
2237
+ isItalic: false,
2238
+ shinyWordHighlight: false,
2239
+ shinySegmentHighlight: false,
2240
+ background: "transparent",
2241
+ backgroundColor: "transparent",
2242
+ backgroundOpacity: "0",
2243
+ backgroundPadding: "0",
2244
+ backgroundBorderRadius: "0",
2245
+ backgroundFillStyle: "none",
2246
+ padding: "0",
2247
+ textHighlightPersists: true
2248
+ },
2249
+ {
2250
+ name: "white-plain",
2251
+ captionPosition: "middle",
2252
+ amplifiedColor: "#ffffff",
2253
+ amplifySpokenWords: true,
2254
+ fontFamily: "Inter",
2255
+ fontWeight: "700",
2256
+ fontColor: "#ffffff",
2257
+ fontSize: "64",
2258
+ textCase: "sentence",
2259
+ shadowColor: "#000000",
2260
+ shadowBlur: "4",
2261
+ shadowOffsetX: "0",
2262
+ shadowOffsetY: "0",
2263
+ textSpacing: "-3",
2264
+ animationStyle: "none",
2265
+ isItalic: false,
2266
+ shinyWordHighlight: false,
2267
+ shinySegmentHighlight: false,
2268
+ backgroundColor: "#000000",
2269
+ backgroundOpacity: "0",
2270
+ backgroundPadding: "0",
2271
+ backgroundBorderRadius: "0",
2272
+ backgroundFillStyle: "none",
2273
+ padding: "0",
2274
+ textHighlightPersists: true
2275
+ },
2276
+ {
2277
+ name: "black-rounded",
2278
+ captionPosition: "middle",
2279
+ amplifiedColor: "#ffffff",
2280
+ amplifySpokenWords: true,
2281
+ fontFamily: "Inter",
2282
+ fontWeight: "700",
2283
+ fontColor: "#878787",
2284
+ fontSize: "64",
2285
+ textCase: "sentence",
2286
+ shadowColor: "#000000",
2287
+ shadowBlur: "0",
2288
+ shadowOffsetX: "0",
2289
+ shadowOffsetY: "0",
2290
+ shadowEnabled: false,
2291
+ textSpacing: "-3",
2292
+ animationStyle: "none",
2293
+ isItalic: false,
2294
+ shinyWordHighlight: false,
2295
+ shinySegmentHighlight: false,
2296
+ backgroundColor: "#000000",
2297
+ backgroundOpacity: "1.0",
2298
+ backgroundPaddingX: "20",
2299
+ backgroundPaddingY: "10",
2300
+ backgroundBorderRadius: "15",
2301
+ backgroundFillStyle: "none",
2302
+ padding: "0"
2303
+ },
2304
+ {
2305
+ name: "failing-up",
2306
+ captionPosition: "middle",
2307
+ amplifiedColor: "#6bddf0",
2308
+ amplifiedOpacity: "1",
2309
+ amplifySpokenWords: true,
2310
+ fontFamily: "Milliard",
2311
+ fontWeight: "800",
2312
+ fontColor: "#6bddf0",
2313
+ opacity: "0.3",
2314
+ fontSize: "60",
2315
+ textCase: "uppercase",
2316
+ shadowColor: "#000000",
2317
+ shadowBlur: "0",
2318
+ shadowOffsetX: "0",
2319
+ shadowOffsetY: "0",
2320
+ shadowEnabled: false,
2321
+ textSpacing: "0",
2322
+ animationStyle: "none",
2323
+ isItalic: false,
2324
+ outlineColor: "#000000",
2325
+ outlineWidth: "4",
2326
+ shinyWordHighlight: false,
2327
+ shinySegmentHighlight: false,
2328
+ background: "transparent",
2329
+ backgroundColor: "transparent",
2330
+ backgroundOpacity: "0",
2331
+ backgroundPadding: "0",
2332
+ backgroundBorderRadius: "0",
2333
+ backgroundFillStyle: "none",
2334
+ padding: "0",
2335
+ textHighlightPersists: true,
2336
+ currentWordBlock: true,
2337
+ currentWordBlockBorderRadius: "10",
2338
+ currentWordBlockBackgroundColor: "#000000",
2339
+ currentWordBlockOpacity: "1",
2340
+ currentWordBlockPadding: "5",
2341
+ maxCharsPerLine: 20,
2342
+ amplifyOpacityTransitionDuration: "0.1"
2343
+ },
2344
+ {
2345
+ name: "y-combinator",
2346
+ captionPosition: "middle",
2347
+ amplifiedColor: "#ffffff",
2348
+ amplifySpokenWords: true,
2349
+ fontFamily: "Inter",
2350
+ fontWeight: "400",
2351
+ fontColor: "#ffffff",
2352
+ fontSize: "70",
2353
+ textCase: "sentence",
2354
+ shadowColor: "#000000",
2355
+ shadowBlur: "5",
2356
+ shadowOffsetX: "0",
2357
+ shadowOffsetY: "0",
2358
+ shadowIntensity: 1,
2359
+ textSpacing: "1",
2360
+ animationStyle: "none",
2361
+ isItalic: false,
2362
+ shinyWordHighlight: false,
2363
+ shinySegmentHighlight: false,
2364
+ backgroundColor: "#000000",
2365
+ backgroundOpacity: "0",
2366
+ backgroundPadding: "8",
2367
+ backgroundBorderRadius: "0",
2368
+ backgroundFillStyle: "none",
2369
+ padding: "8",
2370
+ textHighlightPersists: true
2371
+ },
2372
+ {
2373
+ name: "farnam-street",
2374
+ captionPosition: "middle",
2375
+ amplifiedColor: "#ffffff",
2376
+ amplifySpokenWords: false,
2377
+ fontFamily: "Sofia Pro",
2378
+ fontWeight: "900",
2379
+ fontColor: "#ffffff",
2380
+ fontSize: "110",
2381
+ textCase: "uppercase",
2382
+ outlineColor: "#000000",
2383
+ outlineWidth: "0",
2384
+ shadowColor: "rgba(0, 0, 0, 0.5)",
2385
+ shadowBlur: "20",
2386
+ shadowOffsetX: "0",
2387
+ shadowOffsetY: "1",
2388
+ backgroundColor: "#000000",
2389
+ backgroundOpacity: "0",
2390
+ backgroundBorderRadius: "0",
2391
+ textSpacing: "-4",
2392
+ animationStyle: "none",
2393
+ isItalic: false,
2394
+ shinyWordHighlight: false,
2395
+ shinySegmentHighlight: false,
2396
+ verticalStretch: "0.82s"
2397
+ },
2398
+ {
2399
+ name: "leveling-up",
2400
+ captionPosition: "middle",
2401
+ amplifiedColor: "#ffffff",
2402
+ amplifySpokenWords: false,
2403
+ fontFamily: "Arial Black",
2404
+ fontWeight: "900",
2405
+ fontColor: "#ffffff",
2406
+ fontSize: "70",
2407
+ textCase: "uppercase",
2408
+ outlineColor: "#6205e0",
2409
+ outlineWidth: "6",
2410
+ outlineStyle: "angular",
2411
+ shadowColor: "rgba(0, 0, 0, 0.8)",
2412
+ shadowBlur: "3",
2413
+ shadowOffsetX: "0",
2414
+ shadowOffsetY: "0",
2415
+ backgroundColor: "#000000",
2416
+ backgroundOpacity: "0",
2417
+ backgroundBorderRadius: "0",
2418
+ textSpacing: "0",
2419
+ animationStyle: "none",
2420
+ isItalic: false,
2421
+ shinyWordHighlight: false,
2422
+ shinySegmentHighlight: false
2423
+ },
2424
+ {
2425
+ name: "the-peel-horizontal",
2426
+ captionPosition: "middle",
2427
+ amplifiedColor: "#ffffff",
2428
+ amplifySpokenWords: false,
2429
+ fontFamily: "Arial Black ",
2430
+ fontWeight: "900",
2431
+ fontColor: "#ffffff",
2432
+ fontSize: "90",
2433
+ textCase: "sentence",
2434
+ outlineColor: "#000000",
2435
+ outlineWidth: "0",
2436
+ shadowColor: "#000000",
2437
+ shadowBlur: "2",
2438
+ shadowOffsetX: "2",
2439
+ shadowOffsetY: "2",
2440
+ backgroundColor: "#000000",
2441
+ backgroundOpacity: "0",
2442
+ backgroundBorderRadius: "0",
2443
+ textSpacing: "2",
2444
+ animationStyle: "none",
2445
+ isItalic: false,
2446
+ shinyWordHighlight: false,
2447
+ shinySegmentHighlight: false
2448
+ },
2449
+ {
2450
+ name: "the-peel-vertical",
2451
+ captionPosition: "middle",
2452
+ amplifiedColor: "#ffffff",
2453
+ amplifySpokenWords: false,
2454
+ fontFamily: "Mercadillo Black",
2455
+ fontWeight: "900",
2456
+ fontColor: "#ffffff",
2457
+ fontSize: "80",
2458
+ textCase: "uppercase",
2459
+ outlineColor: "#000000",
2460
+ outlineWidth: "6",
2461
+ shadowColor: "#000000",
2462
+ shadowBlur: "2",
2463
+ shadowOffsetX: "2",
2464
+ shadowOffsetY: "2",
2465
+ backgroundColor: "#000000",
2466
+ backgroundOpacity: "0",
2467
+ backgroundBorderRadius: "0",
2468
+ textSpacing: "3",
2469
+ animationStyle: "spring",
2470
+ isItalic: true,
2471
+ shinyWordHighlight: false,
2472
+ shinySegmentHighlight: false
2473
+ },
2474
+ {
2475
+ name: "marketing-school",
2476
+ captionPosition: "middle",
2477
+ amplifiedColor: "#ff6c39",
2478
+ amplifySpokenWords: false,
2479
+ fontFamily: "Stapel-NarrowMedium",
2480
+ fontWeight: "500",
2481
+ fontColor: "#ff6c39",
2482
+ fontSize: "65",
2483
+ textCase: "uppercase",
2484
+ outlineColor: "#ffffff",
2485
+ outlineWidth: "3",
2486
+ outlineStyle: "angular",
2487
+ shadowColor: "#000000",
2488
+ shadowBlur: "2",
2489
+ shadowOffsetX: "3",
2490
+ shadowOffsetY: "4",
2491
+ shadowIntensity: "2",
2492
+ backgroundColor: "#000000",
2493
+ backgroundOpacity: "0",
2494
+ backgroundBorderRadius: "0",
2495
+ textSpacing: "-1",
2496
+ animationStyle: "none",
2497
+ isItalic: false,
2498
+ shinyWordHighlight: false,
2499
+ shinySegmentHighlight: false,
2500
+ verticalStretch: "1.4"
2501
+ },
2502
+ ""
2503
+ ];
2504
+ var subtitlePresets = {
2505
+ presets: presets
2506
+ };
2507
+
2508
+ export { SubtitleText, Subtitles, subtitlePresets, useAdjustedPhrases, useAdjustedPosition, useStyleConfig, useTextStyle };
2509
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvU3VidGl0bGVUZXh0LmpzeCIsIi4uL3NyYy91dGlscy9maW5kUGhyYXNlc0luUmFuZ2UudHMiLCIuLi9zcmMvaG9va3MvdXNlVGV4dFN0eWxlLmpzIiwiLi4vc3JjL2hvb2tzL2ZvbnRMb2FkZXIuanMiLCIuLi9zcmMvY29tcG9uZW50cy9TdWJ0aXRsZXMudHN4IiwiLi4vc3JjL2hvb2tzL3VzZVN0eWxlQ29uZmlnLnRzIiwiLi4vc3JjL2hvb2tzL3VzZUFkanVzdGVkUG9zaXRpb24uanMiLCIuLi9zcmMvaG9va3MvdXNlQWRqdXN0ZWRQaHJhc2VzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2VzRGVjb3JhdGUoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcclxuICAgIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxyXG4gICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcclxuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xyXG4gICAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XHJcbiAgICB2YXIgXywgZG9uZSA9IGZhbHNlO1xyXG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICB2YXIgY29udGV4dCA9IHt9O1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xyXG4gICAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XHJcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xyXG4gICAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcclxuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcclxuICAgIGRvbmUgPSB0cnVlO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcclxuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Byb3BLZXkoeCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xyXG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiKSBuYW1lID0gbmFtZS5kZXNjcmlwdGlvbiA/IFwiW1wiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCBcIl1cIikgOiBcIlwiO1xyXG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEl0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTtcclxuICAgIHJldHVybiBnLm5leHQgPSB2ZXJiKDApLCBnW1widGhyb3dcIl0gPSB2ZXJiKDEpLCBnW1wicmV0dXJuXCJdID0gdmVyYigyKSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xyXG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcclxuICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xyXG4gICAgfVxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgQXN5bmNJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gQXN5bmNJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiLCBhd2FpdFJldHVybiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGYpIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbihmLCByZWplY3QpOyB9OyB9XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaWYgKGdbbl0pIHsgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgaWYgKGYpIGlbbl0gPSBmKGlbbl0pOyB9IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG52YXIgb3duS2V5cyA9IGZ1bmN0aW9uKG8pIHtcclxuICAgIG93bktleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiAobykge1xyXG4gICAgICAgIHZhciBhciA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIGsgaW4gbykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBrKSkgYXJbYXIubGVuZ3RoXSA9IGs7XHJcbiAgICAgICAgcmV0dXJuIGFyO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBvd25LZXlzKG8pO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgPSBvd25LZXlzKG1vZCksIGkgPSAwOyBpIDwgay5sZW5ndGg7IGkrKykgaWYgKGtbaV0gIT09IFwiZGVmYXVsdFwiKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGtbaV0pO1xyXG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEluKHN0YXRlLCByZWNlaXZlcikge1xyXG4gICAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XHJcbiAgICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52LCB2YWx1ZSwgYXN5bmMpIHtcclxuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XHJcbiAgICAgICAgdmFyIGRpc3Bvc2UsIGlubmVyO1xyXG4gICAgICAgIGlmIChhc3luYykge1xyXG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XHJcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XHJcbiAgICAgICAgICAgIGlmIChhc3luYykgaW5uZXIgPSBkaXNwb3NlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XHJcbiAgICAgICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRyeSB7IGlubmVyLmNhbGwodGhpcyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOyB9IH07XHJcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XHJcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZTtcclxuXHJcbn1cclxuXHJcbnZhciBfU3VwcHJlc3NlZEVycm9yID0gdHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XHJcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcclxuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kaXNwb3NlUmVzb3VyY2VzKGVudikge1xyXG4gICAgZnVuY3Rpb24gZmFpbChlKSB7XHJcbiAgICAgICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IF9TdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xyXG4gICAgICAgIGVudi5oYXNFcnJvciA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB2YXIgciwgcyA9IDA7XHJcbiAgICBmdW5jdGlvbiBuZXh0KCkge1xyXG4gICAgICAgIHdoaWxlIChyID0gZW52LnN0YWNrLnBvcCgpKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXIuYXN5bmMgJiYgcyA9PT0gMSkgcmV0dXJuIHMgPSAwLCBlbnYuc3RhY2sucHVzaChyKSwgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihuZXh0KTtcclxuICAgICAgICAgICAgICAgIGlmIChyLmRpc3Bvc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gci5kaXNwb3NlLmNhbGwoci52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIuYXN5bmMpIHJldHVybiBzIHw9IDIsIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgcyB8PSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBmYWlsKGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzID09PSAxKSByZXR1cm4gZW52Lmhhc0Vycm9yID8gUHJvbWlzZS5yZWplY3QoZW52LmVycm9yKSA6IFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXh0KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbihwYXRoLCBwcmVzZXJ2ZUpzeCkge1xyXG4gICAgaWYgKHR5cGVvZiBwYXRoID09PSBcInN0cmluZ1wiICYmIC9eXFwuXFwuP1xcLy8udGVzdChwYXRoKSkge1xyXG4gICAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoL1xcLih0c3gpJHwoKD86XFwuZCk/KSgoPzpcXC5bXi4vXSs/KT8pXFwuKFtjbV0/KXRzJC9pLCBmdW5jdGlvbiAobSwgdHN4LCBkLCBleHQsIGNtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0c3ggPyBwcmVzZXJ2ZUpzeCA/IFwiLmpzeFwiIDogXCIuanNcIiA6IGQgJiYgKCFleHQgfHwgIWNtKSA/IG0gOiAoZCArIGV4dCArIFwiLlwiICsgY20udG9Mb3dlckNhc2UoKSArIFwianNcIik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGF0aDtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgX19leHRlbmRzOiBfX2V4dGVuZHMsXHJcbiAgICBfX2Fzc2lnbjogX19hc3NpZ24sXHJcbiAgICBfX3Jlc3Q6IF9fcmVzdCxcclxuICAgIF9fZGVjb3JhdGU6IF9fZGVjb3JhdGUsXHJcbiAgICBfX3BhcmFtOiBfX3BhcmFtLFxyXG4gICAgX19lc0RlY29yYXRlOiBfX2VzRGVjb3JhdGUsXHJcbiAgICBfX3J1bkluaXRpYWxpemVyczogX19ydW5Jbml0aWFsaXplcnMsXHJcbiAgICBfX3Byb3BLZXk6IF9fcHJvcEtleSxcclxuICAgIF9fc2V0RnVuY3Rpb25OYW1lOiBfX3NldEZ1bmN0aW9uTmFtZSxcclxuICAgIF9fbWV0YWRhdGE6IF9fbWV0YWRhdGEsXHJcbiAgICBfX2F3YWl0ZXI6IF9fYXdhaXRlcixcclxuICAgIF9fZ2VuZXJhdG9yOiBfX2dlbmVyYXRvcixcclxuICAgIF9fY3JlYXRlQmluZGluZzogX19jcmVhdGVCaW5kaW5nLFxyXG4gICAgX19leHBvcnRTdGFyOiBfX2V4cG9ydFN0YXIsXHJcbiAgICBfX3ZhbHVlczogX192YWx1ZXMsXHJcbiAgICBfX3JlYWQ6IF9fcmVhZCxcclxuICAgIF9fc3ByZWFkOiBfX3NwcmVhZCxcclxuICAgIF9fc3ByZWFkQXJyYXlzOiBfX3NwcmVhZEFycmF5cyxcclxuICAgIF9fc3ByZWFkQXJyYXk6IF9fc3ByZWFkQXJyYXksXHJcbiAgICBfX2F3YWl0OiBfX2F3YWl0LFxyXG4gICAgX19hc3luY0dlbmVyYXRvcjogX19hc3luY0dlbmVyYXRvcixcclxuICAgIF9fYXN5bmNEZWxlZ2F0b3I6IF9fYXN5bmNEZWxlZ2F0b3IsXHJcbiAgICBfX2FzeW5jVmFsdWVzOiBfX2FzeW5jVmFsdWVzLFxyXG4gICAgX19tYWtlVGVtcGxhdGVPYmplY3Q6IF9fbWFrZVRlbXBsYXRlT2JqZWN0LFxyXG4gICAgX19pbXBvcnRTdGFyOiBfX2ltcG9ydFN0YXIsXHJcbiAgICBfX2ltcG9ydERlZmF1bHQ6IF9faW1wb3J0RGVmYXVsdCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQ6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0OiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEluOiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXHJcbiAgICBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZTogX19hZGREaXNwb3NhYmxlUmVzb3VyY2UsXHJcbiAgICBfX2Rpc3Bvc2VSZXNvdXJjZXM6IF9fZGlzcG9zZVJlc291cmNlcyxcclxuICAgIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uOiBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbixcclxufTtcclxuIiwiaW1wb3J0IFJlYWN0LHsgbWVtbywgdXNlTWVtbywgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBzcHJpbmcsIHJhbmRvbSwgdXNlQ3VycmVudEZyYW1lIH0gZnJvbSBcInJlbW90aW9uXCI7XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBlc3RpbWF0ZSB0ZXh0IHdpZHRoXG5jb25zdCBlc3RpbWF0ZVRleHRXaWR0aCA9ICh0ZXh0LCBmb250U2l6ZSwgZm9udEZhbWlseSkgPT4ge1xuICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICBjb250ZXh0LmZvbnQgPSBgJHtmb250U2l6ZX1weCAke2ZvbnRGYW1pbHl9YDtcbiAgcmV0dXJuIGNvbnRleHQubWVhc3VyZVRleHQodGV4dCkud2lkdGg7XG59O1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgb3V0bGluZSBzaGFkb3dcbmNvbnN0IGdlbmVyYXRlT3V0bGluZVNoYWRvdyA9ICgoKSA9PiB7XG4gIGNvbnN0IGNhY2hlID0gbmV3IE1hcCgpO1xuICBcbiAgcmV0dXJuIChjb2xvciwgd2lkdGgsIG91dGxpbmVTdHlsZSA9IFwicm91bmRcIikgPT4ge1xuICAgIGNvbnN0IGtleSA9IGAke2NvbG9yfS0ke3dpZHRofS0ke291dGxpbmVTdHlsZX1gO1xuICAgIGlmIChjYWNoZS5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXkpO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBzaGFkb3dzID0gW107XG4gICAgY29uc3QgcGFyc2VkV2lkdGggPSBwYXJzZUludCh3aWR0aCwgMTApO1xuICAgIFxuICAgIGlmIChvdXRsaW5lU3R5bGUgPT09IFwiYW5ndWxhclwiKSB7XG4gICAgICAvLyBDcmVhdGUgc2hhcnAgY29ybmVycyBieSB1c2luZyBwZXJwZW5kaWN1bGFyIGxpbmVzXG4gICAgICAvLyBUb3AsIHJpZ2h0LCBib3R0b20sIGxlZnRcbiAgICAgIHNoYWRvd3MucHVzaChgMCAtJHtwYXJzZWRXaWR0aH1weCAwICR7Y29sb3J9YCk7ICAvLyBUb3BcbiAgICAgIHNoYWRvd3MucHVzaChgJHtwYXJzZWRXaWR0aH1weCAwIDAgJHtjb2xvcn1gKTsgICAvLyBSaWdodFxuICAgICAgc2hhZG93cy5wdXNoKGAwICR7cGFyc2VkV2lkdGh9cHggMCAke2NvbG9yfWApOyAgIC8vIEJvdHRvbVxuICAgICAgc2hhZG93cy5wdXNoKGAtJHtwYXJzZWRXaWR0aH1weCAwIDAgJHtjb2xvcn1gKTsgIC8vIExlZnRcbiAgICAgIFxuICAgICAgLy8gQWRkIGRpYWdvbmFsIHBvaW50cyBmb3IgY29ybmVyc1xuICAgICAgc2hhZG93cy5wdXNoKGAke3BhcnNlZFdpZHRofXB4IC0ke3BhcnNlZFdpZHRofXB4IDAgJHtjb2xvcn1gKTsgIC8vIFRvcC1yaWdodFxuICAgICAgc2hhZG93cy5wdXNoKGAke3BhcnNlZFdpZHRofXB4ICR7cGFyc2VkV2lkdGh9cHggMCAke2NvbG9yfWApOyAgIC8vIEJvdHRvbS1yaWdodFxuICAgICAgc2hhZG93cy5wdXNoKGAtJHtwYXJzZWRXaWR0aH1weCAke3BhcnNlZFdpZHRofXB4IDAgJHtjb2xvcn1gKTsgIC8vIEJvdHRvbS1sZWZ0XG4gICAgICBzaGFkb3dzLnB1c2goYC0ke3BhcnNlZFdpZHRofXB4IC0ke3BhcnNlZFdpZHRofXB4IDAgJHtjb2xvcn1gKTsgLy8gVG9wLWxlZnRcbiAgICAgIFxuICAgICAgLy8gQWRkIGludGVybWVkaWF0ZSBwb2ludHMgZm9yIGJldHRlciBjb3ZlcmFnZVxuICAgICAgY29uc3QgaGFsZldpZHRoID0gTWF0aC5yb3VuZChwYXJzZWRXaWR0aCAqIDAuNzA3MSk7IC8vIGNvcyg0NcKwKSDiiYggMC43MDcxXG4gICAgICBzaGFkb3dzLnB1c2goYCR7aGFsZldpZHRofXB4IC0ke3BhcnNlZFdpZHRofXB4IDAgJHtjb2xvcn1gKTsgICAgLy8gVG9wLXJpZ2h0IGludGVybWVkaWF0ZVxuICAgICAgc2hhZG93cy5wdXNoKGAke3BhcnNlZFdpZHRofXB4IC0ke2hhbGZXaWR0aH1weCAwICR7Y29sb3J9YCk7ICAgIC8vIFJpZ2h0LXRvcCBpbnRlcm1lZGlhdGVcbiAgICAgIHNoYWRvd3MucHVzaChgJHtwYXJzZWRXaWR0aH1weCAke2hhbGZXaWR0aH1weCAwICR7Y29sb3J9YCk7ICAgICAvLyBSaWdodC1ib3R0b20gaW50ZXJtZWRpYXRlXG4gICAgICBzaGFkb3dzLnB1c2goYCR7aGFsZldpZHRofXB4ICR7cGFyc2VkV2lkdGh9cHggMCAke2NvbG9yfWApOyAgICAgLy8gQm90dG9tLXJpZ2h0IGludGVybWVkaWF0ZVxuICAgICAgc2hhZG93cy5wdXNoKGAtJHtoYWxmV2lkdGh9cHggJHtwYXJzZWRXaWR0aH1weCAwICR7Y29sb3J9YCk7ICAgIC8vIEJvdHRvbS1sZWZ0IGludGVybWVkaWF0ZVxuICAgICAgc2hhZG93cy5wdXNoKGAtJHtwYXJzZWRXaWR0aH1weCAke2hhbGZXaWR0aH1weCAwICR7Y29sb3J9YCk7ICAgIC8vIExlZnQtYm90dG9tIGludGVybWVkaWF0ZVxuICAgICAgc2hhZG93cy5wdXNoKGAtJHtwYXJzZWRXaWR0aH1weCAtJHtoYWxmV2lkdGh9cHggMCAke2NvbG9yfWApOyAgIC8vIExlZnQtdG9wIGludGVybWVkaWF0ZVxuICAgICAgc2hhZG93cy5wdXNoKGAtJHtoYWxmV2lkdGh9cHggLSR7cGFyc2VkV2lkdGh9cHggMCAke2NvbG9yfWApOyAgIC8vIFRvcC1sZWZ0IGludGVybWVkaWF0ZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPcmlnaW5hbCByb3VuZCBzdHlsZVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzNjA7IGkgKz0gMjIuNSkge1xuICAgICAgICBjb25zdCBhbmdsZSA9IChpICogTWF0aC5QSSkgLyAxODA7XG4gICAgICAgIGNvbnN0IHggPSBNYXRoLnJvdW5kKE1hdGguY29zKGFuZ2xlKSAqIHBhcnNlZFdpZHRoKTtcbiAgICAgICAgY29uc3QgeSA9IE1hdGgucm91bmQoTWF0aC5zaW4oYW5nbGUpICogcGFyc2VkV2lkdGgpO1xuICAgICAgICBzaGFkb3dzLnB1c2goYCR7eH1weCAke3l9cHggMCAke2NvbG9yfWApO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBjb25zdCByZXN1bHQgPSBzaGFkb3dzLmpvaW4oJywnKTtcbiAgICBjYWNoZS5zZXQoa2V5LCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59KSgpO1xuXG5cbmV4cG9ydCBjb25zdCBTdWJ0aXRsZVRleHQgPSBtZW1vKCh7IFxuICB0ZXh0LCBcbiAgc3R5bGUsIFxuICBhbmltYXRpb25TdHlsZSwgXG4gIGZyYW1lLFxuICBzdGFydEZyYW1lLCBcbiAgcmFuZG9tQ29sb3JzLCBcbiAgd29yZHMsIFxuICBmcHMsXG4gIGhpZ2hsaWdodFdvcmRzQ29sb3IsXG59KSA9PiB7XG4gIGNvbnN0IHJlbGF0aXZlRnJhbWUgPSBmcmFtZSAtIHN0YXJ0RnJhbWU7XG4gIFxuICBjb25zdCBzY2FsZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChhbmltYXRpb25TdHlsZSA9PT0gXCJwbGVhc3VyZS1wb2QtYW5pbWF0aW9uXCIpIHtcbiAgICAgIHJldHVybiBzcHJpbmcoe1xuICAgICAgICBmcmFtZTogcmVsYXRpdmVGcmFtZSxcbiAgICAgICAgZnJvbTogMC45NSxcbiAgICAgICAgdG86IDEuMCwgIFxuICAgICAgICBmcHM6IDMwLFxuICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICBkYW1waW5nOiAyMCxcbiAgICAgICAgICBzdGlmZm5lc3M6IDQwMCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhbmltYXRpb25TdHlsZSA9PT0gXCJzcHJpbmdcIikge1xuICAgICAgY29uc3Qgc3ByaW5nVmFsdWUgPSBzcHJpbmcoe1xuICAgICAgICBmcmFtZTogcmVsYXRpdmVGcmFtZSxcbiAgICAgICAgZnJvbTogMC45LFxuICAgICAgICB0bzogMSxcbiAgICAgICAgZnBzLFxuICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICBtYXNzOiAwLjUsXG4gICAgICAgICAgc3RpZmZuZXNzOiAxNTAsXG4gICAgICAgICAgZGFtcGluZzogMTUsXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNwcmluZ1ZhbHVlO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gMTtcbiAgfSwgW2FuaW1hdGlvblN0eWxlLCByZWxhdGl2ZUZyYW1lLCBmcHNdKTtcblxuICBjb25zdCB0cmFuc2xhdGVZID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKGFuaW1hdGlvblN0eWxlID09PSBcInNwcmluZ1wiKSB7XG4gICAgICBjb25zdCB0cmFuc2xhdGVWYWx1ZSA9IHNwcmluZyh7XG4gICAgICAgIGZyYW1lOiByZWxhdGl2ZUZyYW1lLFxuICAgICAgICBmcm9tOiAxMCxcbiAgICAgICAgdG86IDAsXG4gICAgICAgIGZwcyxcbiAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgbWFzczogMC41LFxuICAgICAgICAgIHN0aWZmbmVzczogMTUwLFxuICAgICAgICAgIGRhbXBpbmc6IDE1LFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cmFuc2xhdGVWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH0sIFthbmltYXRpb25TdHlsZSwgcmVsYXRpdmVGcmFtZSwgZnBzXSk7XG5cblxuICAvLyBDYWxjdWxhdGUgYWRqdXN0ZWQgZm9udCBzaXplIGJhc2VkIG9uIHRleHQgd2lkdGhcbiAgY29uc3QgYWRqdXN0ZWRGb250U2l6ZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IG1heExpbmVXaWR0aCA9IHN0eWxlLm1heExpbmVXaWR0aCB8fCAxMDgwOyAvLyBEZWZhdWx0IG1heCB3aWR0aFxuICAgIGNvbnN0IGJhc2VGb250U2l6ZSA9IHN0eWxlLmZvbnRTaXplICogMnx8IDY0OyAvLyBEZWZhdWx0IGZvbnQgc2l6ZVxuICAgIGNvbnN0IGZvbnRGYW1pbHkgPSBzdHlsZS5mb250RmFtaWx5IHx8ICdBcmlhbCc7XG4gICAgXG4gICAgY29uc3QgdGV4dFdpZHRoID0gZXN0aW1hdGVUZXh0V2lkdGgodGV4dCwgYmFzZUZvbnRTaXplLCBmb250RmFtaWx5KTtcbiAgICBpZiAodGV4dFdpZHRoID4gbWF4TGluZVdpZHRoKSB7XG4gICAgICBjb25zdCBzY2FsZUZhY3RvciA9IG1heExpbmVXaWR0aCAvIHRleHRXaWR0aDtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKGJhc2VGb250U2l6ZSAqIHNjYWxlRmFjdG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2VGb250U2l6ZTtcbiAgfSwgW3RleHQsIHN0eWxlLm1heExpbmVXaWR0aCwgc3R5bGUuZm9udFNpemUsIHN0eWxlLmZvbnRGYW1pbHldKTtcblxuICAvLyBDYWxjdWxhdGUgYWRqdXN0ZWQgZm9udCBzaXplIGJhc2VkIG9uIHRleHQgd2lkdGhcbiAgY29uc3QgYW5pbWF0ZWRTdHlsZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGJhc2VQYWRkaW5nID0gc3R5bGUuYmFja2dyb3VuZFBhZGRpbmcgfHwgJzE1JztcbiAgICBcbiAgICAvLyBDcmVhdGUgdGV4dCBzaGFkb3cgYmFzZWQgb24gaW50ZW5zaXR5XG4gICAgY29uc3Qgc2hhZG93SW50ZW5zaXR5ID0gc3R5bGUuc2hhZG93SW50ZW5zaXR5IHx8IDE7XG4gICAgY29uc3Qgc2hhZG93Q29sb3IgPSBzdHlsZS5zaGFkb3dDb2xvciB8fCAnIzAwMDAwMCc7XG4gICAgY29uc3Qgc2hhZG93Qmx1ciA9IHN0eWxlLnNoYWRvd0JsdXIgfHwgJzInO1xuICAgIGNvbnN0IHNoYWRvd09mZnNldFggPSBzdHlsZS5zaGFkb3dPZmZzZXRYIHx8ICcwJztcbiAgICBjb25zdCBzaGFkb3dPZmZzZXRZID0gc3R5bGUuc2hhZG93T2Zmc2V0WSB8fCAnMCc7XG4gICAgXG4gICAgLy8gU3RhY2sgbXVsdGlwbGUgc2hhZG93cyBiYXNlZCBvbiBpbnRlbnNpdHlcbiAgICBjb25zdCBzaGFkb3dzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaGFkb3dJbnRlbnNpdHk7IGkrKykge1xuICAgICAgc2hhZG93cy5wdXNoKGAke3NoYWRvd09mZnNldFh9cHggJHtzaGFkb3dPZmZzZXRZfXB4ICR7c2hhZG93Qmx1cn1weCAke3NoYWRvd0NvbG9yfWApO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0U2hhZG93ID0gc2hhZG93cy5qb2luKCcsICcpO1xuXG4gICAgLy8gQ29udmVydCBoZXggdG8gcmdiYSBmb3IgYmFja2dyb3VuZCBjb2xvclxuICAgIGNvbnN0IGhleFRvUmdiYSA9IChoZXgsIG9wYWNpdHkpID0+IHtcbiAgICAgIGNvbnN0IHNob3J0aGFuZFJlZ2V4ID0gL14jPyhbYS1mXFxkXSkoW2EtZlxcZF0pKFthLWZcXGRdKSQvaTtcbiAgICAgIGhleCA9IGhleC5yZXBsYWNlKHNob3J0aGFuZFJlZ2V4LCAobSwgciwgZywgYikgPT4gciArIHIgKyBnICsgZyArIGIgKyBiKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IC9eIz8oW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkkL2kuZXhlYyhoZXgpO1xuICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBoZXg7XG4gICAgICBjb25zdCByID0gcGFyc2VJbnQocmVzdWx0WzFdLCAxNik7XG4gICAgICBjb25zdCBnID0gcGFyc2VJbnQocmVzdWx0WzJdLCAxNik7XG4gICAgICBjb25zdCBiID0gcGFyc2VJbnQocmVzdWx0WzNdLCAxNik7XG4gICAgICByZXR1cm4gYHJnYmEoJHtyfSwgJHtnfSwgJHtifSwgJHtvcGFjaXR5fSlgO1xuICAgIH07XG5cbiAgICBjb25zdCBiYWNrZ3JvdW5kQ29sb3IgPSBzdHlsZS5iYWNrZ3JvdW5kQ29sb3IgfHwgJyMwMDAwMDAnO1xuICAgIGNvbnN0IG9wYWNpdHkgPSB0eXBlb2Ygc3R5bGUuYmFja2dyb3VuZE9wYWNpdHkgPT09ICdzdHJpbmcnIFxuICAgICAgPyBwYXJzZUZsb2F0KHN0eWxlLmJhY2tncm91bmRPcGFjaXR5LnRyaW0oKSlcbiAgICAgIDogcGFyc2VGbG9hdChzdHlsZS5iYWNrZ3JvdW5kT3BhY2l0eSkgfHwgMDtcbiAgICAgIFxuICAgIGNvbnN0IGJhY2tncm91bmQgPSBoZXhUb1JnYmEoYmFja2dyb3VuZENvbG9yLCBvcGFjaXR5KTtcbiAgICBjb25zdCBoYXNCYWNrZ3JvdW5kID0gb3BhY2l0eSA+IDA7XG4gICAgY29uc3QgaGFzU2hhZG93ID0gc2hhZG93SW50ZW5zaXR5ID4gMCAmJiAoc2hhZG93Qmx1ciAhPT0gJzAnIHx8IHNoYWRvd09mZnNldFggIT09ICcwJyB8fCBzaGFkb3dPZmZzZXRZICE9PSAnMCcpO1xuXG4gICAgLy8gSGFuZGxlIGJvcmRlciByYWRpdXMgcHJvcGVybHlcbiAgICBjb25zdCBib3JkZXJSYWRpdXMgPSBzdHlsZS5iYWNrZ3JvdW5kQm9yZGVyUmFkaXVzIFxuICAgICAgPyBgJHtwYXJzZUludChzdHlsZS5iYWNrZ3JvdW5kQm9yZGVyUmFkaXVzLCAxMCl9cHhgXG4gICAgICA6ICcwcHgnO1xuICAgIFxuICAgIC8vIEhhbmRsZSBiYWNrZ3JvdW5kIHdyYXBwaW5nXG4gICAgY29uc3QgaXNXcmFwcGVkID0gc3R5bGUuYmFja2dyb3VuZEZpbGxTdHlsZSA9PT0gXCJ3cmFwXCI7XG4gICAgY29uc3QgcGFkZGluZ1ZhbHVlID0gcGFyc2VJbnQoYmFzZVBhZGRpbmcsIDEwKTtcbiAgICBcbiAgICAvLyBGb3Igd3JhcHBlZCBzdHlsZSwgdXNlIHVuaWZvcm0gcGFkZGluZ1xuICAgIGNvbnN0IHBhZGRpbmcgPSBpc1dyYXBwZWQgXG4gICAgICA/IGAke3BhZGRpbmdWYWx1ZX1weCAke01hdGgucm91bmQocGFkZGluZ1ZhbHVlICogMS4yKX1weGBcbiAgICAgIDogYCR7cGFkZGluZ1ZhbHVlfXB4ICR7cGFkZGluZ1ZhbHVlICogM31weGA7XG4gICAgXG4gICAgY29uc3Qgd2lkdGggPSBpc1dyYXBwZWQgPyBcImF1dG9cIiA6IHN0eWxlLndpZHRoO1xuICAgIGNvbnN0IGRpc3BsYXkgPSBpc1dyYXBwZWQgPyBcImlubGluZS1ibG9ja1wiIDogc3R5bGUuZGlzcGxheSB8fCBcImJsb2NrXCI7XG4gICAgXG4gICAgY29uc3QgYmFzZVN0eWxlID0ge1xuICAgICAgcGFkZGluZyxcbiAgICAgIGJhY2tncm91bmQsXG4gICAgICBib3JkZXJSYWRpdXMsXG4gICAgICB3aWR0aCxcbiAgICAgIGRpc3BsYXksXG4gICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAuLi5zdHlsZSxcbiAgICAgIC8vIEtlZXAgZm9udEZhbWlseSBpbiB0aGUgaW5saW5lIHN0eWxlcyBub3dcbiAgICAgIHRleHRTaGFkb3c6ICdub25lJyxcbiAgICAgIGJveFNoYWRvdzogaGFzQmFja2dyb3VuZCAmJiBoYXNTaGFkb3cgPyB0ZXh0U2hhZG93IDogJ25vbmUnLFxuICAgICAgdHJhbnNmb3JtOiBhbmltYXRpb25TdHlsZSA9PT0gXCJzcHJpbmdcIiBcbiAgICAgICAgPyBgJHtzdHlsZS50cmFuc2Zvcm0gPyBgJHtzdHlsZS50cmFuc2Zvcm19IGAgOiAnJ310cmFuc2xhdGUzZCgwLCAke3RyYW5zbGF0ZVl9cHgsIDApIHNjYWxlKCR7c2NhbGV9KWBcbiAgICAgICAgOiBzdHlsZS50cmFuc2Zvcm0gfHwgJ25vbmUnLFxuICAgICAgZm9udFNpemU6IHR5cGVvZiBzdHlsZS5mb250U2l6ZSA9PT0gJ3N0cmluZycgPyBhZGp1c3RlZEZvbnRTaXplIDogYWRqdXN0ZWRGb250U2l6ZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGJhc2VTdHlsZTtcbiAgfSwgW3N0eWxlLCBzY2FsZSwgdHJhbnNsYXRlWSwgYWRqdXN0ZWRGb250U2l6ZSwgYW5pbWF0aW9uU3R5bGVdKTtcblxuICBjb25zdCB3cmFwcGVyU3R5bGUgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgdHJhbnNmb3JtOiBgc2NhbGVZKCR7c3R5bGUudmVydGljYWxTdHJldGNoIHx8IDF9KWAsXG4gICAgd2hpdGVTcGFjZTogJ25vd3JhcCcsXG4gICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgIHdpZHRoOiAnZml0LWNvbnRlbnQnLFxuICAgIHdpbGxDaGFuZ2U6ICd0cmFuc2Zvcm0nXG4gIH0pLCBbc3R5bGUudmVydGljYWxTdHJldGNoXSk7XG5cbiAgY29uc3Qgb3V0bGluZVN0eWxlID0gdXNlTWVtbygoKSA9PiAoe1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIGxlZnQ6IDAsXG4gICAgdG9wOiAwLFxuICAgIHJpZ2h0OiAwLFxuICAgIGJvdHRvbTogMCxcbiAgICBjb2xvcjogc3R5bGUub3V0bGluZUNvbG9yLFxuICAgIHRleHRTaGFkb3c6IGdlbmVyYXRlT3V0bGluZVNoYWRvdyhzdHlsZS5vdXRsaW5lQ29sb3IsIHN0eWxlLm91dGxpbmVXaWR0aCwgc3R5bGUub3V0bGluZVN0eWxlKSxcbiAgICBXZWJraXRUZXh0RmlsbENvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgIHpJbmRleDogMCxcbiAgfSksIFtzdHlsZS5vdXRsaW5lQ29sb3IsIHN0eWxlLm91dGxpbmVXaWR0aCwgc3R5bGUub3V0bGluZVN0eWxlXSk7XG5cbiAgY29uc3QgbWFpblRleHRTdHlsZSA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICB6SW5kZXg6IDEsXG4gICAgV2Via2l0VGV4dFN0cm9rZTogJ3Vuc2V0JyxcbiAgICBjb2xvcjogc3R5bGUuY29sb3IsXG4gIH0pLCBbc3R5bGUuY29sb3JdKTtcblxuICAvLyBTcGxpdCB0ZXh0IGludG8gd29yZHMgYW5kIGNhbGN1bGF0ZSBjdXJyZW50IHRpbWVcbiAgY29uc3QgdGV4dFdvcmRzID0gdXNlTWVtbygoKSA9PiB0ZXh0LnNwbGl0KCcgJyksIFt0ZXh0XSk7XG4gIGNvbnN0IGN1cnJlbnRXb3JkVGltZSA9IGZyYW1lIC8gZnBzO1xuXG4gIC8vIEZpbmQgY3VycmVudGx5IHNwb2tlbiB3b3JkXG5cbiAgLy8gQ3JlYXRlIGFtcGxpZmllZCBncmFkaWVudCBzdHlsZSBpZiBhbXBsaWZpZWRDb2xvciBpcyBhIGdyYWRpZW50IGFycmF5XG4gIGNvbnN0IHBocmFzZUFtcGxpZmllZFN0eWxlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUuYW1wbGlmaWVkQ29sb3JzKSkge1xuICAgICAgY29uc3QgZmlyc3RXb3JkID0gd29yZHNbMF0ud29yZDtcbiAgICAgIGNvbnN0IGdyYWRpZW50SW5kZXggPSBNYXRoLmZsb29yKHJhbmRvbShgYW1wbGlmaWVkLXBocmFzZS0ke2ZpcnN0V29yZH1gKSAqIHN0eWxlLmFtcGxpZmllZENvbG9ycy5sZW5ndGgpO1xuICAgICAgY29uc3QgZ3JhZGllbnQgPSBzdHlsZS5hbXBsaWZpZWRDb2xvcnNbZ3JhZGllbnRJbmRleF07XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiYWNrZ3JvdW5kOiBgbGluZWFyLWdyYWRpZW50KCR7Z3JhZGllbnQuYW5nbGV9ZGVnLCAke2dyYWRpZW50LmNvbG9ycy5qb2luKFwiLCBcIil9KWAsXG4gICAgICAgIGJhY2tncm91bmRDbGlwOiBcInRleHRcIixcbiAgICAgICAgV2Via2l0VGV4dEZpbGxDb2xvcjogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICBXZWJraXRCYWNrZ3JvdW5kQ2xpcDogXCJ0ZXh0XCIsXG4gICAgICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXG4gICAgICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgICAgIHpJbmRleDogMSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKFwiaGlnaGxpZ2h0IHdvcmRzIGNvbG9yOlwiLCBoaWdobGlnaHRXb3Jkc0NvbG9yKTtcbiAgICBpZiAodHlwZW9mIHN0eWxlLmFtcGxpZmllZENvbG9yID09PSAnb2JqZWN0JyAmJiBzdHlsZS5hbXBsaWZpZWRDb2xvci50eXBlID09PSAnZ3JhZGllbnQnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiYWNrZ3JvdW5kOiBgbGluZWFyLWdyYWRpZW50KCR7c3R5bGUuYW1wbGlmaWVkQ29sb3IuY29sb3JzWzBdLmFuZ2xlfWRlZywgJHtzdHlsZS5hbXBsaWZpZWRDb2xvci5jb2xvcnNbMF0uY29sb3JzLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgICAgYmFja2dyb3VuZENsaXA6IFwidGV4dFwiLFxuICAgICAgICBXZWJraXRUZXh0RmlsbENvbG9yOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIFdlYmtpdEJhY2tncm91bmRDbGlwOiBcInRleHRcIixcbiAgICAgICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICAgICAgcG9zaXRpb246IFwicmVsYXRpdmVcIixcbiAgICAgICAgekluZGV4OiAxLFxuICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHsgXG4gICAgICBjb2xvcjogc3R5bGUuYW1wbGlmaWVkQ29sb3IsXG4gICAgICBXZWJraXRUZXh0RmlsbENvbG9yOiBzdHlsZS5hbXBsaWZpZWRDb2xvcixcbiAgICB9O1xuICB9LCBbc3R5bGUuYW1wbGlmaWVkQ29sb3JzLCBzdHlsZS5hbXBsaWZpZWRDb2xvciwgd29yZHNdKTtcblxuICAvLyBIYW5kbGUgcmFuZG9tIGNvbG9ycyBpZiBlbmFibGVkXG4gIGNvbnN0IHJhbmRvbUNvbG9yRGF0YSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghcmFuZG9tQ29sb3JzPy5lbmFibGVkIHx8ICF3b3JkcykgcmV0dXJuIG51bGw7XG4gICAgXG4gICAgY29uc3Qgc2hvdWxkQ29sb3IgPSByYW5kb20oYHNob3VsZC1jb2xvci0ke3dvcmRzWzBdLndvcmR9YCkgPCByYW5kb21Db2xvcnMucGN0QXBwbGllZDtcbiAgICBpZiAoIXNob3VsZENvbG9yKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IFttaW5Xb3JkcywgbWF4V29yZHNdID0gcmFuZG9tQ29sb3JzPy5yYW5kb21Xb3JkQ291bnRSYW5nZSB8fCBbMCwgMF07XG4gICAgY29uc3QgcmFuZ2UgPSBtYXhXb3JkcyAtIG1pbldvcmRzICsgMTtcbiAgICBjb25zdCByYW5kb21Xb3JkQ291bnQgPSBNYXRoLmZsb29yKHJhbmRvbShgd29yZC1jb3VudC0ke3dvcmRzWzBdLndvcmR9YCkgKiByYW5nZSkgKyBtaW5Xb3JkcztcbiAgICBjb25zdCBtYXhTdGFydEluZGV4ID0gTWF0aC5tYXgoMCwgdGV4dFdvcmRzLmxlbmd0aCAtIHJhbmRvbVdvcmRDb3VudCk7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IE1hdGguZmxvb3IocmFuZG9tKGBzdGFydC1pbmRleC0ke3dvcmRzWzBdLndvcmR9YCkgKiAobWF4U3RhcnRJbmRleCArIDEpKTtcbiAgICBjb25zdCByYW5kb21Db2xvck9iaiA9IHJhbmRvbUNvbG9ycy5jb2xvcnNbTWF0aC5mbG9vcihyYW5kb20oYGNvbG9yLSR7d29yZHNbMF0ud29yZH1gKSAqIHJhbmRvbUNvbG9ycy5jb2xvcnMubGVuZ3RoKV07XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2hvdWxkQ29sb3IsXG4gICAgICByYW5kb21Xb3JkQ291bnQsXG4gICAgICBzdGFydEluZGV4LFxuICAgICAgcmFuZG9tQ29sb3JPYmpcbiAgICB9O1xuICB9LCBbcmFuZG9tQ29sb3JzLCB3b3JkcywgdGV4dFdvcmRzLmxlbmd0aF0pO1xuXG4gIGNvbnN0IHBocmFzZVN0eWxlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFyYW5kb21Db2xvckRhdGEpIHtcbiAgICAgIHJldHVybiB7IFxuICAgICAgICBjb2xvcjogc3R5bGUuY29sb3IsXG4gICAgICAgIFdlYmtpdFRleHRGaWxsQ29sb3I6IHN0eWxlLmNvbG9yLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHJhbmRvbUNvbG9yT2JqIH0gPSByYW5kb21Db2xvckRhdGE7XG4gICAgcmV0dXJuIHJhbmRvbUNvbG9yT2JqLnR5cGUgPT09IFwiZ3JhZGllbnRcIiA/IFxuICAgICAge1xuICAgICAgICBiYWNrZ3JvdW5kOiBgbGluZWFyLWdyYWRpZW50KCR7cmFuZG9tQ29sb3JPYmouYW5nbGV9ZGVnLCAke3JhbmRvbUNvbG9yT2JqLmNvbG9ycy5qb2luKFwiLCBcIil9KWAsXG4gICAgICAgIGJhY2tncm91bmRDbGlwOiBcInRleHRcIixcbiAgICAgICAgV2Via2l0VGV4dEZpbGxDb2xvcjogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICBXZWJraXRCYWNrZ3JvdW5kQ2xpcDogXCJ0ZXh0XCIsXG4gICAgICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXG4gICAgICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgICAgIHpJbmRleDogMSxcbiAgICAgIH0gOiBcbiAgICAgIHsgXG4gICAgICAgIGNvbG9yOiByYW5kb21Db2xvck9iai5jb2xvcixcbiAgICAgICAgV2Via2l0VGV4dEZpbGxDb2xvcjogcmFuZG9tQ29sb3JPYmouY29sb3IsXG4gICAgICB9O1xuICB9LCBbcmFuZG9tQ29sb3JEYXRhLCBzdHlsZS5jb2xvcl0pO1xuXG4gIGNvbnN0IHdvcmRDb250ZW50ID0gdXNlTWVtbygoKSA9PiB0ZXh0V29yZHMubWFwKCh3b3JkLCBpbmRleCkgPT4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSB3b3JkIGlzIHN1cnJvdW5kZWQgYnkgPGg+IHRhZ3NcbiAgICBjb25zdCBoaWdobGlnaHRlZE1hdGNoID0gd29yZC5tYXRjaCgvXjxoPiguKj8pPFxcL2g+JC8pO1xuICAgIGNvbnN0IGlzSGlnaGxpZ2h0ZWQgPSBoaWdobGlnaHRlZE1hdGNoICE9PSBudWxsO1xuICAgIGNvbnN0IGRpc3BsYXlXb3JkID0gaXNIaWdobGlnaHRlZCA/IGhpZ2hsaWdodGVkTWF0Y2hbMV0gOiB3b3JkO1xuXG4gICAgY29uc3Qgc2hvdWxkQ29sb3JUaGlzV29yZCA9IHJhbmRvbUNvbG9yRGF0YSAmJiBcbiAgICAgIGluZGV4ID49IHJhbmRvbUNvbG9yRGF0YS5zdGFydEluZGV4ICYmIFxuICAgICAgaW5kZXggPCByYW5kb21Db2xvckRhdGEuc3RhcnRJbmRleCArIHJhbmRvbUNvbG9yRGF0YS5yYW5kb21Xb3JkQ291bnQgJiZcbiAgICAgIGluZGV4IDwgdGV4dFdvcmRzLmxlbmd0aDtcblxuICAgIGNvbnN0IHdvcmRUaW1pbmcgPSB3b3Jkcz8uW2luZGV4XTtcbiAgICBjb25zdCBoYXNCZWVuU3Bva2VuID0gd29yZFRpbWluZyAmJiBjdXJyZW50V29yZFRpbWUgPj0gd29yZFRpbWluZy5lbmQ7XG4gICAgY29uc3QgaXNDdXJyZW50bHlTcG9rZW4gPSB3b3JkVGltaW5nICYmIFxuICAgICAgY3VycmVudFdvcmRUaW1lID49IHdvcmRUaW1pbmcuc3RhcnQgJiYgXG4gICAgICBjdXJyZW50V29yZFRpbWUgPCB3b3JkVGltaW5nLmVuZDtcblxuICAgIGNvbnN0IHRleHRIaWdobGlnaHRQZXJzaXN0cyA9IHN0eWxlLnRleHRIaWdobGlnaHRQZXJzaXN0cyA/IHRydWUgOiBmYWxzZTtcbiAgICBcbiAgICBjb25zdCBzaG91bGRIaWdobGlnaHQgPSBzdHlsZS5hbXBsaWZ5U3Bva2VuV29yZHMgJiYgXG4gICAgICAoaXNDdXJyZW50bHlTcG9rZW4gfHwgKHRleHRIaWdobGlnaHRQZXJzaXN0cyAmJiBoYXNCZWVuU3Bva2VuKSk7XG4gICAgXG4gICAgLy8gTW9kaWZpZWQgbG9naWMgdG8gcHJpb3JpdGl6ZSA8aD4gdGFnIGhpZ2hsaWdodGluZ1xuICAgIGNvbnN0IHdvcmRTdHlsZSA9IGlzSGlnaGxpZ2h0ZWRcbiAgICAgID8geyBcbiAgICAgICAgICBjb2xvcjogaGlnaGxpZ2h0V29yZHNDb2xvcixcbiAgICAgICAgICBXZWJraXRUZXh0RmlsbENvbG9yOiBoaWdobGlnaHRXb3Jkc0NvbG9yLFxuICAgICAgICAgIG9wYWNpdHk6IHN0eWxlLm9wYWNpdHkgfHwgMSxcbiAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgfVxuICAgICAgOiBzaG91bGRIaWdobGlnaHRcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5waHJhc2VBbXBsaWZpZWRTdHlsZSxcbiAgICAgICAgICAgIG9wYWNpdHk6IHN0eWxlLmFtcGxpZmllZE9wYWNpdHkgfHwgMSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICAgIH1cbiAgICAgICAgOiBzaG91bGRDb2xvclRoaXNXb3JkIFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAuLi5waHJhc2VTdHlsZSxcbiAgICAgICAgICAgICAgb3BhY2l0eTogc3R5bGUub3BhY2l0eSB8fCAxLFxuICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHsgXG4gICAgICAgICAgICAgIGNvbG9yOiBzdHlsZS5jb2xvcixcbiAgICAgICAgICAgICAgV2Via2l0VGV4dEZpbGxDb2xvcjogc3R5bGUuY29sb3IsXG4gICAgICAgICAgICAgIG9wYWNpdHk6IHN0eWxlLnVuQW1wbGlmaWVkT3BhY2l0eSB8fCAxLFxuICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICAgIH07XG5cbiAgICAvLyBBZGQgei1pbmRleCB0byBlbnN1cmUgcHJvcGVyIHN0YWNraW5nIG9mIHdvcmQgYmxvY2tzXG4gICAgY29uc3QgY29udGFpbmVyU3R5bGUgPSB7XG4gICAgICAuLi53b3JkU3R5bGUsXG4gICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgIG1hcmdpblJpZ2h0OiBpbmRleCA8IHRleHRXb3Jkcy5sZW5ndGggLSAxID8gJzAuMjVlbScgOiAwLFxuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICB6SW5kZXg6IGlzQ3VycmVudGx5U3Bva2VuID8gMiA6IDEsXG4gICAgICB3aGl0ZVNwYWNlOiAnbm93cmFwJ1xuICAgIH07XG5cbiAgICByZXR1cm4gKFxuICAgICAgPHNwYW4ga2V5PXtpbmRleH0gc3R5bGU9e2NvbnRhaW5lclN0eWxlfT5cbiAgICAgICAge3N0eWxlLmN1cnJlbnRXb3JkQmxvY2sgJiYgaXNDdXJyZW50bHlTcG9rZW4gJiYgKFxuICAgICAgICAgIDxzcGFuIHN0eWxlPXt7XG4gICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgIGNvbnRlbnQ6ICdcIlwiJyxcbiAgICAgICAgICAgIGxlZnQ6IGAtJHsoc3R5bGUuY3VycmVudFdvcmRCbG9ja1BhZGRpbmcgfHwgNSkgKiAyfXB4YCxcbiAgICAgICAgICAgIHJpZ2h0OiBgLSR7KHN0eWxlLmN1cnJlbnRXb3JkQmxvY2tQYWRkaW5nIHx8IDUpICogMn1weGAsXG4gICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICBoZWlnaHQ6ICc3MCUnLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBzdHlsZS5jdXJyZW50V29yZEJsb2NrQmFja2dyb3VuZENvbG9yIHx8ICcjMDAwMDAwJyxcbiAgICAgICAgICAgIG9wYWNpdHk6IHN0eWxlLmN1cnJlbnRXb3JkQmxvY2tPcGFjaXR5IHx8IDEsXG4gICAgICAgICAgICBib3JkZXJSYWRpdXM6IGAke3N0eWxlLmN1cnJlbnRXb3JkQmxvY2tCb3JkZXJSYWRpdXMgfHwgMTV9cHhgLFxuICAgICAgICAgICAgekluZGV4OiAtMSxcbiAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMnB4KScsXG4gICAgICAgICAgICBwYWRkaW5nOiBgJHtzdHlsZS5jdXJyZW50V29yZEJsb2NrUGFkZGluZyB8fCA1fXB4IDBgLFxuICAgICAgICAgICAgYm94U2l6aW5nOiAnY29udGVudC1ib3gnXG4gICAgICAgICAgfX0gLz5cbiAgICAgICAgKX1cbiAgICAgICAge2Rpc3BsYXlXb3JkfSB7LyogRGlzcGxheSB0aGUgd29yZCB3aXRob3V0IDxoPiB0YWdzICovfVxuICAgICAgPC9zcGFuPlxuICAgICk7XG4gIH0pLCBbdGV4dFdvcmRzLCByYW5kb21Db2xvckRhdGEsIHdvcmRzLCBjdXJyZW50V29yZFRpbWUsIHN0eWxlLmFtcGxpZnlTcG9rZW5Xb3Jkcywgc3R5bGUudGV4dEhpZ2hsaWdodFBlcnNpc3RzLCBwaHJhc2VBbXBsaWZpZWRTdHlsZSwgcGhyYXNlU3R5bGUsIHN0eWxlLmNvbG9yLCBzdHlsZS5jdXJyZW50V29yZEJsb2NrLCBzdHlsZS5jdXJyZW50V29yZEJsb2NrQmFja2dyb3VuZENvbG9yLCBzdHlsZS5jdXJyZW50V29yZEJsb2NrT3BhY2l0eSwgc3R5bGUuY3VycmVudFdvcmRCbG9ja1BhZGRpbmcsIHN0eWxlLmN1cnJlbnRXb3JkQmxvY2tCb3JkZXJSYWRpdXMsIGhpZ2hsaWdodFdvcmRzQ29sb3JdKTtcbiAgLy8gY29uc29sZS5sb2coJ1N1YnRpdGxlVGV4dCAtIHJlY2VpdmVkIHN0eWxlIGZvbnRGYW1pbHk6Jywgc3R5bGUuZm9udEZhbWlseSk7XG4gIHJldHVybiAoXG4gICAgPGRpdiBcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIC4uLmFuaW1hdGVkU3R5bGUsXG4gICAgICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICAgICAgICB3aWR0aDogJ2ZpdC1jb250ZW50JyxcbiAgICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgICAgfX1cbiAgICA+XG4gICAgICA8ZGl2IHN0eWxlPXt3cmFwcGVyU3R5bGV9PlxuICAgICAgICA8ZGl2IHN0eWxlPXt7Li4ub3V0bGluZVN0eWxlLCB3aGl0ZVNwYWNlOiAnbm93cmFwJ319Pnt3b3JkQ29udGVudH08L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT17ey4uLm1haW5UZXh0U3R5bGUsIHdoaXRlU3BhY2U6ICdub3dyYXAnfX0+e3dvcmRDb250ZW50fTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59LCAocHJldlByb3BzLCBuZXh0UHJvcHMpID0+IHtcbiAgLy8gT25seSByZS1yZW5kZXIgaWYgdGhlc2UgZXNzZW50aWFsIHByb3BzIGhhdmUgY2hhbmdlZFxuICBjb25zdCBlc3NlbnRpYWxQcm9wcyA9IFsnZnJhbWUnLCAndGV4dCcsICdzdGFydEZyYW1lJ107XG4gIGNvbnN0IGhhc0Vzc2VudGlhbFByb3BzQ2hhbmdlZCA9IGVzc2VudGlhbFByb3BzLnNvbWUoXG4gICAgcHJvcCA9PiBwcmV2UHJvcHNbcHJvcF0gIT09IG5leHRQcm9wc1twcm9wXVxuICApO1xuICBcbiAgLy8gRGVlcCBjb21wYXJlIHN0eWxlIGFuZCByYW5kb21Db2xvcnMgb25seSBpZiBlc3NlbnRpYWwgcHJvcHMgaGF2ZW4ndCBjaGFuZ2VkXG4gIGlmICghaGFzRXNzZW50aWFsUHJvcHNDaGFuZ2VkKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHByZXZQcm9wcy5zdHlsZSkgPT09IEpTT04uc3RyaW5naWZ5KG5leHRQcm9wcy5zdHlsZSkgJiZcbiAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkocHJldlByb3BzLnJhbmRvbUNvbG9ycykgPT09IEpTT04uc3RyaW5naWZ5KG5leHRQcm9wcy5yYW5kb21Db2xvcnMpO1xuICB9XG4gIFxuICByZXR1cm4gZmFsc2U7XG59KTsgIixudWxsLCJpbXBvcnQgUmVhY3QsIHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcblxuLy8gSGVscGVyIHRvIGNvbnZlcnQgaGV4IHRvIHJnYlxuY29uc3QgaGV4VG9SZ2IgPSAoaGV4KSA9PiB7XG4gIC8vIFJlbW92ZSAjIGlmIHByZXNlbnRcbiAgaGV4ID0gaGV4LnJlcGxhY2UoJyMnLCAnJyk7XG4gIFxuICAvLyBIYW5kbGUgYm90aCAzLWRpZ2l0IGFuZCA2LWRpZ2l0IGhleFxuICBjb25zdCByID0gcGFyc2VJbnQoaGV4Lmxlbmd0aCA9PT0gMyA/IGhleFswXSArIGhleFswXSA6IGhleC5zbGljZSgwLCAyKSwgMTYpO1xuICBjb25zdCBnID0gcGFyc2VJbnQoaGV4Lmxlbmd0aCA9PT0gMyA/IGhleFsxXSArIGhleFsxXSA6IGhleC5zbGljZSgyLCA0KSwgMTYpO1xuICBjb25zdCBiID0gcGFyc2VJbnQoaGV4Lmxlbmd0aCA9PT0gMyA/IGhleFsyXSArIGhleFsyXSA6IGhleC5zbGljZSg0LCA2KSwgMTYpO1xuICBcbiAgcmV0dXJuIGAke3J9LCAke2d9LCAke2J9YDtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VUZXh0U3R5bGUgPSAocHJlc2V0LCB4LCBhZGp1c3RlZFksIHZpZGVvV2lkdGgpID0+IHsgIFxuICByZXR1cm4gdXNlTWVtbygoKSA9PiB7XG4gICAgLy8gQ3JlYXRlIHRleHQgc2hhZG93IGJhc2VkIG9uIGludGVuc2l0eVxuICAgIGNvbnN0IHNoYWRvd0ludGVuc2l0eSA9IHByZXNldC5zaGFkb3dJbnRlbnNpdHkgfHwgMTtcbiAgICBjb25zdCBzaGFkb3dDb2xvciA9IHByZXNldC5zaGFkb3dDb2xvciB8fCAnIzAwMDAwMCc7XG4gICAgY29uc3Qgc2hhZG93Qmx1ciA9IHByZXNldC5zaGFkb3dCbHVyIHx8ICcyJztcbiAgICBjb25zdCBzaGFkb3dPZmZzZXRYID0gcHJlc2V0LnNoYWRvd09mZnNldFggfHwgJzAnO1xuICAgIGNvbnN0IHNoYWRvd09mZnNldFkgPSBwcmVzZXQuc2hhZG93T2Zmc2V0WSB8fCAnMCc7XG4gICAgXG4gICAgLy8gU3RhY2sgbXVsdGlwbGUgc2hhZG93cyBiYXNlZCBvbiBpbnRlbnNpdHlcbiAgICBjb25zdCBzaGFkb3dzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaGFkb3dJbnRlbnNpdHk7IGkrKykge1xuICAgICAgc2hhZG93cy5wdXNoKGAke3NoYWRvd09mZnNldFh9cHggJHtzaGFkb3dPZmZzZXRZfXB4ICR7c2hhZG93Qmx1cn1weCAke3NoYWRvd0NvbG9yfWApO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0U2hhZG93ID0gc2hhZG93cy5qb2luKCcsICcpO1xuXG4gICAgY29uc3QgZHJvcFNoYWRvdyA9IChwcmVzZXQuc2hhZG93RW5hYmxlZCAhPT0gZmFsc2UgJiYgKHByZXNldC5zaGFkb3dPZmZzZXRYIHx8IHByZXNldC5zaGFkb3dPZmZzZXRZIHx8IHByZXNldC5zaGFkb3dCbHVyKSlcbiAgICAgID8gYGRyb3Atc2hhZG93KCR7cHJlc2V0LnNoYWRvd09mZnNldFh9cHggJHtwcmVzZXQuc2hhZG93T2Zmc2V0WX1weCAke3ByZXNldC5zaGFkb3dCbHVyfXB4ICR7cHJlc2V0LnNoYWRvd0NvbG9yfSlgXG4gICAgICA6ICdub25lJztcblxuICAgIGNvbnN0IGJhY2tncm91bmRDb2xvciA9IHByZXNldC5iYWNrZ3JvdW5kQ29sb3IgPT09ICd0cmFuc3BhcmVudCcgXG4gICAgICA/ICd0cmFuc3BhcmVudCcgXG4gICAgICA6IHByZXNldC5iYWNrZ3JvdW5kQ29sb3IgJiYgcHJlc2V0LmJhY2tncm91bmRPcGFjaXR5XG4gICAgICAgID8gYHJnYmEoJHtoZXhUb1JnYihwcmVzZXQuYmFja2dyb3VuZENvbG9yKX0sICR7cHJlc2V0LmJhY2tncm91bmRPcGFjaXR5fSlgXG4gICAgICAgIDogcHJlc2V0LmJhY2tncm91bmRDb2xvciB8fCAnIzAwMDAwMCc7XG4gICAgXG4gICAgLy8gSGFuZGxlIGJvdGggZGlyZWN0aW9uYWwgYW5kIHVuaWZvcm0gcGFkZGluZ1xuICAgIGNvbnN0IHBhZGRpbmdYID0gcHJlc2V0LmJhY2tncm91bmRQYWRkaW5nWCB8fCBwcmVzZXQuYmFja2dyb3VuZFBhZGRpbmcgfHwgJzEwJztcbiAgICBjb25zdCBwYWRkaW5nWSA9IHByZXNldC5iYWNrZ3JvdW5kUGFkZGluZ1kgfHwgcHJlc2V0LmJhY2tncm91bmRQYWRkaW5nIHx8ICcxMCc7XG4gICAgY29uc3QgYmFzZVBhZGRpbmcgPSBgJHtwYWRkaW5nWX1weCAke3BhZGRpbmdYfXB4YDtcbiAgICBcbiAgICBjb25zdCBzdHlsZSA9IHtcbiAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICBsZWZ0OiBgJHt4fXB4YCxcbiAgICAgIHRvcDogYCR7YWRqdXN0ZWRZfXB4YCxcbiAgICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUoLTUwJSwgLTUwJSlcIixcbiAgICAgIGZvbnRGYW1pbHk6IHByZXNldC5mb250RmFtaWx5LFxuICAgICAgZm9udFNpemU6IGAke3ByZXNldC5mb250U2l6ZX1weGAsXG4gICAgICBmb250V2VpZ2h0OiBwcmVzZXQuZm9udFdlaWdodCxcbiAgICAgIGNvbG9yOiBwcmVzZXQuZm9udENvbG9yLFxuICAgICAgYW1wbGlmaWVkQ29sb3I6IHByZXNldC5hbXBsaWZpZWRDb2xvcixcbiAgICAgIGFtcGxpZmllZENvbG9yczogcHJlc2V0LmFtcGxpZmllZENvbG9ycyxcbiAgICAgIGFtcGxpZnlTcG9rZW5Xb3JkczogcHJlc2V0LmFtcGxpZnlTcG9rZW5Xb3JkcyxcbiAgICAgIHRleHRUcmFuc2Zvcm06IHByZXNldC50ZXh0Q2FzZSxcbiAgICAgIGZvbnRTdHlsZTogcHJlc2V0LmlzSXRhbGljID8gXCJpdGFsaWNcIiA6IFwibm9ybWFsXCIsXG4gICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXG4gICAgICBsZXR0ZXJTcGFjaW5nOiBgJHtwcmVzZXQudGV4dFNwYWNpbmd9cHhgLFxuICAgICAgYmFja2dyb3VuZENvbG9yLFxuICAgICAgYmFja2dyb3VuZFBhZGRpbmc6IGJhc2VQYWRkaW5nLFxuICAgICAgYmFja2dyb3VuZEJvcmRlclJhZGl1czogcHJlc2V0LmJhY2tncm91bmRCb3JkZXJSYWRpdXMsXG4gICAgICB2ZXJ0aWNhbFN0cmV0Y2g6IHByZXNldC52ZXJ0aWNhbFN0cmV0Y2ggfHwgMSxcbiAgICAgIHRyYW5zZm9ybU9yaWdpbjogXCJjZW50ZXIgY2VudGVyXCIsXG4gICAgICB3aWR0aDogXCJhdXRvXCIsXG4gICAgICBtYXhXaWR0aDogYCR7dmlkZW9XaWR0aCAqIDAuOX1weGAsXG4gICAgICB3aGl0ZVNwYWNlOiBcInByZS13cmFwXCIsXG4gICAgICBvdmVyZmxvdzogXCJ2aXNpYmxlXCIsXG4gICAgICBvdXRsaW5lQ29sb3I6IHByZXNldC5vdXRsaW5lQ29sb3IsXG4gICAgICBvdXRsaW5lV2lkdGg6IHByZXNldC5vdXRsaW5lV2lkdGgsXG4gICAgICBmaWx0ZXI6IGRyb3BTaGFkb3csXG4gICAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxuICAgICAgdGV4dEhpZ2hsaWdodFBlcnNpc3RzOiBwcmVzZXQudGV4dEhpZ2hsaWdodFBlcnNpc3RzLFxuICAgICAgYW1wbGlmaWVkT3BhY2l0eTogcHJlc2V0LmFtcGxpZmllZE9wYWNpdHksXG4gICAgICB1bkFtcGxpZmllZE9wYWNpdHk6IHByZXNldC5vcGFjaXR5LFxuICAgICAgY3VycmVudFdvcmRCbG9jazogcHJlc2V0LmN1cnJlbnRXb3JkQmxvY2ssXG4gICAgICBjdXJyZW50V29yZEJsb2NrQmFja2dyb3VuZENvbG9yOiBwcmVzZXQuY3VycmVudFdvcmRCbG9ja0JhY2tncm91bmRDb2xvcixcbiAgICAgIGN1cnJlbnRXb3JkQmxvY2tPcGFjaXR5OiBwcmVzZXQuY3VycmVudFdvcmRCbG9ja09wYWNpdHksXG4gICAgICBjdXJyZW50V29yZEJsb2NrUGFkZGluZzogcHJlc2V0LmN1cnJlbnRXb3JkQmxvY2tQYWRkaW5nLFxuICAgICAgY3VycmVudFdvcmRCbG9ja0JvcmRlclJhZGl1czogcHJlc2V0LmN1cnJlbnRXb3JkQmxvY2tCb3JkZXJSYWRpdXMsXG4gICAgICBhbXBsaWZ5T3BhY2l0eVRyYW5zaXRpb25EdXJhdGlvbjogcHJlc2V0LmFtcGxpZnlPcGFjaXR5VHJhbnNpdGlvbkR1cmF0aW9uLFxuICAgICAgdGV4dFNoYWRvdyxcbiAgICAgIHNoYWRvd0ludGVuc2l0eTogcHJlc2V0LnNoYWRvd0ludGVuc2l0eSxcbiAgICB9O1xuICAgIFxuICAgIC8vIGNvbnNvbGUubG9nKCd1c2VUZXh0U3R5bGUgLSBvdXRwdXQgc3R5bGUgZm9udEZhbWlseTonLCBzdHlsZS5mb250RmFtaWx5KTtcbiAgICByZXR1cm4gc3R5bGU7XG4gIH0sIFtwcmVzZXQsIHgsIGFkanVzdGVkWSwgdmlkZW9XaWR0aF0pO1xufTsgIiwiLy8gRm9udCBtYXAgdGhhdCBtYXRjaGVzIENTUyBmb250LWZhbWlseSBuYW1lcyB0byB0aGVpciBmb250IGZpbGVzIGFuZCB3ZWlnaHRzXG5jb25zdCBGT05UX01BUCA9IHtcbiAgJ1Bvc3RlcmFtYS0xOTI3LVcwMS1VbHRyYUJsYWNrJzogW3sgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvUG9zdGVyYW1hLTE5MjctVzAxLVVsdHJhQmxhY2sudHRmP2FsdD1tZWRpYScsIHdlaWdodDogOTAwLCBzdHlsZTogJ25vcm1hbCcgfV0sXG4gICdTdGFwZWwtTmFycm93JzogW3sgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvTmV1ZUhhYXNEaXNwbGF5L05ldWVIYWFzRGlzcGxheVJvbWFuLnR0Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDQwMCwgc3R5bGU6ICdub3JtYWwnIH1dLFxuICAnU3RhcGVsLU5hcnJvd01lZGl1bSc6IFt7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL3N0YXBlbC9TdGFwZWwtTmFycm93TWVkaXVtLnR0Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDUwMCwgc3R5bGU6ICdub3JtYWwnIH1dLFxuICAnTmV1ZUhhYXNEaXNwbGF5Qm9sZCc6IFt7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL05ldWVIYWFzRGlzcGxheUJvbGQudHRmP2FsdD1tZWRpYScsIHdlaWdodDogNzAwLCBzdHlsZTogJ25vcm1hbCcgfV0sXG4gICdUaGVCb2xkRm9udCc6IFt7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL3RoZWJvbGRmb250LnR0Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDcwMCwgc3R5bGU6ICdub3JtYWwnIH1dLFxuICAnTWVyY2FkaWxsbyBCbGFjayc6IFt7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL21lcmNhZGlsbG8vTWVyY2FkaWxsby1CbGFjay50dGY/YWx0PW1lZGlhJywgd2VpZ2h0OiA5MDAsIHN0eWxlOiAnbm9ybWFsJyB9XSxcbiAgJ01lcmNhZGlsbG8gQm9sZCc6IFt7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL21lcmNhZGlsbG8vTWVyY2FkaWxsby1Cb2xkLnR0Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDcwMCwgc3R5bGU6ICdub3JtYWwnIH1dLFxuICBcbiAgLy8gbmVlZCB0byBhZGQgaW50ZXIgZm9udCB2YXJpYXRpb25zXG4gIC8vIEludGVyIGZvbnQgdmFyaWF0aW9uc1xuICAnSW50ZXInOiBbXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9JbnRlci9JbnRlci1UaGluLndvZmYyP2FsdD1tZWRpYScsIHdlaWdodDogMTAwLCBzdHlsZTogJ25vcm1hbCcgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL0ludGVyL0ludGVyLUV4dHJhTGlnaHQud29mZjI/YWx0PW1lZGlhJywgd2VpZ2h0OiAyMDAsIHN0eWxlOiAnbm9ybWFsJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvSW50ZXIvSW50ZXItTGlnaHQud29mZjI/YWx0PW1lZGlhJywgd2VpZ2h0OiAzMDAsIHN0eWxlOiAnbm9ybWFsJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvSW50ZXIvSW50ZXItUmVndWxhci53b2ZmMj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDQwMCwgc3R5bGU6ICdub3JtYWwnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9JbnRlci9JbnRlci1NZWRpdW0ud29mZjI/YWx0PW1lZGlhJywgd2VpZ2h0OiA1MDAsIHN0eWxlOiAnbm9ybWFsJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvSW50ZXIvSW50ZXItU2VtaUJvbGQud29mZjI/YWx0PW1lZGlhJywgd2VpZ2h0OiA2MDAsIHN0eWxlOiAnbm9ybWFsJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvSW50ZXIvSW50ZXItQm9sZC53b2ZmMj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDcwMCwgc3R5bGU6ICdub3JtYWwnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9JbnRlci9JbnRlci1FeHRyYUJvbGQud29mZjI/YWx0PW1lZGlhJywgd2VpZ2h0OiA4MDAsIHN0eWxlOiAnbm9ybWFsJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvSW50ZXIvSW50ZXItQmxhY2sud29mZjI/YWx0PW1lZGlhJywgd2VpZ2h0OiA5MDAsIHN0eWxlOiAnbm9ybWFsJyB9XG4gIF0sXG5cbiAgLy8gTWlsbGlhcmQgZm9udCB2YXJpYXRpb25zXG4gICdNaWxsaWFyZCc6IFtcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL21pbGxpYXJkL1JlbmUlMjBCaWVkZXIlMjAlMjBNaWxsaWFyZCUyMFRoaW4ub3RmP2FsdD1tZWRpYScsIHdlaWdodDogMTAwLCBzdHlsZTogJ25vcm1hbCcgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL21pbGxpYXJkL1JlbmUlMjBCaWVkZXIlMjAlMjBNaWxsaWFyZCUyMFRoaW4lMjBJdGFsaWMub3RmP2FsdD1tZWRpYScsIHdlaWdodDogMTAwLCBzdHlsZTogJ2l0YWxpYycgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL21pbGxpYXJkL1JlbmUlMjBCaWVkZXIlMjAlMjBNaWxsaWFyZCUyMEV4dHJhTGlnaHQub3RmP2FsdD1tZWRpYScsIHdlaWdodDogMjAwLCBzdHlsZTogJ25vcm1hbCcgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL21pbGxpYXJkL1JlbmUlMjBCaWVkZXIlMjAlMjBNaWxsaWFyZCUyMEV4dHJhTGlnaHQlMjBJdGFsaWMub3RmP2FsdD1tZWRpYScsIHdlaWdodDogMjAwLCBzdHlsZTogJ2l0YWxpYycgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL21pbGxpYXJkL1JlbmUlMjBCaWVkZXIlMjAlMjBNaWxsaWFyZCUyMExpZ2h0Lm90Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDMwMCwgc3R5bGU6ICdub3JtYWwnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9taWxsaWFyZC9SZW5lJTIwQmllZGVyJTIwJTIwTWlsbGlhcmQlMjBMaWdodCUyMEl0YWxpYy5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiAzMDAsIHN0eWxlOiAnaXRhbGljJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvbWlsbGlhcmQvUmVuZSUyMEJpZWRlciUyMCUyME1pbGxpYXJkJTIwQm9vay5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiA0MDAsIHN0eWxlOiAnbm9ybWFsJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvbWlsbGlhcmQvUmVuZSUyMEJpZWRlciUyMCUyME1pbGxpYXJkJTIwQm9vayUyMEl0YWxpYy5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiA0MDAsIHN0eWxlOiAnaXRhbGljJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvbWlsbGlhcmQvUmVuZSUyMEJpZWRlciUyMCUyME1pbGxpYXJkJTIwTWVkaXVtLm90Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDUwMCwgc3R5bGU6ICdub3JtYWwnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9taWxsaWFyZC9SZW5lJTIwQmllZGVyJTIwJTIwTWlsbGlhcmQlMjBNZWRpdW0lMjBJdGFsaWMub3RmP2FsdD1tZWRpYScsIHdlaWdodDogNTAwLCBzdHlsZTogJ2l0YWxpYycgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL21pbGxpYXJkL1JlbmUlMjBCaWVkZXIlMjAlMjBNaWxsaWFyZCUyMFNlbWlCb2xkLm90Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDYwMCwgc3R5bGU6ICdub3JtYWwnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9taWxsaWFyZC9SZW5lJTIwQmllZGVyJTIwJTIwTWlsbGlhcmQlMjBTZW1pQm9sZCUyMEl0YWxpYy5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiA2MDAsIHN0eWxlOiAnaXRhbGljJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvbWlsbGlhcmQvUmVuZSUyMEJpZWRlciUyMCUyME1pbGxpYXJkJTIwQm9sZC5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiA3MDAsIHN0eWxlOiAnbm9ybWFsJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvbWlsbGlhcmQvUmVuZSUyMEJpZWRlciUyMCUyME1pbGxpYXJkJTIwQm9sZCUyMEl0YWxpYy5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiA3MDAsIHN0eWxlOiAnaXRhbGljJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvbWlsbGlhcmQvUmVuZSUyMEJpZWRlciUyMCUyME1pbGxpYXJkJTIwRXh0cmFCb2xkLm90Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDgwMCwgc3R5bGU6ICdub3JtYWwnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9taWxsaWFyZC9SZW5lJTIwQmllZGVyJTIwJTIwTWlsbGlhcmQlMjBFeHRyYUJvbGQlMjBJdGFsaWMub3RmP2FsdD1tZWRpYScsIHdlaWdodDogODAwLCBzdHlsZTogJ2l0YWxpYycgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL21pbGxpYXJkL1JlbmUlMjBCaWVkZXIlMjAlMjBNaWxsaWFyZCUyMEJsYWNrLm90Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDkwMCwgc3R5bGU6ICdub3JtYWwnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9taWxsaWFyZC9SZW5lJTIwQmllZGVyJTIwJTIwTWlsbGlhcmQlMjBCbGFjayUyMEl0YWxpYy5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiA5MDAsIHN0eWxlOiAnaXRhbGljJyB9XG4gIF0sXG5cbiAgJ0FyaWFsIEJsYWNrJzogW3sgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvQXJpYWwlMjBCbGFjay50dGY/YWx0PW1lZGlhJywgd2VpZ2h0OiA5MDAsIHN0eWxlOiAnbm9ybWFsJyB9XSxcbiAgXG4gIC8vIFNvZmlhIFBybyBmb250IHZhcmlhdGlvbnNcbiAgJ1NvZmlhIFBybyc6IFtcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL3NvZmlhLXByby9Tb2ZpYSUyMFBybyUyMExpZ2h0JTIwQXoub3RmP2FsdD1tZWRpYScsIHdlaWdodDogMzAwLCBzdHlsZTogJ25vcm1hbCcgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL3NvZmlhLXByby9Tb2ZpYSUyMFBybyUyMExpZ2h0JTIwSXRhbGljJTIwQXoub3RmP2FsdD1tZWRpYScsIHdlaWdodDogMzAwLCBzdHlsZTogJ2l0YWxpYycgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL3NvZmlhLXByby9Tb2ZpYSUyMFBybyUyMFJlZ3VsYXIlMjBBei5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiA0MDAsIHN0eWxlOiAnbm9ybWFsJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvc29maWEtcHJvL1NvZmlhJTIwUHJvJTIwUmVndWxhciUyMEl0YWxpYyUyMEF6Lm90Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDQwMCwgc3R5bGU6ICdpdGFsaWMnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9zb2ZpYS1wcm8vU29maWElMjBQcm8lMjBNZWRpdW0lMjBBei5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiA1MDAsIHN0eWxlOiAnbm9ybWFsJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvc29maWEtcHJvL1NvZmlhJTIwUHJvJTIwTWVkaXVtJTIwSXRhbGljJTIwQXoub3RmP2FsdD1tZWRpYScsIHdlaWdodDogNTAwLCBzdHlsZTogJ2l0YWxpYycgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL3NvZmlhLXByby9Tb2ZpYSUyMFBybyUyMFNlbWklMjBCb2xkJTIwQXoub3RmP2FsdD1tZWRpYScsIHdlaWdodDogNjAwLCBzdHlsZTogJ25vcm1hbCcgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL3NvZmlhLXByby9Tb2ZpYSUyMFBybyUyMFNlbWklMjBCb2xkJTIwSXRhbGljJTIwQXoub3RmP2FsdD1tZWRpYScsIHdlaWdodDogNjAwLCBzdHlsZTogJ2l0YWxpYycgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL3NvZmlhLXByby9Tb2ZpYSUyMFBybyUyMEJvbGQlMjBBei5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiA3MDAsIHN0eWxlOiAnbm9ybWFsJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvc29maWEtcHJvL1NvZmlhJTIwUHJvJTIwQm9sZCUyMEl0YWxpYyUyMEF6Lm90Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDcwMCwgc3R5bGU6ICdpdGFsaWMnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9zb2ZpYS1wcm8vU29maWElMjBQcm8lMjBCbGFjayUyMEF6Lm90Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDkwMCwgc3R5bGU6ICdub3JtYWwnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9zb2ZpYS1wcm8vU29maWElMjBQcm8lMjBCbGFjayUyMEl0YWxpYyUyMEF6Lm90Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDkwMCwgc3R5bGU6ICdpdGFsaWMnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9zb2ZpYS1wcm8vU29maWElMjBQcm8lMjBFeHRyYUxpZ2h0JTIwQXoub3RmP2FsdD1tZWRpYScsIHdlaWdodDogMjAwLCBzdHlsZTogJ25vcm1hbCcgfSxcbiAgICB7IHNyYzogJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9vdmVybGFwLWZvbnRzL2ZvbnRzL3NvZmlhLXByby9Tb2ZpYSUyMFBybyUyMEV4dHJhTGlnaHQlMjBJdGFsaWMlMjBBei5vdGY/YWx0PW1lZGlhJywgd2VpZ2h0OiAyMDAsIHN0eWxlOiAnaXRhbGljJyB9LFxuICAgIHsgc3JjOiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL292ZXJsYXAtZm9udHMvZm9udHMvc29maWEtcHJvL1NvZmlhJTIwUHJvJTIwVWx0cmFMaWdodCUyMEF6Lm90Zj9hbHQ9bWVkaWEnLCB3ZWlnaHQ6IDEwMCwgc3R5bGU6ICdub3JtYWwnIH0sXG4gICAgeyBzcmM6ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vb3ZlcmxhcC1mb250cy9mb250cy9zb2ZpYS1wcm8vU29maWElMjBQcm8lMjBVbHRyYUxpZ2h0JTIwSXRhbGljJTIwQXoub3RmP2FsdD1tZWRpYScsIHdlaWdodDogMTAwLCBzdHlsZTogJ2l0YWxpYycgfVxuICBdXG59O1xuXG5leHBvcnQgY29uc3QgbG9hZERvY3VtZW50Rm9udHMgPSBhc3luYyAoZm9udEZhbWlseSkgPT4geyAgXG4gIGlmIChmb250RmFtaWx5ID09PSAnQXJpYWwnKSB7IFxuICAgIHJldHVybjtcbiAgfVxuICBlbHNlIGlmICghZm9udEZhbWlseSB8fCB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgY29uc29sZS53YXJuKCdGb250IGZhbWlseSBpcyBub3QgcHJvdmlkZWQgb3IgZG9jdW1lbnQgaXMgdW5kZWZpbmVkLicpO1xuICAgIHJldHVybjtcbiAgfSBcblxuICAvLyBDbGVhbiB0aGUgZm9udCBmYW1pbHkgbmFtZSAocmVtb3ZlIHF1b3RlcyBhbmQgZmFsbGJhY2tzKVxuICBjb25zdCBjbGVhbkZvbnRGYW1pbHkgPSBmb250RmFtaWx5LnJlcGxhY2UoL1snXCJdL2csICcnKS5zcGxpdCgnLCcpWzBdLnRyaW0oKTtcbiAgLy8gY29uc29sZS5sb2coYENsZWFuZWQgZm9udCBmYW1pbHkgbmFtZTogJHtjbGVhbkZvbnRGYW1pbHl9YCk7XG4gIFxuICAvLyBHZXQgZm9udCB2YXJpYXRpb25zIGZvciB0aGlzIGZhbWlseVxuICBjb25zdCBmb250VmFyaWF0aW9ucyA9IEZPTlRfTUFQW2NsZWFuRm9udEZhbWlseV07XG4gIGlmICghZm9udFZhcmlhdGlvbnMpIHtcbiAgICBjb25zb2xlLndhcm4oYEZvbnQgZmFtaWx5IFwiJHtjbGVhbkZvbnRGYW1pbHl9XCIgbm90IGZvdW5kIGluIGZvbnQgbWFwYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICAvLyBjb25zb2xlLmxvZyhgRm91bmQgZm9udCB2YXJpYXRpb25zIGZvciBcIiR7Y2xlYW5Gb250RmFtaWx5fVwiOmAsIGZvbnRWYXJpYXRpb25zKTtcblxuICB0cnkge1xuICAgIC8vIExvYWQgYWxsIHZhcmlhdGlvbnMgb2YgdGhlIGZvbnQgZmFtaWx5XG4gICAgY29uc3QgbG9hZFByb21pc2VzID0gZm9udFZhcmlhdGlvbnMubWFwKGFzeW5jICh7IHNyYywgd2VpZ2h0LCBzdHlsZSB9KSA9PiB7XG4gICAgICBjb25zdCBmb250ID0gbmV3IEZvbnRGYWNlKGNsZWFuRm9udEZhbWlseSwgYHVybCgke3NyY30pYCwgeyB3ZWlnaHQsIHN0eWxlIH0pO1xuICAgICAgY29uc3QgbG9hZGVkRm9udCA9IGF3YWl0IGZvbnQubG9hZCgpO1xuICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKGxvYWRlZEZvbnQpO1xuICAgICAgcmV0dXJuIGxvYWRlZEZvbnQ7XG4gICAgfSk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChsb2FkUHJvbWlzZXMpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGxvYWRpbmcgZm9udCBmYW1pbHkgXCIke2NsZWFuRm9udEZhbWlseX1cIjpgLCBlcnJvcik7XG4gIH1cbn07IixudWxsLG51bGwsImltcG9ydCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDdXJyZW50RnJhbWUgfSBmcm9tICdyZW1vdGlvbic7XG5cbmV4cG9ydCBjb25zdCB1c2VBZGp1c3RlZFBvc2l0aW9uID0gKHksIGZhY2VEYXRhKSA9PiB7XG4gIGNvbnN0IGN1cnJlbnRGcmFtZSA9IHVzZUN1cnJlbnRGcmFtZSgpO1xuXG4gIC8vIE1lbW9pemUgZmFjZSBldmVudCBsb29rdXBcbiAgY29uc3QgY3VycmVudEZhY2VFdmVudCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghZmFjZURhdGE/LmV2ZW50cz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyBudW1QZW9wbGU6IDIgfTtcbiAgICB9XG4gICAgcmV0dXJuIGZhY2VEYXRhLmV2ZW50cy5maW5kTGFzdChcbiAgICAgIChldmVudCkgPT4gZXZlbnQuZnJhbWUgPD0gY3VycmVudEZyYW1lXG4gICAgKSB8fCB7IG51bVBlb3BsZTogMiB9O1xuICB9LCBbY3VycmVudEZyYW1lLCBmYWNlRGF0YT8uZXZlbnRzXSk7XG4gIFxuICAvLyBBZGp1c3QgWSBwb3NpdGlvbiBvbmx5IGlmIGZhY2UgZGV0ZWN0aW9uIGRhdGEgaXMgYXZhaWxhYmxlXG4gIGNvbnN0IGFkanVzdGVkWSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChjdXJyZW50RmFjZUV2ZW50Lm51bVBlb3BsZSA9PT0gMikge1xuICAgICAgcmV0dXJuIHk7XG4gICAgfVxuICAgIGlmICh5ID09PSA5NjApIHtcbiAgICAgIHJldHVybiB5ICogMiAtIDMwMDtcbiAgICB9XG4gICAgcmV0dXJuIHk7XG4gIH0sIFt5LCBjdXJyZW50RmFjZUV2ZW50Lm51bVBlb3BsZV0pO1xuXG4gIHJldHVybiB7IGN1cnJlbnRGYWNlRXZlbnQsIGFkanVzdGVkWSB9O1xufTsgIiwiaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGNvbnN0IHVzZUFkanVzdGVkUGhyYXNlcyA9IChzdWJ0aXRsZXNEYXRhLCBtYXhDaGFyc1BlckxpbmUsIGZwcywgc2VnbWVudERhdGEgPSBbXSkgPT4ge1xuICByZXR1cm4gdXNlTWVtbygoKSA9PiB7XG4gICAgLy8gSWYgbm8gc2VnbWVudCBkYXRhLCByZXR1cm4gZW1wdHkgYXJyYXlcbiAgICBpZiAoIXNlZ21lbnREYXRhIHx8IHNlZ21lbnREYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGdldE1pc3NpbmdXb3JkUGhyYXNlc0lmRXhpc3QgPSAoc3RhcnRUaW1lLCBlbmRUaW1lKSA9PiB7XG4gICAgICAvLyBGaW5kIHdvcmRzIHRoYXQgZmFsbCBpbiB0aGUgZ2FwXG4gICAgICBjb25zdCBnYXBXb3JkcyA9IHN1YnRpdGxlc0RhdGEuZmlsdGVyKHdvcmQgPT4gXG4gICAgICAgIHdvcmQuc3RhcnQgPj0gc3RhcnRUaW1lICYmIHdvcmQuZW5kIDw9IGVuZFRpbWVcbiAgICAgICk7XG5cbiAgICAgIGlmIChnYXBXb3Jkcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICAgICAgLy8gQ3JlYXRlIHBocmFzZXMgZnJvbSBnYXAgd29yZHMgdXNpbmcgc2FtZSBsb2dpYyBhcyBzZWdtZW50IHBocmFzZXNcbiAgICAgIGNvbnN0IGdhcFBocmFzZXMgPSBbXTtcbiAgICAgIGxldCBjdXJyZW50UGhyYXNlID0ge1xuICAgICAgICB0ZXh0OiBcIlwiLFxuICAgICAgICB3b3JkczogW10sXG4gICAgICAgIHN0YXJ0OiBudWxsLFxuICAgICAgICBlbmQ6IG51bGwsXG4gICAgICAgIHNlZ21lbnRJbmRleDogLTEsICAvLyBTcGVjaWFsIGluZGV4IGZvciBnYXAgcGhyYXNlc1xuICAgICAgICBkdXJhdGlvbkluRnJhbWVzOiAwXG4gICAgICB9O1xuXG4gICAgICBnYXBXb3Jkcy5mb3JFYWNoKCh3b3JkLCB3b3JkSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgd29yZFdpdGhTcGFjZSA9IHdvcmRJbmRleCA9PT0gMCA/IHdvcmQud29yZCA6IGAgJHt3b3JkLndvcmR9YDtcbiAgICAgICAgY29uc3QgbmV3TGVuZ3RoID0gY3VycmVudFBocmFzZS50ZXh0Lmxlbmd0aCArIHdvcmRXaXRoU3BhY2UubGVuZ3RoO1xuXG4gICAgICAgIGlmIChuZXdMZW5ndGggPD0gbWF4Q2hhcnNQZXJMaW5lKSB7XG4gICAgICAgICAgLy8gQWRkIHRvIGN1cnJlbnQgcGhyYXNlXG4gICAgICAgICAgY3VycmVudFBocmFzZS50ZXh0ICs9IHdvcmRXaXRoU3BhY2U7XG4gICAgICAgICAgY3VycmVudFBocmFzZS53b3Jkcy5wdXNoKHdvcmQpO1xuICAgICAgICAgIGN1cnJlbnRQaHJhc2Uuc3RhcnQgPSBjdXJyZW50UGhyYXNlLnN0YXJ0ID09PSBudWxsID8gd29yZC5zdGFydCA6IGN1cnJlbnRQaHJhc2Uuc3RhcnQ7XG4gICAgICAgICAgY3VycmVudFBocmFzZS5lbmQgPSB3b3JkLmVuZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGaW5hbGl6ZSBjdXJyZW50IHBocmFzZVxuICAgICAgICAgIGlmIChjdXJyZW50UGhyYXNlLndvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGdhcFBocmFzZXMucHVzaChjdXJyZW50UGhyYXNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTdGFydCBuZXcgcGhyYXNlIHdpdGggY3VycmVudCB3b3JkXG4gICAgICAgICAgY3VycmVudFBocmFzZSA9IHtcbiAgICAgICAgICAgIHRleHQ6IHdvcmQud29yZCxcbiAgICAgICAgICAgIHdvcmRzOiBbd29yZF0sXG4gICAgICAgICAgICBzdGFydDogd29yZC5zdGFydCxcbiAgICAgICAgICAgIGVuZDogd29yZC5lbmQsXG4gICAgICAgICAgICBzZWdtZW50SW5kZXg6IC0xXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEFkZCB0aGUgbGFzdCBwaHJhc2UgaWYgaXQgaGFzIHdvcmRzXG4gICAgICBpZiAoY3VycmVudFBocmFzZS53b3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGdhcFBocmFzZXMucHVzaChjdXJyZW50UGhyYXNlKTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJvY2VzcyB0aW1pbmcgZm9yIGdhcCBwaHJhc2VzXG4gICAgICBjb25zdCBwcm9jZXNzZWRHYXBQaHJhc2VzID0gZ2FwUGhyYXNlcy5tYXAoKHBocmFzZSwgcGhyYXNlSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnRGcmFtZSA9IE1hdGguZmxvb3IocGhyYXNlLnN0YXJ0ICogZnBzKTtcbiAgICAgICAgbGV0IGVuZEZyYW1lO1xuXG4gICAgICAgIGlmIChwaHJhc2VJbmRleCA8IGdhcFBocmFzZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGNvbnN0IG5leHRQaHJhc2UgPSBnYXBQaHJhc2VzW3BocmFzZUluZGV4ICsgMV07XG4gICAgICAgICAgY29uc3QgdGltZURpZmYgPSBuZXh0UGhyYXNlLnN0YXJ0IC0gcGhyYXNlLmVuZDtcbiAgICAgICAgICBlbmRGcmFtZSA9IHRpbWVEaWZmID4gMC4zID8gXG4gICAgICAgICAgICBNYXRoLmZsb29yKHBocmFzZS5lbmQgKiBmcHMpIDogXG4gICAgICAgICAgICBNYXRoLmZsb29yKG5leHRQaHJhc2Uuc3RhcnQgKiBmcHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVuZEZyYW1lID0gTWF0aC5mbG9vcihwaHJhc2UuZW5kICogZnBzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucGhyYXNlLFxuICAgICAgICAgIHN0YXJ0RnJhbWUsXG4gICAgICAgICAgZW5kRnJhbWUsXG4gICAgICAgICAgZHVyYXRpb25JbkZyYW1lczogZW5kRnJhbWUgLSBzdGFydEZyYW1lICsgMVxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBwcm9jZXNzZWRHYXBQaHJhc2VzO1xuICAgIH07XG5cbiAgICBjb25zdCBtYXN0ZXJQaHJhc2VzID0gW107XG5cbiAgICAvLyBDaGVjayBmb3Igd29yZHMgYmVmb3JlIHRoZSBmaXJzdCBzZWdtZW50XG4gICAgaWYgKHNlZ21lbnREYXRhLmxlbmd0aCA+IDAgJiYgc3VidGl0bGVzRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaXJzdFNlZ21lbnRTdGFydCA9IHNlZ21lbnREYXRhWzBdLnN0YXJ0O1xuICAgICAgY29uc3QgZmlyc3RXb3JkU3RhcnQgPSAwOyAvLyBTdGFydCBmcm9tIHRoZSBiZWdpbm5pbmdcbiAgICAgIGNvbnN0IHByZVNlZ21lbnRQaHJhc2VzID0gZ2V0TWlzc2luZ1dvcmRQaHJhc2VzSWZFeGlzdChmaXJzdFdvcmRTdGFydCwgZmlyc3RTZWdtZW50U3RhcnQpO1xuICAgICAgaWYgKHByZVNlZ21lbnRQaHJhc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbWFzdGVyUGhyYXNlcy5wdXNoKC4uLnByZVNlZ21lbnRQaHJhc2VzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGVhY2ggc2VnbWVudCBhbmQgZ2FwcyBiZXR3ZWVuIHNlZ21lbnRzXG4gICAgc2VnbWVudERhdGEuZm9yRWFjaCgoc2VnbWVudCwgc2VnbWVudEluZGV4KSA9PiB7XG4gICAgICAvLyAxLiBHZXQgd29yZHMgZm9yIHRoaXMgc2VnbWVudFxuICAgICAgY29uc3Qgc2VnbWVudFdvcmRzID0gc3VidGl0bGVzRGF0YS5maWx0ZXIod29yZCA9PiB3b3JkLnNlZ21lbnRJZCA9PT0gc2VnbWVudEluZGV4KTtcbiAgICAgIFxuICAgICAgLy8gUHJvY2VzcyBzZWdtZW50IHBocmFzZXNcbiAgICAgIGlmIChzZWdtZW50V29yZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyAyLiBDcmVhdGUgcGhyYXNlcyBmb3IgdGhpcyBzZWdtZW50XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTZWdtZW50UGhyYXNlcyA9IFtdO1xuICAgICAgICBsZXQgY3VycmVudFBocmFzZSA9IHtcbiAgICAgICAgICB0ZXh0OiBcIlwiLFxuICAgICAgICAgIHdvcmRzOiBbXSxcbiAgICAgICAgICBzdGFydDogbnVsbCxcbiAgICAgICAgICBlbmQ6IG51bGwsXG4gICAgICAgICAgc2VnbWVudEluZGV4XG4gICAgICAgIH07XG5cbiAgICAgICAgc2VnbWVudFdvcmRzLmZvckVhY2goKHdvcmQsIHdvcmRJbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHdvcmRXaXRoU3BhY2UgPSB3b3JkSW5kZXggPT09IDAgPyB3b3JkLndvcmQgOiBgICR7d29yZC53b3JkfWA7XG4gICAgICAgICAgY29uc3QgbmV3TGVuZ3RoID0gY3VycmVudFBocmFzZS50ZXh0Lmxlbmd0aCArIHdvcmRXaXRoU3BhY2UubGVuZ3RoO1xuXG4gICAgICAgICAgaWYgKG5ld0xlbmd0aCA8PSBtYXhDaGFyc1BlckxpbmUpIHtcbiAgICAgICAgICAgIC8vIEFkZCB0byBjdXJyZW50IHBocmFzZVxuICAgICAgICAgICAgY3VycmVudFBocmFzZS50ZXh0ICs9IHdvcmRXaXRoU3BhY2U7XG4gICAgICAgICAgICBjdXJyZW50UGhyYXNlLndvcmRzLnB1c2god29yZCk7XG4gICAgICAgICAgICBjdXJyZW50UGhyYXNlLnN0YXJ0ID0gY3VycmVudFBocmFzZS5zdGFydCA9PT0gbnVsbCA/IHdvcmQuc3RhcnQgOiBjdXJyZW50UGhyYXNlLnN0YXJ0O1xuICAgICAgICAgICAgY3VycmVudFBocmFzZS5lbmQgPSB3b3JkLmVuZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmluYWxpemUgY3VycmVudCBwaHJhc2VcbiAgICAgICAgICAgIGlmIChjdXJyZW50UGhyYXNlLndvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY3VycmVudFNlZ21lbnRQaHJhc2VzLnB1c2goY3VycmVudFBocmFzZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFN0YXJ0IG5ldyBwaHJhc2Ugd2l0aCBjdXJyZW50IHdvcmRcbiAgICAgICAgICAgIGN1cnJlbnRQaHJhc2UgPSB7XG4gICAgICAgICAgICAgIHRleHQ6IHdvcmQud29yZCxcbiAgICAgICAgICAgICAgd29yZHM6IFt3b3JkXSxcbiAgICAgICAgICAgICAgc3RhcnQ6IHdvcmQuc3RhcnQsXG4gICAgICAgICAgICAgIGVuZDogd29yZC5lbmQsXG4gICAgICAgICAgICAgIHNlZ21lbnRJbmRleFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgbGFzdCBwaHJhc2UgaWYgaXQgaGFzIHdvcmRzXG4gICAgICAgIGlmIChjdXJyZW50UGhyYXNlLndvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjdXJyZW50U2VnbWVudFBocmFzZXMucHVzaChjdXJyZW50UGhyYXNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDMuIFByb2Nlc3MgdGltaW5nIGZvciBwaHJhc2VzXG4gICAgICAgIGNvbnN0IHByb2Nlc3NlZFBocmFzZXMgPSBjdXJyZW50U2VnbWVudFBocmFzZXMubWFwKChwaHJhc2UsIHBocmFzZUluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRGcmFtZSA9IE1hdGguZmxvb3IocGhyYXNlLnN0YXJ0ICogZnBzKTtcbiAgICAgICAgICBsZXQgZW5kRnJhbWU7XG5cbiAgICAgICAgICAvLyBDYWxjdWxhdGUgZW5kIGZyYW1lIGJhc2VkIG9uIG5leHQgcGhyYXNlIG9yIHNlZ21lbnQgZW5kXG4gICAgICAgICAgaWYgKHBocmFzZUluZGV4IDwgY3VycmVudFNlZ21lbnRQaHJhc2VzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRQaHJhc2UgPSBjdXJyZW50U2VnbWVudFBocmFzZXNbcGhyYXNlSW5kZXggKyAxXTtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVEaWZmID0gbmV4dFBocmFzZS5zdGFydCAtIHBocmFzZS5lbmQ7XG4gICAgICAgICAgICBlbmRGcmFtZSA9IHRpbWVEaWZmID4gMC4zID8gXG4gICAgICAgICAgICAgIE1hdGguZmxvb3IocGhyYXNlLmVuZCAqIGZwcykgOiBcbiAgICAgICAgICAgICAgTWF0aC5mbG9vcihuZXh0UGhyYXNlLnN0YXJ0ICogZnBzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW5kRnJhbWUgPSBNYXRoLmZsb29yKHBocmFzZS5lbmQgKiBmcHMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVuc3VyZSBwaHJhc2UgZG9lc24ndCBleHRlbmQgYmV5b25kIHNlZ21lbnQgYm91bmRhcmllc1xuICAgICAgICAgIGVuZEZyYW1lID0gTWF0aC5taW4oZW5kRnJhbWUsIE1hdGguZmxvb3Ioc2VnbWVudC5lbmQgKiBmcHMpKTtcblxuICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZFBocmFzZSA9IHtcbiAgICAgICAgICAgIC4uLnBocmFzZSxcbiAgICAgICAgICAgIHN0YXJ0RnJhbWUsXG4gICAgICAgICAgICBlbmRGcmFtZSxcbiAgICAgICAgICAgIGR1cmF0aW9uSW5GcmFtZXM6IGVuZEZyYW1lIC0gc3RhcnRGcmFtZSArIDFcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBwcm9jZXNzZWRQaHJhc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIDQuIEFkZCB0byBtYXN0ZXIgYXJyYXlcbiAgICAgICAgbWFzdGVyUGhyYXNlcy5wdXNoKC4uLnByb2Nlc3NlZFBocmFzZXMpO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3IgZ2FwIGFmdGVyIHRoaXMgc2VnbWVudFxuICAgICAgaWYgKHNlZ21lbnRJbmRleCA8IHNlZ21lbnREYXRhLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgY29uc3QgbmV4dFNlZ21lbnQgPSBzZWdtZW50RGF0YVtzZWdtZW50SW5kZXggKyAxXTtcbiAgICAgICAgY29uc3QgZ2FwUGhyYXNlcyA9IGdldE1pc3NpbmdXb3JkUGhyYXNlc0lmRXhpc3Qoc2VnbWVudC5lbmQsIG5leHRTZWdtZW50LnN0YXJ0KTtcbiAgICAgICAgaWYgKGdhcFBocmFzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG1hc3RlclBocmFzZXMucHVzaCguLi5nYXBQaHJhc2VzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU29ydCBmaW5hbCBwaHJhc2VzIGJ5IHN0YXJ0IHRpbWVcbiAgICBtYXN0ZXJQaHJhc2VzLnNvcnQoKGEsIGIpID0+IGEuc3RhcnQgLSBiLnN0YXJ0KTtcbiAgICBcbiAgICByZXR1cm4gbWFzdGVyUGhyYXNlcztcbiAgfSwgW3N1YnRpdGxlc0RhdGEsIG1heENoYXJzUGVyTGluZSwgZnBzLCBzZWdtZW50RGF0YV0pO1xufTsgIl0sIm5hbWVzIjpbImVzdGltYXRlVGV4dFdpZHRoIiwidGV4dCIsImZvbnRTaXplIiwiZm9udEZhbWlseSIsImNhbnZhcyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImNvbnRleHQiLCJnZXRDb250ZXh0IiwiZm9udCIsImNvbmNhdCIsIm1lYXN1cmVUZXh0Iiwid2lkdGgiLCJnZW5lcmF0ZU91dGxpbmVTaGFkb3ciLCJjYWNoZSIsIk1hcCIsImNvbG9yIiwib3V0bGluZVN0eWxlIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwia2V5IiwiaGFzIiwiZ2V0Iiwic2hhZG93cyIsInBhcnNlZFdpZHRoIiwicGFyc2VJbnQiLCJwdXNoIiwiaGFsZldpZHRoIiwiTWF0aCIsInJvdW5kIiwiaSIsImFuZ2xlIiwiUEkiLCJ4IiwiY29zIiwieSIsInNpbiIsInJlc3VsdCIsImpvaW4iLCJzZXQiLCJTdWJ0aXRsZVRleHQiLCJtZW1vIiwiX3JlZiIsInN0eWxlIiwiYW5pbWF0aW9uU3R5bGUiLCJmcmFtZSIsInN0YXJ0RnJhbWUiLCJyYW5kb21Db2xvcnMiLCJ3b3JkcyIsImZwcyIsImhpZ2hsaWdodFdvcmRzQ29sb3IiLCJyZWxhdGl2ZUZyYW1lIiwic2NhbGUiLCJ1c2VNZW1vIiwic3ByaW5nIiwiZnJvbSIsInRvIiwiY29uZmlnIiwiZGFtcGluZyIsInN0aWZmbmVzcyIsInNwcmluZ1ZhbHVlIiwibWFzcyIsInRyYW5zbGF0ZVkiLCJ0cmFuc2xhdGVWYWx1ZSIsImFkanVzdGVkRm9udFNpemUiLCJtYXhMaW5lV2lkdGgiLCJiYXNlRm9udFNpemUiLCJ0ZXh0V2lkdGgiLCJzY2FsZUZhY3RvciIsImZsb29yIiwiYW5pbWF0ZWRTdHlsZSIsImJhc2VQYWRkaW5nIiwiYmFja2dyb3VuZFBhZGRpbmciLCJzaGFkb3dJbnRlbnNpdHkiLCJzaGFkb3dDb2xvciIsInNoYWRvd0JsdXIiLCJzaGFkb3dPZmZzZXRYIiwic2hhZG93T2Zmc2V0WSIsInRleHRTaGFkb3ciLCJoZXhUb1JnYmEiLCJoZXgiLCJvcGFjaXR5Iiwic2hvcnRoYW5kUmVnZXgiLCJyZXBsYWNlIiwibSIsInIiLCJnIiwiYiIsImV4ZWMiLCJiYWNrZ3JvdW5kQ29sb3IiLCJiYWNrZ3JvdW5kT3BhY2l0eSIsInBhcnNlRmxvYXQiLCJ0cmltIiwiYmFja2dyb3VuZCIsImhhc0JhY2tncm91bmQiLCJoYXNTaGFkb3ciLCJib3JkZXJSYWRpdXMiLCJiYWNrZ3JvdW5kQm9yZGVyUmFkaXVzIiwiaXNXcmFwcGVkIiwiYmFja2dyb3VuZEZpbGxTdHlsZSIsInBhZGRpbmdWYWx1ZSIsInBhZGRpbmciLCJkaXNwbGF5IiwiYmFzZVN0eWxlIiwiX29iamVjdFNwcmVhZCIsIm92ZXJmbG93IiwiYm94U2hhZG93IiwidHJhbnNmb3JtIiwid3JhcHBlclN0eWxlIiwicG9zaXRpb24iLCJ2ZXJ0aWNhbFN0cmV0Y2giLCJ3aGl0ZVNwYWNlIiwiYWxpZ25JdGVtcyIsIndpbGxDaGFuZ2UiLCJsZWZ0IiwidG9wIiwicmlnaHQiLCJib3R0b20iLCJvdXRsaW5lQ29sb3IiLCJvdXRsaW5lV2lkdGgiLCJXZWJraXRUZXh0RmlsbENvbG9yIiwiekluZGV4IiwibWFpblRleHRTdHlsZSIsIldlYmtpdFRleHRTdHJva2UiLCJ0ZXh0V29yZHMiLCJzcGxpdCIsImN1cnJlbnRXb3JkVGltZSIsInBocmFzZUFtcGxpZmllZFN0eWxlIiwiQXJyYXkiLCJpc0FycmF5IiwiYW1wbGlmaWVkQ29sb3JzIiwiZmlyc3RXb3JkIiwid29yZCIsImdyYWRpZW50SW5kZXgiLCJyYW5kb20iLCJncmFkaWVudCIsImNvbG9ycyIsImJhY2tncm91bmRDbGlwIiwiV2Via2l0QmFja2dyb3VuZENsaXAiLCJjb25zb2xlIiwibG9nIiwiX3R5cGVvZiIsImFtcGxpZmllZENvbG9yIiwidHlwZSIsInJhbmRvbUNvbG9yRGF0YSIsImVuYWJsZWQiLCJzaG91bGRDb2xvciIsInBjdEFwcGxpZWQiLCJfcmVmMiIsInJhbmRvbVdvcmRDb3VudFJhbmdlIiwiX3JlZjMiLCJfc2xpY2VkVG9BcnJheSIsIm1pbldvcmRzIiwibWF4V29yZHMiLCJyYW5nZSIsInJhbmRvbVdvcmRDb3VudCIsIm1heFN0YXJ0SW5kZXgiLCJtYXgiLCJzdGFydEluZGV4IiwicmFuZG9tQ29sb3JPYmoiLCJwaHJhc2VTdHlsZSIsIndvcmRDb250ZW50IiwibWFwIiwiaW5kZXgiLCJoaWdobGlnaHRlZE1hdGNoIiwibWF0Y2giLCJpc0hpZ2hsaWdodGVkIiwiZGlzcGxheVdvcmQiLCJzaG91bGRDb2xvclRoaXNXb3JkIiwid29yZFRpbWluZyIsImhhc0JlZW5TcG9rZW4iLCJlbmQiLCJpc0N1cnJlbnRseVNwb2tlbiIsInN0YXJ0IiwidGV4dEhpZ2hsaWdodFBlcnNpc3RzIiwic2hvdWxkSGlnaGxpZ2h0IiwiYW1wbGlmeVNwb2tlbldvcmRzIiwid29yZFN0eWxlIiwiYW1wbGlmaWVkT3BhY2l0eSIsInVuQW1wbGlmaWVkT3BhY2l0eSIsImNvbnRhaW5lclN0eWxlIiwibWFyZ2luUmlnaHQiLCJSZWFjdCIsImN1cnJlbnRXb3JkQmxvY2siLCJjb250ZW50IiwiY3VycmVudFdvcmRCbG9ja1BhZGRpbmciLCJoZWlnaHQiLCJjdXJyZW50V29yZEJsb2NrQmFja2dyb3VuZENvbG9yIiwiY3VycmVudFdvcmRCbG9ja09wYWNpdHkiLCJjdXJyZW50V29yZEJsb2NrQm9yZGVyUmFkaXVzIiwicG9pbnRlckV2ZW50cyIsImJveFNpemluZyIsInByZXZQcm9wcyIsIm5leHRQcm9wcyIsImVzc2VudGlhbFByb3BzIiwiaGFzRXNzZW50aWFsUHJvcHNDaGFuZ2VkIiwic29tZSIsInByb3AiLCJKU09OIiwic3RyaW5naWZ5IiwiZmluZFBocmFzZXNJblJhbmdlIiwidGltZSIsInBocmFzZXMiLCJtaWQiLCJwaHJhc2UiLCJoZXhUb1JnYiIsInNsaWNlIiwidXNlVGV4dFN0eWxlIiwicHJlc2V0IiwiYWRqdXN0ZWRZIiwidmlkZW9XaWR0aCIsImRyb3BTaGFkb3ciLCJzaGFkb3dFbmFibGVkIiwicGFkZGluZ1giLCJiYWNrZ3JvdW5kUGFkZGluZ1giLCJwYWRkaW5nWSIsImJhY2tncm91bmRQYWRkaW5nWSIsImZvbnRXZWlnaHQiLCJmb250Q29sb3IiLCJ0ZXh0VHJhbnNmb3JtIiwidGV4dENhc2UiLCJmb250U3R5bGUiLCJpc0l0YWxpYyIsInRleHRBbGlnbiIsImxldHRlclNwYWNpbmciLCJ0ZXh0U3BhY2luZyIsInRyYW5zZm9ybU9yaWdpbiIsIm1heFdpZHRoIiwiZmlsdGVyIiwiYW1wbGlmeU9wYWNpdHlUcmFuc2l0aW9uRHVyYXRpb24iLCJGT05UX01BUCIsInNyYyIsIndlaWdodCIsImxvYWREb2N1bWVudEZvbnRzIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUyIiwiY2xlYW5Gb250RmFtaWx5IiwiZm9udFZhcmlhdGlvbnMiLCJsb2FkUHJvbWlzZXMiLCJ3cmFwIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwicHJldiIsIm5leHQiLCJhYnJ1cHQiLCJ3YXJuIiwiX2NhbGxlZSIsImxvYWRlZEZvbnQiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwiRm9udEZhY2UiLCJsb2FkIiwic2VudCIsImZvbnRzIiwiYWRkIiwic3RvcCIsIl94MiIsImFwcGx5IiwiUHJvbWlzZSIsImFsbCIsInQwIiwiZXJyb3IiLCJfeCIsImFkZFBpeGVsVW5pdCIsInZhbHVlIiwiZW5kc1dpdGgiLCJTdWJ0aXRsZXNDb21wb3NpdGlvbiIsIl9hIiwic3R5bGVDb25maWciLCJjdXJyZW50RnJhbWUiLCJjdXJyZW50VGltZSIsInVzZUVmZmVjdCIsImN1cnJlbnRQaHJhc2VzIiwiX2pzeCIsIl9fYXNzaWduIiwiY2hpbGRyZW4iLCJwcm9wcyIsIlN1YnRpdGxlcyIsImRldk1vZGUiLCJQbGF5ZXIiLCJjb21wb25lbnQiLCJpbnB1dFByb3BzIiwiZHVyYXRpb25JbkZyYW1lcyIsImNvbXBvc2l0aW9uV2lkdGgiLCJjb21wb3NpdGlvbkhlaWdodCIsImNvbnRyb2xzIiwiYXV0b1BsYXkiLCJsb29wIiwidXNlU3R5bGVDb25maWciLCJzdWJ0aXRsZVN0eWxlIiwidGV4dFN0eWxlIiwibmFtZSIsImNhcHRpb25Qb3NpdGlvbiIsInVzZUFkanVzdGVkUG9zaXRpb24iLCJmYWNlRGF0YSIsInVzZUN1cnJlbnRGcmFtZSIsImN1cnJlbnRGYWNlRXZlbnQiLCJfZmFjZURhdGEkZXZlbnRzIiwiZXZlbnRzIiwibnVtUGVvcGxlIiwiZmluZExhc3QiLCJldmVudCIsInVzZUFkanVzdGVkUGhyYXNlcyIsInN1YnRpdGxlc0RhdGEiLCJtYXhDaGFyc1BlckxpbmUiLCJzZWdtZW50RGF0YSIsImdldE1pc3NpbmdXb3JkUGhyYXNlc0lmRXhpc3QiLCJzdGFydFRpbWUiLCJlbmRUaW1lIiwiZ2FwV29yZHMiLCJnYXBQaHJhc2VzIiwiY3VycmVudFBocmFzZSIsInNlZ21lbnRJbmRleCIsImZvckVhY2giLCJ3b3JkSW5kZXgiLCJ3b3JkV2l0aFNwYWNlIiwibmV3TGVuZ3RoIiwicHJvY2Vzc2VkR2FwUGhyYXNlcyIsInBocmFzZUluZGV4IiwiZW5kRnJhbWUiLCJuZXh0UGhyYXNlIiwidGltZURpZmYiLCJtYXN0ZXJQaHJhc2VzIiwiZmlyc3RTZWdtZW50U3RhcnQiLCJmaXJzdFdvcmRTdGFydCIsInByZVNlZ21lbnRQaHJhc2VzIiwiX3RvQ29uc3VtYWJsZUFycmF5Iiwic2VnbWVudCIsInNlZ21lbnRXb3JkcyIsInNlZ21lbnRJZCIsImN1cnJlbnRTZWdtZW50UGhyYXNlcyIsInByb2Nlc3NlZFBocmFzZXMiLCJtaW4iLCJwcm9jZXNzZWRQaHJhc2UiLCJuZXh0U2VnbWVudCIsInNvcnQiLCJhIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBZUE7QUFDTyxJQUFJLFFBQVEsR0FBRyxXQUFXO0FBQ2pDLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksU0FBUyxRQUFRLENBQUMsQ0FBQyxFQUFFO0FBQ3JELFFBQVEsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDN0QsWUFBWSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FB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QUEsQ0FBQWpCLE1BQUEsQ0FBSWtCLFNBQVMsRUFBQWxCLEtBQUFBLENBQUFBLENBQUFBLE1BQUEsQ0FBTWUsV0FBVyxXQUFBZixNQUFBLENBQVFNLEtBQUssQ0FBRSxDQUFDLENBQUM7QUFDM0RRLE1BQUFBLE9BQU8sQ0FBQ0csSUFBSSxDQUFBLEdBQUEsQ0FBQWpCLE1BQUEsQ0FBS2tCLFNBQVMsRUFBQWxCLEtBQUFBLENBQUFBLENBQUFBLE1BQUEsQ0FBTWUsV0FBVyxXQUFBZixNQUFBLENBQVFNLEtBQUssQ0FBRSxDQUFDLENBQUM7QUFDNURRLE1BQUFBLE9BQU8sQ0FBQ0csSUFBSSxDQUFBLEdBQUEsQ0FBQWpCLE1BQUEsQ0FBS2UsV0FBVyxFQUFBZixLQUFBQSxDQUFBQSxDQUFBQSxNQUFBLENBQU1rQixTQUFTLFdBQUFsQixNQUFBLENBQVFNLEtBQUssQ0FBRSxDQUFDLENBQUM7QUFDNURRLE1BQUFBLE9BQU8sQ0FBQ0csSUFBSSxDQUFBLEdBQUEsQ0FBQWpCLE1BQUEsQ0FBS2UsV0FBVyxFQUFBZixNQUFBQSxDQUFBQSxDQUFBQSxNQUFBLENBQU9rQixTQUFTLFdBQUFsQixNQUFBLENBQVFNLEtBQUssQ0FBRSxDQUFDLENBQUM7QUFDN0RRLE1BQUFBLE9BQU8sQ0FBQ0csSUFBSSxDQUFBLEdBQUEsQ0FBQWpCLE1BQUEsQ0FBS2tCLFNBQVMsRUFBQWxCLE1BQUFBLENBQUFBLENBQUFBLE1BQUEsQ0FBT2UsV0FBVyxXQUFBZixNQUFBLENBQVFNLEtBQUssQ0FBRSxDQUFDLENBQUM7QUFDL0QsS0FBQyxNQUFNO0FBQ0w7QUFDQSxNQUFBLEtBQUssSUFBSWUsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHLEdBQUcsRUFBRUEsQ0FBQyxJQUFJLElBQUksRUFBRTtRQUNsQyxJQUFNQyxLQUFLLEdBQUlELENBQUMsR0FBR0YsSUFBSSxDQUFDSSxFQUFFLEdBQUksR0FBRyxDQUFBO0FBQ2pDLFFBQUEsSUFBTUMsQ0FBQyxHQUFHTCxJQUFJLENBQUNDLEtBQUssQ0FBQ0QsSUFBSSxDQUFDTSxH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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMF19