mobx-keystone-yjs 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,13 @@
1
1
  (function(global, factory) {
2
- typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("mobx-keystone"), require("yjs")) : typeof define === "function" && define.amd ? define(["exports", "mobx-keystone", "yjs"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global["mobx-keystone-yjs"] = {}, global["mobx-keystone"], global.yjs));
3
- })(this, function(exports2, mobxKeystone, Y) {
4
- "use strict";
2
+ typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("mobx"), require("mobx-keystone"), require("yjs")) : typeof define === "function" && define.amd ? define(["exports", "mobx", "mobx-keystone", "yjs"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global["mobx-keystone-yjs"] = {}, global.mobx, global["mobx-keystone"], global.yjs));
3
+ })(this, function(exports2, mobx, mobxKeystone, Y) {
4
+ "use strict";var __defProp = Object.defineProperty;
5
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
+ var __publicField = (obj, key, value) => {
7
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
8
+ return value;
9
+ };
10
+
5
11
  function _interopNamespaceDefault(e) {
6
12
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
7
13
  if (e) {
@@ -19,6 +25,20 @@
19
25
  return Object.freeze(n);
20
26
  }
21
27
  const Y__namespace = /* @__PURE__ */ _interopNamespaceDefault(Y);
28
+ function __decorate(decorators, target, key, desc) {
29
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
30
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
31
+ r = Reflect.decorate(decorators, target, key, desc);
32
+ else
33
+ for (var i = decorators.length - 1; i >= 0; i--)
34
+ if (d = decorators[i])
35
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
36
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
37
+ }
38
+ typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
39
+ var e = new Error(message);
40
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
41
+ };
22
42
  class MobxKeystoneYjsError extends Error {
23
43
  constructor(msg) {
24
44
  super(msg);
@@ -28,6 +48,212 @@
28
48
  function failure(msg) {
29
49
  return new MobxKeystoneYjsError(msg);
30
50
  }
51
+ const yjsBindingContext = mobxKeystone.createContext(void 0);
52
+ const yjsCollectionAtoms = /* @__PURE__ */ new WeakMap();
53
+ const getOrCreateYjsCollectionAtom = (yjsCollection) => {
54
+ let atom = yjsCollectionAtoms.get(yjsCollection);
55
+ if (!atom) {
56
+ atom = mobx.createAtom(`yjsCollectionAtom`);
57
+ yjsCollectionAtoms.set(yjsCollection, atom);
58
+ }
59
+ return atom;
60
+ };
61
+ function resolveYjsPath(yjsObject, path) {
62
+ let currentYjsObject = yjsObject;
63
+ path.forEach((pathPart, i) => {
64
+ if (currentYjsObject instanceof Y__namespace.Map) {
65
+ getOrCreateYjsCollectionAtom(currentYjsObject).reportObserved();
66
+ const key = String(pathPart);
67
+ currentYjsObject = currentYjsObject.get(key);
68
+ } else if (currentYjsObject instanceof Y__namespace.Array) {
69
+ getOrCreateYjsCollectionAtom(currentYjsObject).reportObserved();
70
+ const key = Number(pathPart);
71
+ currentYjsObject = currentYjsObject.get(key);
72
+ } else {
73
+ throw failure(`Y.Map or Y.Array was expected at path ${JSON.stringify(path.slice(0, i))} in order to resolve path ${JSON.stringify(path)}, but got ${currentYjsObject} instead`);
74
+ }
75
+ });
76
+ return currentYjsObject;
77
+ }
78
+ const deltaListType = mobxKeystone.types.array(mobxKeystone.types.frozen(mobxKeystone.types.unchecked()));
79
+ const yjsTextModelId = "mobx-keystone-yjs/YjsTextModel";
80
+ exports2.YjsTextModel = class YjsTextModel2 extends mobxKeystone.Model({
81
+ deltaList: mobxKeystone.tProp(deltaListType, () => [])
82
+ }) {
83
+ constructor() {
84
+ super(...arguments);
85
+ /**
86
+ * Atom that gets changed when the associated Y.js text changes.
87
+ */
88
+ __publicField(this, "yjsTextChangedAtom", mobx.createAtom("yjsTextChangedAtom"));
89
+ }
90
+ /**
91
+ * Helper function to create a YjsTextModel instance with a simple text.
92
+ */
93
+ static withText(text) {
94
+ return new DecoratedYjsTextModel({
95
+ deltaList: [
96
+ mobxKeystone.frozen([
97
+ {
98
+ insert: text
99
+ }
100
+ ])
101
+ ]
102
+ });
103
+ }
104
+ /**
105
+ * The Y.js path from the bound object to the YjsTextModel instance.
106
+ */
107
+ get _yjsObjectPath() {
108
+ const ctx = yjsBindingContext.get(this);
109
+ if (!ctx || ctx.boundObject == null) {
110
+ throw failure("the YjsTextModel instance must be part of a bound object before it can be accessed");
111
+ }
112
+ const path = mobxKeystone.getParentToChildPath(ctx.boundObject, this);
113
+ if (!path) {
114
+ throw failure("a path from the bound object to the YjsTextModel instance is not available");
115
+ }
116
+ return path;
117
+ }
118
+ /**
119
+ * The Yjs.Text object present at this mobx-keystone node's path.
120
+ */
121
+ get _yjsObjectAtPath() {
122
+ const path = this._yjsObjectPath;
123
+ const ctx = yjsBindingContext.get(this);
124
+ return resolveYjsPath(ctx.yjsObject, path);
125
+ }
126
+ /**
127
+ * The Yjs.Text object represented by this mobx-keystone node.
128
+ */
129
+ get yjsText() {
130
+ const yjsObject = this._yjsObjectAtPath;
131
+ if (!(yjsObject instanceof Y__namespace.Text)) {
132
+ throw failure(`Y.Text was expected at path ${JSON.stringify(this._yjsObjectPath)}`);
133
+ }
134
+ return yjsObject;
135
+ }
136
+ /**
137
+ * The text value of the Yjs.Text object.
138
+ * Shortcut for `yjsText.toString()`, but computed.
139
+ */
140
+ get text() {
141
+ this.yjsTextChangedAtom.reportObserved();
142
+ return this.yjsText.toString();
143
+ }
144
+ onInit() {
145
+ const shouldReplicateToYjs = (ctx) => {
146
+ return !!ctx && !!ctx.boundObject && !ctx.isApplyingYjsChangesToMobxKeystone;
147
+ };
148
+ let reapplyDeltasToYjsText = false;
149
+ const newDeltas = [];
150
+ let disposeObserveDeltaList;
151
+ const disposeReactionToDeltaListRefChange = mobx.reaction(() => this.$.deltaList, (deltaList) => {
152
+ disposeObserveDeltaList == null ? void 0 : disposeObserveDeltaList();
153
+ disposeObserveDeltaList = void 0;
154
+ if (deltaList) {
155
+ disposeObserveDeltaList = mobx.observe(this.$.deltaList, (change) => {
156
+ if (reapplyDeltasToYjsText) {
157
+ return;
158
+ }
159
+ if (!shouldReplicateToYjs(yjsBindingContext.get(this))) {
160
+ return;
161
+ }
162
+ if (change.type === "splice" && change.removedCount === 0 && change.addedCount > 0 && change.index === this.deltaList.length) {
163
+ newDeltas.push(...change.added);
164
+ } else {
165
+ reapplyDeltasToYjsText = true;
166
+ }
167
+ });
168
+ }
169
+ }, { fireImmediately: true });
170
+ const disposeOnSnapshot = mobxKeystone.onSnapshot(this, () => {
171
+ try {
172
+ if (reapplyDeltasToYjsText) {
173
+ const ctx = yjsBindingContext.get(this);
174
+ if (shouldReplicateToYjs(ctx)) {
175
+ const { yjsText } = this;
176
+ ctx.yjsDoc.transact(() => {
177
+ if (yjsText.length > 0) {
178
+ yjsText.delete(0, yjsText.length);
179
+ }
180
+ this.deltaList.forEach((frozenDeltas) => {
181
+ yjsText.applyDelta(frozenDeltas.data);
182
+ });
183
+ }, ctx.yjsOrigin);
184
+ }
185
+ } else if (newDeltas.length > 0) {
186
+ const ctx = yjsBindingContext.get(this);
187
+ if (shouldReplicateToYjs(ctx)) {
188
+ const { yjsText } = this;
189
+ ctx.yjsDoc.transact(() => {
190
+ newDeltas.forEach((frozenDeltas) => {
191
+ yjsText.applyDelta(frozenDeltas.data);
192
+ });
193
+ }, ctx.yjsOrigin);
194
+ }
195
+ }
196
+ } finally {
197
+ reapplyDeltasToYjsText = false;
198
+ newDeltas.length = 0;
199
+ }
200
+ });
201
+ const diposeYjsTextChangedAtom = hookYjsTextChangedAtom(() => this.yjsText, this.yjsTextChangedAtom);
202
+ return () => {
203
+ disposeOnSnapshot();
204
+ disposeReactionToDeltaListRefChange();
205
+ disposeObserveDeltaList == null ? void 0 : disposeObserveDeltaList();
206
+ disposeObserveDeltaList = void 0;
207
+ diposeYjsTextChangedAtom();
208
+ };
209
+ }
210
+ };
211
+ __decorate([
212
+ mobx.computed
213
+ ], exports2.YjsTextModel.prototype, "_yjsObjectPath", null);
214
+ __decorate([
215
+ mobx.computed
216
+ ], exports2.YjsTextModel.prototype, "_yjsObjectAtPath", null);
217
+ __decorate([
218
+ mobx.computed
219
+ ], exports2.YjsTextModel.prototype, "yjsText", null);
220
+ __decorate([
221
+ mobx.computed
222
+ ], exports2.YjsTextModel.prototype, "text", null);
223
+ exports2.YjsTextModel = __decorate([
224
+ mobxKeystone.model(yjsTextModelId)
225
+ ], exports2.YjsTextModel);
226
+ const DecoratedYjsTextModel = exports2.YjsTextModel;
227
+ function hookYjsTextChangedAtom(getYjsText, textChangedAtom) {
228
+ let disposeObserveYjsText;
229
+ const observeFn = () => {
230
+ textChangedAtom.reportChanged();
231
+ };
232
+ const disposeReactionToYTextChange = mobx.reaction(() => {
233
+ try {
234
+ return getYjsText();
235
+ } catch {
236
+ return void 0;
237
+ }
238
+ }, (yjsText) => {
239
+ disposeObserveYjsText == null ? void 0 : disposeObserveYjsText();
240
+ disposeObserveYjsText = void 0;
241
+ if (yjsText) {
242
+ yjsText.observe(observeFn);
243
+ disposeObserveYjsText = () => {
244
+ yjsText.unobserve(observeFn);
245
+ };
246
+ }
247
+ textChangedAtom.reportChanged();
248
+ }, {
249
+ fireImmediately: true
250
+ });
251
+ return () => {
252
+ disposeReactionToYTextChange();
253
+ disposeObserveYjsText == null ? void 0 : disposeObserveYjsText();
254
+ disposeObserveYjsText = void 0;
255
+ };
256
+ }
31
257
  function isJsonPrimitive(v) {
32
258
  const t = typeof v;
33
259
  return t === "string" || t === "number" || t === "boolean" || v === null;
@@ -44,20 +270,28 @@
44
270
  }
45
271
  if (isJsonArray(v)) {
46
272
  const arr = new Y__namespace.Array();
47
- applyJsonArrayYArray(arr, v);
273
+ applyJsonArrayToYArray(arr, v);
48
274
  return arr;
49
275
  }
50
276
  if (isJsonObject(v)) {
51
277
  if (v.$frozen === true) {
52
278
  return v;
53
279
  }
280
+ if (v.$modelType === yjsTextModelId) {
281
+ const text = new Y__namespace.Text();
282
+ const yjsTextModel = v;
283
+ yjsTextModel.deltaList.forEach((frozenDeltas) => {
284
+ text.applyDelta(frozenDeltas.data);
285
+ });
286
+ return text;
287
+ }
54
288
  const map = new Y__namespace.Map();
55
289
  applyJsonObjectToYMap(map, v);
56
290
  return map;
57
291
  }
58
292
  throw new Error(`unsupported value type: ${v}`);
59
293
  }
60
- function applyJsonArrayYArray(dest, source) {
294
+ function applyJsonArrayToYArray(dest, source) {
61
295
  dest.push(source.map(convertJsonToYjsData));
62
296
  }
63
297
  function applyJsonObjectToYMap(dest, source) {
@@ -80,7 +314,9 @@
80
314
  throw failure(`invalid patch path, key "${key}" not found in Yjs array - patch: ${JSON.stringify(patch)}`);
81
315
  }
82
316
  applyMobxKeystonePatchToYjsObject({ ...patch, path: rest }, child);
83
- } else {
317
+ } else if (yjs instanceof Y__namespace.Text)
318
+ ;
319
+ else {
84
320
  throw failure(`invalid patch path, key "${key}" not found in unknown Yjs object - patch: ${JSON.stringify(patch)}`);
85
321
  }
86
322
  } else if (patch.path.length === 1) {
@@ -130,13 +366,34 @@
130
366
  throw failure(`invalid patch operation for array`);
131
367
  }
132
368
  }
133
- } else {
369
+ } else if (yjs instanceof Y__namespace.Text)
370
+ ;
371
+ else {
134
372
  throw failure(`invalid patch path, the Yjs object is of an unkown type, so key "${patch.path[0]}" cannot be found in it`);
135
373
  }
136
374
  } else {
137
375
  throw failure(`invalid patch path, it cannot be empty`);
138
376
  }
139
377
  }
378
+ function convertYjsDataToJson(yjsData) {
379
+ if (yjsData instanceof Y__namespace.Array) {
380
+ return yjsData.map((v) => convertYjsDataToJson(v));
381
+ }
382
+ if (yjsData instanceof Y__namespace.Map) {
383
+ const obj = {};
384
+ yjsData.forEach((v, k) => {
385
+ obj[k] = convertYjsDataToJson(v);
386
+ });
387
+ return obj;
388
+ }
389
+ if (yjsData instanceof Y__namespace.Text) {
390
+ const deltas = yjsData.toDelta();
391
+ return mobxKeystone.modelSnapshotOutWithMetadata(exports2.YjsTextModel, {
392
+ deltaList: deltas.length > 0 ? [{ $frozen: true, data: deltas }] : []
393
+ });
394
+ }
395
+ return yjsData;
396
+ }
140
397
  function convertYjsEventToPatches(event) {
141
398
  const patches = [];
142
399
  if (event instanceof Y__namespace.YMapEvent) {
@@ -196,6 +453,18 @@
196
453
  });
197
454
  }
198
455
  });
456
+ } else if (event instanceof Y__namespace.YTextEvent) {
457
+ const path = [
458
+ ...event.path,
459
+ "deltaList",
460
+ -1
461
+ /* last item */
462
+ ];
463
+ patches.push({
464
+ op: "add",
465
+ path,
466
+ value: { $frozen: true, data: event.delta }
467
+ });
199
468
  }
200
469
  return patches;
201
470
  }
@@ -206,16 +475,21 @@
206
475
  return v;
207
476
  }
208
477
  }
209
- const yjsBindingContext = mobxKeystone.createContext(void 0);
210
478
  function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
211
479
  const yjsOrigin = Symbol("bindYjsToMobxKeystoneTransactionOrigin");
480
+ let applyingYjsChangesToMobxKeystone = 0;
212
481
  const bindingContext = {
213
482
  yjsDoc,
214
483
  yjsObject,
215
484
  mobxKeystoneType,
216
- yjsOrigin
485
+ yjsOrigin,
486
+ boundObject: void 0,
487
+ // not yet created
488
+ get isApplyingYjsChangesToMobxKeystone() {
489
+ return applyingYjsChangesToMobxKeystone > 0;
490
+ }
217
491
  };
218
- const yjsJson = yjsObject.toJSON();
492
+ const yjsJson = convertYjsDataToJson(yjsObject);
219
493
  const initializationGlobalPatches = [];
220
494
  const createBoundObject = () => {
221
495
  const disposeOnGlobalPatches = mobxKeystone.onGlobalPatches((target, patches) => {
@@ -223,47 +497,51 @@
223
497
  });
224
498
  try {
225
499
  const boundObject2 = yjsBindingContext.apply(() => mobxKeystone.fromSnapshot(mobxKeystoneType, yjsJson), bindingContext);
226
- yjsBindingContext.set(boundObject2, bindingContext);
500
+ yjsBindingContext.set(boundObject2, { ...bindingContext, boundObject: boundObject2 });
227
501
  return boundObject2;
228
502
  } finally {
229
503
  disposeOnGlobalPatches();
230
504
  }
231
505
  };
232
506
  const boundObject = createBoundObject();
233
- let applyingMobxKeystoneChanges = 0;
234
- const observeDeepCb = (events) => {
507
+ const observeDeepCb = mobx.action((events) => {
235
508
  const patches = [];
236
509
  events.forEach((event) => {
237
510
  if (event.transaction.origin !== yjsOrigin) {
238
511
  patches.push(...convertYjsEventToPatches(event));
239
512
  }
513
+ if (event.target instanceof Y__namespace.Map || event.target instanceof Y__namespace.Array) {
514
+ getOrCreateYjsCollectionAtom(event.target).reportChanged();
515
+ }
240
516
  });
241
517
  if (patches.length > 0) {
242
- applyingMobxKeystoneChanges++;
518
+ applyingYjsChangesToMobxKeystone++;
243
519
  try {
244
520
  mobxKeystone.applyPatches(boundObject, patches);
245
521
  } finally {
246
- applyingMobxKeystoneChanges--;
522
+ applyingYjsChangesToMobxKeystone--;
247
523
  }
248
524
  }
249
- };
525
+ });
250
526
  yjsObject.observeDeep(observeDeepCb);
251
- let pendingPatches = [];
527
+ let pendingArrayOfArrayOfPatches = [];
252
528
  const disposeOnPatches = mobxKeystone.onPatches(boundObject, (patches) => {
253
- if (applyingMobxKeystoneChanges > 0) {
529
+ if (applyingYjsChangesToMobxKeystone > 0) {
254
530
  return;
255
531
  }
256
- pendingPatches.push(...patches);
532
+ pendingArrayOfArrayOfPatches.push(patches);
257
533
  });
258
534
  const disposeOnSnapshot = mobxKeystone.onSnapshot(boundObject, () => {
259
- if (pendingPatches.length === 0) {
535
+ if (pendingArrayOfArrayOfPatches.length === 0) {
260
536
  return;
261
537
  }
262
- const patches = pendingPatches;
263
- pendingPatches = [];
538
+ const arrayOfArrayOfPatches = pendingArrayOfArrayOfPatches;
539
+ pendingArrayOfArrayOfPatches = [];
264
540
  yjsDoc.transact(() => {
265
- patches.forEach((patch) => {
266
- applyMobxKeystonePatchToYjsObject(patch, yjsObject);
541
+ arrayOfArrayOfPatches.forEach((arrayOfPatches) => {
542
+ arrayOfPatches.forEach((patch) => {
543
+ applyMobxKeystonePatchToYjsObject(patch, yjsObject);
544
+ });
267
545
  });
268
546
  }, yjsOrigin);
269
547
  });
@@ -298,11 +576,12 @@
298
576
  };
299
577
  }
300
578
  exports2.MobxKeystoneYjsError = MobxKeystoneYjsError;
301
- exports2.applyJsonArrayYArray = applyJsonArrayYArray;
579
+ exports2.applyJsonArrayToYArray = applyJsonArrayToYArray;
302
580
  exports2.applyJsonObjectToYMap = applyJsonObjectToYMap;
303
581
  exports2.bindYjsToMobxKeystone = bindYjsToMobxKeystone;
304
582
  exports2.convertJsonToYjsData = convertJsonToYjsData;
305
583
  exports2.yjsBindingContext = yjsBindingContext;
584
+ exports2.yjsTextModelId = yjsTextModelId;
306
585
  Object.defineProperty(exports2, Symbol.toStringTag, { value: "Module" });
307
586
  });
308
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMudW1kLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvZXJyb3IudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0SnNvblRvWWpzRGF0YS50cyIsIi4uL3NyYy9iaW5kaW5nL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdC50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlcy50cyIsIi4uL3NyYy9iaW5kaW5nL3lqc0JpbmRpbmdDb250ZXh0LnRzIiwiLi4vc3JjL2JpbmRpbmcvYmluZFlqc1RvTW9ieEtleXN0b25lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBBIG1vYngta2V5c3RvbmUteWpzIGVycm9yLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1vYnhLZXlzdG9uZVlqc0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nKSB7XHJcbiAgICBzdXBlcihtc2cpXHJcblxyXG4gICAgLy8gU2V0IHRoZSBwcm90b3R5cGUgZXhwbGljaXRseS5cclxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBNb2J4S2V5c3RvbmVZanNFcnJvci5wcm90b3R5cGUpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmFpbHVyZShtc2c6IHN0cmluZykge1xyXG4gIHJldHVybiBuZXcgTW9ieEtleXN0b25lWWpzRXJyb3IobXNnKVxyXG59XHJcbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBKc29uVmFsdWUsIEpzb25BcnJheSwgSnNvbk9iamVjdCwgSnNvblByaW1pdGl2ZSB9IGZyb20gXCIuLi9qc29uVHlwZXNcIlxuXG5mdW5jdGlvbiBpc0pzb25QcmltaXRpdmUodjogSnNvblZhbHVlKTogdiBpcyBKc29uUHJpbWl0aXZlIHtcbiAgY29uc3QgdCA9IHR5cGVvZiB2XG4gIHJldHVybiB0ID09PSBcInN0cmluZ1wiIHx8IHQgPT09IFwibnVtYmVyXCIgfHwgdCA9PT0gXCJib29sZWFuXCIgfHwgdiA9PT0gbnVsbFxufVxuXG5mdW5jdGlvbiBpc0pzb25BcnJheSh2OiBKc29uVmFsdWUpOiB2IGlzIEpzb25BcnJheSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHYpXG59XG5cbmZ1bmN0aW9uIGlzSnNvbk9iamVjdCh2OiBKc29uVmFsdWUpOiB2IGlzIEpzb25PYmplY3Qge1xuICByZXR1cm4gIWlzSnNvbkFycmF5KHYpICYmIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0SnNvblRvWWpzRGF0YSh2OiBKc29uVmFsdWUpIHtcbiAgaWYgKHYgPT09IHVuZGVmaW5lZCB8fCBpc0pzb25QcmltaXRpdmUodikpIHtcbiAgICByZXR1cm4gdlxuICB9XG5cbiAgaWYgKGlzSnNvbkFycmF5KHYpKSB7XG4gICAgY29uc3QgYXJyID0gbmV3IFkuQXJyYXkoKVxuICAgIGFwcGx5SnNvbkFycmF5WUFycmF5KGFyciwgdilcbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICBpZiAoaXNKc29uT2JqZWN0KHYpKSB7XG4gICAgaWYgKHYuJGZyb3plbiA9PT0gdHJ1ZSkge1xuICAgICAgLy8gZnJvemVuIHZhbHVlLCBzYXZlIGFzIGltbXV0YWJsZSBvYmplY3RcbiAgICAgIHJldHVybiB2XG4gICAgfVxuXG4gICAgY29uc3QgbWFwID0gbmV3IFkuTWFwKClcbiAgICBhcHBseUpzb25PYmplY3RUb1lNYXAobWFwLCB2KVxuICAgIHJldHVybiBtYXBcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgdmFsdWUgdHlwZTogJHt2fWApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUpzb25BcnJheVlBcnJheShkZXN0OiBZLkFycmF5PHVua25vd24+LCBzb3VyY2U6IEpzb25BcnJheSkge1xuICBkZXN0LnB1c2goc291cmNlLm1hcChjb252ZXJ0SnNvblRvWWpzRGF0YSkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUpzb25PYmplY3RUb1lNYXAoZGVzdDogWS5NYXA8dW5rbm93bj4sIHNvdXJjZTogSnNvbk9iamVjdCkge1xuICBPYmplY3QuZW50cmllcyhzb3VyY2UpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgIGRlc3Quc2V0KGssIGNvbnZlcnRKc29uVG9ZanNEYXRhKHYpKVxuICB9KVxufVxuIiwiaW1wb3J0IHsgUGF0Y2ggfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBjb252ZXJ0SnNvblRvWWpzRGF0YSB9IGZyb20gXCIuL2NvbnZlcnRKc29uVG9ZanNEYXRhXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaDogUGF0Y2gsIHlqczogdW5rbm93bik6IHZvaWQge1xuICBpZiAocGF0Y2gucGF0aC5sZW5ndGggPiAxKSB7XG4gICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRjaC5wYXRoXG5cbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGNvbnN0IGNoaWxkID0geWpzLmdldChTdHJpbmcoa2V5KSlcbiAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIFlqcyBtYXAgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShwYXRjaCl9YFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoeyAuLi5wYXRjaCwgcGF0aDogcmVzdCB9LCBjaGlsZClcbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICAgIGNvbnN0IGNoaWxkID0geWpzLmdldChOdW1iZXIoa2V5KSlcbiAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIFlqcyBhcnJheSAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgcGF0Y2hcbiAgICAgICAgICApfWBcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHsgLi4ucGF0Y2gsIHBhdGg6IHJlc3QgfSwgY2hpbGQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiB1bmtub3duIFlqcyBvYmplY3QgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBwYXRjaFxuICAgICAgICApfWBcbiAgICAgIClcbiAgICB9XG4gIH0gZWxzZSBpZiAocGF0Y2gucGF0aC5sZW5ndGggPT09IDEpIHtcbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwYXRjaC5wYXRoWzBdKVxuXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XG4gICAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xuICAgICAgICAgIHlqcy5zZXQoa2V5LCBjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICB5anMuZGVsZXRlKGtleSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIG9wZXJhdGlvbiBmb3IgbWFwYClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgY29uc3Qga2V5ID0gcGF0Y2gucGF0aFswXVxuXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSBcImxlbmd0aFwiKSB7XG4gICAgICAgICAgICBpZiAoeWpzLmxlbmd0aCA+IHBhdGNoLnZhbHVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvRGVsZXRlID0geWpzLmxlbmd0aCAtIHBhdGNoLnZhbHVlXG4gICAgICAgICAgICAgIHlqcy5kZWxldGUocGF0Y2gudmFsdWUsIHRvRGVsZXRlKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh5anMubGVuZ3RoIDwgcGF0Y2gudmFsdWUpIHtcbiAgICAgICAgICAgICAgY29uc3QgdG9JbnNlcnQgPSBwYXRjaC52YWx1ZSAtIHlqcy5sZW5ndGhcbiAgICAgICAgICAgICAgeWpzLmluc2VydCh5anMubGVuZ3RoLCBBcnJheSh0b0luc2VydCkuZmlsbCh1bmRlZmluZWQpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB5anMuZGVsZXRlKE51bWJlcihrZXkpKVxuICAgICAgICAgICAgeWpzLmluc2VydChOdW1iZXIoa2V5KSwgW2NvbnZlcnRKc29uVG9ZanNEYXRhKHBhdGNoLnZhbHVlKV0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImFkZFwiOiB7XG4gICAgICAgICAgeWpzLmluc2VydChOdW1iZXIoa2V5KSwgW2NvbnZlcnRKc29uVG9ZanNEYXRhKHBhdGNoLnZhbHVlKV0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICB5anMuZGVsZXRlKE51bWJlcihrZXkpKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggb3BlcmF0aW9uIGZvciBhcnJheWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwgdGhlIFlqcyBvYmplY3QgaXMgb2YgYW4gdW5rb3duIHR5cGUsIHNvIGtleSBcIiR7cGF0Y2gucGF0aFswXX1cIiBjYW5ub3QgYmUgZm91bmQgaW4gaXRgXG4gICAgICApXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggcGF0aCwgaXQgY2Fubm90IGJlIGVtcHR5YClcbiAgfVxufVxuIiwiaW1wb3J0IHsgUGF0Y2ggfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgSnNvbkFycmF5LCBKc29uT2JqZWN0LCBKc29uVmFsdWUgfSBmcm9tIFwiLi4vanNvblR5cGVzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50OiBZLllFdmVudDxhbnk+KTogUGF0Y2hbXSB7XG4gIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxuXG4gIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWU1hcEV2ZW50KSB7XG4gICAgY29uc3Qgc291cmNlID0gZXZlbnQudGFyZ2V0IGFzIFkuTWFwPGFueT5cblxuICAgIGV2ZW50LmNoYW5nZXMua2V5cy5mb3JFYWNoKChjaGFuZ2UsIGtleSkgPT4ge1xuICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCBrZXldXG5cbiAgICAgIHN3aXRjaCAoY2hhbmdlLmFjdGlvbikge1xuICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcImFkZFwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUoc291cmNlLmdldChrZXkpKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBcInVwZGF0ZVwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZXBsYWNlXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZShzb3VyY2UuZ2V0KGtleSkpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIFwiZGVsZXRlXCI6XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGB1bnN1cHBvcnRlZCBZanMgbWFwIGV2ZW50IGFjdGlvbjogJHtjaGFuZ2UuYWN0aW9ufWApXG4gICAgICB9XG4gICAgfSlcbiAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWUFycmF5RXZlbnQpIHtcbiAgICBsZXQgcmV0YWluID0gMFxuICAgIGV2ZW50LmNoYW5nZXMuZGVsdGEuZm9yRWFjaCgoY2hhbmdlKSA9PiB7XG4gICAgICBpZiAoY2hhbmdlLnJldGFpbikge1xuICAgICAgICByZXRhaW4gKz0gY2hhbmdlLnJldGFpblxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlLmRlbGV0ZSkge1xuICAgICAgICAvLyByZW1vdmUgWCBpdGVtcyBhdCByZXRhaW4gcG9zaXRpb25cbiAgICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCByZXRhaW5dXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlLmRlbGV0ZTsgaSsrKSB7XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2UuaW5zZXJ0KSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IEFycmF5LmlzQXJyYXkoY2hhbmdlLmluc2VydCkgPyBjaGFuZ2UuaW5zZXJ0IDogW2NoYW5nZS5pbnNlcnRdXG4gICAgICAgIG5ld1ZhbHVlcy5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCByZXRhaW5dXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcImFkZFwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUodiksXG4gICAgICAgICAgfSlcbiAgICAgICAgICByZXRhaW4rK1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gcGF0Y2hlc1xufVxuXG5mdW5jdGlvbiB0b1BsYWluVmFsdWUodjogWS5NYXA8YW55PiB8IFkuQXJyYXk8YW55PiB8IEpzb25WYWx1ZSkge1xuICBpZiAodiBpbnN0YW5jZW9mIFkuTWFwIHx8IHYgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgcmV0dXJuIHYudG9KU09OKCkgYXMgSnNvbk9iamVjdCB8IEpzb25BcnJheVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB2XG4gIH1cbn1cbiIsImltcG9ydCB7IEFueVR5cGUsIGNyZWF0ZUNvbnRleHQgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFlqc0JpbmRpbmdDb250ZXh0IHtcbiAgeWpzRG9jOiBZLkRvY1xuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPlxuICBtb2J4S2V5c3RvbmVUeXBlOiBBbnlUeXBlXG4gIHlqc09yaWdpbjogc3ltYm9sXG59XG5cbmV4cG9ydCBjb25zdCB5anNCaW5kaW5nQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8WWpzQmluZGluZ0NvbnRleHQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbiIsImltcG9ydCB7XG4gIEFueURhdGFNb2RlbCxcbiAgQW55TW9kZWwsXG4gIEFueVN0YW5kYXJkVHlwZSxcbiAgTW9kZWxDbGFzcyxcbiAgUGF0Y2gsXG4gIFR5cGVUb0RhdGEsXG4gIGFwcGx5UGF0Y2hlcyxcbiAgZnJvbVNuYXBzaG90LFxuICBnZXRQYXJlbnRUb0NoaWxkUGF0aCxcbiAgb25HbG9iYWxQYXRjaGVzLFxuICBvblBhdGNoZXMsXG4gIG9uU25hcHNob3QsXG59IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QgfSBmcm9tIFwiLi9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3RcIlxuaW1wb3J0IHsgY29udmVydFlqc0V2ZW50VG9QYXRjaGVzIH0gZnJvbSBcIi4vY29udmVydFlqc0V2ZW50VG9QYXRjaGVzXCJcbmltcG9ydCB7IFlqc0JpbmRpbmdDb250ZXh0LCB5anNCaW5kaW5nQ29udGV4dCB9IGZyb20gXCIuL3lqc0JpbmRpbmdDb250ZXh0XCJcblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRZanNUb01vYnhLZXlzdG9uZTxcbiAgVFR5cGUgZXh0ZW5kcyBBbnlTdGFuZGFyZFR5cGUgfCBNb2RlbENsYXNzPEFueU1vZGVsPiB8IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPixcbj4oe1xuICB5anNEb2MsXG4gIHlqc09iamVjdCxcbiAgbW9ieEtleXN0b25lVHlwZSxcbn06IHtcbiAgeWpzRG9jOiBZLkRvY1xuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPlxuICBtb2J4S2V5c3RvbmVUeXBlOiBUVHlwZVxufSk6IHtcbiAgYm91bmRPYmplY3Q6IFR5cGVUb0RhdGE8VFR5cGU+XG4gIGRpc3Bvc2UoKTogdm9pZFxuICB5anNPcmlnaW46IHN5bWJvbFxufSB7XG4gIGNvbnN0IHlqc09yaWdpbiA9IFN5bWJvbChcImJpbmRZanNUb01vYnhLZXlzdG9uZVRyYW5zYWN0aW9uT3JpZ2luXCIpXG5cbiAgY29uc3QgYmluZGluZ0NvbnRleHQ6IFlqc0JpbmRpbmdDb250ZXh0ID0ge1xuICAgIHlqc0RvYyxcbiAgICB5anNPYmplY3QsXG4gICAgbW9ieEtleXN0b25lVHlwZSxcbiAgICB5anNPcmlnaW4sXG4gIH1cblxuICBjb25zdCB5anNKc29uID0geWpzT2JqZWN0LnRvSlNPTigpXG5cbiAgY29uc3QgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzOiB7IHRhcmdldDogb2JqZWN0OyBwYXRjaGVzOiBQYXRjaFtdIH1bXSA9IFtdXG5cbiAgY29uc3QgY3JlYXRlQm91bmRPYmplY3QgPSAoKSA9PiB7XG4gICAgY29uc3QgZGlzcG9zZU9uR2xvYmFsUGF0Y2hlcyA9IG9uR2xvYmFsUGF0Y2hlcygodGFyZ2V0LCBwYXRjaGVzKSA9PiB7XG4gICAgICBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXMucHVzaCh7IHRhcmdldCwgcGF0Y2hlcyB9KVxuICAgIH0pXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYm91bmRPYmplY3QgPSB5anNCaW5kaW5nQ29udGV4dC5hcHBseShcbiAgICAgICAgKCkgPT4gZnJvbVNuYXBzaG90KG1vYnhLZXlzdG9uZVR5cGUsIHlqc0pzb24gYXMgYW55KSxcbiAgICAgICAgYmluZGluZ0NvbnRleHRcbiAgICAgIClcbiAgICAgIHlqc0JpbmRpbmdDb250ZXh0LnNldChib3VuZE9iamVjdCwgYmluZGluZ0NvbnRleHQpXG4gICAgICByZXR1cm4gYm91bmRPYmplY3RcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZGlzcG9zZU9uR2xvYmFsUGF0Y2hlcygpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYm91bmRPYmplY3QgPSBjcmVhdGVCb3VuZE9iamVjdCgpXG5cbiAgbGV0IGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcyA9IDBcblxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20geWpzIHRvIG1vYngta2V5c3RvbmVcbiAgY29uc3Qgb2JzZXJ2ZURlZXBDYiA9IChldmVudHM6IFkuWUV2ZW50PGFueT5bXSkgPT4ge1xuICAgIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LnRyYW5zYWN0aW9uLm9yaWdpbiAhPT0geWpzT3JpZ2luKSB7XG4gICAgICAgIHBhdGNoZXMucHVzaCguLi5jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMoZXZlbnQpKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAocGF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICBhcHBseWluZ01vYnhLZXlzdG9uZUNoYW5nZXMrK1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXBwbHlQYXRjaGVzKGJvdW5kT2JqZWN0LCBwYXRjaGVzKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXBwbHlpbmdNb2J4S2V5c3RvbmVDaGFuZ2VzLS1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB5anNPYmplY3Qub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcblxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20gbW9ieC1rZXlzdG9uZSB0byB5anNcbiAgbGV0IHBlbmRpbmdQYXRjaGVzOiBQYXRjaFtdID0gW11cbiAgY29uc3QgZGlzcG9zZU9uUGF0Y2hlcyA9IG9uUGF0Y2hlcyhib3VuZE9iamVjdCwgKHBhdGNoZXMpID0+IHtcbiAgICBpZiAoYXBwbHlpbmdNb2J4S2V5c3RvbmVDaGFuZ2VzID4gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcGVuZGluZ1BhdGNoZXMucHVzaCguLi5wYXRjaGVzKVxuICB9KVxuXG4gIC8vIHRoaXMgaXMgb25seSB1c2VkIHNvIHdlIGNhbiB0cmFuc2FjdCBhbGwgcGF0Y2hlcyB0byB0aGUgc25hcHNob3QgYm91bmRhcnlcbiAgY29uc3QgZGlzcG9zZU9uU25hcHNob3QgPSBvblNuYXBzaG90KGJvdW5kT2JqZWN0LCAoKSA9PiB7XG4gICAgaWYgKHBlbmRpbmdQYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcGF0Y2hlcyA9IHBlbmRpbmdQYXRjaGVzXG4gICAgcGVuZGluZ1BhdGNoZXMgPSBbXVxuXG4gICAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgIHBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcbiAgICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoLCB5anNPYmplY3QpXG4gICAgICB9KVxuICAgIH0sIHlqc09yaWdpbilcbiAgfSlcblxuICAvLyBzeW5jIGluaXRpYWwgcGF0Y2hlcywgdGhhdCBtaWdodCBpbmNsdWRlIHNldHRpbmcgZGVmYXVsdHMsIElEcywgZXRjXG4gIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgLy8gd2UgbmVlZCB0byBza2lwIGluaXRpYWxpemF0aW9ucyB1bnRpbCB3ZSBoaXQgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBib3VuZCBvYmplY3RcbiAgICAvLyB0aGlzIGlzIGJlY2F1c2UgZGVmYXVsdCBvYmplY3RzIG1pZ2h0IGJlIGNyZWF0ZWQgYW5kIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgbWFpbiBvYmplY3RcbiAgICAvLyBidXQgd2UganVzdCBuZWVkIHRvIGNhdGNoIHdoZW4gdGhvc2UgYXJlIGFjdHVhbGx5IGFzc2lnbmVkIHRvIHRoZSBib3VuZCBvYmplY3RcbiAgICBsZXQgYm91bmRPYmplY3RGb3VuZCA9IGZhbHNlXG5cbiAgICBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXMuZm9yRWFjaCgoeyB0YXJnZXQsIHBhdGNoZXMgfSkgPT4ge1xuICAgICAgaWYgKCFib3VuZE9iamVjdEZvdW5kKSB7XG4gICAgICAgIGlmICh0YXJnZXQgIT09IGJvdW5kT2JqZWN0KSB7XG4gICAgICAgICAgcmV0dXJuIC8vIHNraXBcbiAgICAgICAgfVxuICAgICAgICBib3VuZE9iamVjdEZvdW5kID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJlbnRUb0NoaWxkUGF0aCA9IGdldFBhcmVudFRvQ2hpbGRQYXRoKGJvdW5kT2JqZWN0LCB0YXJnZXQpXG4gICAgICAvLyB0aGlzIGlzIHVuZGVmaW5lZCBvbmx5IGlmIHRhcmdldCBpcyBub3QgYSBjaGlsZCBvZiBib3VuZE1vZGVsXG4gICAgICBpZiAocGFyZW50VG9DaGlsZFBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXRjaGVzLmZvckVhY2goKHBhdGNoKSA9PiB7XG4gICAgICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAuLi5wYXRjaCxcbiAgICAgICAgICAgICAgcGF0aDogWy4uLnBhcmVudFRvQ2hpbGRQYXRoLCAuLi5wYXRjaC5wYXRoXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB5anNPYmplY3RcbiAgICAgICAgICApXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfSwgeWpzT3JpZ2luKVxuXG4gIHJldHVybiB7XG4gICAgYm91bmRPYmplY3QsXG4gICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgZGlzcG9zZU9uUGF0Y2hlcygpXG4gICAgICBkaXNwb3NlT25TbmFwc2hvdCgpXG4gICAgICB5anNPYmplY3QudW5vYnNlcnZlRGVlcChvYnNlcnZlRGVlcENiKVxuICAgIH0sXG4gICAgeWpzT3JpZ2luLFxuICB9XG59XG4iXSwibmFtZXMiOlsiWSIsImNyZWF0ZUNvbnRleHQiLCJvbkdsb2JhbFBhdGNoZXMiLCJib3VuZE9iamVjdCIsImZyb21TbmFwc2hvdCIsImFwcGx5UGF0Y2hlcyIsIm9uUGF0Y2hlcyIsIm9uU25hcHNob3QiLCJnZXRQYXJlbnRUb0NoaWxkUGF0aCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBR00sTUFBTyw2QkFBNkIsTUFBSztBQUFBLElBQzdDLFlBQVksS0FBVztBQUNyQixZQUFNLEdBQUc7QUFHRixhQUFBLGVBQWUsTUFBTSxxQkFBcUIsU0FBUztBQUFBLElBQzVEO0FBQUEsRUFDRDtBQUtLLFdBQVUsUUFBUSxLQUFXO0FBQzFCLFdBQUEsSUFBSSxxQkFBcUIsR0FBRztBQUFBLEVBQ3JDO0FDZEEsV0FBUyxnQkFBZ0IsR0FBWTtBQUNuQyxVQUFNLElBQUksT0FBTztBQUNqQixXQUFPLE1BQU0sWUFBWSxNQUFNLFlBQVksTUFBTSxhQUFhLE1BQU07QUFBQSxFQUN0RTtBQUVBLFdBQVMsWUFBWSxHQUFZO0FBQ3hCLFdBQUEsTUFBTSxRQUFRLENBQUM7QUFBQSxFQUN4QjtBQUVBLFdBQVMsYUFBYSxHQUFZO0FBQ2hDLFdBQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxPQUFPLE1BQU07QUFBQSxFQUN6QztBQUVNLFdBQVUscUJBQXFCLEdBQVk7QUFDL0MsUUFBSSxNQUFNLFVBQWEsZ0JBQWdCLENBQUMsR0FBRztBQUNsQyxhQUFBO0FBQUEsSUFDVDtBQUVJLFFBQUEsWUFBWSxDQUFDLEdBQUc7QUFDWixZQUFBLE1BQU0sSUFBSUEsYUFBRTtBQUNsQiwyQkFBcUIsS0FBSyxDQUFDO0FBQ3BCLGFBQUE7QUFBQSxJQUNUO0FBRUksUUFBQSxhQUFhLENBQUMsR0FBRztBQUNmLFVBQUEsRUFBRSxZ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
587
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMudW1kLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvZXJyb3IudHMiLCIuLi9zcmMvYmluZGluZy95anNCaW5kaW5nQ29udGV4dC50cyIsIi4uL3NyYy91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tLnRzIiwiLi4vc3JjL2JpbmRpbmcvcmVzb2x2ZVlqc1BhdGgudHMiLCIuLi9zcmMvYmluZGluZy9ZanNUZXh0TW9kZWwudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0SnNvblRvWWpzRGF0YS50cyIsIi4uL3NyYy9iaW5kaW5nL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdC50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNEYXRhVG9Kc29uLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydFlqc0V2ZW50VG9QYXRjaGVzLnRzIiwiLi4vc3JjL2JpbmRpbmcvYmluZFlqc1RvTW9ieEtleXN0b25lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBBIG1vYngta2V5c3RvbmUteWpzIGVycm9yLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1vYnhLZXlzdG9uZVlqc0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nKSB7XHJcbiAgICBzdXBlcihtc2cpXHJcblxyXG4gICAgLy8gU2V0IHRoZSBwcm90b3R5cGUgZXhwbGljaXRseS5cclxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBNb2J4S2V5c3RvbmVZanNFcnJvci5wcm90b3R5cGUpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmFpbHVyZShtc2c6IHN0cmluZykge1xyXG4gIHJldHVybiBuZXcgTW9ieEtleXN0b25lWWpzRXJyb3IobXNnKVxyXG59XHJcbiIsImltcG9ydCB7IEFueVR5cGUsIGNyZWF0ZUNvbnRleHQgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXHJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcblxyXG4vKipcclxuICogQ29udGV4dCB3aXRoIGluZm8gb24gaG93IGEgbW9ieC1rZXlzdG9uZSBtb2RlbCBpcyBib3VuZCB0byBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFlqc0JpbmRpbmdDb250ZXh0IHtcclxuICAvKipcclxuICAgKiBUaGUgWS5qcyBkb2N1bWVudC5cclxuICAgKi9cclxuICB5anNEb2M6IFkuRG9jXHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBib3VuZCBZLmpzIGRhdGEgc3RydWN0dXJlLlxyXG4gICAqL1xyXG4gIHlqc09iamVjdDogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+IHwgWS5UZXh0XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBtb2J4LWtleXN0b25lIG1vZGVsIHR5cGUuXHJcbiAgICovXHJcbiAgbW9ieEtleXN0b25lVHlwZTogQW55VHlwZVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgb3JpZ2luIHN5bWJvbCB1c2VkIGZvciB0cmFuc2FjdGlvbnMuXHJcbiAgICovXHJcbiAgeWpzT3JpZ2luOiBzeW1ib2xcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGJvdW5kIG1vYngta2V5c3RvbmUgaW5zdGFuY2UuXHJcbiAgICovXHJcbiAgYm91bmRPYmplY3Q6IHVua25vd24gfCB1bmRlZmluZWRcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB3ZSBhcmUgY3VycmVudGx5IGFwcGx5aW5nIFkuanMgY2hhbmdlcyB0byB0aGUgbW9ieC1rZXlzdG9uZSBtb2RlbC5cclxuICAgKi9cclxuICBpc0FwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lOiBib29sZWFuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb250ZXh0IHdpdGggaW5mbyBvbiBob3cgYSBtb2J4LWtleXN0b25lIG1vZGVsIGlzIGJvdW5kIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cclxuICovXHJcbmV4cG9ydCBjb25zdCB5anNCaW5kaW5nQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8WWpzQmluZGluZ0NvbnRleHQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcclxuIiwiaW1wb3J0IHsgSUF0b20sIGNyZWF0ZUF0b20gfSBmcm9tIFwibW9ieFwiXHJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcblxyXG5jb25zdCB5anNDb2xsZWN0aW9uQXRvbXMgPSBuZXcgV2Vha01hcDxZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj4sIElBdG9tPigpXHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSA9IChcclxuICB5anNDb2xsZWN0aW9uOiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj5cclxuKTogSUF0b20gPT4ge1xyXG4gIGxldCBhdG9tID0geWpzQ29sbGVjdGlvbkF0b21zLmdldCh5anNDb2xsZWN0aW9uKVxyXG4gIGlmICghYXRvbSkge1xyXG4gICAgYXRvbSA9IGNyZWF0ZUF0b20oYHlqc0NvbGxlY3Rpb25BdG9tYClcclxuICAgIHlqc0NvbGxlY3Rpb25BdG9tcy5zZXQoeWpzQ29sbGVjdGlvbiwgYXRvbSlcclxuICB9XHJcbiAgcmV0dXJuIGF0b21cclxufVxyXG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxyXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcclxuaW1wb3J0IHsgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSB9IGZyb20gXCIuLi91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tXCJcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlWWpzUGF0aCh5anNPYmplY3Q6IHVua25vd24sIHBhdGg6IHJlYWRvbmx5IChzdHJpbmcgfCBudW1iZXIpW10pOiB1bmtub3duIHtcclxuICBsZXQgY3VycmVudFlqc09iamVjdDogdW5rbm93biA9IHlqc09iamVjdFxyXG5cclxuICBwYXRoLmZvckVhY2goKHBhdGhQYXJ0LCBpKSA9PiB7XHJcbiAgICBpZiAoY3VycmVudFlqc09iamVjdCBpbnN0YW5jZW9mIFkuTWFwKSB7XHJcbiAgICAgIGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20oY3VycmVudFlqc09iamVjdCkucmVwb3J0T2JzZXJ2ZWQoKVxyXG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcocGF0aFBhcnQpXHJcbiAgICAgIGN1cnJlbnRZanNPYmplY3QgPSBjdXJyZW50WWpzT2JqZWN0LmdldChrZXkpXHJcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRZanNPYmplY3QgaW5zdGFuY2VvZiBZLkFycmF5KSB7XHJcbiAgICAgIGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20oY3VycmVudFlqc09iamVjdCkucmVwb3J0T2JzZXJ2ZWQoKVxyXG4gICAgICBjb25zdCBrZXkgPSBOdW1iZXIocGF0aFBhcnQpXHJcbiAgICAgIGN1cnJlbnRZanNPYmplY3QgPSBjdXJyZW50WWpzT2JqZWN0LmdldChrZXkpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBmYWlsdXJlKFxyXG4gICAgICAgIGBZLk1hcCBvciBZLkFycmF5IHdhcyBleHBlY3RlZCBhdCBwYXRoICR7SlNPTi5zdHJpbmdpZnkoXHJcbiAgICAgICAgICBwYXRoLnNsaWNlKDAsIGkpXHJcbiAgICAgICAgKX0gaW4gb3JkZXIgdG8gcmVzb2x2ZSBwYXRoICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9LCBidXQgZ290ICR7Y3VycmVudFlqc09iamVjdH0gaW5zdGVhZGBcclxuICAgICAgKVxyXG4gICAgfVxyXG4gIH0pXHJcblxyXG4gIHJldHVybiBjdXJyZW50WWpzT2JqZWN0XHJcbn1cclxuIiwiaW1wb3J0IHsgSUF0b20sIGNvbXB1dGVkLCBjcmVhdGVBdG9tLCBvYnNlcnZlLCByZWFjdGlvbiB9IGZyb20gXCJtb2J4XCJcclxuaW1wb3J0IHtcclxuICBGcm96ZW4sXHJcbiAgTW9kZWwsXHJcbiAgZnJvemVuLFxyXG4gIGdldFBhcmVudFRvQ2hpbGRQYXRoLFxyXG4gIG1vZGVsLFxyXG4gIG9uU25hcHNob3QsXHJcbiAgdFByb3AsXHJcbiAgdHlwZXMsXHJcbn0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxyXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxyXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcclxuaW1wb3J0IHsgWWpzQmluZGluZ0NvbnRleHQsIHlqc0JpbmRpbmdDb250ZXh0IH0gZnJvbSBcIi4veWpzQmluZGluZ0NvbnRleHRcIlxyXG5pbXBvcnQgeyByZXNvbHZlWWpzUGF0aCB9IGZyb20gXCIuL3Jlc29sdmVZanNQYXRoXCJcclxuXHJcbi8vIERlbHRhW11bXSwgc2luY2UgZWFjaCBzaW5nbGUgY2hhbmdlIGlzIGEgRGVsdGFbXVxyXG4vLyB3ZSB1c2UgZnJvemVuIHNvIHRoYXQgd2UgY2FuIHJldXNlIGVhY2ggZGVsdGEgY2hhbmdlXHJcbmNvbnN0IGRlbHRhTGlzdFR5cGUgPSB0eXBlcy5hcnJheSh0eXBlcy5mcm96ZW4odHlwZXMudW5jaGVja2VkPHVua25vd25bXT4oKSkpXHJcblxyXG5leHBvcnQgY29uc3QgeWpzVGV4dE1vZGVsSWQgPSBcIm1vYngta2V5c3RvbmUteWpzL1lqc1RleHRNb2RlbFwiXHJcblxyXG4vKipcclxuICogQSBtb2J4LWtleXN0b25lIG1vZGVsIHRoYXQgcmVwcmVzZW50cyBhIFlqcy5UZXh0IG9iamVjdC5cclxuICovXHJcbkBtb2RlbCh5anNUZXh0TW9kZWxJZClcclxuZXhwb3J0IGNsYXNzIFlqc1RleHRNb2RlbCBleHRlbmRzIE1vZGVsKHtcclxuICBkZWx0YUxpc3Q6IHRQcm9wKGRlbHRhTGlzdFR5cGUsICgpID0+IFtdKSxcclxufSkge1xyXG4gIC8qKlxyXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBZanNUZXh0TW9kZWwgaW5zdGFuY2Ugd2l0aCBhIHNpbXBsZSB0ZXh0LlxyXG4gICAqL1xyXG4gIHN0YXRpYyB3aXRoVGV4dCh0ZXh0OiBzdHJpbmcpOiBZanNUZXh0TW9kZWwge1xyXG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0ZWRZanNUZXh0TW9kZWwoe1xyXG4gICAgICBkZWx0YUxpc3Q6IFtcclxuICAgICAgICBmcm96ZW4oW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBpbnNlcnQ6IHRleHQsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF0pLFxyXG4gICAgICBdLFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBZLmpzIHBhdGggZnJvbSB0aGUgYm91bmQgb2JqZWN0IHRvIHRoZSBZanNUZXh0TW9kZWwgaW5zdGFuY2UuXHJcbiAgICovXHJcbiAgQGNvbXB1dGVkXHJcbiAgcHJpdmF0ZSBnZXQgX3lqc09iamVjdFBhdGgoKSB7XHJcbiAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcclxuICAgIGlmICghY3R4IHx8IGN0eC5ib3VuZE9iamVjdCA9PSBudWxsKSB7XHJcbiAgICAgIHRocm93IGZhaWx1cmUoXHJcbiAgICAgICAgXCJ0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlIG11c3QgYmUgcGFydCBvZiBhIGJvdW5kIG9iamVjdCBiZWZvcmUgaXQgY2FuIGJlIGFjY2Vzc2VkXCJcclxuICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChjdHguYm91bmRPYmplY3QsIHRoaXMpXHJcbiAgICBpZiAoIXBhdGgpIHtcclxuICAgICAgdGhyb3cgZmFpbHVyZShcImEgcGF0aCBmcm9tIHRoZSBib3VuZCBvYmplY3QgdG8gdGhlIFlqc1RleHRNb2RlbCBpbnN0YW5jZSBpcyBub3QgYXZhaWxhYmxlXCIpXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBhdGhcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBZanMuVGV4dCBvYmplY3QgcHJlc2VudCBhdCB0aGlzIG1vYngta2V5c3RvbmUgbm9kZSdzIHBhdGguXHJcbiAgICovXHJcbiAgQGNvbXB1dGVkXHJcbiAgcHJpdmF0ZSBnZXQgX3lqc09iamVjdEF0UGF0aCgpOiB1bmtub3duIHtcclxuICAgIGNvbnN0IHBhdGggPSB0aGlzLl95anNPYmplY3RQYXRoXHJcblxyXG4gICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpIVxyXG5cclxuICAgIHJldHVybiByZXNvbHZlWWpzUGF0aChjdHgueWpzT2JqZWN0LCBwYXRoKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIFlqcy5UZXh0IG9iamVjdCByZXByZXNlbnRlZCBieSB0aGlzIG1vYngta2V5c3RvbmUgbm9kZS5cclxuICAgKi9cclxuICBAY29tcHV0ZWRcclxuICBnZXQgeWpzVGV4dCgpOiBZLlRleHQge1xyXG4gICAgY29uc3QgeWpzT2JqZWN0ID0gdGhpcy5feWpzT2JqZWN0QXRQYXRoXHJcblxyXG4gICAgaWYgKCEoeWpzT2JqZWN0IGluc3RhbmNlb2YgWS5UZXh0KSkge1xyXG4gICAgICB0aHJvdyBmYWlsdXJlKGBZLlRleHQgd2FzIGV4cGVjdGVkIGF0IHBhdGggJHtKU09OLnN0cmluZ2lmeSh0aGlzLl95anNPYmplY3RQYXRoKX1gKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB5anNPYmplY3RcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEF0b20gdGhhdCBnZXRzIGNoYW5nZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBZLmpzIHRleHQgY2hhbmdlcy5cclxuICAgKi9cclxuICB5anNUZXh0Q2hhbmdlZEF0b20gPSBjcmVhdGVBdG9tKFwieWpzVGV4dENoYW5nZWRBdG9tXCIpXHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBZanMuVGV4dCBvYmplY3QuXHJcbiAgICogU2hvcnRjdXQgZm9yIGB5anNUZXh0LnRvU3RyaW5nKClgLCBidXQgY29tcHV0ZWQuXHJcbiAgICovXHJcbiAgQGNvbXB1dGVkXHJcbiAgZ2V0IHRleHQoKTogc3RyaW5nIHtcclxuICAgIHRoaXMueWpzVGV4dENoYW5nZWRBdG9tLnJlcG9ydE9ic2VydmVkKClcclxuICAgIHJldHVybiB0aGlzLnlqc1RleHQudG9TdHJpbmcoKVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uSW5pdCgpIHtcclxuICAgIGNvbnN0IHNob3VsZFJlcGxpY2F0ZVRvWWpzID0gKGN0eDogWWpzQmluZGluZ0NvbnRleHQgfCB1bmRlZmluZWQpOiBjdHggaXMgWWpzQmluZGluZ0NvbnRleHQgPT4ge1xyXG4gICAgICByZXR1cm4gISFjdHggJiYgISFjdHguYm91bmRPYmplY3QgJiYgIWN0eC5pc0FwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlYXBwbHlEZWx0YXNUb1lqc1RleHQgPSBmYWxzZVxyXG4gICAgY29uc3QgbmV3RGVsdGFzOiBGcm96ZW48dW5rbm93bltdPltdID0gW11cclxuXHJcbiAgICBsZXQgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxyXG5cclxuICAgIGNvbnN0IGRpc3Bvc2VSZWFjdGlvblRvRGVsdGFMaXN0UmVmQ2hhbmdlID0gcmVhY3Rpb24oXHJcbiAgICAgICgpID0+IHRoaXMuJC5kZWx0YUxpc3QsXHJcbiAgICAgIChkZWx0YUxpc3QpID0+IHtcclxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdD8uKClcclxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICBpZiAoZGVsdGFMaXN0KSB7XHJcbiAgICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IG9ic2VydmUodGhpcy4kLmRlbHRhTGlzdCwgKGNoYW5nZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVhcHBseURlbHRhc1RvWWpzVGV4dCkge1xyXG4gICAgICAgICAgICAgIC8vIGFscmVhZHkgZ29ubmEgcmVwbGFjZSB0aGVtIGFsbFxyXG4gICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghc2hvdWxkUmVwbGljYXRlVG9ZanMoeWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpKSkge1xyXG4gICAgICAgICAgICAgIC8vIHlqcyB0ZXh0IGlzIGFscmVhZHkgdXAgdG8gZGF0ZSB3aXRoIHRoZXNlIGNoYW5nZXNcclxuICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgIGNoYW5nZS50eXBlID09PSBcInNwbGljZVwiICYmXHJcbiAgICAgICAgICAgICAgY2hhbmdlLnJlbW92ZWRDb3VudCA9PT0gMCAmJlxyXG4gICAgICAgICAgICAgIGNoYW5nZS5hZGRlZENvdW50ID4gMCAmJlxyXG4gICAgICAgICAgICAgIGNoYW5nZS5pbmRleCA9PT0gdGhpcy5kZWx0YUxpc3QubGVuZ3RoXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIC8vIG9wdGltaXphdGlvbiwganVzdCBhZGRpbmcgbmV3IG9uZXMgdG8gdGhlIGVuZFxyXG4gICAgICAgICAgICAgIG5ld0RlbHRhcy5wdXNoKC4uLmNoYW5nZS5hZGRlZClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBhbnkgb3RoZXIgY2hhbmdlLCB3ZSBuZWVkIHRvIHJlYXBwbHkgYWxsIGRlbHRhc1xyXG4gICAgICAgICAgICAgIHJlYXBwbHlEZWx0YXNUb1lqc1RleHQgPSB0cnVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICB7IGZpcmVJbW1lZGlhdGVseTogdHJ1ZSB9XHJcbiAgICApXHJcblxyXG4gICAgY29uc3QgZGlzcG9zZU9uU25hcHNob3QgPSBvblNuYXBzaG90KHRoaXMsICgpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAocmVhcHBseURlbHRhc1RvWWpzVGV4dCkge1xyXG4gICAgICAgICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXHJcblxyXG4gICAgICAgICAgaWYgKHNob3VsZFJlcGxpY2F0ZVRvWWpzKGN0eCkpIHtcclxuICAgICAgICAgICAgY29uc3QgeyB5anNUZXh0IH0gPSB0aGlzXHJcblxyXG4gICAgICAgICAgICBjdHgueWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcclxuICAgICAgICAgICAgICAvLyBkaWRuJ3QgZmluZCBhIGJldHRlciB3YXkgdGhhbiB0aGlzIHRvIHJlYXBwbHkgYWxsIGRlbHRhc1xyXG4gICAgICAgICAgICAgIC8vIHdpdGhvdXQgaGF2aW5nIHRvIHJlLWNyZWF0ZSB0aGUgWS5UZXh0IG9iamVjdFxyXG4gICAgICAgICAgICAgIGlmICh5anNUZXh0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHlqc1RleHQuZGVsZXRlKDAsIHlqc1RleHQubGVuZ3RoKVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5kZWx0YUxpc3QuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB5anNUZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSwgY3R4Lnlqc09yaWdpbilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKG5ld0RlbHRhcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcclxuXHJcbiAgICAgICAgICBpZiAoc2hvdWxkUmVwbGljYXRlVG9ZanMoY3R4KSkge1xyXG4gICAgICAgICAgICBjb25zdCB7IHlqc1RleHQgfSA9IHRoaXNcclxuXHJcbiAgICAgICAgICAgIGN0eC55anNEb2MudHJhbnNhY3QoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIG5ld0RlbHRhcy5mb3JFYWNoKChmcm96ZW5EZWx0YXMpID0+IHtcclxuICAgICAgICAgICAgICAgIHlqc1RleHQuYXBwbHlEZWx0YShmcm96ZW5EZWx0YXMuZGF0YSlcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9LCBjdHgueWpzT3JpZ2luKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICByZWFwcGx5RGVsdGFzVG9ZanNUZXh0ID0gZmFsc2VcclxuICAgICAgICBuZXdEZWx0YXMubGVuZ3RoID0gMFxyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnN0IGRpcG9zZVlqc1RleHRDaGFuZ2VkQXRvbSA9IGhvb2tZanNUZXh0Q2hhbmdlZEF0b20oXHJcbiAgICAgICgpID0+IHRoaXMueWpzVGV4dCxcclxuICAgICAgdGhpcy55anNUZXh0Q2hhbmdlZEF0b21cclxuICAgIClcclxuXHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICBkaXNwb3NlT25TbmFwc2hvdCgpXHJcbiAgICAgIGRpc3Bvc2VSZWFjdGlvblRvRGVsdGFMaXN0UmVmQ2hhbmdlKClcclxuICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q/LigpXHJcbiAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gdW5kZWZpbmVkXHJcblxyXG4gICAgICBkaXBvc2VZanNUZXh0Q2hhbmdlZEF0b20oKVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8gd2UgdXNlIHRoaXMgdHJpY2sganVzdCB0byBhdm9pZCBhIGJhYmVsIGJ1ZyB0aGF0IGNhdXNlcyBjbGFzc2VzIHVzZWQgaW5zaWRlIGNsYXNzZXMgbm90IHRvIGJlIG92ZXJyaWRlblxyXG4vLyBieSB0aGUgZGVjb3JhdG9yXHJcbmNvbnN0IERlY29yYXRlZFlqc1RleHRNb2RlbCA9IFlqc1RleHRNb2RlbFxyXG5cclxuZnVuY3Rpb24gaG9va1lqc1RleHRDaGFuZ2VkQXRvbShnZXRZanNUZXh0OiAoKSA9PiBZLlRleHQsIHRleHRDaGFuZ2VkQXRvbTogSUF0b20pIHtcclxuICBsZXQgZGlzcG9zZU9ic2VydmVZanNUZXh0OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWRcclxuXHJcbiAgY29uc3Qgb2JzZXJ2ZUZuID0gKCkgPT4ge1xyXG4gICAgdGV4dENoYW5nZWRBdG9tLnJlcG9ydENoYW5nZWQoKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgZGlzcG9zZVJlYWN0aW9uVG9ZVGV4dENoYW5nZSA9IHJlYWN0aW9uKFxyXG4gICAgKCkgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHJldHVybiBnZXRZanNUZXh0KClcclxuICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgKHlqc1RleHQpID0+IHtcclxuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0Py4oKVxyXG4gICAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQgPSB1bmRlZmluZWRcclxuXHJcbiAgICAgIGlmICh5anNUZXh0KSB7XHJcbiAgICAgICAgeWpzVGV4dC5vYnNlcnZlKG9ic2VydmVGbilcclxuXHJcbiAgICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gKCkgPT4ge1xyXG4gICAgICAgICAgeWpzVGV4dC51bm9ic2VydmUob2JzZXJ2ZUZuKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGV4dENoYW5nZWRBdG9tLnJlcG9ydENoYW5nZWQoKVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgZmlyZUltbWVkaWF0ZWx5OiB0cnVlLFxyXG4gICAgfVxyXG4gIClcclxuXHJcbiAgcmV0dXJuICgpID0+IHtcclxuICAgIGRpc3Bvc2VSZWFjdGlvblRvWVRleHRDaGFuZ2UoKVxyXG4gICAgZGlzcG9zZU9ic2VydmVZanNUZXh0Py4oKVxyXG4gICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcbmltcG9ydCB7IEpzb25WYWx1ZSwgSnNvbkFycmF5LCBKc29uT2JqZWN0LCBKc29uUHJpbWl0aXZlIH0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXHJcbmltcG9ydCB7IFlqc1RleHRNb2RlbCwgeWpzVGV4dE1vZGVsSWQgfSBmcm9tIFwiLi9ZanNUZXh0TW9kZWxcIlxyXG5pbXBvcnQgeyBTbmFwc2hvdE91dE9mIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxyXG5cclxuZnVuY3Rpb24gaXNKc29uUHJpbWl0aXZlKHY6IEpzb25WYWx1ZSk6IHYgaXMgSnNvblByaW1pdGl2ZSB7XHJcbiAgY29uc3QgdCA9IHR5cGVvZiB2XHJcbiAgcmV0dXJuIHQgPT09IFwic3RyaW5nXCIgfHwgdCA9PT0gXCJudW1iZXJcIiB8fCB0ID09PSBcImJvb2xlYW5cIiB8fCB2ID09PSBudWxsXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzSnNvbkFycmF5KHY6IEpzb25WYWx1ZSk6IHYgaXMgSnNvbkFycmF5IHtcclxuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2KVxyXG59XHJcblxyXG5mdW5jdGlvbiBpc0pzb25PYmplY3QodjogSnNvblZhbHVlKTogdiBpcyBKc29uT2JqZWN0IHtcclxuICByZXR1cm4gIWlzSnNvbkFycmF5KHYpICYmIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBhIEpTT04gdmFsdWUgdG8gYSBZLmpzIGRhdGEgc3RydWN0dXJlLlxyXG4gKiBPYmplY3RzIGFyZSBjb252ZXJ0ZWQgdG8gWS5NYXBzLCBhcnJheXMgdG8gWS5BcnJheXMsIHByaW1pdGl2ZXMgYXJlIHVudG91Y2hlZC5cclxuICogRnJvemVuIHZhbHVlcyBhcmUgYSBzcGVjaWFsIGNhc2UgYW5kIHRoZXkgYXJlIGtlcHQgYXMgaW1tdXRhYmxlIHBsYWluIHZhbHVlcy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0SnNvblRvWWpzRGF0YSh2OiBKc29uVmFsdWUpIHtcclxuICBpZiAodiA9PT0gdW5kZWZpbmVkIHx8IGlzSnNvblByaW1pdGl2ZSh2KSkge1xyXG4gICAgcmV0dXJuIHZcclxuICB9XHJcblxyXG4gIGlmIChpc0pzb25BcnJheSh2KSkge1xyXG4gICAgY29uc3QgYXJyID0gbmV3IFkuQXJyYXkoKVxyXG4gICAgYXBwbHlKc29uQXJyYXlUb1lBcnJheShhcnIsIHYpXHJcbiAgICByZXR1cm4gYXJyXHJcbiAgfVxyXG5cclxuICBpZiAoaXNKc29uT2JqZWN0KHYpKSB7XHJcbiAgICBpZiAodi4kZnJvemVuID09PSB0cnVlKSB7XHJcbiAgICAgIC8vIGZyb3plbiB2YWx1ZSwgc2F2ZSBhcyBpbW11dGFibGUgb2JqZWN0XHJcbiAgICAgIHJldHVybiB2XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHYuJG1vZGVsVHlwZSA9PT0geWpzVGV4dE1vZGVsSWQpIHtcclxuICAgICAgY29uc3QgdGV4dCA9IG5ldyBZLlRleHQoKVxyXG4gICAgICBjb25zdCB5anNUZXh0TW9kZWwgPSB2IGFzIFNuYXBzaG90T3V0T2Y8WWpzVGV4dE1vZGVsPlxyXG4gICAgICB5anNUZXh0TW9kZWwuZGVsdGFMaXN0LmZvckVhY2goKGZyb3plbkRlbHRhcykgPT4ge1xyXG4gICAgICAgIHRleHQuYXBwbHlEZWx0YShmcm96ZW5EZWx0YXMuZGF0YSlcclxuICAgICAgfSlcclxuICAgICAgcmV0dXJuIHRleHRcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtYXAgPSBuZXcgWS5NYXAoKVxyXG4gICAgYXBwbHlKc29uT2JqZWN0VG9ZTWFwKG1hcCwgdilcclxuICAgIHJldHVybiBtYXBcclxuICB9XHJcblxyXG4gIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgdmFsdWUgdHlwZTogJHt2fWApXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgSlNPTiBhcnJheSB0byBhIFkuQXJyYXksIHVzaW5nIHRoZSBjb252ZXJ0SnNvblRvWWpzRGF0YSB0byBjb252ZXJ0IHRoZSB2YWx1ZXMuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlKc29uQXJyYXlUb1lBcnJheShkZXN0OiBZLkFycmF5PHVua25vd24+LCBzb3VyY2U6IEpzb25BcnJheSkge1xyXG4gIGRlc3QucHVzaChzb3VyY2UubWFwKGNvbnZlcnRKc29uVG9ZanNEYXRhKSlcclxufVxyXG5cclxuLyoqXHJcbiAqIEFwcGxpZXMgYSBKU09OIG9iamVjdCB0byBhIFkuTWFwLCB1c2luZyB0aGUgY29udmVydEpzb25Ub1lqc0RhdGEgdG8gY29udmVydCB0aGUgdmFsdWVzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SnNvbk9iamVjdFRvWU1hcChkZXN0OiBZLk1hcDx1bmtub3duPiwgc291cmNlOiBKc29uT2JqZWN0KSB7XHJcbiAgT2JqZWN0LmVudHJpZXMoc291cmNlKS5mb3JFYWNoKChbaywgdl0pID0+IHtcclxuICAgIGRlc3Quc2V0KGssIGNvbnZlcnRKc29uVG9ZanNEYXRhKHYpKVxyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IHsgUGF0Y2ggfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXHJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxyXG5pbXBvcnQgeyBjb252ZXJ0SnNvblRvWWpzRGF0YSB9IGZyb20gXCIuL2NvbnZlcnRKc29uVG9ZanNEYXRhXCJcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QocGF0Y2g6IFBhdGNoLCB5anM6IHVua25vd24pOiB2b2lkIHtcclxuICBpZiAocGF0Y2gucGF0aC5sZW5ndGggPiAxKSB7XHJcbiAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGNoLnBhdGhcclxuXHJcbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSB5anMuZ2V0KFN0cmluZyhrZXkpKVxyXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRocm93IGZhaWx1cmUoXHJcbiAgICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gWWpzIG1hcCAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KHBhdGNoKX1gXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxyXG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLkFycmF5KSB7XHJcbiAgICAgIGNvbnN0IGNoaWxkID0geWpzLmdldChOdW1iZXIoa2V5KSlcclxuICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aHJvdyBmYWlsdXJlKFxyXG4gICAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIFlqcyBhcnJheSAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KFxyXG4gICAgICAgICAgICBwYXRjaFxyXG4gICAgICAgICAgKX1gXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxyXG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLlRleHQpIHtcclxuICAgICAgLy8gY2hhbmdlcyB0byBkZWx0YUxpc3Qgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBhcnJheSBvYnNlcnZlIGluIHRoZSBZanNUZXh0TW9kZWwgY2xhc3NcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IGZhaWx1cmUoXHJcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIHVua25vd24gWWpzIG9iamVjdCAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KFxyXG4gICAgICAgICAgcGF0Y2hcclxuICAgICAgICApfWBcclxuICAgICAgKVxyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAocGF0Y2gucGF0aC5sZW5ndGggPT09IDEpIHtcclxuICAgIGlmICh5anMgaW5zdGFuY2VvZiBZLk1hcCkge1xyXG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcocGF0Y2gucGF0aFswXSlcclxuXHJcbiAgICAgIHN3aXRjaCAocGF0Y2gub3ApIHtcclxuICAgICAgICBjYXNlIFwiYWRkXCI6XHJcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xyXG4gICAgICAgICAgeWpzLnNldChrZXksIGNvbnZlcnRKc29uVG9ZanNEYXRhKHBhdGNoLnZhbHVlKSlcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xyXG4gICAgICAgICAgeWpzLmRlbGV0ZShrZXkpXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIG9wZXJhdGlvbiBmb3IgbWFwYClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xyXG4gICAgICBjb25zdCBrZXkgPSBwYXRjaC5wYXRoWzBdXHJcblxyXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XHJcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xyXG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJsZW5ndGhcIikge1xyXG4gICAgICAgICAgICBpZiAoeWpzLmxlbmd0aCA+IHBhdGNoLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdG9EZWxldGUgPSB5anMubGVuZ3RoIC0gcGF0Y2gudmFsdWVcclxuICAgICAgICAgICAgICB5anMuZGVsZXRlKHBhdGNoLnZhbHVlLCB0b0RlbGV0ZSlcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh5anMubGVuZ3RoIDwgcGF0Y2gudmFsdWUpIHtcclxuICAgICAgICAgICAgICBjb25zdCB0b0luc2VydCA9IHBhdGNoLnZhbHVlIC0geWpzLmxlbmd0aFxyXG4gICAgICAgICAgICAgIHlqcy5pbnNlcnQoeWpzLmxlbmd0aCwgQXJyYXkodG9JbnNlcnQpLmZpbGwodW5kZWZpbmVkKSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcclxuICAgICAgICAgICAgeWpzLmluc2VydChOdW1iZXIoa2V5KSwgW2NvbnZlcnRKc29uVG9ZanNEYXRhKHBhdGNoLnZhbHVlKV0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXNlIFwiYWRkXCI6IHtcclxuICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSldKVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XHJcbiAgICAgICAgICB5anMuZGVsZXRlKE51bWJlcihrZXkpKVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIGFycmF5YClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5UZXh0KSB7XHJcbiAgICAgIC8vIGluaXRpYWxpemF0aW9uIG9mIGEgWWpzVGV4dE1vZGVsLCBkbyBub3RoaW5nXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBmYWlsdXJlKFxyXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIHRoZSBZanMgb2JqZWN0IGlzIG9mIGFuIHVua293biB0eXBlLCBzbyBrZXkgXCIke3BhdGNoLnBhdGhbMF19XCIgY2Fubm90IGJlIGZvdW5kIGluIGl0YFxyXG4gICAgICApXHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggcGF0aCwgaXQgY2Fubm90IGJlIGVtcHR5YClcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgbW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YSB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcclxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgSnNvblZhbHVlIH0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXHJcbmltcG9ydCB7IFlqc1RleHRNb2RlbCB9IGZyb20gXCIuL1lqc1RleHRNb2RlbFwiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFlqc0RhdGFUb0pzb24oXHJcbiAgeWpzRGF0YTogWS5BcnJheTx1bmtub3duPiB8IFkuTWFwPHVua25vd24+IHwgWS5UZXh0IHwgdW5rbm93blxyXG4pOiBKc29uVmFsdWUge1xyXG4gIGlmICh5anNEYXRhIGluc3RhbmNlb2YgWS5BcnJheSkge1xyXG4gICAgcmV0dXJuIHlqc0RhdGEubWFwKCh2KSA9PiBjb252ZXJ0WWpzRGF0YVRvSnNvbih2KSlcclxuICB9XHJcblxyXG4gIGlmICh5anNEYXRhIGluc3RhbmNlb2YgWS5NYXApIHtcclxuICAgIGNvbnN0IG9iajogUmVjb3JkPHN0cmluZywgSnNvblZhbHVlPiA9IHt9XHJcbiAgICB5anNEYXRhLmZvckVhY2goKHYsIGspID0+IHtcclxuICAgICAgb2JqW2tdID0gY29udmVydFlqc0RhdGFUb0pzb24odilcclxuICAgIH0pXHJcbiAgICByZXR1cm4gb2JqXHJcbiAgfVxyXG5cclxuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuVGV4dCkge1xyXG4gICAgY29uc3QgZGVsdGFzID0geWpzRGF0YS50b0RlbHRhKClcclxuXHJcbiAgICByZXR1cm4gbW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YShZanNUZXh0TW9kZWwsIHtcclxuICAgICAgZGVsdGFMaXN0OiBkZWx0YXMubGVuZ3RoID4gMCA/IFt7ICRmcm96ZW46IHRydWUsIGRhdGE6IGRlbHRhcyB9XSA6IFtdLFxyXG4gICAgfSkgYXMgSnNvblZhbHVlXHJcbiAgfVxyXG5cclxuICAvLyBhc3N1bWUgaXQncyBhIHByaW1pdGl2ZVxyXG4gIHJldHVybiB5anNEYXRhIGFzIEpzb25WYWx1ZVxyXG59XHJcbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxyXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxyXG5pbXBvcnQgeyBKc29uQXJyYXksIEpzb25PYmplY3QsIEpzb25WYWx1ZSB9IGZyb20gXCIuLi9qc29uVHlwZXNcIlxyXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMoZXZlbnQ6IFkuWUV2ZW50PGFueT4pOiBQYXRjaFtdIHtcclxuICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cclxuXHJcbiAgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZTWFwRXZlbnQpIHtcclxuICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50LnRhcmdldCBhcyBZLk1hcDxhbnk+XHJcblxyXG4gICAgZXZlbnQuY2hhbmdlcy5rZXlzLmZvckVhY2goKGNoYW5nZSwga2V5KSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwga2V5XVxyXG5cclxuICAgICAgc3dpdGNoIChjaGFuZ2UuYWN0aW9uKSB7XHJcbiAgICAgICAgY2FzZSBcImFkZFwiOlxyXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgb3A6IFwiYWRkXCIsXHJcbiAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUoc291cmNlLmdldChrZXkpKSxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBicmVha1xyXG5cclxuICAgICAgICBjYXNlIFwidXBkYXRlXCI6XHJcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICBvcDogXCJyZXBsYWNlXCIsXHJcbiAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUoc291cmNlLmdldChrZXkpKSxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBicmVha1xyXG5cclxuICAgICAgICBjYXNlIFwiZGVsZXRlXCI6XHJcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcclxuICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBicmVha1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgdW5zdXBwb3J0ZWQgWWpzIG1hcCBldmVudCBhY3Rpb246ICR7Y2hhbmdlLmFjdGlvbn1gKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllBcnJheUV2ZW50KSB7XHJcbiAgICBsZXQgcmV0YWluID0gMFxyXG4gICAgZXZlbnQuY2hhbmdlcy5kZWx0YS5mb3JFYWNoKChjaGFuZ2UpID0+IHtcclxuICAgICAgaWYgKGNoYW5nZS5yZXRhaW4pIHtcclxuICAgICAgICByZXRhaW4gKz0gY2hhbmdlLnJldGFpblxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY2hhbmdlLmRlbGV0ZSkge1xyXG4gICAgICAgIC8vIHJlbW92ZSBYIGl0ZW1zIGF0IHJldGFpbiBwb3NpdGlvblxyXG4gICAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgcmV0YWluXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlLmRlbGV0ZTsgaSsrKSB7XHJcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcclxuICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY2hhbmdlLmluc2VydCkge1xyXG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IEFycmF5LmlzQXJyYXkoY2hhbmdlLmluc2VydCkgPyBjaGFuZ2UuaW5zZXJ0IDogW2NoYW5nZS5pbnNlcnRdXHJcbiAgICAgICAgbmV3VmFsdWVzLmZvckVhY2goKHYpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgcmV0YWluXVxyXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgb3A6IFwiYWRkXCIsXHJcbiAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUodiksXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgcmV0YWluKytcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllUZXh0RXZlbnQpIHtcclxuICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgXCJkZWx0YUxpc3RcIiwgLTEgLyogbGFzdCBpdGVtICovXVxyXG4gICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgb3A6IFwiYWRkXCIsXHJcbiAgICAgIHBhdGgsXHJcbiAgICAgIHZhbHVlOiB7ICRmcm96ZW46IHRydWUsIGRhdGE6IGV2ZW50LmRlbHRhIH0sXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHBhdGNoZXNcclxufVxyXG5cclxuZnVuY3Rpb24gdG9QbGFpblZhbHVlKHY6IFkuTWFwPGFueT4gfCBZLkFycmF5PGFueT4gfCBKc29uVmFsdWUpIHtcclxuICBpZiAodiBpbnN0YW5jZW9mIFkuTWFwIHx8IHYgaW5zdGFuY2VvZiBZLkFycmF5KSB7XHJcbiAgICByZXR1cm4gdi50b0pTT04oKSBhcyBKc29uT2JqZWN0IHwgSnNvbkFycmF5XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiB2XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcclxuaW1wb3J0IHtcclxuICBBbnlEYXRhTW9kZWwsXHJcbiAgQW55TW9kZWwsXHJcbiAgQW55U3RhbmRhcmRUeXBlLFxyXG4gIE1vZGVsQ2xhc3MsXHJcbiAgUGF0Y2gsXHJcbiAgVHlwZVRvRGF0YSxcclxuICBhcHBseVBhdGNoZXMsXHJcbiAgZnJvbVNuYXBzaG90LFxyXG4gIGdldFBhcmVudFRvQ2hpbGRQYXRoLFxyXG4gIG9uR2xvYmFsUGF0Y2hlcyxcclxuICBvblBhdGNoZXMsXHJcbiAgb25TbmFwc2hvdCxcclxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXHJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcbmltcG9ydCB7IGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20gfSBmcm9tIFwiLi4vdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbVwiXHJcbmltcG9ydCB7IGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCB9IGZyb20gXCIuL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdFwiXHJcbmltcG9ydCB7IGNvbnZlcnRZanNEYXRhVG9Kc29uIH0gZnJvbSBcIi4vY29udmVydFlqc0RhdGFUb0pzb25cIlxyXG5pbXBvcnQgeyBjb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMgfSBmcm9tIFwiLi9jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXNcIlxyXG5pbXBvcnQgeyBZanNCaW5kaW5nQ29udGV4dCwgeWpzQmluZGluZ0NvbnRleHQgfSBmcm9tIFwiLi95anNCaW5kaW5nQ29udGV4dFwiXHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIGJpZGlyZWN0aW9uYWwgYmluZGluZyBiZXR3ZWVuIGEgWS5qcyBkYXRhIHN0cnVjdHVyZSBhbmQgYSBtb2J4LWtleXN0b25lIG1vZGVsLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRZanNUb01vYnhLZXlzdG9uZTxcclxuICBUVHlwZSBleHRlbmRzIEFueVN0YW5kYXJkVHlwZSB8IE1vZGVsQ2xhc3M8QW55TW9kZWw+IHwgTW9kZWxDbGFzczxBbnlEYXRhTW9kZWw+LFxyXG4+KHtcclxuICB5anNEb2MsXHJcbiAgeWpzT2JqZWN0LFxyXG4gIG1vYnhLZXlzdG9uZVR5cGUsXHJcbn06IHtcclxuICAvKipcclxuICAgKiBUaGUgWS5qcyBkb2N1bWVudC5cclxuICAgKi9cclxuICB5anNEb2M6IFkuRG9jXHJcbiAgLyoqXHJcbiAgICogVGhlIGJvdW5kIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXHJcbiAgICovXHJcbiAgeWpzT2JqZWN0OiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj4gfCBZLlRleHRcclxuICAvKipcclxuICAgKiBUaGUgbW9ieC1rZXlzdG9uZSBtb2RlbCB0eXBlLlxyXG4gICAqL1xyXG4gIG1vYnhLZXlzdG9uZVR5cGU6IFRUeXBlXHJcbn0pOiB7XHJcbiAgLyoqXHJcbiAgICogVGhlIGJvdW5kIG1vYngta2V5c3RvbmUgaW5zdGFuY2UuXHJcbiAgICovXHJcbiAgYm91bmRPYmplY3Q6IFR5cGVUb0RhdGE8VFR5cGU+XHJcbiAgLyoqXHJcbiAgICogRGlzcG9zZXMgdGhlIGJpbmRpbmcuXHJcbiAgICovXHJcbiAgZGlzcG9zZSgpOiB2b2lkXHJcbiAgLyoqXHJcbiAgICogVGhlIFkuanMgb3JpZ2luIHN5bWJvbCB1c2VkIGZvciBiaW5kaW5nIHRyYW5zYWN0aW9ucy5cclxuICAgKi9cclxuICB5anNPcmlnaW46IHN5bWJvbFxyXG59IHtcclxuICBjb25zdCB5anNPcmlnaW4gPSBTeW1ib2woXCJiaW5kWWpzVG9Nb2J4S2V5c3RvbmVUcmFuc2FjdGlvbk9yaWdpblwiKVxyXG5cclxuICBsZXQgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPSAwXHJcblxyXG4gIGNvbnN0IGJpbmRpbmdDb250ZXh0OiBZanNCaW5kaW5nQ29udGV4dCA9IHtcclxuICAgIHlqc0RvYyxcclxuICAgIHlqc09iamVjdCxcclxuICAgIG1vYnhLZXlzdG9uZVR5cGUsXHJcbiAgICB5anNPcmlnaW4sXHJcbiAgICBib3VuZE9iamVjdDogdW5kZWZpbmVkLCAvLyBub3QgeWV0IGNyZWF0ZWRcclxuXHJcbiAgICBnZXQgaXNBcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSgpIHtcclxuICAgICAgcmV0dXJuIGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID4gMFxyXG4gICAgfSxcclxuICB9XHJcblxyXG4gIGNvbnN0IHlqc0pzb24gPSBjb252ZXJ0WWpzRGF0YVRvSnNvbih5anNPYmplY3QpXHJcblxyXG4gIGNvbnN0IGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlczogeyB0YXJnZXQ6IG9iamVjdDsgcGF0Y2hlczogUGF0Y2hbXSB9W10gPSBbXVxyXG5cclxuICBjb25zdCBjcmVhdGVCb3VuZE9iamVjdCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMgPSBvbkdsb2JhbFBhdGNoZXMoKHRhcmdldCwgcGF0Y2hlcykgPT4ge1xyXG4gICAgICBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXMucHVzaCh7IHRhcmdldCwgcGF0Y2hlcyB9KVxyXG4gICAgfSlcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBib3VuZE9iamVjdCA9IHlqc0JpbmRpbmdDb250ZXh0LmFwcGx5KFxyXG4gICAgICAgICgpID0+IGZyb21TbmFwc2hvdChtb2J4S2V5c3RvbmVUeXBlLCB5anNKc29uIGFzIGFueSksXHJcbiAgICAgICAgYmluZGluZ0NvbnRleHRcclxuICAgICAgKVxyXG4gICAgICB5anNCaW5kaW5nQ29udGV4dC5zZXQoYm91bmRPYmplY3QsIHsgLi4uYmluZGluZ0NvbnRleHQsIGJvdW5kT2JqZWN0IH0pXHJcbiAgICAgIHJldHVybiBib3VuZE9iamVjdFxyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgZGlzcG9zZU9uR2xvYmFsUGF0Y2hlcygpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdCBib3VuZE9iamVjdCA9IGNyZWF0ZUJvdW5kT2JqZWN0KClcclxuXHJcbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIHlqcyB0byBtb2J4LWtleXN0b25lXHJcbiAgY29uc3Qgb2JzZXJ2ZURlZXBDYiA9IGFjdGlvbigoZXZlbnRzOiBZLllFdmVudDxhbnk+W10pID0+IHtcclxuICAgIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxyXG4gICAgZXZlbnRzLmZvckVhY2goKGV2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChldmVudC50cmFuc2FjdGlvbi5vcmlnaW4gIT09IHlqc09yaWdpbikge1xyXG4gICAgICAgIHBhdGNoZXMucHVzaCguLi5jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMoZXZlbnQpKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgWS5NYXAgfHwgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgWS5BcnJheSkge1xyXG4gICAgICAgIGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20oZXZlbnQudGFyZ2V0KS5yZXBvcnRDaGFuZ2VkKClcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICBpZiAocGF0Y2hlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lKytcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhcHBseVBhdGNoZXMoYm91bmRPYmplY3QsIHBhdGNoZXMpXHJcbiAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUtLVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbiAgeWpzT2JqZWN0Lm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXHJcblxyXG4gIC8vIGJpbmQgYW55IGNoYW5nZXMgZnJvbSBtb2J4LWtleXN0b25lIHRvIHlqc1xyXG4gIGxldCBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzOiBQYXRjaFtdW10gPSBbXVxyXG4gIGNvbnN0IGRpc3Bvc2VPblBhdGNoZXMgPSBvblBhdGNoZXMoYm91bmRPYmplY3QsIChwYXRjaGVzKSA9PiB7XHJcbiAgICBpZiAoYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPiAwKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXMucHVzaChwYXRjaGVzKVxyXG4gIH0pXHJcblxyXG4gIC8vIHRoaXMgaXMgb25seSB1c2VkIHNvIHdlIGNhbiB0cmFuc2FjdCBhbGwgcGF0Y2hlcyB0byB0aGUgc25hcHNob3QgYm91bmRhcnlcclxuICBjb25zdCBkaXNwb3NlT25TbmFwc2hvdCA9IG9uU25hcHNob3QoYm91bmRPYmplY3QsICgpID0+IHtcclxuICAgIGlmIChwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhcnJheU9mQXJyYXlPZlBhdGNoZXMgPSBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzXHJcbiAgICBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzID0gW11cclxuXHJcbiAgICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xyXG4gICAgICBhcnJheU9mQXJyYXlPZlBhdGNoZXMuZm9yRWFjaCgoYXJyYXlPZlBhdGNoZXMpID0+IHtcclxuICAgICAgICBhcnJheU9mUGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xyXG4gICAgICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoLCB5anNPYmplY3QpXHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgIH0sIHlqc09yaWdpbilcclxuICB9KVxyXG5cclxuICAvLyBzeW5jIGluaXRpYWwgcGF0Y2hlcywgdGhhdCBtaWdodCBpbmNsdWRlIHNldHRpbmcgZGVmYXVsdHMsIElEcywgZXRjXHJcbiAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcclxuICAgIC8vIHdlIG5lZWQgdG8gc2tpcCBpbml0aWFsaXphdGlvbnMgdW50aWwgd2UgaGl0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgYm91bmQgb2JqZWN0XHJcbiAgICAvLyB0aGlzIGlzIGJlY2F1c2UgZGVmYXVsdCBvYmplY3RzIG1pZ2h0IGJlIGNyZWF0ZWQgYW5kIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgbWFpbiBvYmplY3RcclxuICAgIC8vIGJ1dCB3ZSBqdXN0IG5lZWQgdG8gY2F0Y2ggd2hlbiB0aG9zZSBhcmUgYWN0dWFsbHkgYXNzaWduZWQgdG8gdGhlIGJvdW5kIG9iamVjdFxyXG4gICAgbGV0IGJvdW5kT2JqZWN0Rm91bmQgPSBmYWxzZVxyXG5cclxuICAgIGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlcy5mb3JFYWNoKCh7IHRhcmdldCwgcGF0Y2hlcyB9KSA9PiB7XHJcbiAgICAgIGlmICghYm91bmRPYmplY3RGb3VuZCkge1xyXG4gICAgICAgIGlmICh0YXJnZXQgIT09IGJvdW5kT2JqZWN0KSB7XHJcbiAgICAgICAgICByZXR1cm4gLy8gc2tpcFxyXG4gICAgICAgIH1cclxuICAgICAgICBib3VuZE9iamVjdEZvdW5kID0gdHJ1ZVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBwYXJlbnRUb0NoaWxkUGF0aCA9IGdldFBhcmVudFRvQ2hpbGRQYXRoKGJvdW5kT2JqZWN0LCB0YXJnZXQpXHJcbiAgICAgIC8vIHRoaXMgaXMgdW5kZWZpbmVkIG9ubHkgaWYgdGFyZ2V0IGlzIG5vdCBhIGNoaWxkIG9mIGJvdW5kTW9kZWxcclxuICAgICAgaWYgKHBhcmVudFRvQ2hpbGRQYXRoICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBwYXRjaGVzLmZvckVhY2goKHBhdGNoKSA9PiB7XHJcbiAgICAgICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAuLi5wYXRjaCxcclxuICAgICAgICAgICAgICBwYXRoOiBbLi4ucGFyZW50VG9DaGlsZFBhdGgsIC4uLnBhdGNoLnBhdGhdLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB5anNPYmplY3RcclxuICAgICAgICAgIClcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH0sIHlqc09yaWdpbilcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGJvdW5kT2JqZWN0LFxyXG4gICAgZGlzcG9zZTogKCkgPT4ge1xyXG4gICAgICBkaXNwb3NlT25QYXRjaGVzKClcclxuICAgICAgZGlzcG9zZU9uU25hcHNob3QoKVxyXG4gICAgICB5anNPYmplY3QudW5vYnNlcnZlRGVlcChvYnNlcnZlRGVlcENiKVxyXG4gICAgfSxcclxuICAgIHlqc09yaWdpbixcclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbImNyZWF0ZUNvbnRleHQiLCJjcmVhdGVBdG9tIiwiWSIsInR5cGVzIiwiWWpzVGV4dE1vZGVsIiwiTW9kZWwiLCJ0UHJvcCIsImZyb3plbiIsImdldFBhcmVudFRvQ2hpbGRQYXRoIiwicmVhY3Rpb24iLCJvYnNlcnZlIiwib25TbmFwc2hvdCIsImNvbXB1dGVkIiwiZXhwb3J0cyIsIm1vZGVsIiwibW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YSIsIm9uR2xvYmFsUGF0Y2hlcyIsImJvdW5kT2JqZWN0IiwiZnJvbVNuYXBzaG90IiwiYWN0aW9uIiwiYXBwbHlQYXRjaGVzIiwib25QYXRjaGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQUdNLE1BQU8sNkJBQTZCLE1BQUs7QUFBQSxJQUM3QyxZQUFZLEtBQVc7QUFDckIsWUFBTSxHQUFHO0FBR0YsYUFBQSxlQUFlLE1BQU0scUJBQXFCLFNBQVM7QUFBQSxJQUM1RDtBQUFBLEVBQ0Q7QUFLSyxXQUFVLFFBQVEsS0FBVztBQUMxQixXQUFBLElBQUkscUJBQXFCLEdBQUc7QUFBQSxFQUNyQztBQ3dCYSxRQUFBLG9CQUFvQkEsMkJBQTZDLE1BQVM7QUN0Q3ZGLFFBQU0seUNBQXlCO0FBS2xCLFFBQUEsK0JBQStCLENBQzFDLGtCQUNTO0FBQ0wsUUFBQSxPQUFPLG1CQUFtQixJQUFJLGFBQWE7QUFDL0MsUUFBSSxDQUFDLE1BQU07QUFDVCxhQUFPQyxnQkFBVyxtQkFBbUI7QUFDbEIseUJBQUEsSUFBSSxlQUFlLElBQUk7QUFBQSxJQUM1QztBQUNPLFdBQUE7QUFBQSxFQUNUO0FDYmdCLFdBQUEsZUFBZSxXQUFvQixNQUFrQztBQUNuRixRQUFJLG1CQUE0QjtBQUUzQixTQUFBLFFBQVEsQ0FBQyxVQUFVLE1BQUs7QUFDdkIsVUFBQSw0QkFBNEJDLGFBQUUsS0FBSztBQUNSLHFDQUFBLGdCQUFnQixFQUFFO0FBQ3pDLGNBQUEsTUFBTSxPQUFPLFFBQVE7QUFDUiwyQkFBQSxpQkFBaUIsSUFBSSxHQUFHO0FBQUEsTUFBQSxXQUNsQyw0QkFBNEJBLGFBQUUsT0FBTztBQUNqQixxQ0FBQSxnQkFBZ0IsRUFBRTtBQUN6QyxjQUFB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
@@ -0,0 +1,39 @@
1
+ import { IAtom } from "mobx";
2
+ import { Frozen } from "mobx-keystone";
3
+ import * as Y from "yjs";
4
+ export declare const yjsTextModelId = "mobx-keystone-yjs/YjsTextModel";
5
+ declare const YjsTextModel_base: import("mobx-keystone")._Model<unknown, {
6
+ deltaList: import("mobx-keystone").OptionalModelProp<Frozen<unknown[]>[]>;
7
+ }, never, never>;
8
+ /**
9
+ * A mobx-keystone model that represents a Yjs.Text object.
10
+ */
11
+ export declare class YjsTextModel extends YjsTextModel_base {
12
+ /**
13
+ * Helper function to create a YjsTextModel instance with a simple text.
14
+ */
15
+ static withText(text: string): YjsTextModel;
16
+ /**
17
+ * The Y.js path from the bound object to the YjsTextModel instance.
18
+ */
19
+ private get _yjsObjectPath();
20
+ /**
21
+ * The Yjs.Text object present at this mobx-keystone node's path.
22
+ */
23
+ private get _yjsObjectAtPath();
24
+ /**
25
+ * The Yjs.Text object represented by this mobx-keystone node.
26
+ */
27
+ get yjsText(): Y.Text;
28
+ /**
29
+ * Atom that gets changed when the associated Y.js text changes.
30
+ */
31
+ yjsTextChangedAtom: IAtom;
32
+ /**
33
+ * The text value of the Yjs.Text object.
34
+ * Shortcut for `yjsText.toString()`, but computed.
35
+ */
36
+ get text(): string;
37
+ protected onInit(): () => void;
38
+ }
39
+ export {};