mobx-keystone-yjs 1.5.4 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +57 -45
- package/dist/mobx-keystone-yjs.esm.js +475 -299
- package/dist/mobx-keystone-yjs.esm.mjs +475 -299
- package/dist/mobx-keystone-yjs.umd.js +475 -299
- package/dist/types/binding/YjsTextModel.d.ts +5 -4
- package/dist/types/binding/applyMobxChangeToYjsObject.d.ts +3 -0
- package/dist/types/binding/applyYjsEventToMobx.d.ts +8 -0
- package/dist/types/binding/bindYjsToMobxKeystone.d.ts +1 -1
- package/dist/types/binding/convertJsonToYjsData.d.ts +23 -4
- package/dist/types/binding/convertYjsDataToJson.d.ts +1 -1
- package/dist/types/binding/resolveYjsPath.d.ts +14 -1
- package/dist/types/binding/yjsBindingContext.d.ts +2 -2
- package/dist/types/binding/yjsSnapshotTracking.d.ts +24 -0
- package/dist/types/index.d.ts +7 -6
- package/dist/types/utils/isYjsValueDeleted.d.ts +7 -0
- package/package.json +90 -78
- package/src/binding/YjsTextModel.ts +280 -247
- package/src/binding/applyMobxChangeToYjsObject.ts +77 -0
- package/src/binding/applyYjsEventToMobx.ts +173 -0
- package/src/binding/bindYjsToMobxKeystone.ts +300 -192
- package/src/binding/convertJsonToYjsData.ts +218 -76
- package/src/binding/convertYjsDataToJson.ts +1 -1
- package/src/binding/resolveYjsPath.ts +51 -27
- package/src/binding/yjsSnapshotTracking.ts +40 -0
- package/src/index.ts +11 -10
- package/src/utils/getOrCreateYjsCollectionAtom.ts +27 -27
- package/src/utils/isYjsValueDeleted.ts +14 -0
- package/dist/types/binding/applyMobxKeystonePatchToYjsObject.d.ts +0 -2
- package/dist/types/binding/convertYjsEventToPatches.d.ts +0 -3
- package/src/binding/applyMobxKeystonePatchToYjsObject.ts +0 -98
- package/src/binding/convertYjsEventToPatches.ts +0 -92
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
(function(global, factory) {
|
|
2
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) {
|
|
3
|
+
})(this, (function(exports2, mobx, mobxKeystone, Y) {
|
|
4
4
|
"use strict";var __defProp = Object.defineProperty;
|
|
5
5
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
6
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
@@ -22,16 +22,6 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
22
22
|
return Object.freeze(n);
|
|
23
23
|
}
|
|
24
24
|
const Y__namespace = /* @__PURE__ */ _interopNamespaceDefault(Y);
|
|
25
|
-
function __decorate(decorators, target, key, desc) {
|
|
26
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
27
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
28
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
29
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
30
|
-
}
|
|
31
|
-
typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
|
|
32
|
-
var e = new Error(message);
|
|
33
|
-
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
34
|
-
};
|
|
35
25
|
class MobxKeystoneYjsError extends Error {
|
|
36
26
|
constructor(msg) {
|
|
37
27
|
super(msg);
|
|
@@ -41,7 +31,6 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
41
31
|
function failure(msg) {
|
|
42
32
|
return new MobxKeystoneYjsError(msg);
|
|
43
33
|
}
|
|
44
|
-
const yjsBindingContext = mobxKeystone.createContext(void 0);
|
|
45
34
|
const yjsCollectionAtoms = /* @__PURE__ */ new WeakMap();
|
|
46
35
|
const getYjsCollectionAtom = (yjsCollection) => {
|
|
47
36
|
return yjsCollectionAtoms.get(yjsCollection);
|
|
@@ -54,9 +43,21 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
54
43
|
}
|
|
55
44
|
return atom;
|
|
56
45
|
};
|
|
46
|
+
function isYjsValueDeleted(yjsValue) {
|
|
47
|
+
var _a, _b;
|
|
48
|
+
if (yjsValue instanceof Y__namespace.AbstractType) {
|
|
49
|
+
return !!((_a = yjsValue._item) == null ? void 0 : _a.deleted) || !!((_b = yjsValue.doc) == null ? void 0 : _b.isDestroyed);
|
|
50
|
+
}
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
57
53
|
function resolveYjsPath(yjsObject, path) {
|
|
58
54
|
let currentYjsObject = yjsObject;
|
|
59
|
-
|
|
55
|
+
let i = -1;
|
|
56
|
+
for (const pathPart of path) {
|
|
57
|
+
i++;
|
|
58
|
+
if (currentYjsObject instanceof Y__namespace.Text) {
|
|
59
|
+
return currentYjsObject;
|
|
60
|
+
}
|
|
60
61
|
if (currentYjsObject instanceof Y__namespace.Map) {
|
|
61
62
|
getOrCreateYjsCollectionAtom(currentYjsObject).reportObserved();
|
|
62
63
|
const key = String(pathPart);
|
|
@@ -66,14 +67,29 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
66
67
|
const key = Number(pathPart);
|
|
67
68
|
currentYjsObject = currentYjsObject.get(key);
|
|
68
69
|
} else {
|
|
69
|
-
throw failure(
|
|
70
|
+
throw failure(
|
|
71
|
+
`Y.Map or Y.Array was expected at path ${JSON.stringify(
|
|
72
|
+
path.slice(0, i)
|
|
73
|
+
)} in order to resolve path ${JSON.stringify(path)}, but got ${currentYjsObject} instead`
|
|
74
|
+
);
|
|
70
75
|
}
|
|
71
|
-
}
|
|
76
|
+
}
|
|
72
77
|
return currentYjsObject;
|
|
73
78
|
}
|
|
79
|
+
const yjsBindingContext = mobxKeystone.createContext(void 0);
|
|
80
|
+
var __defProp2 = Object.defineProperty;
|
|
81
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
82
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
83
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
84
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
85
|
+
if (decorator = decorators[i])
|
|
86
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
87
|
+
if (kind && result) __defProp2(target, key, result);
|
|
88
|
+
return result;
|
|
89
|
+
};
|
|
74
90
|
const deltaListType = mobxKeystone.types.array(mobxKeystone.types.frozen(mobxKeystone.types.unchecked()));
|
|
75
91
|
const yjsTextModelId = "mobx-keystone-yjs/YjsTextModel";
|
|
76
|
-
exports2.YjsTextModel = class
|
|
92
|
+
exports2.YjsTextModel = class YjsTextModel extends mobxKeystone.Model({
|
|
77
93
|
deltaList: mobxKeystone.tProp(deltaListType, () => [])
|
|
78
94
|
}) {
|
|
79
95
|
constructor() {
|
|
@@ -97,13 +113,12 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
97
113
|
]
|
|
98
114
|
});
|
|
99
115
|
}
|
|
100
|
-
/**
|
|
101
|
-
* The Y.js path from the bound object to the YjsTextModel instance.
|
|
102
|
-
*/
|
|
103
116
|
get _yjsObjectPath() {
|
|
104
117
|
const ctx = yjsBindingContext.get(this);
|
|
105
118
|
if ((ctx == null ? void 0 : ctx.boundObject) == null) {
|
|
106
|
-
throw failure(
|
|
119
|
+
throw failure(
|
|
120
|
+
"the YjsTextModel instance must be part of a bound object before it can be accessed"
|
|
121
|
+
);
|
|
107
122
|
}
|
|
108
123
|
const path = mobxKeystone.getParentToChildPath(ctx.boundObject, this);
|
|
109
124
|
if (!path) {
|
|
@@ -111,17 +126,11 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
111
126
|
}
|
|
112
127
|
return path;
|
|
113
128
|
}
|
|
114
|
-
/**
|
|
115
|
-
* The Yjs.Text object present at this mobx-keystone node's path.
|
|
116
|
-
*/
|
|
117
129
|
get _yjsObjectAtPath() {
|
|
118
130
|
const path = this._yjsObjectPath;
|
|
119
131
|
const ctx = yjsBindingContext.get(this);
|
|
120
132
|
return resolveYjsPath(ctx.yjsObject, path);
|
|
121
133
|
}
|
|
122
|
-
/**
|
|
123
|
-
* The Yjs.Text object represented by this mobx-keystone node.
|
|
124
|
-
*/
|
|
125
134
|
get yjsText() {
|
|
126
135
|
const yjsObject = this._yjsObjectAtPath;
|
|
127
136
|
if (!(yjsObject instanceof Y__namespace.Text)) {
|
|
@@ -129,13 +138,27 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
129
138
|
}
|
|
130
139
|
return yjsObject;
|
|
131
140
|
}
|
|
132
|
-
/**
|
|
133
|
-
* The text value of the Yjs.Text object.
|
|
134
|
-
* Shortcut for `yjsText.toString()`, but computed.
|
|
135
|
-
*/
|
|
136
141
|
get text() {
|
|
137
142
|
this.yjsTextChangedAtom.reportObserved();
|
|
138
|
-
|
|
143
|
+
const ctx = yjsBindingContext.get(this);
|
|
144
|
+
if ((ctx == null ? void 0 : ctx.boundObject) != null) {
|
|
145
|
+
try {
|
|
146
|
+
const yjsTextString = this.yjsText.toString();
|
|
147
|
+
if (yjsTextString !== "" || this.deltaList.length === 0) {
|
|
148
|
+
return yjsTextString;
|
|
149
|
+
}
|
|
150
|
+
} catch {
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return this.deltaListToText();
|
|
154
|
+
}
|
|
155
|
+
deltaListToText() {
|
|
156
|
+
const doc = new Y__namespace.Doc();
|
|
157
|
+
const text = doc.getText();
|
|
158
|
+
this.deltaList.forEach((d) => {
|
|
159
|
+
text.applyDelta(d.data);
|
|
160
|
+
});
|
|
161
|
+
return text.toString();
|
|
139
162
|
}
|
|
140
163
|
onInit() {
|
|
141
164
|
const shouldReplicateToYjs = (ctx) => {
|
|
@@ -144,29 +167,36 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
144
167
|
let reapplyDeltasToYjsText = false;
|
|
145
168
|
const newDeltas = [];
|
|
146
169
|
let disposeObserveDeltaList;
|
|
147
|
-
const disposeReactionToDeltaListRefChange = mobx.reaction(
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
170
|
+
const disposeReactionToDeltaListRefChange = mobx.reaction(
|
|
171
|
+
() => this.$.deltaList,
|
|
172
|
+
(deltaList) => {
|
|
173
|
+
disposeObserveDeltaList == null ? void 0 : disposeObserveDeltaList();
|
|
174
|
+
disposeObserveDeltaList = void 0;
|
|
175
|
+
disposeObserveDeltaList = mobx.observe(deltaList, (change) => {
|
|
176
|
+
if (reapplyDeltasToYjsText) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
if (!shouldReplicateToYjs(yjsBindingContext.get(this))) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
if (change.type === "splice" && change.removedCount === 0 && change.addedCount > 0 && change.index === this.deltaList.length) {
|
|
183
|
+
newDeltas.push(...change.added);
|
|
184
|
+
} else {
|
|
185
|
+
reapplyDeltasToYjsText = true;
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
},
|
|
189
|
+
{ fireImmediately: true }
|
|
190
|
+
);
|
|
164
191
|
const disposeOnSnapshot = mobxKeystone.onSnapshot(this, () => {
|
|
165
192
|
try {
|
|
166
193
|
if (reapplyDeltasToYjsText) {
|
|
167
194
|
const ctx = yjsBindingContext.get(this);
|
|
168
195
|
if (shouldReplicateToYjs(ctx)) {
|
|
169
196
|
const { yjsText } = this;
|
|
197
|
+
if (isYjsValueDeleted(yjsText)) {
|
|
198
|
+
throw failure("cannot reapply deltas to deleted Yjs.Text");
|
|
199
|
+
}
|
|
170
200
|
ctx.yjsDoc.transact(() => {
|
|
171
201
|
if (yjsText.length > 0) {
|
|
172
202
|
yjsText.delete(0, yjsText.length);
|
|
@@ -180,6 +210,9 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
180
210
|
const ctx = yjsBindingContext.get(this);
|
|
181
211
|
if (shouldReplicateToYjs(ctx)) {
|
|
182
212
|
const { yjsText } = this;
|
|
213
|
+
if (isYjsValueDeleted(yjsText)) {
|
|
214
|
+
throw failure("cannot reapply deltas to deleted Yjs.Text");
|
|
215
|
+
}
|
|
183
216
|
ctx.yjsDoc.transact(() => {
|
|
184
217
|
newDeltas.forEach((frozenDeltas) => {
|
|
185
218
|
yjsText.applyDelta(frozenDeltas.data);
|
|
@@ -192,7 +225,10 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
192
225
|
newDeltas.length = 0;
|
|
193
226
|
}
|
|
194
227
|
});
|
|
195
|
-
const diposeYjsTextChangedAtom = hookYjsTextChangedAtom(
|
|
228
|
+
const diposeYjsTextChangedAtom = hookYjsTextChangedAtom(
|
|
229
|
+
() => this.yjsText,
|
|
230
|
+
this.yjsTextChangedAtom
|
|
231
|
+
);
|
|
196
232
|
return () => {
|
|
197
233
|
disposeOnSnapshot();
|
|
198
234
|
disposeReactionToDeltaListRefChange();
|
|
@@ -202,19 +238,19 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
202
238
|
};
|
|
203
239
|
}
|
|
204
240
|
};
|
|
205
|
-
|
|
241
|
+
__decorateClass([
|
|
206
242
|
mobx.computed
|
|
207
|
-
], exports2.YjsTextModel.prototype, "_yjsObjectPath",
|
|
208
|
-
|
|
243
|
+
], exports2.YjsTextModel.prototype, "_yjsObjectPath", 1);
|
|
244
|
+
__decorateClass([
|
|
209
245
|
mobx.computed
|
|
210
|
-
], exports2.YjsTextModel.prototype, "_yjsObjectAtPath",
|
|
211
|
-
|
|
246
|
+
], exports2.YjsTextModel.prototype, "_yjsObjectAtPath", 1);
|
|
247
|
+
__decorateClass([
|
|
212
248
|
mobx.computed
|
|
213
|
-
], exports2.YjsTextModel.prototype, "yjsText",
|
|
214
|
-
|
|
249
|
+
], exports2.YjsTextModel.prototype, "yjsText", 1);
|
|
250
|
+
__decorateClass([
|
|
215
251
|
mobx.computed
|
|
216
|
-
], exports2.YjsTextModel.prototype, "text",
|
|
217
|
-
exports2.YjsTextModel =
|
|
252
|
+
], exports2.YjsTextModel.prototype, "text", 1);
|
|
253
|
+
exports2.YjsTextModel = __decorateClass([
|
|
218
254
|
mobxKeystone.model(yjsTextModelId)
|
|
219
255
|
], exports2.YjsTextModel);
|
|
220
256
|
const DecoratedYjsTextModel = exports2.YjsTextModel;
|
|
@@ -223,31 +259,43 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
223
259
|
const observeFn = () => {
|
|
224
260
|
textChangedAtom.reportChanged();
|
|
225
261
|
};
|
|
226
|
-
const disposeReactionToYTextChange = mobx.reaction(
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
disposeObserveYjsText =
|
|
238
|
-
|
|
239
|
-
|
|
262
|
+
const disposeReactionToYTextChange = mobx.reaction(
|
|
263
|
+
() => {
|
|
264
|
+
try {
|
|
265
|
+
const yjsText = getYjsText();
|
|
266
|
+
return isYjsValueDeleted(yjsText) ? void 0 : yjsText;
|
|
267
|
+
} catch {
|
|
268
|
+
return void 0;
|
|
269
|
+
}
|
|
270
|
+
},
|
|
271
|
+
(yjsText) => {
|
|
272
|
+
disposeObserveYjsText == null ? void 0 : disposeObserveYjsText();
|
|
273
|
+
disposeObserveYjsText = void 0;
|
|
274
|
+
if (yjsText) {
|
|
275
|
+
yjsText.observe(observeFn);
|
|
276
|
+
disposeObserveYjsText = () => {
|
|
277
|
+
yjsText.unobserve(observeFn);
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
textChangedAtom.reportChanged();
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
fireImmediately: true
|
|
240
284
|
}
|
|
241
|
-
|
|
242
|
-
}, {
|
|
243
|
-
fireImmediately: true
|
|
244
|
-
});
|
|
285
|
+
);
|
|
245
286
|
return () => {
|
|
246
287
|
disposeReactionToYTextChange();
|
|
247
288
|
disposeObserveYjsText == null ? void 0 : disposeObserveYjsText();
|
|
248
289
|
disposeObserveYjsText = void 0;
|
|
249
290
|
};
|
|
250
291
|
}
|
|
292
|
+
const yjsContainerToSnapshot = /* @__PURE__ */ new WeakMap();
|
|
293
|
+
function setYjsContainerSnapshot(container, snapshot) {
|
|
294
|
+
yjsContainerToSnapshot.set(container, snapshot);
|
|
295
|
+
}
|
|
296
|
+
function isYjsContainerUpToDate(container, snapshot) {
|
|
297
|
+
return yjsContainerToSnapshot.get(container) === snapshot;
|
|
298
|
+
}
|
|
251
299
|
function isPlainPrimitive(v) {
|
|
252
300
|
const t = typeof v;
|
|
253
301
|
return t === "string" || t === "number" || t === "boolean" || v === null || v === void 0;
|
|
@@ -256,118 +304,163 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
256
304
|
return Array.isArray(v);
|
|
257
305
|
}
|
|
258
306
|
function isPlainObject(v) {
|
|
259
|
-
return
|
|
307
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
260
308
|
}
|
|
261
309
|
function convertJsonToYjsData(v) {
|
|
262
|
-
|
|
263
|
-
|
|
310
|
+
if (isPlainPrimitive(v)) {
|
|
311
|
+
return v;
|
|
312
|
+
}
|
|
313
|
+
if (isPlainArray(v)) {
|
|
314
|
+
const arr = new Y__namespace.Array();
|
|
315
|
+
applyJsonArrayToYArray(arr, v);
|
|
316
|
+
return arr;
|
|
317
|
+
}
|
|
318
|
+
if (isPlainObject(v)) {
|
|
319
|
+
if (v[mobxKeystone.frozenKey] === true) {
|
|
264
320
|
return v;
|
|
265
321
|
}
|
|
266
|
-
if (
|
|
267
|
-
const
|
|
268
|
-
|
|
269
|
-
|
|
322
|
+
if (v[mobxKeystone.modelTypeKey] === yjsTextModelId) {
|
|
323
|
+
const text = new Y__namespace.Text();
|
|
324
|
+
const yjsTextModel = v;
|
|
325
|
+
yjsTextModel.deltaList.forEach((frozenDeltas) => {
|
|
326
|
+
text.applyDelta(frozenDeltas.data);
|
|
327
|
+
});
|
|
328
|
+
return text;
|
|
270
329
|
}
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
330
|
+
const map = new Y__namespace.Map();
|
|
331
|
+
applyJsonObjectToYMap(map, v);
|
|
332
|
+
return map;
|
|
333
|
+
}
|
|
334
|
+
throw new Error(`unsupported value type: ${v}`);
|
|
335
|
+
}
|
|
336
|
+
const applyJsonArrayToYArray = (dest, source, options = {}) => {
|
|
337
|
+
const { mode = "add" } = options;
|
|
338
|
+
if (mode === "merge" && isYjsContainerUpToDate(dest, source)) {
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
const srcLen = source.length;
|
|
342
|
+
if (mode === "add") {
|
|
343
|
+
for (let i = 0; i < srcLen; i++) {
|
|
344
|
+
dest.push([convertJsonToYjsData(source[i])]);
|
|
345
|
+
}
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
const destLen = dest.length;
|
|
349
|
+
if (destLen > srcLen) {
|
|
350
|
+
dest.delete(srcLen, destLen - srcLen);
|
|
351
|
+
}
|
|
352
|
+
const minLen = Math.min(destLen, srcLen);
|
|
353
|
+
for (let i = 0; i < minLen; i++) {
|
|
354
|
+
const srcItem = source[i];
|
|
355
|
+
const destItem = dest.get(i);
|
|
356
|
+
if (isPlainObject(srcItem) && destItem instanceof Y__namespace.Map) {
|
|
357
|
+
applyJsonObjectToYMap(destItem, srcItem, options);
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
if (isPlainArray(srcItem) && destItem instanceof Y__namespace.Array) {
|
|
361
|
+
applyJsonArrayToYArray(destItem, srcItem, options);
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
if (isPlainPrimitive(srcItem) && destItem === srcItem) {
|
|
365
|
+
continue;
|
|
366
|
+
}
|
|
367
|
+
dest.delete(i, 1);
|
|
368
|
+
dest.insert(i, [convertJsonToYjsData(srcItem)]);
|
|
369
|
+
}
|
|
370
|
+
for (let i = destLen; i < srcLen; i++) {
|
|
371
|
+
dest.push([convertJsonToYjsData(source[i])]);
|
|
372
|
+
}
|
|
373
|
+
setYjsContainerSnapshot(dest, source);
|
|
374
|
+
};
|
|
375
|
+
const applyJsonObjectToYMap = (dest, source, options = {}) => {
|
|
376
|
+
const { mode = "add" } = options;
|
|
377
|
+
if (mode === "merge" && isYjsContainerUpToDate(dest, source)) {
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
if (mode === "add") {
|
|
381
|
+
for (const k of Object.keys(source)) {
|
|
382
|
+
const v = source[k];
|
|
383
|
+
if (v !== void 0) {
|
|
384
|
+
dest.set(k, convertJsonToYjsData(v));
|
|
282
385
|
}
|
|
283
|
-
const map = new Y__namespace.Map();
|
|
284
|
-
applyJsonObjectToYMap(map, v);
|
|
285
|
-
return map;
|
|
286
386
|
}
|
|
287
|
-
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
const sourceKeysWithValues = new Set(Object.keys(source).filter((k) => source[k] !== void 0));
|
|
390
|
+
for (const key of dest.keys()) {
|
|
391
|
+
if (!sourceKeysWithValues.has(key)) {
|
|
392
|
+
dest.delete(key);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
for (const k of Object.keys(source)) {
|
|
396
|
+
const v = source[k];
|
|
397
|
+
if (v === void 0) {
|
|
398
|
+
continue;
|
|
399
|
+
}
|
|
400
|
+
const existing = dest.get(k);
|
|
401
|
+
if (isPlainObject(v) && existing instanceof Y__namespace.Map) {
|
|
402
|
+
applyJsonObjectToYMap(existing, v, options);
|
|
403
|
+
continue;
|
|
404
|
+
}
|
|
405
|
+
if (isPlainArray(v) && existing instanceof Y__namespace.Array) {
|
|
406
|
+
applyJsonArrayToYArray(existing, v, options);
|
|
407
|
+
continue;
|
|
408
|
+
}
|
|
409
|
+
if (isPlainPrimitive(v) && existing === v) {
|
|
410
|
+
continue;
|
|
411
|
+
}
|
|
295
412
|
dest.set(k, convertJsonToYjsData(v));
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
case "replace": {
|
|
323
|
-
yjs.set(key, convertJsonToYjsData(patch.value));
|
|
324
|
-
break;
|
|
325
|
-
}
|
|
326
|
-
case "remove": {
|
|
327
|
-
yjs.delete(key);
|
|
328
|
-
break;
|
|
329
|
-
}
|
|
330
|
-
default: {
|
|
331
|
-
throw failure(`invalid patch operation for map`);
|
|
332
|
-
}
|
|
413
|
+
}
|
|
414
|
+
setYjsContainerSnapshot(dest, source);
|
|
415
|
+
};
|
|
416
|
+
function convertValue(v) {
|
|
417
|
+
if (v === null || v === void 0 || typeof v !== "object") {
|
|
418
|
+
return v;
|
|
419
|
+
}
|
|
420
|
+
if (Array.isArray(v) && v.length === 0) {
|
|
421
|
+
return new Y__namespace.Array();
|
|
422
|
+
}
|
|
423
|
+
return convertJsonToYjsData(v);
|
|
424
|
+
}
|
|
425
|
+
function applyMobxChangeToYjsObject(change, yjsObject) {
|
|
426
|
+
if (isYjsValueDeleted(yjsObject)) {
|
|
427
|
+
throw failure("cannot apply patch to deleted Yjs value");
|
|
428
|
+
}
|
|
429
|
+
const yjsContainer = resolveYjsPath(yjsObject, change.path);
|
|
430
|
+
if (!yjsContainer) {
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
if (yjsContainer instanceof Y__namespace.Array) {
|
|
434
|
+
if (change.type === mobxKeystone.DeepChangeType.ArraySplice) {
|
|
435
|
+
yjsContainer.delete(change.index, change.removedValues.length);
|
|
436
|
+
if (change.addedValues.length > 0) {
|
|
437
|
+
const valuesToInsert = change.addedValues.map(convertValue);
|
|
438
|
+
yjsContainer.insert(change.index, valuesToInsert);
|
|
333
439
|
}
|
|
334
|
-
} else if (
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
} else {
|
|
348
|
-
yjs.delete(Number(key));
|
|
349
|
-
yjs.insert(Number(key), [convertJsonToYjsData(patch.value)]);
|
|
350
|
-
}
|
|
351
|
-
break;
|
|
352
|
-
}
|
|
353
|
-
case "add": {
|
|
354
|
-
yjs.insert(Number(key), [convertJsonToYjsData(patch.value)]);
|
|
355
|
-
break;
|
|
356
|
-
}
|
|
357
|
-
case "remove": {
|
|
358
|
-
yjs.delete(Number(key));
|
|
359
|
-
break;
|
|
360
|
-
}
|
|
361
|
-
default: {
|
|
362
|
-
throw failure(`invalid patch operation for array`);
|
|
363
|
-
}
|
|
440
|
+
} else if (change.type === mobxKeystone.DeepChangeType.ArrayUpdate) {
|
|
441
|
+
yjsContainer.delete(change.index, 1);
|
|
442
|
+
yjsContainer.insert(change.index, [convertValue(change.newValue)]);
|
|
443
|
+
} else {
|
|
444
|
+
throw failure(`unsupported array change type: ${change.type}`);
|
|
445
|
+
}
|
|
446
|
+
} else if (yjsContainer instanceof Y__namespace.Map) {
|
|
447
|
+
if (change.type === mobxKeystone.DeepChangeType.ObjectAdd || change.type === mobxKeystone.DeepChangeType.ObjectUpdate) {
|
|
448
|
+
const key = change.key;
|
|
449
|
+
if (change.newValue === void 0) {
|
|
450
|
+
yjsContainer.delete(key);
|
|
451
|
+
} else {
|
|
452
|
+
yjsContainer.set(key, convertValue(change.newValue));
|
|
364
453
|
}
|
|
365
|
-
} else if (
|
|
366
|
-
|
|
367
|
-
|
|
454
|
+
} else if (change.type === mobxKeystone.DeepChangeType.ObjectRemove) {
|
|
455
|
+
const key = change.key;
|
|
456
|
+
yjsContainer.delete(key);
|
|
457
|
+
} else {
|
|
458
|
+
throw failure(`unsupported object change type: ${change.type}`);
|
|
368
459
|
}
|
|
460
|
+
} else if (yjsContainer instanceof Y__namespace.Text) {
|
|
461
|
+
return;
|
|
369
462
|
} else {
|
|
370
|
-
throw failure(`
|
|
463
|
+
throw failure(`unsupported Yjs container type: ${yjsContainer}`);
|
|
371
464
|
}
|
|
372
465
|
}
|
|
373
466
|
const convertYjsDataToJson = mobx.action((yjsData) => {
|
|
@@ -389,89 +482,126 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
389
482
|
}
|
|
390
483
|
return yjsData;
|
|
391
484
|
});
|
|
392
|
-
function
|
|
393
|
-
const
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
485
|
+
function applyYjsEventToMobx(event, boundObject, reconciliationMap) {
|
|
486
|
+
const path = event.path;
|
|
487
|
+
const { value: target } = mobxKeystone.resolvePath(boundObject, path);
|
|
488
|
+
if (!target) {
|
|
489
|
+
throw failure(`cannot resolve path ${JSON.stringify(path)}`);
|
|
490
|
+
}
|
|
491
|
+
mobxKeystone.runUnprotected(() => {
|
|
492
|
+
if (event instanceof Y__namespace.YMapEvent) {
|
|
493
|
+
applyYMapEventToMobx(event, target, reconciliationMap);
|
|
494
|
+
} else if (event instanceof Y__namespace.YArrayEvent) {
|
|
495
|
+
applyYArrayEventToMobx(event, target, reconciliationMap);
|
|
496
|
+
} else if (event instanceof Y__namespace.YTextEvent) {
|
|
497
|
+
applyYTextEventToMobx(event, target);
|
|
498
|
+
}
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
function processDeletedValue(val, reconciliationMap) {
|
|
502
|
+
if (val && typeof val === "object" && mobxKeystone.isModel(val)) {
|
|
503
|
+
const sn = mobxKeystone.getSnapshot(val);
|
|
504
|
+
const id = mobxKeystone.getSnapshotModelId(sn);
|
|
505
|
+
if (id) {
|
|
506
|
+
reconciliationMap.set(id, val);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
function reviveValue(jsonValue, reconciliationMap) {
|
|
511
|
+
if (jsonValue === null || typeof jsonValue !== "object") {
|
|
512
|
+
return jsonValue;
|
|
513
|
+
}
|
|
514
|
+
if (mobxKeystone.isFrozenSnapshot(jsonValue)) {
|
|
515
|
+
return mobxKeystone.frozen(jsonValue.data);
|
|
516
|
+
}
|
|
517
|
+
if (reconciliationMap && jsonValue && typeof jsonValue === "object") {
|
|
518
|
+
const modelId = mobxKeystone.getSnapshotModelId(jsonValue);
|
|
519
|
+
if (modelId) {
|
|
520
|
+
const existing = reconciliationMap.get(modelId);
|
|
521
|
+
if (existing) {
|
|
522
|
+
reconciliationMap.delete(modelId);
|
|
523
|
+
return existing;
|
|
428
524
|
}
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
return mobxKeystone.fromSnapshot(jsonValue);
|
|
528
|
+
}
|
|
529
|
+
function applyYMapEventToMobx(event, target, reconciliationMap) {
|
|
530
|
+
const source = event.target;
|
|
531
|
+
event.changes.keys.forEach((change, key) => {
|
|
532
|
+
switch (change.action) {
|
|
533
|
+
case "add":
|
|
534
|
+
case "update": {
|
|
535
|
+
const yjsValue = source.get(key);
|
|
536
|
+
const jsonValue = convertYjsDataToJson(yjsValue);
|
|
537
|
+
if (change.action === "update") {
|
|
538
|
+
processDeletedValue(target[key], reconciliationMap);
|
|
436
539
|
}
|
|
540
|
+
target[key] = reviveValue(jsonValue, reconciliationMap);
|
|
541
|
+
break;
|
|
437
542
|
}
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
});
|
|
447
|
-
retain++;
|
|
448
|
-
});
|
|
543
|
+
case "delete": {
|
|
544
|
+
processDeletedValue(target[key], reconciliationMap);
|
|
545
|
+
if (mobxKeystone.isModel(target)) {
|
|
546
|
+
mobx.remove(target.$, key);
|
|
547
|
+
} else {
|
|
548
|
+
mobx.remove(target, key);
|
|
549
|
+
}
|
|
550
|
+
break;
|
|
449
551
|
}
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
552
|
+
default:
|
|
553
|
+
throw failure(`unsupported Yjs map event action: ${change.action}`);
|
|
554
|
+
}
|
|
555
|
+
});
|
|
556
|
+
}
|
|
557
|
+
function applyYArrayEventToMobx(event, target, reconciliationMap) {
|
|
558
|
+
let currentIndex = 0;
|
|
559
|
+
for (const change of event.changes.delta) {
|
|
560
|
+
if (change.retain) {
|
|
561
|
+
currentIndex += change.retain;
|
|
562
|
+
}
|
|
563
|
+
if (change.delete) {
|
|
564
|
+
const deletedItems = target.slice(currentIndex, currentIndex + change.delete);
|
|
565
|
+
deletedItems.forEach((item) => {
|
|
566
|
+
processDeletedValue(item, reconciliationMap);
|
|
567
|
+
});
|
|
568
|
+
target.splice(currentIndex, change.delete);
|
|
569
|
+
}
|
|
570
|
+
if (change.insert) {
|
|
571
|
+
const insertedItems = Array.isArray(change.insert) ? change.insert : [change.insert];
|
|
572
|
+
const values = insertedItems.map((yjsValue) => {
|
|
573
|
+
const jsonValue = convertYjsDataToJson(yjsValue);
|
|
574
|
+
return reviveValue(jsonValue, reconciliationMap);
|
|
575
|
+
});
|
|
576
|
+
target.splice(currentIndex, 0, ...values);
|
|
577
|
+
currentIndex += values.length;
|
|
578
|
+
}
|
|
463
579
|
}
|
|
464
|
-
return patches;
|
|
465
580
|
}
|
|
466
|
-
function
|
|
467
|
-
if (
|
|
468
|
-
|
|
469
|
-
}
|
|
470
|
-
|
|
581
|
+
function applyYTextEventToMobx(event, target) {
|
|
582
|
+
if (target == null ? void 0 : target.deltaList) {
|
|
583
|
+
target.deltaList.push(mobxKeystone.frozen(event.delta));
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
function captureChangeSnapshots(change) {
|
|
587
|
+
if (change.type === mobxKeystone.DeepChangeType.ArraySplice && change.addedValues.length > 0) {
|
|
588
|
+
const snapshots = change.addedValues.map((v) => mobxKeystone.isTreeNode(v) ? mobxKeystone.getSnapshot(v) : v);
|
|
589
|
+
return { ...change, addedValues: snapshots };
|
|
590
|
+
} else if (change.type === mobxKeystone.DeepChangeType.ArrayUpdate) {
|
|
591
|
+
const snapshot = mobxKeystone.isTreeNode(change.newValue) ? mobxKeystone.getSnapshot(change.newValue) : change.newValue;
|
|
592
|
+
return { ...change, newValue: snapshot };
|
|
593
|
+
} else if (change.type === mobxKeystone.DeepChangeType.ObjectAdd || change.type === mobxKeystone.DeepChangeType.ObjectUpdate) {
|
|
594
|
+
const snapshot = mobxKeystone.isTreeNode(change.newValue) ? mobxKeystone.getSnapshot(change.newValue) : change.newValue;
|
|
595
|
+
return { ...change, newValue: snapshot };
|
|
471
596
|
}
|
|
597
|
+
return change;
|
|
472
598
|
}
|
|
473
|
-
function bindYjsToMobxKeystone({
|
|
474
|
-
|
|
599
|
+
function bindYjsToMobxKeystone({
|
|
600
|
+
yjsDoc,
|
|
601
|
+
yjsObject,
|
|
602
|
+
mobxKeystoneType
|
|
603
|
+
}) {
|
|
604
|
+
const yjsOrigin = /* @__PURE__ */ Symbol("bindYjsToMobxKeystoneTransactionOrigin");
|
|
475
605
|
let applyingYjsChangesToMobxKeystone = 0;
|
|
476
606
|
const bindingContext = {
|
|
477
607
|
yjsDoc,
|
|
@@ -484,90 +614,136 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
484
614
|
return applyingYjsChangesToMobxKeystone > 0;
|
|
485
615
|
}
|
|
486
616
|
};
|
|
617
|
+
if (isYjsValueDeleted(yjsObject)) {
|
|
618
|
+
throw failure("cannot apply patch to deleted Yjs value");
|
|
619
|
+
}
|
|
487
620
|
const yjsJson = convertYjsDataToJson(yjsObject);
|
|
488
|
-
|
|
621
|
+
let boundObject;
|
|
622
|
+
let hasInitChanges = false;
|
|
489
623
|
const createBoundObject = () => {
|
|
490
|
-
const
|
|
491
|
-
|
|
624
|
+
const disposeGlobalListener = mobxKeystone.onGlobalDeepChange((_target, change) => {
|
|
625
|
+
if (change.isInit) {
|
|
626
|
+
hasInitChanges = true;
|
|
627
|
+
}
|
|
492
628
|
});
|
|
493
629
|
try {
|
|
494
|
-
const
|
|
495
|
-
|
|
496
|
-
|
|
630
|
+
const result = yjsBindingContext.apply(
|
|
631
|
+
() => mobxKeystone.fromSnapshot(mobxKeystoneType, yjsJson),
|
|
632
|
+
bindingContext
|
|
633
|
+
);
|
|
634
|
+
yjsBindingContext.set(result, { ...bindingContext, boundObject: result });
|
|
635
|
+
return result;
|
|
497
636
|
} finally {
|
|
498
|
-
|
|
637
|
+
disposeGlobalListener();
|
|
499
638
|
}
|
|
500
639
|
};
|
|
501
|
-
|
|
640
|
+
boundObject = createBoundObject();
|
|
502
641
|
const observeDeepCb = mobx.action((events) => {
|
|
503
|
-
const
|
|
642
|
+
const eventsToApply = [];
|
|
504
643
|
events.forEach((event) => {
|
|
505
644
|
var _a;
|
|
506
645
|
if (event.transaction.origin !== yjsOrigin) {
|
|
507
|
-
|
|
646
|
+
eventsToApply.push(event);
|
|
508
647
|
}
|
|
509
648
|
if (event.target instanceof Y__namespace.Map || event.target instanceof Y__namespace.Array) {
|
|
510
649
|
(_a = getYjsCollectionAtom(event.target)) == null ? void 0 : _a.reportChanged();
|
|
511
650
|
}
|
|
512
651
|
});
|
|
513
|
-
if (
|
|
652
|
+
if (eventsToApply.length > 0) {
|
|
514
653
|
applyingYjsChangesToMobxKeystone++;
|
|
515
654
|
try {
|
|
516
|
-
|
|
655
|
+
const reconciliationMap = /* @__PURE__ */ new Map();
|
|
656
|
+
const initChanges = [];
|
|
657
|
+
const disposeGlobalListener = mobxKeystone.onGlobalDeepChange((target, change) => {
|
|
658
|
+
if (change.isInit) {
|
|
659
|
+
initChanges.push({ target, change: captureChangeSnapshots(change) });
|
|
660
|
+
}
|
|
661
|
+
});
|
|
662
|
+
try {
|
|
663
|
+
eventsToApply.forEach((event) => {
|
|
664
|
+
applyYjsEventToMobx(event, boundObject, reconciliationMap);
|
|
665
|
+
});
|
|
666
|
+
} finally {
|
|
667
|
+
disposeGlobalListener();
|
|
668
|
+
}
|
|
669
|
+
if (initChanges.length > 0 && !isYjsValueDeleted(yjsObject)) {
|
|
670
|
+
yjsDoc.transact(() => {
|
|
671
|
+
for (const { target, change } of initChanges) {
|
|
672
|
+
const pathToTarget = mobxKeystone.getParentToChildPath(boundObject, target);
|
|
673
|
+
if (pathToTarget !== void 0) {
|
|
674
|
+
const changeWithCorrectPath = {
|
|
675
|
+
...change,
|
|
676
|
+
path: [...pathToTarget, ...change.path]
|
|
677
|
+
};
|
|
678
|
+
applyMobxChangeToYjsObject(changeWithCorrectPath, yjsObject);
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
}, yjsOrigin);
|
|
682
|
+
}
|
|
683
|
+
if (yjsObject instanceof Y__namespace.Map || yjsObject instanceof Y__namespace.Array) {
|
|
684
|
+
setYjsContainerSnapshot(yjsObject, mobxKeystone.getSnapshot(boundObject));
|
|
685
|
+
}
|
|
517
686
|
} finally {
|
|
518
687
|
applyingYjsChangesToMobxKeystone--;
|
|
519
688
|
}
|
|
520
689
|
}
|
|
521
690
|
});
|
|
522
691
|
yjsObject.observeDeep(observeDeepCb);
|
|
523
|
-
let
|
|
524
|
-
const
|
|
692
|
+
let pendingChanges = [];
|
|
693
|
+
const disposeOnDeepChange = mobxKeystone.onDeepChange(boundObject, (change) => {
|
|
525
694
|
if (applyingYjsChangesToMobxKeystone > 0) {
|
|
526
695
|
return;
|
|
527
696
|
}
|
|
528
|
-
|
|
697
|
+
if (change.isInit) {
|
|
698
|
+
return;
|
|
699
|
+
}
|
|
700
|
+
pendingChanges.push(captureChangeSnapshots(change));
|
|
529
701
|
});
|
|
530
|
-
const disposeOnSnapshot = mobxKeystone.onSnapshot(boundObject, () => {
|
|
531
|
-
if (
|
|
702
|
+
const disposeOnSnapshot = mobxKeystone.onSnapshot(boundObject, (boundObjectSnapshot) => {
|
|
703
|
+
if (pendingChanges.length === 0) {
|
|
704
|
+
return;
|
|
705
|
+
}
|
|
706
|
+
const changesToApply = pendingChanges;
|
|
707
|
+
pendingChanges = [];
|
|
708
|
+
if (isYjsValueDeleted(yjsObject)) {
|
|
532
709
|
return;
|
|
533
710
|
}
|
|
534
|
-
const arrayOfArrayOfPatches = pendingArrayOfArrayOfPatches;
|
|
535
|
-
pendingArrayOfArrayOfPatches = [];
|
|
536
711
|
yjsDoc.transact(() => {
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
applyMobxKeystonePatchToYjsObject(patch, yjsObject);
|
|
540
|
-
});
|
|
712
|
+
changesToApply.forEach((change) => {
|
|
713
|
+
applyMobxChangeToYjsObject(change, yjsObject);
|
|
541
714
|
});
|
|
542
715
|
}, yjsOrigin);
|
|
716
|
+
if (yjsObject instanceof Y__namespace.Map || yjsObject instanceof Y__namespace.Array) {
|
|
717
|
+
setYjsContainerSnapshot(yjsObject, boundObjectSnapshot);
|
|
718
|
+
}
|
|
543
719
|
});
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
if (
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
}
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
if (parentToChildPath !== void 0) {
|
|
555
|
-
patches.forEach((patch) => {
|
|
556
|
-
applyMobxKeystonePatchToYjsObject({
|
|
557
|
-
...patch,
|
|
558
|
-
path: [...parentToChildPath, ...patch.path]
|
|
559
|
-
}, yjsObject);
|
|
720
|
+
const finalSnapshot = mobxKeystone.getSnapshot(boundObject);
|
|
721
|
+
if (hasInitChanges) {
|
|
722
|
+
yjsDoc.transact(() => {
|
|
723
|
+
if (yjsObject instanceof Y__namespace.Map) {
|
|
724
|
+
applyJsonObjectToYMap(yjsObject, finalSnapshot, {
|
|
725
|
+
mode: "merge"
|
|
726
|
+
});
|
|
727
|
+
} else if (yjsObject instanceof Y__namespace.Array) {
|
|
728
|
+
applyJsonArrayToYArray(yjsObject, finalSnapshot, {
|
|
729
|
+
mode: "merge"
|
|
560
730
|
});
|
|
561
731
|
}
|
|
562
|
-
});
|
|
563
|
-
}
|
|
732
|
+
}, yjsOrigin);
|
|
733
|
+
}
|
|
734
|
+
if (yjsObject instanceof Y__namespace.Map || yjsObject instanceof Y__namespace.Array) {
|
|
735
|
+
setYjsContainerSnapshot(yjsObject, finalSnapshot);
|
|
736
|
+
}
|
|
737
|
+
const dispose = () => {
|
|
738
|
+
yjsDoc.off("destroy", dispose);
|
|
739
|
+
disposeOnDeepChange();
|
|
740
|
+
disposeOnSnapshot();
|
|
741
|
+
yjsObject.unobserveDeep(observeDeepCb);
|
|
742
|
+
};
|
|
743
|
+
yjsDoc.on("destroy", dispose);
|
|
564
744
|
return {
|
|
565
745
|
boundObject,
|
|
566
|
-
dispose
|
|
567
|
-
disposeOnPatches();
|
|
568
|
-
disposeOnSnapshot();
|
|
569
|
-
yjsObject.unobserveDeep(observeDeepCb);
|
|
570
|
-
},
|
|
746
|
+
dispose,
|
|
571
747
|
yjsOrigin
|
|
572
748
|
};
|
|
573
749
|
}
|
|
@@ -579,5 +755,5 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
579
755
|
exports2.yjsBindingContext = yjsBindingContext;
|
|
580
756
|
exports2.yjsTextModelId = yjsTextModelId;
|
|
581
757
|
Object.defineProperty(exports2, Symbol.toStringTag, { value: "Module" });
|
|
582
|
-
});
|
|
583
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMudW1kLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvZXJyb3IudHMiLCIuLi9zcmMvYmluZGluZy95anNCaW5kaW5nQ29udGV4dC50cyIsIi4uL3NyYy91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tLnRzIiwiLi4vc3JjL2JpbmRpbmcvcmVzb2x2ZVlqc1BhdGgudHMiLCIuLi9zcmMvYmluZGluZy9ZanNUZXh0TW9kZWwudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0SnNvblRvWWpzRGF0YS50cyIsIi4uL3NyYy9iaW5kaW5nL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdC50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNEYXRhVG9Kc29uLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydFlqc0V2ZW50VG9QYXRjaGVzLnRzIiwiLi4vc3JjL2JpbmRpbmcvYmluZFlqc1RvTW9ieEtleXN0b25lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBBIG1vYngta2V5c3RvbmUteWpzIGVycm9yLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1vYnhLZXlzdG9uZVlqc0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nKSB7XHJcbiAgICBzdXBlcihtc2cpXHJcblxyXG4gICAgLy8gU2V0IHRoZSBwcm90b3R5cGUgZXhwbGljaXRseS5cclxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBNb2J4S2V5c3RvbmVZanNFcnJvci5wcm90b3R5cGUpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmFpbHVyZShtc2c6IHN0cmluZykge1xyXG4gIHJldHVybiBuZXcgTW9ieEtleXN0b25lWWpzRXJyb3IobXNnKVxyXG59XHJcbiIsImltcG9ydCB7IEFueVR5cGUsIGNyZWF0ZUNvbnRleHQgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuXG4vKipcbiAqIENvbnRleHQgd2l0aCBpbmZvIG9uIGhvdyBhIG1vYngta2V5c3RvbmUgbW9kZWwgaXMgYm91bmQgdG8gYSBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlqc0JpbmRpbmdDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBZLmpzIGRvY3VtZW50LlxuICAgKi9cbiAgeWpzRG9jOiBZLkRvY1xuXG4gIC8qKlxuICAgKiBUaGUgYm91bmQgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAgICovXG4gIHlqc09iamVjdDogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+IHwgWS5UZXh0XG5cbiAgLyoqXG4gICAqIFRoZSBtb2J4LWtleXN0b25lIG1vZGVsIHR5cGUuXG4gICAqL1xuICBtb2J4S2V5c3RvbmVUeXBlOiBBbnlUeXBlXG5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW4gc3ltYm9sIHVzZWQgZm9yIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIHlqc09yaWdpbjogc3ltYm9sXG5cbiAgLyoqXG4gICAqIFRoZSBib3VuZCBtb2J4LWtleXN0b25lIGluc3RhbmNlLlxuICAgKi9cbiAgYm91bmRPYmplY3Q6IHVua25vd25cblxuICAvKipcbiAgICogV2hldGhlciB3ZSBhcmUgY3VycmVudGx5IGFwcGx5aW5nIFkuanMgY2hhbmdlcyB0byB0aGUgbW9ieC1rZXlzdG9uZSBtb2RlbC5cbiAgICovXG4gIGlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmU6IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBDb250ZXh0IHdpdGggaW5mbyBvbiBob3cgYSBtb2J4LWtleXN0b25lIG1vZGVsIGlzIGJvdW5kIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHlqc0JpbmRpbmdDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxZanNCaW5kaW5nQ29udGV4dCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuIiwiaW1wb3J0IHsgSUF0b20sIGNyZWF0ZUF0b20gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuXG5jb25zdCB5anNDb2xsZWN0aW9uQXRvbXMgPSBuZXcgV2Vha01hcDxZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj4sIElBdG9tPigpXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRZanNDb2xsZWN0aW9uQXRvbSA9IChcbiAgeWpzQ29sbGVjdGlvbjogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+XG4pOiBJQXRvbSB8IHVuZGVmaW5lZCA9PiB7XG4gIHJldHVybiB5anNDb2xsZWN0aW9uQXRvbXMuZ2V0KHlqc0NvbGxlY3Rpb24pXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tID0gKFxuICB5anNDb2xsZWN0aW9uOiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj5cbik6IElBdG9tID0+IHtcbiAgbGV0IGF0b20gPSB5anNDb2xsZWN0aW9uQXRvbXMuZ2V0KHlqc0NvbGxlY3Rpb24pXG4gIGlmICghYXRvbSkge1xuICAgIGF0b20gPSBjcmVhdGVBdG9tKGB5anNDb2xsZWN0aW9uQXRvbWApXG4gICAgeWpzQ29sbGVjdGlvbkF0b21zLnNldCh5anNDb2xsZWN0aW9uLCBhdG9tKVxuICB9XG4gIHJldHVybiBhdG9tXG59XG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tIH0gZnJvbSBcIi4uL3V0aWxzL2dldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b21cIlxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVlqc1BhdGgoeWpzT2JqZWN0OiB1bmtub3duLCBwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdW5rbm93biB7XG4gIGxldCBjdXJyZW50WWpzT2JqZWN0OiB1bmtub3duID0geWpzT2JqZWN0XG5cbiAgcGF0aC5mb3JFYWNoKChwYXRoUGFydCwgaSkgPT4ge1xuICAgIGlmIChjdXJyZW50WWpzT2JqZWN0IGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20oY3VycmVudFlqc09iamVjdCkucmVwb3J0T2JzZXJ2ZWQoKVxuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHBhdGhQYXJ0KVxuICAgICAgY3VycmVudFlqc09iamVjdCA9IGN1cnJlbnRZanNPYmplY3QuZ2V0KGtleSlcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRZanNPYmplY3QgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGN1cnJlbnRZanNPYmplY3QpLnJlcG9ydE9ic2VydmVkKClcbiAgICAgIGNvbnN0IGtleSA9IE51bWJlcihwYXRoUGFydClcbiAgICAgIGN1cnJlbnRZanNPYmplY3QgPSBjdXJyZW50WWpzT2JqZWN0LmdldChrZXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBZLk1hcCBvciBZLkFycmF5IHdhcyBleHBlY3RlZCBhdCBwYXRoICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgcGF0aC5zbGljZSgwLCBpKVxuICAgICAgICApfSBpbiBvcmRlciB0byByZXNvbHZlIHBhdGggJHtKU09OLnN0cmluZ2lmeShwYXRoKX0sIGJ1dCBnb3QgJHtjdXJyZW50WWpzT2JqZWN0fSBpbnN0ZWFkYFxuICAgICAgKVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gY3VycmVudFlqc09iamVjdFxufVxuIiwiaW1wb3J0IHsgSUF0b20sIGNvbXB1dGVkLCBjcmVhdGVBdG9tLCBvYnNlcnZlLCByZWFjdGlvbiB9IGZyb20gXCJtb2J4XCJcclxuaW1wb3J0IHtcclxuICBGcm96ZW4sXHJcbiAgTW9kZWwsXHJcbiAgZnJvemVuLFxyXG4gIGdldFBhcmVudFRvQ2hpbGRQYXRoLFxyXG4gIG1vZGVsLFxyXG4gIG9uU25hcHNob3QsXHJcbiAgdFByb3AsXHJcbiAgdHlwZXMsXHJcbn0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxyXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxyXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcclxuaW1wb3J0IHsgWWpzQmluZGluZ0NvbnRleHQsIHlqc0JpbmRpbmdDb250ZXh0IH0gZnJvbSBcIi4veWpzQmluZGluZ0NvbnRleHRcIlxyXG5pbXBvcnQgeyByZXNvbHZlWWpzUGF0aCB9IGZyb20gXCIuL3Jlc29sdmVZanNQYXRoXCJcclxuXHJcbi8vIERlbHRhW11bXSwgc2luY2UgZWFjaCBzaW5nbGUgY2hhbmdlIGlzIGEgRGVsdGFbXVxyXG4vLyB3ZSB1c2UgZnJvemVuIHNvIHRoYXQgd2UgY2FuIHJldXNlIGVhY2ggZGVsdGEgY2hhbmdlXHJcbmNvbnN0IGRlbHRhTGlzdFR5cGUgPSB0eXBlcy5hcnJheSh0eXBlcy5mcm96ZW4odHlwZXMudW5jaGVja2VkPHVua25vd25bXT4oKSkpXHJcblxyXG5leHBvcnQgY29uc3QgeWpzVGV4dE1vZGVsSWQgPSBcIm1vYngta2V5c3RvbmUteWpzL1lqc1RleHRNb2RlbFwiXHJcblxyXG4vKipcclxuICogQSBtb2J4LWtleXN0b25lIG1vZGVsIHRoYXQgcmVwcmVzZW50cyBhIFlqcy5UZXh0IG9iamVjdC5cclxuICovXHJcbkBtb2RlbCh5anNUZXh0TW9kZWxJZClcclxuZXhwb3J0IGNsYXNzIFlqc1RleHRNb2RlbCBleHRlbmRzIE1vZGVsKHtcclxuICBkZWx0YUxpc3Q6IHRQcm9wKGRlbHRhTGlzdFR5cGUsICgpID0+IFtdKSxcclxufSkge1xyXG4gIC8qKlxyXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBZanNUZXh0TW9kZWwgaW5zdGFuY2Ugd2l0aCBhIHNpbXBsZSB0ZXh0LlxyXG4gICAqL1xyXG4gIHN0YXRpYyB3aXRoVGV4dCh0ZXh0OiBzdHJpbmcpOiBZanNUZXh0TW9kZWwge1xyXG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0ZWRZanNUZXh0TW9kZWwoe1xyXG4gICAgICBkZWx0YUxpc3Q6IFtcclxuICAgICAgICBmcm96ZW4oW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBpbnNlcnQ6IHRleHQsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF0pLFxyXG4gICAgICBdLFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBZLmpzIHBhdGggZnJvbSB0aGUgYm91bmQgb2JqZWN0IHRvIHRoZSBZanNUZXh0TW9kZWwgaW5zdGFuY2UuXHJcbiAgICovXHJcbiAgQGNvbXB1dGVkXHJcbiAgcHJpdmF0ZSBnZXQgX3lqc09iamVjdFBhdGgoKSB7XHJcbiAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcclxuICAgIGlmIChjdHg/LmJvdW5kT2JqZWN0ID09IG51bGwpIHtcclxuICAgICAgdGhyb3cgZmFpbHVyZShcclxuICAgICAgICBcInRoZSBZanNUZXh0TW9kZWwgaW5zdGFuY2UgbXVzdCBiZSBwYXJ0IG9mIGEgYm91bmQgb2JqZWN0IGJlZm9yZSBpdCBjYW4gYmUgYWNjZXNzZWRcIlxyXG4gICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGF0aCA9IGdldFBhcmVudFRvQ2hpbGRQYXRoKGN0eC5ib3VuZE9iamVjdCwgdGhpcylcclxuICAgIGlmICghcGF0aCkge1xyXG4gICAgICB0aHJvdyBmYWlsdXJlKFwiYSBwYXRoIGZyb20gdGhlIGJvdW5kIG9iamVjdCB0byB0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlIGlzIG5vdCBhdmFpbGFibGVcIilcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGF0aFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIFlqcy5UZXh0IG9iamVjdCBwcmVzZW50IGF0IHRoaXMgbW9ieC1rZXlzdG9uZSBub2RlJ3MgcGF0aC5cclxuICAgKi9cclxuICBAY29tcHV0ZWRcclxuICBwcml2YXRlIGdldCBfeWpzT2JqZWN0QXRQYXRoKCk6IHVua25vd24ge1xyXG4gICAgY29uc3QgcGF0aCA9IHRoaXMuX3lqc09iamVjdFBhdGhcclxuXHJcbiAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcykhXHJcblxyXG4gICAgcmV0dXJuIHJlc29sdmVZanNQYXRoKGN0eC55anNPYmplY3QsIHBhdGgpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgWWpzLlRleHQgb2JqZWN0IHJlcHJlc2VudGVkIGJ5IHRoaXMgbW9ieC1rZXlzdG9uZSBub2RlLlxyXG4gICAqL1xyXG4gIEBjb21wdXRlZFxyXG4gIGdldCB5anNUZXh0KCk6IFkuVGV4dCB7XHJcbiAgICBjb25zdCB5anNPYmplY3QgPSB0aGlzLl95anNPYmplY3RBdFBhdGhcclxuXHJcbiAgICBpZiAoISh5anNPYmplY3QgaW5zdGFuY2VvZiBZLlRleHQpKSB7XHJcbiAgICAgIHRocm93IGZhaWx1cmUoYFkuVGV4dCB3YXMgZXhwZWN0ZWQgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KHRoaXMuX3lqc09iamVjdFBhdGgpfWApXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHlqc09iamVjdFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXRvbSB0aGF0IGdldHMgY2hhbmdlZCB3aGVuIHRoZSBhc3NvY2lhdGVkIFkuanMgdGV4dCBjaGFuZ2VzLlxyXG4gICAqL1xyXG4gIHlqc1RleHRDaGFuZ2VkQXRvbSA9IGNyZWF0ZUF0b20oXCJ5anNUZXh0Q2hhbmdlZEF0b21cIilcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHRleHQgdmFsdWUgb2YgdGhlIFlqcy5UZXh0IG9iamVjdC5cclxuICAgKiBTaG9ydGN1dCBmb3IgYHlqc1RleHQudG9TdHJpbmcoKWAsIGJ1dCBjb21wdXRlZC5cclxuICAgKi9cclxuICBAY29tcHV0ZWRcclxuICBnZXQgdGV4dCgpOiBzdHJpbmcge1xyXG4gICAgdGhpcy55anNUZXh0Q2hhbmdlZEF0b20ucmVwb3J0T2JzZXJ2ZWQoKVxyXG4gICAgcmV0dXJuIHRoaXMueWpzVGV4dC50b1N0cmluZygpXHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25Jbml0KCkge1xyXG4gICAgY29uc3Qgc2hvdWxkUmVwbGljYXRlVG9ZanMgPSAoY3R4OiBZanNCaW5kaW5nQ29udGV4dCB8IHVuZGVmaW5lZCk6IGN0eCBpcyBZanNCaW5kaW5nQ29udGV4dCA9PiB7XHJcbiAgICAgIHJldHVybiAhIWN0eCAmJiAhIWN0eC5ib3VuZE9iamVjdCAmJiAhY3R4LmlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmVcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVhcHBseURlbHRhc1RvWWpzVGV4dCA9IGZhbHNlXHJcbiAgICBjb25zdCBuZXdEZWx0YXM6IEZyb3plbjx1bmtub3duW10+W10gPSBbXVxyXG5cclxuICAgIGxldCBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdDogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkXHJcblxyXG4gICAgY29uc3QgZGlzcG9zZVJlYWN0aW9uVG9EZWx0YUxpc3RSZWZDaGFuZ2UgPSByZWFjdGlvbihcclxuICAgICAgKCkgPT4gdGhpcy4kLmRlbHRhTGlzdCxcclxuICAgICAgKGRlbHRhTGlzdCkgPT4ge1xyXG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0Py4oKVxyXG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gb2JzZXJ2ZShkZWx0YUxpc3QsIChjaGFuZ2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZWFwcGx5RGVsdGFzVG9ZanNUZXh0KSB7XHJcbiAgICAgICAgICAgIC8vIGFscmVhZHkgZ29ubmEgcmVwbGFjZSB0aGVtIGFsbFxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICghc2hvdWxkUmVwbGljYXRlVG9ZanMoeWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpKSkge1xyXG4gICAgICAgICAgICAvLyB5anMgdGV4dCBpcyBhbHJlYWR5IHVwIHRvIGRhdGUgd2l0aCB0aGVzZSBjaGFuZ2VzXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgY2hhbmdlLnR5cGUgPT09IFwic3BsaWNlXCIgJiZcclxuICAgICAgICAgICAgY2hhbmdlLnJlbW92ZWRDb3VudCA9PT0gMCAmJlxyXG4gICAgICAgICAgICBjaGFuZ2UuYWRkZWRDb3VudCA+IDAgJiZcclxuICAgICAgICAgICAgY2hhbmdlLmluZGV4ID09PSB0aGlzLmRlbHRhTGlzdC5sZW5ndGhcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAvLyBvcHRpbWl6YXRpb24sIGp1c3QgYWRkaW5nIG5ldyBvbmVzIHRvIHRoZSBlbmRcclxuICAgICAgICAgICAgbmV3RGVsdGFzLnB1c2goLi4uY2hhbmdlLmFkZGVkKVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gYW55IG90aGVyIGNoYW5nZSwgd2UgbmVlZCB0byByZWFwcGx5IGFsbCBkZWx0YXNcclxuICAgICAgICAgICAgcmVhcHBseURlbHRhc1RvWWpzVGV4dCA9IHRydWVcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9LFxyXG4gICAgICB7IGZpcmVJbW1lZGlhdGVseTogdHJ1ZSB9XHJcbiAgICApXHJcblxyXG4gICAgY29uc3QgZGlzcG9zZU9uU25hcHNob3QgPSBvblNuYXBzaG90KHRoaXMsICgpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAocmVhcHBseURlbHRhc1RvWWpzVGV4dCkge1xyXG4gICAgICAgICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXHJcblxyXG4gICAgICAgICAgaWYgKHNob3VsZFJlcGxpY2F0ZVRvWWpzKGN0eCkpIHtcclxuICAgICAgICAgICAgY29uc3QgeyB5anNUZXh0IH0gPSB0aGlzXHJcblxyXG4gICAgICAgICAgICBjdHgueWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcclxuICAgICAgICAgICAgICAvLyBkaWRuJ3QgZmluZCBhIGJldHRlciB3YXkgdGhhbiB0aGlzIHRvIHJlYXBwbHkgYWxsIGRlbHRhc1xyXG4gICAgICAgICAgICAgIC8vIHdpdGhvdXQgaGF2aW5nIHRvIHJlLWNyZWF0ZSB0aGUgWS5UZXh0IG9iamVjdFxyXG4gICAgICAgICAgICAgIGlmICh5anNUZXh0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHlqc1RleHQuZGVsZXRlKDAsIHlqc1RleHQubGVuZ3RoKVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5kZWx0YUxpc3QuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB5anNUZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSwgY3R4Lnlqc09yaWdpbilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKG5ld0RlbHRhcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcclxuXHJcbiAgICAgICAgICBpZiAoc2hvdWxkUmVwbGljYXRlVG9ZanMoY3R4KSkge1xyXG4gICAgICAgICAgICBjb25zdCB7IHlqc1RleHQgfSA9IHRoaXNcclxuXHJcbiAgICAgICAgICAgIGN0eC55anNEb2MudHJhbnNhY3QoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIG5ld0RlbHRhcy5mb3JFYWNoKChmcm96ZW5EZWx0YXMpID0+IHtcclxuICAgICAgICAgICAgICAgIHlqc1RleHQuYXBwbHlEZWx0YShmcm96ZW5EZWx0YXMuZGF0YSlcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9LCBjdHgueWpzT3JpZ2luKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICByZWFwcGx5RGVsdGFzVG9ZanNUZXh0ID0gZmFsc2VcclxuICAgICAgICBuZXdEZWx0YXMubGVuZ3RoID0gMFxyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnN0IGRpcG9zZVlqc1RleHRDaGFuZ2VkQXRvbSA9IGhvb2tZanNUZXh0Q2hhbmdlZEF0b20oXHJcbiAgICAgICgpID0+IHRoaXMueWpzVGV4dCxcclxuICAgICAgdGhpcy55anNUZXh0Q2hhbmdlZEF0b21cclxuICAgIClcclxuXHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICBkaXNwb3NlT25TbmFwc2hvdCgpXHJcbiAgICAgIGRpc3Bvc2VSZWFjdGlvblRvRGVsdGFMaXN0UmVmQ2hhbmdlKClcclxuICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q/LigpXHJcbiAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gdW5kZWZpbmVkXHJcblxyXG4gICAgICBkaXBvc2VZanNUZXh0Q2hhbmdlZEF0b20oKVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8gd2UgdXNlIHRoaXMgdHJpY2sganVzdCB0byBhdm9pZCBhIGJhYmVsIGJ1ZyB0aGF0IGNhdXNlcyBjbGFzc2VzIHVzZWQgaW5zaWRlIGNsYXNzZXMgbm90IHRvIGJlIG92ZXJyaWRlblxyXG4vLyBieSB0aGUgZGVjb3JhdG9yXHJcbmNvbnN0IERlY29yYXRlZFlqc1RleHRNb2RlbCA9IFlqc1RleHRNb2RlbFxyXG5cclxuZnVuY3Rpb24gaG9va1lqc1RleHRDaGFuZ2VkQXRvbShnZXRZanNUZXh0OiAoKSA9PiBZLlRleHQsIHRleHRDaGFuZ2VkQXRvbTogSUF0b20pIHtcclxuICBsZXQgZGlzcG9zZU9ic2VydmVZanNUZXh0OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWRcclxuXHJcbiAgY29uc3Qgb2JzZXJ2ZUZuID0gKCkgPT4ge1xyXG4gICAgdGV4dENoYW5nZWRBdG9tLnJlcG9ydENoYW5nZWQoKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgZGlzcG9zZVJlYWN0aW9uVG9ZVGV4dENoYW5nZSA9IHJlYWN0aW9uKFxyXG4gICAgKCkgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHJldHVybiBnZXRZanNUZXh0KClcclxuICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgKHlqc1RleHQpID0+IHtcclxuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0Py4oKVxyXG4gICAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQgPSB1bmRlZmluZWRcclxuXHJcbiAgICAgIGlmICh5anNUZXh0KSB7XHJcbiAgICAgICAgeWpzVGV4dC5vYnNlcnZlKG9ic2VydmVGbilcclxuXHJcbiAgICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gKCkgPT4ge1xyXG4gICAgICAgICAgeWpzVGV4dC51bm9ic2VydmUob2JzZXJ2ZUZuKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGV4dENoYW5nZWRBdG9tLnJlcG9ydENoYW5nZWQoKVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgZmlyZUltbWVkaWF0ZWx5OiB0cnVlLFxyXG4gICAgfVxyXG4gIClcclxuXHJcbiAgcmV0dXJuICgpID0+IHtcclxuICAgIGRpc3Bvc2VSZWFjdGlvblRvWVRleHRDaGFuZ2UoKVxyXG4gICAgZGlzcG9zZU9ic2VydmVZanNUZXh0Py4oKVxyXG4gICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwsIHlqc1RleHRNb2RlbElkIH0gZnJvbSBcIi4vWWpzVGV4dE1vZGVsXCJcbmltcG9ydCB7IFNuYXBzaG90T3V0T2YgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgeyBZanNEYXRhIH0gZnJvbSBcIi4vY29udmVydFlqc0RhdGFUb0pzb25cIlxuaW1wb3J0IHsgUGxhaW5BcnJheSwgUGxhaW5PYmplY3QsIFBsYWluUHJpbWl0aXZlLCBQbGFpblZhbHVlIH0gZnJvbSBcIi4uL3BsYWluVHlwZXNcIlxuaW1wb3J0IHsgYWN0aW9uLCBydW5JbkFjdGlvbiB9IGZyb20gXCJtb2J4XCJcblxuZnVuY3Rpb24gaXNQbGFpblByaW1pdGl2ZSh2OiBQbGFpblZhbHVlKTogdiBpcyBQbGFpblByaW1pdGl2ZSB7XG4gIGNvbnN0IHQgPSB0eXBlb2YgdlxuICByZXR1cm4gdCA9PT0gXCJzdHJpbmdcIiB8fCB0ID09PSBcIm51bWJlclwiIHx8IHQgPT09IFwiYm9vbGVhblwiIHx8IHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5BcnJheSh2OiBQbGFpblZhbHVlKTogdiBpcyBQbGFpbkFycmF5IHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodilcbn1cblxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2OiBQbGFpblZhbHVlKTogdiBpcyBQbGFpbk9iamVjdCB7XG4gIHJldHVybiAhaXNQbGFpbkFycmF5KHYpICYmIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT09IG51bGxcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHBsYWluIHZhbHVlIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqIE9iamVjdHMgYXJlIGNvbnZlcnRlZCB0byBZLk1hcHMsIGFycmF5cyB0byBZLkFycmF5cywgcHJpbWl0aXZlcyBhcmUgdW50b3VjaGVkLlxuICogRnJvemVuIHZhbHVlcyBhcmUgYSBzcGVjaWFsIGNhc2UgYW5kIHRoZXkgYXJlIGtlcHQgYXMgaW1tdXRhYmxlIHBsYWluIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRKc29uVG9ZanNEYXRhKHY6IFBsYWluVmFsdWUpOiBZanNEYXRhIHtcbiAgcmV0dXJuIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICBpZiAoaXNQbGFpblByaW1pdGl2ZSh2KSkge1xuICAgICAgcmV0dXJuIHZcbiAgICB9XG5cbiAgICBpZiAoaXNQbGFpbkFycmF5KHYpKSB7XG4gICAgICBjb25zdCBhcnIgPSBuZXcgWS5BcnJheSgpXG4gICAgICBhcHBseUpzb25BcnJheVRvWUFycmF5KGFyciwgdilcbiAgICAgIHJldHVybiBhcnJcbiAgICB9XG5cbiAgICBpZiAoaXNQbGFpbk9iamVjdCh2KSkge1xuICAgICAgaWYgKHYuJGZyb3plbiA9PT0gdHJ1ZSkge1xuICAgICAgICAvLyBmcm96ZW4gdmFsdWUsIHNhdmUgYXMgaW1tdXRhYmxlIG9iamVjdFxuICAgICAgICByZXR1cm4gdlxuICAgICAgfVxuXG4gICAgICBpZiAodi4kbW9kZWxUeXBlID09PSB5anNUZXh0TW9kZWxJZCkge1xuICAgICAgICBjb25zdCB0ZXh0ID0gbmV3IFkuVGV4dCgpXG4gICAgICAgIGNvbnN0IHlqc1RleHRNb2RlbCA9IHYgYXMgdW5rbm93biBhcyBTbmFwc2hvdE91dE9mPFlqc1RleHRNb2RlbD5cbiAgICAgICAgeWpzVGV4dE1vZGVsLmRlbHRhTGlzdC5mb3JFYWNoKChmcm96ZW5EZWx0YXMpID0+IHtcbiAgICAgICAgICB0ZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiB0ZXh0XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBZLk1hcCgpXG4gICAgICBhcHBseUpzb25PYmplY3RUb1lNYXAobWFwLCB2KVxuICAgICAgcmV0dXJuIG1hcFxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgdmFsdWUgdHlwZTogJHt2fWApXG4gIH0pXG59XG5cbi8qKlxuICogQXBwbGllcyBhIEpTT04gYXJyYXkgdG8gYSBZLkFycmF5LCB1c2luZyB0aGUgY29udmVydEpzb25Ub1lqc0RhdGEgdG8gY29udmVydCB0aGUgdmFsdWVzLlxuICovXG5leHBvcnQgY29uc3QgYXBwbHlKc29uQXJyYXlUb1lBcnJheSA9IGFjdGlvbigoZGVzdDogWS5BcnJheTxhbnk+LCBzb3VyY2U6IFBsYWluQXJyYXkpID0+IHtcbiAgZGVzdC5wdXNoKHNvdXJjZS5tYXAoY29udmVydEpzb25Ub1lqc0RhdGEpKVxufSlcblxuLyoqXG4gKiBBcHBsaWVzIGEgSlNPTiBvYmplY3QgdG8gYSBZLk1hcCwgdXNpbmcgdGhlIGNvbnZlcnRKc29uVG9ZanNEYXRhIHRvIGNvbnZlcnQgdGhlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGFwcGx5SnNvbk9iamVjdFRvWU1hcCA9IGFjdGlvbigoZGVzdDogWS5NYXA8YW55Piwgc291cmNlOiBQbGFpbk9iamVjdCkgPT4ge1xuICBPYmplY3QuZW50cmllcyhzb3VyY2UpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgIGRlc3Quc2V0KGssIGNvbnZlcnRKc29uVG9ZanNEYXRhKHYpKVxuICB9KVxufSlcbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuaW1wb3J0IHsgY29udmVydEpzb25Ub1lqc0RhdGEgfSBmcm9tIFwiLi9jb252ZXJ0SnNvblRvWWpzRGF0YVwiXG5pbXBvcnQgeyBQbGFpblZhbHVlIH0gZnJvbSBcIi4uL3BsYWluVHlwZXNcIlxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoOiBQYXRjaCwgeWpzOiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChwYXRjaC5wYXRoLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGNoLnBhdGhcblxuICAgIGlmICh5anMgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgICAgY29uc3QgY2hpbGQgPSB5anMuZ2V0KFN0cmluZyhrZXkpKSBhcyB1bmtub3duXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgbWFwIC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkocGF0Y2gpfWBcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHsgLi4ucGF0Y2gsIHBhdGg6IHJlc3QgfSwgY2hpbGQpXG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoTnVtYmVyKGtleSkpIGFzIHVua25vd25cbiAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIFlqcyBhcnJheSAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgcGF0Y2hcbiAgICAgICAgICApfWBcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHsgLi4ucGF0Y2gsIHBhdGg6IHJlc3QgfSwgY2hpbGQpXG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLlRleHQpIHtcbiAgICAgIC8vIGNoYW5nZXMgdG8gZGVsdGFMaXN0IHdpbGwgYmUgaGFuZGxlZCBieSB0aGUgYXJyYXkgb2JzZXJ2ZSBpbiB0aGUgWWpzVGV4dE1vZGVsIGNsYXNzXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiB1bmtub3duIFlqcyBvYmplY3QgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBwYXRjaFxuICAgICAgICApfWBcbiAgICAgIClcbiAgICB9XG4gIH0gZWxzZSBpZiAocGF0Y2gucGF0aC5sZW5ndGggPT09IDEpIHtcbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwYXRjaC5wYXRoWzBdKVxuXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XG4gICAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xuICAgICAgICAgIHlqcy5zZXQoa2V5LCBjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSBhcyBQbGFpblZhbHVlKSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIHlqcy5kZWxldGUoa2V5KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggb3BlcmF0aW9uIGZvciBtYXBgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBjb25zdCBrZXkgPSBwYXRjaC5wYXRoWzBdXG5cbiAgICAgIHN3aXRjaCAocGF0Y2gub3ApIHtcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xuICAgICAgICAgIGlmIChrZXkgPT09IFwibGVuZ3RoXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0xlbmd0aCA9IHBhdGNoLnZhbHVlIGFzIG51bWJlclxuICAgICAgICAgICAgaWYgKHlqcy5sZW5ndGggPiBuZXdMZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgdG9EZWxldGUgPSB5anMubGVuZ3RoIC0gbmV3TGVuZ3RoXG4gICAgICAgICAgICAgIHlqcy5kZWxldGUobmV3TGVuZ3RoLCB0b0RlbGV0ZSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeWpzLmxlbmd0aCA8IHBhdGNoLnZhbHVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvSW5zZXJ0ID0gcGF0Y2gudmFsdWUgLSB5anMubGVuZ3RoXG4gICAgICAgICAgICAgIHlqcy5pbnNlcnQoeWpzLmxlbmd0aCwgQXJyYXkuZnJvbSh7IGxlbmd0aDogdG9JbnNlcnQgfSkuZmlsbCh1bmRlZmluZWQpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB5anMuZGVsZXRlKE51bWJlcihrZXkpKVxuICAgICAgICAgICAgeWpzLmluc2VydChOdW1iZXIoa2V5KSwgW2NvbnZlcnRKc29uVG9ZanNEYXRhKHBhdGNoLnZhbHVlIGFzIFBsYWluVmFsdWUpXSlcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiYWRkXCI6IHtcbiAgICAgICAgICB5anMuaW5zZXJ0KE51bWJlcihrZXkpLCBbY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUgYXMgUGxhaW5WYWx1ZSldKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIG9wZXJhdGlvbiBmb3IgYXJyYXlgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLlRleHQpIHtcbiAgICAgIC8vIGluaXRpYWxpemF0aW9uIG9mIGEgWWpzVGV4dE1vZGVsLCBkbyBub3RoaW5nXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIHRoZSBZanMgb2JqZWN0IGlzIG9mIGFuIHVua293biB0eXBlLCBzbyBrZXkgXCIke1N0cmluZyhwYXRjaC5wYXRoWzBdKX1cIiBjYW5ub3QgYmUgZm91bmQgaW4gaXRgXG4gICAgICApXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggcGF0aCwgaXQgY2Fubm90IGJlIGVtcHR5YClcbiAgfVxufVxuIiwiaW1wb3J0IHsgbW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YSB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBQbGFpbk9iamVjdCwgUGxhaW5WYWx1ZSB9IGZyb20gXCIuLi9wbGFpblR5cGVzXCJcbmltcG9ydCB7IFlqc1RleHRNb2RlbCB9IGZyb20gXCIuL1lqc1RleHRNb2RlbFwiXG5pbXBvcnQgeyBhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5cbmV4cG9ydCB0eXBlIFlqc0RhdGEgPSBZLkFycmF5PGFueT4gfCBZLk1hcDxhbnk+IHwgWS5UZXh0IHwgUGxhaW5WYWx1ZVxuXG5leHBvcnQgY29uc3QgY29udmVydFlqc0RhdGFUb0pzb24gPSBhY3Rpb24oKHlqc0RhdGE6IFlqc0RhdGEpOiBQbGFpblZhbHVlID0+IHtcbiAgaWYgKHlqc0RhdGEgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgcmV0dXJuIHlqc0RhdGEubWFwKCh2KSA9PiBjb252ZXJ0WWpzRGF0YVRvSnNvbih2KSlcbiAgfVxuXG4gIGlmICh5anNEYXRhIGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICBjb25zdCBvYmo6IFBsYWluT2JqZWN0ID0ge31cbiAgICB5anNEYXRhLmZvckVhY2goKHYsIGspID0+IHtcbiAgICAgIG9ialtrXSA9IGNvbnZlcnRZanNEYXRhVG9Kc29uKHYpXG4gICAgfSlcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuVGV4dCkge1xuICAgIGNvbnN0IGRlbHRhcyA9IHlqc0RhdGEudG9EZWx0YSgpIGFzIHVua25vd25bXVxuXG4gICAgcmV0dXJuIG1vZGVsU25hcHNob3RPdXRXaXRoTWV0YWRhdGEoWWpzVGV4dE1vZGVsLCB7XG4gICAgICBkZWx0YUxpc3Q6IGRlbHRhcy5sZW5ndGggPiAwID8gW3sgJGZyb3plbjogdHJ1ZSwgZGF0YTogZGVsdGFzIH1dIDogW10sXG4gICAgfSkgYXMgdW5rbm93biBhcyBQbGFpblZhbHVlXG4gIH1cblxuICAvLyBhc3N1bWUgaXQncyBhIHByaW1pdGl2ZVxuICByZXR1cm4geWpzRGF0YVxufSlcbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IFBsYWluQXJyYXksIFBsYWluT2JqZWN0LCBQbGFpblZhbHVlIH0gZnJvbSBcIi4uL3BsYWluVHlwZXNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMoZXZlbnQ6IFkuWUV2ZW50PGFueT4pOiBQYXRjaFtdIHtcbiAgY29uc3QgcGF0Y2hlczogUGF0Y2hbXSA9IFtdXG5cbiAgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZTWFwRXZlbnQpIHtcbiAgICBjb25zdCBzb3VyY2UgPSBldmVudC50YXJnZXRcblxuICAgIGV2ZW50LmNoYW5nZXMua2V5cy5mb3JFYWNoKChjaGFuZ2UsIGtleSkgPT4ge1xuICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCBrZXldXG5cbiAgICAgIHN3aXRjaCAoY2hhbmdlLmFjdGlvbikge1xuICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcImFkZFwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUoc291cmNlLmdldChrZXkpKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBcInVwZGF0ZVwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZXBsYWNlXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZShzb3VyY2UuZ2V0KGtleSkpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIFwiZGVsZXRlXCI6XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGB1bnN1cHBvcnRlZCBZanMgbWFwIGV2ZW50IGFjdGlvbjogJHtjaGFuZ2UuYWN0aW9ufWApXG4gICAgICB9XG4gICAgfSlcbiAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWUFycmF5RXZlbnQpIHtcbiAgICBsZXQgcmV0YWluID0gMFxuICAgIGV2ZW50LmNoYW5nZXMuZGVsdGEuZm9yRWFjaCgoY2hhbmdlKSA9PiB7XG4gICAgICBpZiAoY2hhbmdlLnJldGFpbikge1xuICAgICAgICByZXRhaW4gKz0gY2hhbmdlLnJldGFpblxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlLmRlbGV0ZSkge1xuICAgICAgICAvLyByZW1vdmUgWCBpdGVtcyBhdCByZXRhaW4gcG9zaXRpb25cbiAgICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCByZXRhaW5dXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlLmRlbGV0ZTsgaSsrKSB7XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2UuaW5zZXJ0KSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IEFycmF5LmlzQXJyYXkoY2hhbmdlLmluc2VydCkgPyBjaGFuZ2UuaW5zZXJ0IDogW2NoYW5nZS5pbnNlcnRdXG4gICAgICAgIG5ld1ZhbHVlcy5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCByZXRhaW5dXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcImFkZFwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUodiksXG4gICAgICAgICAgfSlcbiAgICAgICAgICByZXRhaW4rK1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllUZXh0RXZlbnQpIHtcbiAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIFwiZGVsdGFMaXN0XCIsIC0xIC8qIGxhc3QgaXRlbSAqL11cbiAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICBwYXRoLFxuICAgICAgdmFsdWU6IHsgJGZyb3plbjogdHJ1ZSwgZGF0YTogZXZlbnQuZGVsdGEgfSxcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHBhdGNoZXNcbn1cblxuZnVuY3Rpb24gdG9QbGFpblZhbHVlKHY6IFkuTWFwPGFueT4gfCBZLkFycmF5PGFueT4gfCBQbGFpblZhbHVlKSB7XG4gIGlmICh2IGluc3RhbmNlb2YgWS5NYXAgfHwgdiBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICByZXR1cm4gdi50b0pTT04oKSBhcyBQbGFpbk9iamVjdCB8IFBsYWluQXJyYXlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdlxuICB9XG59XG4iLCJpbXBvcnQgeyBhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQge1xuICBBbnlEYXRhTW9kZWwsXG4gIEFueU1vZGVsLFxuICBBbnlTdGFuZGFyZFR5cGUsXG4gIE1vZGVsQ2xhc3MsXG4gIFBhdGNoLFxuICBTbmFwc2hvdEluT2YsXG4gIFR5cGVUb0RhdGEsXG4gIGFwcGx5UGF0Y2hlcyxcbiAgZnJvbVNuYXBzaG90LFxuICBnZXRQYXJlbnRUb0NoaWxkUGF0aCxcbiAgb25HbG9iYWxQYXRjaGVzLFxuICBvblBhdGNoZXMsXG4gIG9uU25hcHNob3QsXG59IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBnZXRZanNDb2xsZWN0aW9uQXRvbSB9IGZyb20gXCIuLi91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tXCJcbmltcG9ydCB7IGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCB9IGZyb20gXCIuL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdFwiXG5pbXBvcnQgeyBjb252ZXJ0WWpzRGF0YVRvSnNvbiB9IGZyb20gXCIuL2NvbnZlcnRZanNEYXRhVG9Kc29uXCJcbmltcG9ydCB7IGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyB9IGZyb20gXCIuL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlc1wiXG5pbXBvcnQgeyBZanNCaW5kaW5nQ29udGV4dCwgeWpzQmluZGluZ0NvbnRleHQgfSBmcm9tIFwiLi95anNCaW5kaW5nQ29udGV4dFwiXG5cbi8qKlxuICogQ3JlYXRlcyBhIGJpZGlyZWN0aW9uYWwgYmluZGluZyBiZXR3ZWVuIGEgWS5qcyBkYXRhIHN0cnVjdHVyZSBhbmQgYSBtb2J4LWtleXN0b25lIG1vZGVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZFlqc1RvTW9ieEtleXN0b25lPFxuICBUVHlwZSBleHRlbmRzIEFueVN0YW5kYXJkVHlwZSB8IE1vZGVsQ2xhc3M8QW55TW9kZWw+IHwgTW9kZWxDbGFzczxBbnlEYXRhTW9kZWw+LFxuPih7XG4gIHlqc0RvYyxcbiAgeWpzT2JqZWN0LFxuICBtb2J4S2V5c3RvbmVUeXBlLFxufToge1xuICAvKipcbiAgICogVGhlIFkuanMgZG9jdW1lbnQuXG4gICAqL1xuICB5anNEb2M6IFkuRG9jXG4gIC8qKlxuICAgKiBUaGUgYm91bmQgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAgICovXG4gIHlqc09iamVjdDogWS5NYXA8YW55PiB8IFkuQXJyYXk8YW55PiB8IFkuVGV4dFxuICAvKipcbiAgICogVGhlIG1vYngta2V5c3RvbmUgbW9kZWwgdHlwZS5cbiAgICovXG4gIG1vYnhLZXlzdG9uZVR5cGU6IFRUeXBlXG59KToge1xuICAvKipcbiAgICogVGhlIGJvdW5kIG1vYngta2V5c3RvbmUgaW5zdGFuY2UuXG4gICAqL1xuICBib3VuZE9iamVjdDogVHlwZVRvRGF0YTxUVHlwZT5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBiaW5kaW5nLlxuICAgKi9cbiAgZGlzcG9zZTogKCkgPT4gdm9pZFxuICAvKipcbiAgICogVGhlIFkuanMgb3JpZ2luIHN5bWJvbCB1c2VkIGZvciBiaW5kaW5nIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIHlqc09yaWdpbjogc3ltYm9sXG59IHtcbiAgY29uc3QgeWpzT3JpZ2luID0gU3ltYm9sKFwiYmluZFlqc1RvTW9ieEtleXN0b25lVHJhbnNhY3Rpb25PcmlnaW5cIilcblxuICBsZXQgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPSAwXG5cbiAgY29uc3QgYmluZGluZ0NvbnRleHQ6IFlqc0JpbmRpbmdDb250ZXh0ID0ge1xuICAgIHlqc0RvYyxcbiAgICB5anNPYmplY3QsXG4gICAgbW9ieEtleXN0b25lVHlwZSxcbiAgICB5anNPcmlnaW4sXG4gICAgYm91bmRPYmplY3Q6IHVuZGVmaW5lZCwgLy8gbm90IHlldCBjcmVhdGVkXG5cbiAgICBnZXQgaXNBcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSgpIHtcbiAgICAgIHJldHVybiBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSA+IDBcbiAgICB9LFxuICB9XG5cbiAgY29uc3QgeWpzSnNvbiA9IGNvbnZlcnRZanNEYXRhVG9Kc29uKHlqc09iamVjdClcblxuICBjb25zdCBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXM6IHsgdGFyZ2V0OiBvYmplY3Q7IHBhdGNoZXM6IFBhdGNoW10gfVtdID0gW11cblxuICBjb25zdCBjcmVhdGVCb3VuZE9iamVjdCA9ICgpID0+IHtcbiAgICBjb25zdCBkaXNwb3NlT25HbG9iYWxQYXRjaGVzID0gb25HbG9iYWxQYXRjaGVzKCh0YXJnZXQsIHBhdGNoZXMpID0+IHtcbiAgICAgIGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlcy5wdXNoKHsgdGFyZ2V0LCBwYXRjaGVzIH0pXG4gICAgfSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBib3VuZE9iamVjdCA9IHlqc0JpbmRpbmdDb250ZXh0LmFwcGx5KFxuICAgICAgICAoKSA9PiBmcm9tU25hcHNob3QobW9ieEtleXN0b25lVHlwZSwgeWpzSnNvbiBhcyB1bmtub3duIGFzIFNuYXBzaG90SW5PZjxUeXBlVG9EYXRhPFRUeXBlPj4pLFxuICAgICAgICBiaW5kaW5nQ29udGV4dFxuICAgICAgKVxuICAgICAgeWpzQmluZGluZ0NvbnRleHQuc2V0KGJvdW5kT2JqZWN0LCB7IC4uLmJpbmRpbmdDb250ZXh0LCBib3VuZE9iamVjdCB9KVxuICAgICAgcmV0dXJuIGJvdW5kT2JqZWN0XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJvdW5kT2JqZWN0ID0gY3JlYXRlQm91bmRPYmplY3QoKVxuXG4gIC8vIGJpbmQgYW55IGNoYW5nZXMgZnJvbSB5anMgdG8gbW9ieC1rZXlzdG9uZVxuICBjb25zdCBvYnNlcnZlRGVlcENiID0gYWN0aW9uKChldmVudHM6IFkuWUV2ZW50PGFueT5bXSkgPT4ge1xuICAgIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LnRyYW5zYWN0aW9uLm9yaWdpbiAhPT0geWpzT3JpZ2luKSB7XG4gICAgICAgIHBhdGNoZXMucHVzaCguLi5jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMoZXZlbnQpKVxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgWS5NYXAgfHwgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgICBnZXRZanNDb2xsZWN0aW9uQXRvbShldmVudC50YXJnZXQpPy5yZXBvcnRDaGFuZ2VkKClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKHBhdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUrK1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXBwbHlQYXRjaGVzKGJvdW5kT2JqZWN0LCBwYXRjaGVzKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUtLVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICB5anNPYmplY3Qub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcblxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20gbW9ieC1rZXlzdG9uZSB0byB5anNcbiAgbGV0IHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXM6IFBhdGNoW11bXSA9IFtdXG4gIGNvbnN0IGRpc3Bvc2VPblBhdGNoZXMgPSBvblBhdGNoZXMoYm91bmRPYmplY3QsIChwYXRjaGVzKSA9PiB7XG4gICAgaWYgKGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID4gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcy5wdXNoKHBhdGNoZXMpXG4gIH0pXG5cbiAgLy8gdGhpcyBpcyBvbmx5IHVzZWQgc28gd2UgY2FuIHRyYW5zYWN0IGFsbCBwYXRjaGVzIHRvIHRoZSBzbmFwc2hvdCBib3VuZGFyeVxuICBjb25zdCBkaXNwb3NlT25TbmFwc2hvdCA9IG9uU25hcHNob3QoYm91bmRPYmplY3QsICgpID0+IHtcbiAgICBpZiAocGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFycmF5T2ZBcnJheU9mUGF0Y2hlcyA9IHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXNcbiAgICBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzID0gW11cblxuICAgIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICBhcnJheU9mQXJyYXlPZlBhdGNoZXMuZm9yRWFjaCgoYXJyYXlPZlBhdGNoZXMpID0+IHtcbiAgICAgICAgYXJyYXlPZlBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcbiAgICAgICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QocGF0Y2gsIHlqc09iamVjdClcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSwgeWpzT3JpZ2luKVxuICB9KVxuXG4gIC8vIHN5bmMgaW5pdGlhbCBwYXRjaGVzLCB0aGF0IG1pZ2h0IGluY2x1ZGUgc2V0dGluZyBkZWZhdWx0cywgSURzLCBldGNcbiAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAvLyB3ZSBuZWVkIHRvIHNraXAgaW5pdGlhbGl6YXRpb25zIHVudGlsIHdlIGhpdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGJvdW5kIG9iamVjdFxuICAgIC8vIHRoaXMgaXMgYmVjYXVzZSBkZWZhdWx0IG9iamVjdHMgbWlnaHQgYmUgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZSBtYWluIG9iamVjdFxuICAgIC8vIGJ1dCB3ZSBqdXN0IG5lZWQgdG8gY2F0Y2ggd2hlbiB0aG9zZSBhcmUgYWN0dWFsbHkgYXNzaWduZWQgdG8gdGhlIGJvdW5kIG9iamVjdFxuICAgIGxldCBib3VuZE9iamVjdEZvdW5kID0gZmFsc2VcblxuICAgIGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlcy5mb3JFYWNoKCh7IHRhcmdldCwgcGF0Y2hlcyB9KSA9PiB7XG4gICAgICBpZiAoIWJvdW5kT2JqZWN0Rm91bmQpIHtcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gYm91bmRPYmplY3QpIHtcbiAgICAgICAgICByZXR1cm4gLy8gc2tpcFxuICAgICAgICB9XG4gICAgICAgIGJvdW5kT2JqZWN0Rm91bmQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudFRvQ2hpbGRQYXRoID0gZ2V0UGFyZW50VG9DaGlsZFBhdGgoYm91bmRPYmplY3QsIHRhcmdldClcbiAgICAgIC8vIHRoaXMgaXMgdW5kZWZpbmVkIG9ubHkgaWYgdGFyZ2V0IGlzIG5vdCBhIGNoaWxkIG9mIGJvdW5kTW9kZWxcbiAgICAgIGlmIChwYXJlbnRUb0NoaWxkUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcbiAgICAgICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnBhdGNoLFxuICAgICAgICAgICAgICBwYXRoOiBbLi4ucGFyZW50VG9DaGlsZFBhdGgsIC4uLnBhdGNoLnBhdGhdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHlqc09iamVjdFxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9LCB5anNPcmlnaW4pXG5cbiAgcmV0dXJuIHtcbiAgICBib3VuZE9iamVjdCxcbiAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICBkaXNwb3NlT25QYXRjaGVzKClcbiAgICAgIGRpc3Bvc2VPblNuYXBzaG90KClcbiAgICAgIHlqc09iamVjdC51bm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXG4gICAgfSxcbiAgICB5anNPcmlnaW4sXG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJjcmVhdGVDb250ZXh0IiwiY3JlYXRlQXRvbSIsIlkiLCJ0eXBlcyIsIllqc1RleHRNb2RlbCIsIk1vZGVsIiwidFByb3AiLCJmcm96ZW4iLCJnZXRQYXJlbnRUb0NoaWxkUGF0aCIsInJlYWN0aW9uIiwib2JzZXJ2ZSIsIm9uU25hcHNob3QiLCJjb21wdXRlZCIsImV4cG9ydHMiLCJtb2RlbCIsInJ1bkluQWN0aW9uIiwiYWN0aW9uIiwibW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YSIsIm9uR2xvYmFsUGF0Y2hlcyIsImJvdW5kT2JqZWN0IiwiZnJvbVNuYXBzaG90IiwiYXBwbHlQYXRjaGVzIiwib25QYXRjaGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBR00sTUFBTyw2QkFBNkIsTUFBSztBQUFBLElBQzdDLFlBQVksS0FBVztBQUNyQixZQUFNLEdBQUc7QUFHRixhQUFBLGVBQWUsTUFBTSxxQkFBcUIsU0FBUztBQUFBLElBQUE7QUFBQSxFQUU3RDtBQUtLLFdBQVUsUUFBUSxLQUFXO0FBQzFCLFdBQUEsSUFBSSxxQkFBcUIsR0FBRztBQUFBLEVBQ3JDO0FDd0JhLFFBQUEsb0JBQW9CQSwyQkFBNkMsTUFBUztBQ3RDdkYsUUFBTSx5Q0FBeUI7QUFLbEIsUUFBQSx1QkFBdUIsQ0FDbEMsa0JBQ3FCO0FBQ2QsV0FBQSxtQkFBbUIsSUFBSSxhQUFhO0FBQUEsRUFDN0M7QUFLYSxRQUFBLCtCQUErQixDQUMxQyxrQkFDUztBQUNMLFFBQUEsT0FBTyxtQkFBbUIsSUFBSSxhQUFhO0FBQy9DLFFBQUksQ0FBQyxNQUFNO0FBQ1QsYUFBT0MsS0FBQUEsV0FBVyxtQkFBbUI7QUFDbEIseUJBQUEsSUFBSSxlQUFlLElBQUk7QUFBQSxJQUFBO0FBRXJDLFdBQUE7QUFBQSxFQUNUO0FDdEJnQixXQUFBLGVBQWUsV0FBb0IsTUFBa0M7QUFDbkYsUUFBSSxtQkFBNEI7QUFFM0IsU0FBQSxRQUFRLENBQUMsVUFBVSxNQUFLO0FBQ3ZCLFVBQUEsNEJBQTRCQyxhQUFFLEtBQUs7QUFDUixxQ0FBQSxnQkFBZ0IsRUFBRTtBQUN6QyxjQUFBLE1BQU0sT0FBTyxRQUFRO0FBQ1IsMkJBQUEsaUJBQWlCLElBQUksR0FBRztBQUFBLE1BQUEsV0FDbEMsNEJBQTRCQSxhQUFFLE9BQU87QUFDakIscUNBQUEsZ0JBQWdCLEVBQUU7QUFDekMsY0FBQSxNQUFNLE9BQU8sUUFBUTtBQUNSLDJCQUFBLGlCQUFpQixJQUFJLEdBQUc7QUFBQSxNQUFBLE9BQ3RDO0FBQ0wsY0FBTSxRQUNKLHlDQUF5QyxLQUFLLFVBQzVDLEtBQUssTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUNqQiw2QkFBNkIsS0FBSyxVQUFVLElBQUksQ0FBQyxhQUFhLGdCQUFnQixVQUFVO0FBQUEsTUFBQTtBQUFBLElBRTdGLENBQ0Q7QUFFTSxXQUFBO0FBQUEsRUFDVDtBQ1JBLFFBQU0sZ0JBQWdCQyxtQkFBTSxNQUFNQSxhQUFBQSxNQUFNLE9BQU9BLGFBQU0sTUFBQSxVQUFBLENBQXNCLENBQUM7QUFFckUsUUFBTSxpQkFBaUI7QUFNakJDLEVBQUFBLFNBQUFBLGVBQU4sTUFBTUEsc0JBQXFCQyxtQkFBTTtBQUFBLElBQ3RDLFdBQVdDLGFBQUFBLE1BQU0sZUFBZSxNQUFNLENBQUUsQ0FBQTtBQUFBLEdBQ3pDLEVBQUM7QUFBQSxJQUZLO0FBQUE7QUFtRUw7QUFBQTtBQUFBO0FBQUEsZ0RBQXFCTCxnQkFBVyxvQkFBb0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBN0RwRCxPQUFPLFNBQVMsTUFBWTtBQUMxQixhQUFPLElBQUksc0JBQXNCO0FBQUEsUUFDL0IsV0FBVztBQUFBLFVBQ1RNLG9CQUFPO0FBQUEsWUFDTDtBQUFBLGNBQ0UsUUFBUTtBQUFBLFlBQUE7QUFBQSxVQUVYLENBQUE7QUFBQSxRQUFBO0FBQUEsTUFDRixDQUNGO0FBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBT0gsSUFBWSxpQkFBYztBQUNsQixZQUFBLE1BQU0sa0JBQWtCLElBQUksSUFBSTtBQUNsQyxXQUFBLDJCQUFLLGdCQUFlLE1BQU07QUFDNUIsY0FBTSxRQUNKLG9GQUFvRjtBQUFBLE1BQUE7QUFJeEYsWUFBTSxPQUFPQyxhQUFBLHFCQUFxQixJQUFJLGFBQWEsSUFBSTtBQUN2RCxVQUFJLENBQUMsTUFBTTtBQUNULGNBQU0sUUFBUSw0RUFBNEU7QUFBQSxNQUFBO0FBR3JGLGFBQUE7QUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFPVCxJQUFZLG1CQUFnQjtBQUMxQixZQUFNLE9BQU8sS0FBSztBQUVaLFlBQUEsTUFBTSxrQkFBa0IsSUFBSSxJQUFJO0FBRS9CLGFBQUEsZUFBZSxJQUFJLFdBQVcsSUFBSTtBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQU8zQyxJQUFJLFVBQU87QUFDVCxZQUFNLFlBQVksS0FBSztBQUVuQixVQUFBLEVBQUUscUJBQXFCTixhQUFFLE9BQU87QUFDbEMsY0FBTSxRQUFRLCtCQUErQixLQUFLLFVBQVUsS0FBSyxjQUFjLENBQUMsRUFBRTtBQUFBLE1BQUE7QUFHN0UsYUFBQTtBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBYVQsSUFBSSxPQUFJO0FBQ04sV0FBSyxtQkFBbUI7QUFDakIsYUFBQSxLQUFLLFFBQVE7O0lBR1osU0FBTTtBQUNSLFlBQUEsdUJBQXVCLENBQUMsUUFBZ0U7QUFDckYsZUFBQSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxlQUFlLENBQUMsSUFBSTtBQUFBLE1BQzVDO0FBRUEsVUFBSSx5QkFBeUI7QUFDN0IsWUFBTSxZQUFpQyxDQUFBO0FBRW5DLFVBQUE7QUFFSixZQUFNLHNDQUFzQ08sS0FBQUEsU0FDMUMsTUFBTSxLQUFLLEVBQUUsV0FDYixDQUFDLGNBQWE7O0FBRWMsa0NBQUE7QUFFQSxrQ0FBQUMsS0FBQSxRQUFRLFdBQVcsQ0FBQyxXQUFVO0FBQ3RELGNBQUksd0JBQXdCO0FBRTFCO0FBQUEsVUFBQTtBQUVGLGNBQUksQ0FBQyxxQkFBcUIsa0JBQWtCLElBQUksSUFBSSxDQUFDLEdBQUc7QUFFdEQ7QUFBQSxVQUFBO0FBR0YsY0FDRSxPQUFPLFNBQVMsWUFDaEIsT0FBTyxpQkFBaUIsS0FDeEIsT0FBTyxhQUFhLEtBQ3BCLE9BQU8sVUFBVSxLQUFLLFVBQVUsUUFDaEM7QUFFVSxzQkFBQSxLQUFLLEdBQUcsT0FBTyxLQUFLO0FBQUEsVUFBQSxPQUN6QjtBQUVvQixxQ0FBQTtBQUFBLFVBQUE7QUFBQSxRQUMzQixDQUNEO0FBQUEsTUFBQSxHQUVILEVBQUUsaUJBQWlCLE1BQU07QUFHckIsWUFBQSxvQkFBb0JDLHdCQUFXLE1BQU0sTUFBSztBQUMxQyxZQUFBO0FBQ0YsY0FBSSx3QkFBd0I7QUFDcEIsa0JBQUEsTUFBTSxrQkFBa0IsSUFBSSxJQUFJO0FBRWxDLGdCQUFBLHFCQUFxQixHQUFHLEdBQUc7QUFDdkIsb0JBQUEsRUFBRSxZQUFZO0FBRWhCLGtCQUFBLE9BQU8sU0FBUyxNQUFLO0FBR25CLG9CQUFBLFFBQVEsU0FBUyxHQUFHO0FBQ2QsMEJBQUEsT0FBTyxHQUFHLFFBQVEsTUFBTTtBQUFBLGdCQUFBO0FBRzdCLHFCQUFBLFVBQVUsUUFBUSxDQUFDLGlCQUFnQjtBQUM5QiwwQkFBQSxXQUFXLGFBQWEsSUFBSTtBQUFBLGdCQUFBLENBQ3JDO0FBQUEsY0FBQSxHQUNBLElBQUksU0FBUztBQUFBLFlBQUE7QUFBQSxVQUNsQixXQUNTLFVBQVUsU0FBUyxHQUFHO0FBQ3pCLGtCQUFBLE1BQU0sa0JBQWtCLElBQUksSUFBSTtBQUVsQyxnQkFBQSxxQkFBcUIsR0FBRyxHQUFHO0FBQ3ZCLG9CQUFBLEVBQUUsWUFBWTtBQUVoQixrQkFBQSxPQUFPLFNBQVMsTUFBSztBQUNiLDBCQUFBLFFBQVEsQ0FBQyxpQkFBZ0I7QUFDekIsMEJBQUEsV0FBVyxhQUFhLElBQUk7QUFBQSxnQkFBQSxDQUNyQztBQUFBLGNBQUEsR0FDQSxJQUFJLFNBQVM7QUFBQSxZQUFBO0FBQUEsVUFDbEI7QUFBQSxRQUNGO0FBRXlCLG1DQUFBO0FBQ3pCLG9CQUFVLFNBQVM7QUFBQSxRQUFBO0FBQUEsTUFDckIsQ0FDRDtBQUVELFlBQU0sMkJBQTJCLHVCQUMvQixNQUFNLEtBQUssU0FDWCxLQUFLLGtCQUFrQjtBQUd6QixhQUFPLE1BQUs7Ozs7QUFJZ0Isa0NBQUE7O01BRzVCO0FBQUEsSUFBQTtBQUFBO0FBdkpGLGFBQUE7QUFBQSxJQURDQyxLQUFBQTtBQUFBQSxFQWVBLEdBQUFSLHNCQUFBLFdBQUEsa0JBQUEsSUFBQTtBQU1ELGFBQUE7QUFBQSxJQURDUSxLQUFBQTtBQUFBQSxFQU9BLEdBQUFSLHNCQUFBLFdBQUEsb0JBQUEsSUFBQTtBQU1ELGFBQUE7QUFBQSxJQURDUSxLQUFBQTtBQUFBQSxFQVNBLEdBQUFSLHNCQUFBLFdBQUEsV0FBQSxJQUFBO0FBWUQsYUFBQTtBQUFBLElBRENRLEtBQUFBO0FBQUFBLEVBSUEsR0FBQVIsc0JBQUEsV0FBQSxRQUFBLElBQUE7QUE3RVUsRUFBQVMsU0FBQSxlQUFZLFdBQUE7QUFBQSxJQUR4QkMsYUFBQUEsTUFBTSxjQUFjO0FBQUEsRUFDUixHQUFBVixxQkFBWTtBQW1MekIsUUFBTSx3QkFBd0JBLFNBQUE7QUFFOUIsV0FBUyx1QkFBdUIsWUFBMEIsaUJBQXNCO0FBQzFFLFFBQUE7QUFFSixVQUFNLFlBQVksTUFBSztBQUNyQixzQkFBZ0IsY0FBYTtBQUFBLElBQy9CO0FBRU0sVUFBQSwrQkFBK0JLLEtBQUFBLFNBQ25DLE1BQUs7QUFDQyxVQUFBO0FBQ0YsZUFBTztjQUNEO0FBQ0MsZUFBQTtBQUFBLE1BQUE7QUFBQSxJQUVYLEdBQ0EsQ0FBQyxZQUFXOztBQUVjLDhCQUFBO0FBRXhCLFVBQUksU0FBUztBQUNYLGdCQUFRLFFBQVEsU0FBUztBQUV6QixnQ0FBd0IsTUFBSztBQUMzQixrQkFBUSxVQUFVLFNBQVM7QUFBQSxRQUM3QjtBQUFBLE1BQUE7QUFHRixzQkFBZ0IsY0FBYTtBQUFBLElBQUEsR0FFL0I7QUFBQSxNQUNFLGlCQUFpQjtBQUFBLElBQUEsQ0FDbEI7QUFHSCxXQUFPLE1BQUs7OztBQUdjLDhCQUFBO0FBQUEsSUFDMUI7QUFBQSxFQUNGO0FDL09BLFdBQVMsaUJBQWlCLEdBQWE7QUFDckMsVUFBTSxJQUFJLE9BQU87QUFDVixXQUFBLE1BQU0sWUFBWSxNQUFNLFlBQVksTUFBTSxhQUFhLE1BQU0sUUFBUSxNQUFNO0FBQUEsRUFDcEY7QUFFQSxXQUFTLGFBQWEsR0FBYTtBQUMxQixXQUFBLE1BQU0sUUFBUSxDQUFDO0FBQUEsRUFDeEI7QUFFQSxXQUFTLGNBQWMsR0FBYTtBQUNsQyxXQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssT0FBTyxNQUFNLFlBQVksTUFBTTtBQUFBLEVBQzVEO0FBT00sV0FBVSxxQkFBcUIsR0FBYTtBQUNoRCxXQUFPTSxpQkFBWSxNQUFLO0FBQ2xCLFVBQUEsaUJBQWlCLENBQUMsR0FBRztBQUNoQixlQUFBO0FBQUEsTUFBQTtBQUdMLFVBQUEsYUFBYSxDQUFDLEdBQUc7QUFDYixjQUFBLE1BQU0sSUFBSWIsYUFBRTtBQUNsQiwrQkFBdUIsS0FBSyxDQUFDO0FBQ3RCLGVBQUE7QUFBQSxNQUFBO0FBR0wsVUFBQSxjQUFjLENBQUMsR0FBRztBQUNoQixZQUFBLEVBQUUsWUFBWSxNQUFNO0FBRWYsaUJBQUE7QUFBQSxRQUFBO0FBR0wsWUFBQSxFQUFFLGVBQWUsZ0JBQWdCO0FBQzdCLGdCQUFBLE9BQU8sSUFBSUEsYUFBRTtBQUNuQixnQkFBTSxlQUFlO0FBQ1IsdUJBQUEsVUFBVSxRQUFRLENBQUMsaUJBQWdCO0FBQ3pDLGlCQUFBLFdBQVcsYUFBYSxJQUFJO0FBQUEsVUFBQSxDQUNsQztBQUNNLGlCQUFBO0FBQUEsUUFBQTtBQUdILGNBQUEsTUFBTSxJQUFJQSxhQUFFO0FBQ2xCLDhCQUFzQixLQUFLLENBQUM7QUFDckIsZUFBQTtBQUFBLE1BQUE7QUFHVCxZQUFNLElBQUksTUFBTSwyQkFBMkIsQ0FBQyxFQUFFO0FBQUEsSUFBQSxDQUMvQztBQUFBLEVBQ0g7QUFLYSxRQUFBLHlCQUF5QmMsS0FBQSxPQUFPLENBQUMsTUFBb0IsV0FBc0I7QUFDdEYsU0FBSyxLQUFLLE9BQU8sSUFBSSxvQkFBb0IsQ0FBQztBQUFBLEVBQzVDLENBQUM7QUFLWSxRQUFBLHdCQUF3QkEsS0FBQSxPQUFPLENBQUMsTUFBa0IsV0FBdUI7QUFDN0UsV0FBQSxRQUFRLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBSztBQUN4QyxXQUFLLElBQUksR0FBRyxxQkFBcUIsQ0FBQyxDQUFDO0FBQUEsSUFBQSxDQUNwQztBQUFBLEVBQ0gsQ0FBQztBQ3JFZSxXQUFBLGtDQUFrQyxPQUFjLEtBQVk7QUFDdEUsUUFBQSxNQUFNLEtBQUssU0FBUyxHQUFHO0FBQ3pCLFlBQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxJQUFJLE1BQU07QUFFekIsVUFBQSxlQUFlZCxhQUFFLEtBQUs7QUFDeEIsY0FBTSxRQUFRLElBQUksSUFBSSxPQUFPLEdBQUcsQ0FBQztBQUNqQyxZQUFJLFVBQVUsUUFBVztBQUNqQixnQkFBQSxRQUNKLDRCQUE0QixHQUFHLG1DQUFtQyxLQUFLLFVBQVUsS0FBSyxDQUFDLEVBQUU7QUFBQSxRQUFBO0FBRzdGLDBDQUFrQyxFQUFFLEdBQUcsT0FBTyxNQUFNLEtBQUEsR0FBUSxLQUFLO0FBQUEsTUFBQSxXQUN4RCxlQUFlQSxhQUFFLE9BQU87QUFDakMsY0FBTSxRQUFRLElBQUksSUFBSSxPQUFPLEdBQUcsQ0FBQztBQUNqQyxZQUFJLFVBQVUsUUFBVztBQUNqQixnQkFBQSxRQUNKLDRCQUE0QixHQUFHLHFDQUFxQyxLQUFLLFVBQ3ZFLEtBQUssQ0FDTixFQUFFO0FBQUEsUUFBQTtBQUdQLDBDQUFrQyxFQUFFLEdBQUcsT0FBTyxNQUFNLEtBQUEsR0FBUSxLQUFLO0FBQUEsTUFDbkUsV0FBVyxlQUFlQSxhQUFFLEtBQU07QUFBQSxXQUUzQjtBQUNDLGNBQUEsUUFDSiw0QkFBNEIsR0FBRyw4Q0FBOEMsS0FBSyxVQUNoRixLQUFLLENBQ04sRUFBRTtBQUFBLE1BQUE7QUFBQSxJQUdFLFdBQUEsTUFBTSxLQUFLLFdBQVcsR0FBRztBQUM5QixVQUFBLGVBQWVBLGFBQUUsS0FBSztBQUN4QixjQUFNLE1BQU0sT0FBTyxNQUFNLEtBQUssQ0FBQyxDQUFDO0FBRWhDLGdCQUFRLE1BQU0sSUFBSTtBQUFBLFVBQ2hCLEtBQUs7QUFBQSxVQUNMLEtBQUssV0FBVztBQUNkLGdCQUFJLElBQUksS0FBSyxxQkFBcUIsTUFBTSxLQUFtQixDQUFDO0FBQzVEO0FBQUEsVUFBQTtBQUFBLFVBRUYsS0FBSyxVQUFVO0FBQ2IsZ0JBQUksT0FBTyxHQUFHO0FBQ2Q7QUFBQSxVQUFBO0FBQUEsVUFFRixTQUFTO0FBQ1Asa0JBQU0sUUFBUSxpQ0FBaUM7QUFBQSxVQUFBO0FBQUEsUUFDakQ7QUFBQSxNQUNGLFdBQ1MsZUFBZUEsYUFBRSxPQUFPO0FBQzNCLGNBQUEsTUFBTSxNQUFNLEtBQUssQ0FBQztBQUV4QixnQkFBUSxNQUFNLElBQUk7QUFBQSxVQUNoQixLQUFLLFdBQVc7QUFDZCxnQkFBSSxRQUFRLFVBQVU7QUFDcEIsb0JBQU0sWUFBWSxNQUFNO0FBQ3BCLGtCQUFBLElBQUksU0FBUyxXQUFXO0FBQ3BCLHNCQUFBLFdBQVcsSUFBSSxTQUFTO0FBQzFCLG9CQUFBLE9BQU8sV0FBVyxRQUFRO0FBQUEsY0FDckIsV0FBQSxJQUFJLFNBQVMsTUFBTSxPQUFPO0FBQzdCLHNCQUFBLFdBQVcsTUFBTSxRQUFRLElBQUk7QUFDbkMsb0JBQUksT0FBTyxJQUFJLFFBQVEsTUFBTSxLQUFLLEVBQUUsUUFBUSxTQUFVLENBQUEsRUFBRSxLQUFLLE1BQVMsQ0FBQztBQUFBLGNBQUE7QUFBQSxZQUN6RSxPQUNLO0FBQ0Qsa0JBQUEsT0FBTyxPQUFPLEdBQUcsQ0FBQztBQUNsQixrQkFBQSxPQUFPLE9BQU8sR0FBRyxHQUFHLENBQUMscUJBQXFCLE1BQU0sS0FBbUIsQ0FBQyxDQUFDO0FBQUEsWUFBQTtBQUUzRTtBQUFBLFVBQUE7QUFBQSxVQUVGLEtBQUssT0FBTztBQUNOLGdCQUFBLE9BQU8sT0FBTyxHQUFHLEdBQUcsQ0FBQyxxQkFBcUIsTUFBTSxLQUFtQixDQUFDLENBQUM7QUFDekU7QUFBQSxVQUFBO0FBQUEsVUFFRixLQUFLLFVBQVU7QUFDVCxnQkFBQSxPQUFPLE9BQU8sR0FBRyxDQUFDO0FBQ3RCO0FBQUEsVUFBQTtBQUFBLFVBRUYsU0FBUztBQUNQLGtCQUFNLFFBQVEsbUNBQW1DO0FBQUEsVUFBQTtBQUFBLFFBQ25EO0FBQUEsTUFFSixXQUFXLGVBQWVBLGFBQUUsS0FBTTtBQUFBLFdBRTNCO0FBQ0MsY0FBQSxRQUNKLG9FQUFvRSxPQUFPLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyx5QkFBeUI7QUFBQSxNQUFBO0FBQUEsSUFFdEgsT0FDSztBQUNMLFlBQU0sUUFBUSx3Q0FBd0M7QUFBQSxJQUFBO0FBQUEsRUFFMUQ7QUN6RmEsUUFBQSx1QkFBdUJjLEtBQUFBLE9BQU8sQ0FBQyxZQUFnQztBQUN0RSxRQUFBLG1CQUFtQmQsYUFBRSxPQUFPO0FBQzlCLGFBQU8sUUFBUSxJQUFJLENBQUMsTUFBTSxxQkFBcUIsQ0FBQyxDQUFDO0FBQUEsSUFBQTtBQUcvQyxRQUFBLG1CQUFtQkEsYUFBRSxLQUFLO0FBQzVCLFlBQU0sTUFBbUIsQ0FBQTtBQUNqQixjQUFBLFFBQVEsQ0FBQyxHQUFHLE1BQUs7QUFDbkIsWUFBQSxDQUFDLElBQUkscUJBQXFCLENBQUM7QUFBQSxNQUFBLENBQ2hDO0FBQ00sYUFBQTtBQUFBLElBQUE7QUFHTCxRQUFBLG1CQUFtQkEsYUFBRSxNQUFNO0FBQ3ZCLFlBQUEsU0FBUyxRQUFRO0FBRXZCLGFBQU9lLGFBQUFBLDZCQUE2QmIsU0FBQUEsY0FBYztBQUFBLFFBQ2hELFdBQVcsT0FBTyxTQUFTLElBQUksQ0FBQyxFQUFFLFNBQVMsTUFBTSxNQUFNLE9BQUEsQ0FBUSxJQUFJLENBQUE7QUFBQSxNQUFFLENBQ3RFO0FBQUEsSUFBQTtBQUlJLFdBQUE7QUFBQSxFQUNULENBQUM7QUMxQkssV0FBVSx5QkFBeUIsT0FBb0I7QUFDM0QsVUFBTSxVQUFtQixDQUFBO0FBRXJCLFFBQUEsaUJBQWlCRixhQUFFLFdBQVc7QUFDaEMsWUFBTSxTQUFTLE1BQU07QUFFckIsWUFBTSxRQUFRLEtBQUssUUFBUSxDQUFDLFFBQVEsUUFBTztBQUN6QyxjQUFNLE9BQU8sQ0FBQyxHQUFHLE1BQU0sTUFBTSxHQUFHO0FBRWhDLGdCQUFRLE9BQU8sUUFBUTtBQUFBLFVBQ3JCLEtBQUs7QUFDSCxvQkFBUSxLQUFLO0FBQUEsY0FDWCxJQUFJO0FBQUEsY0FDSjtBQUFBLGNBQ0EsT0FBTyxhQUFhLE9BQU8sSUFBSSxHQUFHLENBQUM7QUFBQSxZQUFBLENBQ3BDO0FBQ0Q7QUFBQSxVQUVGLEtBQUs7QUFDSCxvQkFBUSxLQUFLO0FBQUEsY0FDWCxJQUFJO0FBQUEsY0FDSjtBQUFBLGNBQ0EsT0FBTyxhQUFhLE9BQU8sSUFBSSxHQUFHLENBQUM7QUFBQSxZQUFBLENBQ3BDO0FBQ0Q7QUFBQSxVQUVGLEtBQUs7QUFDSCxvQkFBUSxLQUFLO0FBQUEsY0FDWCxJQUFJO0FBQUEsY0FDSjtBQUFBLFlBQUEsQ0FDRDtBQUNEO0FBQUEsVUFFRjtBQUNFLGtCQUFNLFFBQVEscUNBQXFDLE9BQU8sTUFBTSxFQUFFO0FBQUEsUUFBQTtBQUFBLE1BQ3RFLENBQ0Q7QUFBQSxJQUFBLFdBQ1EsaUJBQWlCQSxhQUFFLGFBQWE7QUFDekMsVUFBSSxTQUFTO0FBQ2IsWUFBTSxRQUFRLE1BQU0sUUFBUSxDQUFDLFdBQVU7QUFDckMsWUFBSSxPQUFPLFFBQVE7QUFDakIsb0JBQVUsT0FBTztBQUFBLFFBQUE7QUFHbkIsWUFBSSxPQUFPLFFBQVE7QUFFakIsZ0JBQU0sT0FBTyxDQUFDLEdBQUcsTUFBTSxNQUFNLE1BQU07QUFDbkMsbUJBQVMsSUFBSSxHQUFHLElBQUksT0FBTyxRQUFRLEtBQUs7QUFDdEMsb0JBQVEsS0FBSztBQUFBLGNBQ1gsSUFBSTtBQUFBLGNBQ0o7QUFBQSxZQUFBLENBQ0Q7QUFBQSxVQUFBO0FBQUEsUUFDSDtBQUdGLFlBQUksT0FBTyxRQUFRO0FBQ1gsZ0JBQUEsWUFBWSxNQUFNLFFBQVEsT0FBTyxNQUFNLElBQUksT0FBTyxTQUFTLENBQUMsT0FBTyxNQUFNO0FBQ3JFLG9CQUFBLFFBQVEsQ0FBQyxNQUFLO0FBQ3RCLGtCQUFNLE9BQU8sQ0FBQyxHQUFHLE1BQU0sTUFBTSxNQUFNO0FBQ25DLG9CQUFRLEtBQUs7QUFBQSxjQUNYLElBQUk7QUFBQSxjQUNKO0FBQUEsY0FDQSxPQUFPLGFBQWEsQ0FBQztBQUFBLFlBQUEsQ0FDdEI7QUFDRDtBQUFBLFVBQUEsQ0FDRDtBQUFBLFFBQUE7QUFBQSxNQUNILENBQ0Q7QUFBQSxJQUFBLFdBQ1EsaUJBQWlCQSxhQUFFLFlBQVk7QUFDeEMsWUFBTSxPQUFPO0FBQUEsUUFBQyxHQUFHLE1BQU07QUFBQSxRQUFNO0FBQUEsUUFBYTtBQUFBO0FBQUEsTUFBa0I7QUFDNUQsY0FBUSxLQUFLO0FBQUEsUUFDWCxJQUFJO0FBQUEsUUFDSjtBQUFBLFFBQ0EsT0FBTyxFQUFFLFNBQVMsTUFBTSxNQUFNLE1BQU0sTUFBTztBQUFBLE1BQUEsQ0FDNUM7QUFBQSxJQUFBO0FBR0ksV0FBQTtBQUFBLEVBQ1Q7QUFFQSxXQUFTLGFBQWEsR0FBeUM7QUFDN0QsUUFBSSxhQUFhQSxhQUFFLE9BQU8sYUFBYUEsYUFBRSxPQUFPO0FBQzlDLGFBQU8sRUFBRSxPQUFNO0FBQUEsSUFBQSxPQUNWO0FBQ0UsYUFBQTtBQUFBLElBQUE7QUFBQSxFQUVYO0FDakVNLFdBQVUsc0JBRWQsRUFDQSxRQUNBLFdBQ0Esb0JBY0Q7QUFjTyxVQUFBLFlBQVksT0FBTyx3Q0FBd0M7QUFFakUsUUFBSSxtQ0FBbUM7QUFFdkMsVUFBTSxpQkFBb0M7QUFBQSxNQUN4QztBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0EsYUFBYTtBQUFBO0FBQUEsTUFFYixJQUFJLHFDQUFrQztBQUNwQyxlQUFPLG1DQUFtQztBQUFBLE1BQUE7QUFBQTtBQUl4QyxVQUFBLFVBQVUscUJBQXFCLFNBQVM7QUFFOUMsVUFBTSw4QkFBc0UsQ0FBQTtBQUU1RSxVQUFNLG9CQUFvQixNQUFLO0FBQzdCLFlBQU0seUJBQXlCZ0IsYUFBQUEsZ0JBQWdCLENBQUMsUUFBUSxZQUFXO0FBQ2pFLG9DQUE0QixLQUFLLEVBQUUsUUFBUSxRQUFBLENBQVM7QUFBQSxNQUFBLENBQ3JEO0FBRUcsVUFBQTtBQUNJQyxjQUFBQSxlQUFjLGtCQUFrQixNQUNwQyxNQUFNQywwQkFBYSxrQkFBa0IsT0FBcUQsR0FDMUYsY0FBYztBQUVoQiwwQkFBa0IsSUFBSUQsY0FBYSxFQUFFLEdBQUcsZ0JBQWdCLGFBQUFBLGNBQWE7QUFDOURBLGVBQUFBO0FBQUFBLE1BQUE7OztJQUlYO0FBRUEsVUFBTSxjQUFjLGtCQUFpQjtBQUcvQixVQUFBLGdCQUFnQkgsWUFBTyxDQUFDLFdBQTJCO0FBQ3ZELFlBQU0sVUFBbUIsQ0FBQTtBQUNsQixhQUFBLFFBQVEsQ0FBQyxVQUFTOztBQUNuQixZQUFBLE1BQU0sWUFBWSxXQUFXLFdBQVc7QUFDMUMsa0JBQVEsS0FBSyxHQUFHLHlCQUF5QixLQUFLLENBQUM7QUFBQSxRQUFBO0FBR2pELFlBQUksTUFBTSxrQkFBa0JkLGFBQUUsT0FBTyxNQUFNLGtCQUFrQkEsYUFBRSxPQUFPO0FBQy9DLHFDQUFBLE1BQU0sTUFBTSxNQUFaLG1CQUFlO0FBQUE7TUFDdEMsQ0FDRDtBQUVHLFVBQUEsUUFBUSxTQUFTLEdBQUc7QUFDdEI7QUFDSSxZQUFBO0FBQ0ZtQix1QkFBQSxhQUFhLGFBQWEsT0FBTztBQUFBLFFBQUE7QUFFakM7QUFBQSxRQUFBO0FBQUEsTUFDRjtBQUFBLElBQ0YsQ0FDRDtBQUVELGNBQVUsWUFBWSxhQUFhO0FBR25DLFFBQUksK0JBQTBDLENBQUE7QUFDOUMsVUFBTSxtQkFBbUJDLGFBQUFBLFVBQVUsYUFBYSxDQUFDLFlBQVc7QUFDMUQsVUFBSSxtQ0FBbUMsR0FBRztBQUN4QztBQUFBLE1BQUE7QUFHRixtQ0FBNkIsS0FBSyxPQUFPO0FBQUEsSUFBQSxDQUMxQztBQUdLLFVBQUEsb0JBQW9CWCx3QkFBVyxhQUFhLE1BQUs7QUFDakQsVUFBQSw2QkFBNkIsV0FBVyxHQUFHO0FBQzdDO0FBQUEsTUFBQTtBQUdGLFlBQU0sd0JBQXdCO0FBQzlCLHFDQUErQjtBQUUvQixhQUFPLFNBQVMsTUFBSztBQUNHLDhCQUFBLFFBQVEsQ0FBQyxtQkFBa0I7QUFDaEMseUJBQUEsUUFBUSxDQUFDLFVBQVM7QUFDL0IsOENBQWtDLE9BQU8sU0FBUztBQUFBLFVBQUEsQ0FDbkQ7QUFBQSxRQUFBLENBQ0Y7QUFBQSxTQUNBLFNBQVM7QUFBQSxJQUFBLENBQ2I7QUFHRCxXQUFPLFNBQVMsTUFBSztBQUluQixVQUFJLG1CQUFtQjtBQUV2QixrQ0FBNEIsUUFBUSxDQUFDLEVBQUUsUUFBUSxjQUFhO0FBQzFELFlBQUksQ0FBQyxrQkFBa0I7QUFDckIsY0FBSSxXQUFXLGFBQWE7QUFDMUI7QUFBQSxVQUFBO0FBRWlCLDZCQUFBO0FBQUEsUUFBQTtBQUdmLGNBQUEsb0JBQW9CSCxhQUFBQSxxQkFBcUIsYUFBYSxNQUFNO0FBRWxFLFlBQUksc0JBQXNCLFFBQVc7QUFDM0Isa0JBQUEsUUFBUSxDQUFDLFVBQVM7QUFFdEIsOENBQUE7QUFBQSxjQUNFLEdBQUc7QUFBQSxjQUNILE1BQU0sQ0FBQyxHQUFHLG1CQUFtQixHQUFHLE1BQU0sSUFBSTtBQUFBLGVBRTVDLFNBQVM7QUFBQSxVQUFBLENBRVo7QUFBQSxRQUFBO0FBQUEsTUFDSCxDQUNEO0FBQUEsT0FDQSxTQUFTO0FBRUwsV0FBQTtBQUFBLE1BQ0w7QUFBQSxNQUNBLFNBQVMsTUFBSzs7O0FBR1osa0JBQVUsY0FBYyxhQUFhO0FBQUEsTUFDdkM7QUFBQSxNQUNBO0FBQUE7RUFFSjs7Ozs7Ozs7OzsifQ==
|
|
758
|
+
}));
|
|
759
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMudW1kLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvZXJyb3IudHMiLCIuLi9zcmMvdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbS50cyIsIi4uL3NyYy91dGlscy9pc1lqc1ZhbHVlRGVsZXRlZC50cyIsIi4uL3NyYy9iaW5kaW5nL3Jlc29sdmVZanNQYXRoLnRzIiwiLi4vc3JjL2JpbmRpbmcveWpzQmluZGluZ0NvbnRleHQudHMiLCIuLi9zcmMvYmluZGluZy9ZanNUZXh0TW9kZWwudHMiLCIuLi9zcmMvYmluZGluZy95anNTbmFwc2hvdFRyYWNraW5nLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydEpzb25Ub1lqc0RhdGEudHMiLCIuLi9zcmMvYmluZGluZy9hcHBseU1vYnhDaGFuZ2VUb1lqc09iamVjdC50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNEYXRhVG9Kc29uLnRzIiwiLi4vc3JjL2JpbmRpbmcvYXBwbHlZanNFdmVudFRvTW9ieC50cyIsIi4uL3NyYy9iaW5kaW5nL2JpbmRZanNUb01vYnhLZXlzdG9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQSBtb2J4LWtleXN0b25lLXlqcyBlcnJvci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBNb2J4S2V5c3RvbmVZanNFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xyXG4gICAgc3VwZXIobXNnKVxyXG5cclxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTW9ieEtleXN0b25lWWpzRXJyb3IucHJvdG90eXBlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUobXNnOiBzdHJpbmcpIHtcclxuICByZXR1cm4gbmV3IE1vYnhLZXlzdG9uZVlqc0Vycm9yKG1zZylcclxufVxyXG4iLCJpbXBvcnQgeyBjcmVhdGVBdG9tLCBJQXRvbSB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5cbmNvbnN0IHlqc0NvbGxlY3Rpb25BdG9tcyA9IG5ldyBXZWFrTWFwPFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPiwgSUF0b20+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFlqc0NvbGxlY3Rpb25BdG9tID0gKFxuICB5anNDb2xsZWN0aW9uOiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj5cbik6IElBdG9tIHwgdW5kZWZpbmVkID0+IHtcbiAgcmV0dXJuIHlqc0NvbGxlY3Rpb25BdG9tcy5nZXQoeWpzQ29sbGVjdGlvbilcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20gPSAoXG4gIHlqc0NvbGxlY3Rpb246IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPlxuKTogSUF0b20gPT4ge1xuICBsZXQgYXRvbSA9IHlqc0NvbGxlY3Rpb25BdG9tcy5nZXQoeWpzQ29sbGVjdGlvbilcbiAgaWYgKCFhdG9tKSB7XG4gICAgYXRvbSA9IGNyZWF0ZUF0b20oYHlqc0NvbGxlY3Rpb25BdG9tYClcbiAgICB5anNDb2xsZWN0aW9uQXRvbXMuc2V0KHlqc0NvbGxlY3Rpb24sIGF0b20pXG4gIH1cbiAgcmV0dXJuIGF0b21cbn1cbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgWS5qcyB2YWx1ZSBoYXMgYmVlbiBkZWxldGVkIG9yIGl0cyBkb2N1bWVudCBkZXN0cm95ZWQuXG4gKlxuICogQHBhcmFtIHlqc1ZhbHVlIFRoZSBZLmpzIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZSBpcyBkZWxldGVkIG9yIGRlc3Ryb3llZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1lqc1ZhbHVlRGVsZXRlZCh5anNWYWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoeWpzVmFsdWUgaW5zdGFuY2VvZiBZLkFic3RyYWN0VHlwZSkge1xuICAgIHJldHVybiAhISh5anNWYWx1ZSBhcyBhbnkpLl9pdGVtPy5kZWxldGVkIHx8ICEheWpzVmFsdWUuZG9jPy5pc0Rlc3Ryb3llZFxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSB9IGZyb20gXCIuLi91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tXCJcblxuLyoqXG4gKiBSZXNvbHZlcyBhIHBhdGggd2l0aGluIGEgWWpzIG9iamVjdCBzdHJ1Y3R1cmUuXG4gKiBSZXR1cm5zIHRoZSBZanMgY29udGFpbmVyIGF0IHRoZSBzcGVjaWZpZWQgcGF0aC5cbiAqXG4gKiBXaGVuIGEgWS5UZXh0IGlzIGVuY291bnRlcmVkIGR1cmluZyBwYXRoIHJlc29sdXRpb24gKGVpdGhlciBhdCB0aGUgc3RhcnRcbiAqIG9yIG1pZC1wYXRoKSwgaXQgaXMgcmV0dXJuZWQgaW1tZWRpYXRlbHkgc2luY2UgWS5UZXh0IGRvZXNuJ3Qgc3VwcG9ydFxuICogbmVzdGVkIHBhdGggdHJhdmVyc2FsLlxuICpcbiAqIEBwYXJhbSB5anNPYmplY3QgVGhlIHJvb3QgWWpzIG9iamVjdFxuICogQHBhcmFtIHBhdGggQXJyYXkgb2Yga2V5cy9pbmRpY2VzIHRvIHRyYXZlcnNlXG4gKiBAcmV0dXJucyBUaGUgWWpzIGNvbnRhaW5lciBhdCB0aGUgcGF0aCwgb3IgWS5UZXh0IGlmIGVuY291bnRlcmVkIGR1cmluZyB0cmF2ZXJzYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVZanNQYXRoKFxuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPiB8IFkuVGV4dCxcbiAgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXVxuKTogdW5rbm93biB7XG4gIGxldCBjdXJyZW50WWpzT2JqZWN0OiB1bmtub3duID0geWpzT2JqZWN0XG5cbiAgbGV0IGkgPSAtMVxuICBmb3IgKGNvbnN0IHBhdGhQYXJ0IG9mIHBhdGgpIHtcbiAgICBpKytcbiAgICAvLyBJZiB3ZSBlbmNvdW50ZXIgYSBZLlRleHQgZHVyaW5nIHBhdGggcmVzb2x1dGlvbiwgcmV0dXJuIGl0IGltbWVkaWF0ZWx5LlxuICAgIC8vIFkuVGV4dCBvYmplY3RzIGRvbid0IHN1cHBvcnQgbmVzdGVkIHBhdGggdHJhdmVyc2FsLCBhbmQgdGhlaXIgdXBkYXRlc1xuICAgIC8vIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkgYnkgWWpzVGV4dE1vZGVsJ3Mgb3duIHN5bmNocm9uaXphdGlvbiBtZWNoYW5pc20uXG4gICAgaWYgKGN1cnJlbnRZanNPYmplY3QgaW5zdGFuY2VvZiBZLlRleHQpIHtcbiAgICAgIHJldHVybiBjdXJyZW50WWpzT2JqZWN0XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRZanNPYmplY3QgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgICAgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbShjdXJyZW50WWpzT2JqZWN0KS5yZXBvcnRPYnNlcnZlZCgpXG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcocGF0aFBhcnQpXG4gICAgICBjdXJyZW50WWpzT2JqZWN0ID0gY3VycmVudFlqc09iamVjdC5nZXQoa2V5KVxuICAgIH0gZWxzZSBpZiAoY3VycmVudFlqc09iamVjdCBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICAgIGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20oY3VycmVudFlqc09iamVjdCkucmVwb3J0T2JzZXJ2ZWQoKVxuICAgICAgY29uc3Qga2V5ID0gTnVtYmVyKHBhdGhQYXJ0KVxuICAgICAgY3VycmVudFlqc09iamVjdCA9IGN1cnJlbnRZanNPYmplY3QuZ2V0KGtleSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgYFkuTWFwIG9yIFkuQXJyYXkgd2FzIGV4cGVjdGVkIGF0IHBhdGggJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBwYXRoLnNsaWNlKDAsIGkpXG4gICAgICAgICl9IGluIG9yZGVyIHRvIHJlc29sdmUgcGF0aCAke0pTT04uc3RyaW5naWZ5KHBhdGgpfSwgYnV0IGdvdCAke2N1cnJlbnRZanNPYmplY3R9IGluc3RlYWRgXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnRZanNPYmplY3Rcbn1cbiIsImltcG9ydCB7IEFueVR5cGUsIGNyZWF0ZUNvbnRleHQgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuXG4vKipcbiAqIENvbnRleHQgd2l0aCBpbmZvIG9uIGhvdyBhIG1vYngta2V5c3RvbmUgbW9kZWwgaXMgYm91bmQgdG8gYSBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlqc0JpbmRpbmdDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBZLmpzIGRvY3VtZW50LlxuICAgKi9cbiAgeWpzRG9jOiBZLkRvY1xuXG4gIC8qKlxuICAgKiBUaGUgYm91bmQgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAgICovXG4gIHlqc09iamVjdDogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+IHwgWS5UZXh0XG5cbiAgLyoqXG4gICAqIFRoZSBtb2J4LWtleXN0b25lIG1vZGVsIHR5cGUuXG4gICAqL1xuICBtb2J4S2V5c3RvbmVUeXBlOiBBbnlUeXBlXG5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW4gc3ltYm9sIHVzZWQgZm9yIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIHlqc09yaWdpbjogc3ltYm9sXG5cbiAgLyoqXG4gICAqIFRoZSBib3VuZCBtb2J4LWtleXN0b25lIGluc3RhbmNlLlxuICAgKi9cbiAgYm91bmRPYmplY3Q6IHVua25vd25cblxuICAvKipcbiAgICogV2hldGhlciB3ZSBhcmUgY3VycmVudGx5IGFwcGx5aW5nIFkuanMgY2hhbmdlcyB0byB0aGUgbW9ieC1rZXlzdG9uZSBtb2RlbC5cbiAgICovXG4gIGlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmU6IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBDb250ZXh0IHdpdGggaW5mbyBvbiBob3cgYSBtb2J4LWtleXN0b25lIG1vZGVsIGlzIGJvdW5kIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHlqc0JpbmRpbmdDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxZanNCaW5kaW5nQ29udGV4dCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuIiwiaW1wb3J0IHsgY29tcHV0ZWQsIGNyZWF0ZUF0b20sIElBdG9tLCBvYnNlcnZlLCByZWFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7XG4gIEZyb3plbixcbiAgZnJvemVuLFxuICBnZXRQYXJlbnRUb0NoaWxkUGF0aCxcbiAgTW9kZWwsXG4gIG1vZGVsLFxuICBvblNuYXBzaG90LFxuICB0UHJvcCxcbiAgdHlwZXMsXG59IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcbmltcG9ydCB7IGlzWWpzVmFsdWVEZWxldGVkIH0gZnJvbSBcIi4uL3V0aWxzL2lzWWpzVmFsdWVEZWxldGVkXCJcbmltcG9ydCB7IHJlc29sdmVZanNQYXRoIH0gZnJvbSBcIi4vcmVzb2x2ZVlqc1BhdGhcIlxuaW1wb3J0IHsgWWpzQmluZGluZ0NvbnRleHQsIHlqc0JpbmRpbmdDb250ZXh0IH0gZnJvbSBcIi4veWpzQmluZGluZ0NvbnRleHRcIlxuXG4vLyBEZWx0YVtdW10sIHNpbmNlIGVhY2ggc2luZ2xlIGNoYW5nZSBpcyBhIERlbHRhW11cbi8vIHdlIHVzZSBmcm96ZW4gc28gdGhhdCB3ZSBjYW4gcmV1c2UgZWFjaCBkZWx0YSBjaGFuZ2VcbmNvbnN0IGRlbHRhTGlzdFR5cGUgPSB0eXBlcy5hcnJheSh0eXBlcy5mcm96ZW4odHlwZXMudW5jaGVja2VkPHVua25vd25bXT4oKSkpXG5cbmV4cG9ydCBjb25zdCB5anNUZXh0TW9kZWxJZCA9IFwibW9ieC1rZXlzdG9uZS15anMvWWpzVGV4dE1vZGVsXCJcblxuLyoqXG4gKiBBIG1vYngta2V5c3RvbmUgbW9kZWwgdGhhdCByZXByZXNlbnRzIGEgWWpzLlRleHQgb2JqZWN0LlxuICovXG5AbW9kZWwoeWpzVGV4dE1vZGVsSWQpXG5leHBvcnQgY2xhc3MgWWpzVGV4dE1vZGVsIGV4dGVuZHMgTW9kZWwoe1xuICBkZWx0YUxpc3Q6IHRQcm9wKGRlbHRhTGlzdFR5cGUsICgpID0+IFtdKSxcbn0pIHtcbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBZanNUZXh0TW9kZWwgaW5zdGFuY2Ugd2l0aCBhIHNpbXBsZSB0ZXh0LlxuICAgKi9cbiAgc3RhdGljIHdpdGhUZXh0KHRleHQ6IHN0cmluZyk6IFlqc1RleHRNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0ZWRZanNUZXh0TW9kZWwoe1xuICAgICAgZGVsdGFMaXN0OiBbXG4gICAgICAgIGZyb3plbihbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaW5zZXJ0OiB0ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pLFxuICAgICAgXSxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBZLmpzIHBhdGggZnJvbSB0aGUgYm91bmQgb2JqZWN0IHRvIHRoZSBZanNUZXh0TW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgcHJpdmF0ZSBnZXQgX3lqc09iamVjdFBhdGgoKSB7XG4gICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXG4gICAgaWYgKGN0eD8uYm91bmRPYmplY3QgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgXCJ0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlIG11c3QgYmUgcGFydCBvZiBhIGJvdW5kIG9iamVjdCBiZWZvcmUgaXQgY2FuIGJlIGFjY2Vzc2VkXCJcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gZ2V0UGFyZW50VG9DaGlsZFBhdGgoY3R4LmJvdW5kT2JqZWN0LCB0aGlzKVxuICAgIGlmICghcGF0aCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcImEgcGF0aCBmcm9tIHRoZSBib3VuZCBvYmplY3QgdG8gdGhlIFlqc1RleHRNb2RlbCBpbnN0YW5jZSBpcyBub3QgYXZhaWxhYmxlXCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgWWpzLlRleHQgb2JqZWN0IHByZXNlbnQgYXQgdGhpcyBtb2J4LWtleXN0b25lIG5vZGUncyBwYXRoLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIHByaXZhdGUgZ2V0IF95anNPYmplY3RBdFBhdGgoKTogdW5rbm93biB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuX3lqc09iamVjdFBhdGhcblxuICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKSFcblxuICAgIHJldHVybiByZXNvbHZlWWpzUGF0aChjdHgueWpzT2JqZWN0LCBwYXRoKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBZanMuVGV4dCBvYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhpcyBtb2J4LWtleXN0b25lIG5vZGUuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IHlqc1RleHQoKTogWS5UZXh0IHtcbiAgICBjb25zdCB5anNPYmplY3QgPSB0aGlzLl95anNPYmplY3RBdFBhdGhcblxuICAgIGlmICghKHlqc09iamVjdCBpbnN0YW5jZW9mIFkuVGV4dCkpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYFkuVGV4dCB3YXMgZXhwZWN0ZWQgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KHRoaXMuX3lqc09iamVjdFBhdGgpfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHlqc09iamVjdFxuICB9XG5cbiAgLyoqXG4gICAqIEF0b20gdGhhdCBnZXRzIGNoYW5nZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBZLmpzIHRleHQgY2hhbmdlcy5cbiAgICovXG4gIHlqc1RleHRDaGFuZ2VkQXRvbSA9IGNyZWF0ZUF0b20oXCJ5anNUZXh0Q2hhbmdlZEF0b21cIilcblxuICAvKipcbiAgICogVGhlIHRleHQgdmFsdWUgb2YgdGhlIFlqcy5UZXh0IG9iamVjdC5cbiAgICogU2hvcnRjdXQgZm9yIGB5anNUZXh0LnRvU3RyaW5nKClgLCBidXQgY29tcHV0ZWQuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IHRleHQoKTogc3RyaW5nIHtcbiAgICB0aGlzLnlqc1RleHRDaGFuZ2VkQXRvbS5yZXBvcnRPYnNlcnZlZCgpXG5cbiAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcbiAgICBpZiAoY3R4Py5ib3VuZE9iamVjdCAhPSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB5anNUZXh0U3RyaW5nID0gdGhpcy55anNUZXh0LnRvU3RyaW5nKClcbiAgICAgICAgLy8gaWYgdGhlIHlqc1RleHQgaXMgZGV0YWNoZWQsIHRvU3RyaW5nKCkgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmdcbiAgICAgICAgLy8gaW4gdGhhdCBjYXNlIHdlIHNob3VsZCB1c2UgdGhlIGRlbHRhTGlzdCBhcyBhIGZhbGxiYWNrXG4gICAgICAgIGlmICh5anNUZXh0U3RyaW5nICE9PSBcIlwiIHx8IHRoaXMuZGVsdGFMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB5anNUZXh0U3RyaW5nXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBmYWxsIGJhY2tcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmYWxsIGJhY2sgdG8gZGVsdGFMaXN0XG4gICAgcmV0dXJuIHRoaXMuZGVsdGFMaXN0VG9UZXh0KClcbiAgfVxuXG4gIHByaXZhdGUgZGVsdGFMaXN0VG9UZXh0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgZG9jID0gbmV3IFkuRG9jKClcbiAgICBjb25zdCB0ZXh0ID0gZG9jLmdldFRleHQoKVxuICAgIHRoaXMuZGVsdGFMaXN0LmZvckVhY2goKGQpID0+IHtcbiAgICAgIHRleHQuYXBwbHlEZWx0YShkLmRhdGEpXG4gICAgfSlcbiAgICByZXR1cm4gdGV4dC50b1N0cmluZygpXG4gIH1cblxuICBwcm90ZWN0ZWQgb25Jbml0KCkge1xuICAgIGNvbnN0IHNob3VsZFJlcGxpY2F0ZVRvWWpzID0gKGN0eDogWWpzQmluZGluZ0NvbnRleHQgfCB1bmRlZmluZWQpOiBjdHggaXMgWWpzQmluZGluZ0NvbnRleHQgPT4ge1xuICAgICAgcmV0dXJuICEhY3R4ICYmICEhY3R4LmJvdW5kT2JqZWN0ICYmICFjdHguaXNBcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZVxuICAgIH1cblxuICAgIGxldCByZWFwcGx5RGVsdGFzVG9ZanNUZXh0ID0gZmFsc2VcbiAgICBjb25zdCBuZXdEZWx0YXM6IEZyb3plbjx1bmtub3duW10+W10gPSBbXVxuXG4gICAgbGV0IGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWRcblxuICAgIGNvbnN0IGRpc3Bvc2VSZWFjdGlvblRvRGVsdGFMaXN0UmVmQ2hhbmdlID0gcmVhY3Rpb24oXG4gICAgICAoKSA9PiB0aGlzLiQuZGVsdGFMaXN0LFxuICAgICAgKGRlbHRhTGlzdCkgPT4ge1xuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdD8uKClcbiAgICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3QgPSB1bmRlZmluZWRcblxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IG9ic2VydmUoZGVsdGFMaXN0LCAoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgaWYgKHJlYXBwbHlEZWx0YXNUb1lqc1RleHQpIHtcbiAgICAgICAgICAgIC8vIGFscmVhZHkgZ29ubmEgcmVwbGFjZSB0aGVtIGFsbFxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc2hvdWxkUmVwbGljYXRlVG9ZanMoeWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpKSkge1xuICAgICAgICAgICAgLy8geWpzIHRleHQgaXMgYWxyZWFkeSB1cCB0byBkYXRlIHdpdGggdGhlc2UgY2hhbmdlc1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2hhbmdlLnR5cGUgPT09IFwic3BsaWNlXCIgJiZcbiAgICAgICAgICAgIGNoYW5nZS5yZW1vdmVkQ291bnQgPT09IDAgJiZcbiAgICAgICAgICAgIGNoYW5nZS5hZGRlZENvdW50ID4gMCAmJlxuICAgICAgICAgICAgY2hhbmdlLmluZGV4ID09PSB0aGlzLmRlbHRhTGlzdC5sZW5ndGhcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIG9wdGltaXphdGlvbiwganVzdCBhZGRpbmcgbmV3IG9uZXMgdG8gdGhlIGVuZFxuICAgICAgICAgICAgbmV3RGVsdGFzLnB1c2goLi4uY2hhbmdlLmFkZGVkKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBhbnkgb3RoZXIgY2hhbmdlLCB3ZSBuZWVkIHRvIHJlYXBwbHkgYWxsIGRlbHRhc1xuICAgICAgICAgICAgcmVhcHBseURlbHRhc1RvWWpzVGV4dCA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgeyBmaXJlSW1tZWRpYXRlbHk6IHRydWUgfVxuICAgIClcblxuICAgIGNvbnN0IGRpc3Bvc2VPblNuYXBzaG90ID0gb25TbmFwc2hvdCh0aGlzLCAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAocmVhcHBseURlbHRhc1RvWWpzVGV4dCkge1xuICAgICAgICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKVxuXG4gICAgICAgICAgaWYgKHNob3VsZFJlcGxpY2F0ZVRvWWpzKGN0eCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgeWpzVGV4dCB9ID0gdGhpc1xuICAgICAgICAgICAgaWYgKGlzWWpzVmFsdWVEZWxldGVkKHlqc1RleHQpKSB7XG4gICAgICAgICAgICAgIHRocm93IGZhaWx1cmUoXCJjYW5ub3QgcmVhcHBseSBkZWx0YXMgdG8gZGVsZXRlZCBZanMuVGV4dFwiKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdHgueWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgLy8gZGlkbid0IGZpbmQgYSBiZXR0ZXIgd2F5IHRoYW4gdGhpcyB0byByZWFwcGx5IGFsbCBkZWx0YXNcbiAgICAgICAgICAgICAgLy8gd2l0aG91dCBoYXZpbmcgdG8gcmUtY3JlYXRlIHRoZSBZLlRleHQgb2JqZWN0XG4gICAgICAgICAgICAgIGlmICh5anNUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB5anNUZXh0LmRlbGV0ZSgwLCB5anNUZXh0Lmxlbmd0aClcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRoaXMuZGVsdGFMaXN0LmZvckVhY2goKGZyb3plbkRlbHRhcykgPT4ge1xuICAgICAgICAgICAgICAgIHlqc1RleHQuYXBwbHlEZWx0YShmcm96ZW5EZWx0YXMuZGF0YSlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIGN0eC55anNPcmlnaW4pXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG5ld0RlbHRhcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXG5cbiAgICAgICAgICBpZiAoc2hvdWxkUmVwbGljYXRlVG9ZanMoY3R4KSkge1xuICAgICAgICAgICAgY29uc3QgeyB5anNUZXh0IH0gPSB0aGlzXG4gICAgICAgICAgICBpZiAoaXNZanNWYWx1ZURlbGV0ZWQoeWpzVGV4dCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgZmFpbHVyZShcImNhbm5vdCByZWFwcGx5IGRlbHRhcyB0byBkZWxldGVkIFlqcy5UZXh0XCIpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN0eC55anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgICAgICAgICAgICBuZXdEZWx0YXMuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XG4gICAgICAgICAgICAgICAgeWpzVGV4dC5hcHBseURlbHRhKGZyb3plbkRlbHRhcy5kYXRhKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgY3R4Lnlqc09yaWdpbilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlYXBwbHlEZWx0YXNUb1lqc1RleHQgPSBmYWxzZVxuICAgICAgICBuZXdEZWx0YXMubGVuZ3RoID0gMFxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCBkaXBvc2VZanNUZXh0Q2hhbmdlZEF0b20gPSBob29rWWpzVGV4dENoYW5nZWRBdG9tKFxuICAgICAgKCkgPT4gdGhpcy55anNUZXh0LFxuICAgICAgdGhpcy55anNUZXh0Q2hhbmdlZEF0b21cbiAgICApXG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZGlzcG9zZU9uU25hcHNob3QoKVxuICAgICAgZGlzcG9zZVJlYWN0aW9uVG9EZWx0YUxpc3RSZWZDaGFuZ2UoKVxuICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q/LigpXG4gICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IHVuZGVmaW5lZFxuXG4gICAgICBkaXBvc2VZanNUZXh0Q2hhbmdlZEF0b20oKVxuICAgIH1cbiAgfVxufVxuXG4vLyB3ZSB1c2UgdGhpcyB0cmljayBqdXN0IHRvIGF2b2lkIGEgYmFiZWwgYnVnIHRoYXQgY2F1c2VzIGNsYXNzZXMgdXNlZCBpbnNpZGUgY2xhc3NlcyBub3QgdG8gYmUgb3ZlcnJpZGVuXG4vLyBieSB0aGUgZGVjb3JhdG9yXG5jb25zdCBEZWNvcmF0ZWRZanNUZXh0TW9kZWwgPSBZanNUZXh0TW9kZWxcblxuZnVuY3Rpb24gaG9va1lqc1RleHRDaGFuZ2VkQXRvbShnZXRZanNUZXh0OiAoKSA9PiBZLlRleHQsIHRleHRDaGFuZ2VkQXRvbTogSUF0b20pIHtcbiAgbGV0IGRpc3Bvc2VPYnNlcnZlWWpzVGV4dDogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkXG5cbiAgY29uc3Qgb2JzZXJ2ZUZuID0gKCkgPT4ge1xuICAgIHRleHRDaGFuZ2VkQXRvbS5yZXBvcnRDaGFuZ2VkKClcbiAgfVxuXG4gIGNvbnN0IGRpc3Bvc2VSZWFjdGlvblRvWVRleHRDaGFuZ2UgPSByZWFjdGlvbihcbiAgICAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB5anNUZXh0ID0gZ2V0WWpzVGV4dCgpXG4gICAgICAgIHJldHVybiBpc1lqc1ZhbHVlRGVsZXRlZCh5anNUZXh0KSA/IHVuZGVmaW5lZCA6IHlqc1RleHRcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSxcbiAgICAoeWpzVGV4dCkgPT4ge1xuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0Py4oKVxuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXG5cbiAgICAgIGlmICh5anNUZXh0KSB7XG4gICAgICAgIHlqc1RleHQub2JzZXJ2ZShvYnNlcnZlRm4pXG5cbiAgICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gKCkgPT4ge1xuICAgICAgICAgIHlqc1RleHQudW5vYnNlcnZlKG9ic2VydmVGbilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0ZXh0Q2hhbmdlZEF0b20ucmVwb3J0Q2hhbmdlZCgpXG4gICAgfSxcbiAgICB7XG4gICAgICBmaXJlSW1tZWRpYXRlbHk6IHRydWUsXG4gICAgfVxuICApXG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBkaXNwb3NlUmVhY3Rpb25Ub1lUZXh0Q2hhbmdlKClcbiAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQ/LigpXG4gICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5cbi8qKlxuICogV2Vha01hcCB0aGF0IHRyYWNrcyB3aGljaCBzbmFwc2hvdCBlYWNoIFkuanMgY29udGFpbmVyIHdhcyBsYXN0IHN5bmNlZCBmcm9tLlxuICogVGhpcyBpcyB1c2VkIGR1cmluZyByZWNvbmNpbGlhdGlvbiB0byBza2lwIGNvbnRhaW5lcnMgdGhhdCBhcmUgYWxyZWFkeSB1cC10by1kYXRlLlxuICpcbiAqIFRoZSBrZXkgaXMgdGhlIFkuanMgY29udGFpbmVyIChZLk1hcCBvciBZLkFycmF5KS5cbiAqIFRoZSB2YWx1ZSBpcyB0aGUgc25hcHNob3QgKHBsYWluIG9iamVjdCBvciBhcnJheSkgdGhhdCB3YXMgbGFzdCBzeW5jZWQgdG8gaXQuXG4gKi9cbmV4cG9ydCBjb25zdCB5anNDb250YWluZXJUb1NuYXBzaG90ID0gbmV3IFdlYWtNYXA8WS5NYXA8YW55PiB8IFkuQXJyYXk8YW55PiwgdW5rbm93bj4oKVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHNuYXBzaG90IHRyYWNraW5nIGZvciBhIFkuanMgY29udGFpbmVyLlxuICogQ2FsbCB0aGlzIGFmdGVyIHN5bmNpbmcgYSBzbmFwc2hvdCB0byBhIFkuanMgY29udGFpbmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0WWpzQ29udGFpbmVyU25hcHNob3QoXG4gIGNvbnRhaW5lcjogWS5NYXA8YW55PiB8IFkuQXJyYXk8YW55PixcbiAgc25hcHNob3Q6IHVua25vd25cbik6IHZvaWQge1xuICB5anNDb250YWluZXJUb1NuYXBzaG90LnNldChjb250YWluZXIsIHNuYXBzaG90KVxufVxuXG4vKipcbiAqIEdldHMgdGhlIGxhc3Qgc3luY2VkIHNuYXBzaG90IGZvciBhIFkuanMgY29udGFpbmVyLlxuICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIGNvbnRhaW5lciBoYXMgbmV2ZXIgYmVlbiBzeW5jZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRZanNDb250YWluZXJTbmFwc2hvdChjb250YWluZXI6IFkuTWFwPGFueT4gfCBZLkFycmF5PGFueT4pOiB1bmtub3duIHtcbiAgcmV0dXJuIHlqc0NvbnRhaW5lclRvU25hcHNob3QuZ2V0KGNvbnRhaW5lcilcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBZLmpzIGNvbnRhaW5lciBpcyB1cC10by1kYXRlIHdpdGggdGhlIGdpdmVuIHNuYXBzaG90LlxuICogVXNlcyByZWZlcmVuY2UgZXF1YWxpdHkgdG8gY2hlY2sgaWYgdGhlIHNuYXBzaG90IGlzIHRoZSBzYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNZanNDb250YWluZXJVcFRvRGF0ZShcbiAgY29udGFpbmVyOiBZLk1hcDxhbnk+IHwgWS5BcnJheTxhbnk+LFxuICBzbmFwc2hvdDogdW5rbm93blxuKTogYm9vbGVhbiB7XG4gIHJldHVybiB5anNDb250YWluZXJUb1NuYXBzaG90LmdldChjb250YWluZXIpID09PSBzbmFwc2hvdFxufVxuIiwiaW1wb3J0IHsgZnJvemVuS2V5LCBtb2RlbFR5cGVLZXksIFNuYXBzaG90T3V0T2YgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgUGxhaW5BcnJheSwgUGxhaW5PYmplY3QsIFBsYWluUHJpbWl0aXZlLCBQbGFpblZhbHVlIH0gZnJvbSBcIi4uL3BsYWluVHlwZXNcIlxuaW1wb3J0IHsgWWpzRGF0YSB9IGZyb20gXCIuL2NvbnZlcnRZanNEYXRhVG9Kc29uXCJcbmltcG9ydCB7IFlqc1RleHRNb2RlbCwgeWpzVGV4dE1vZGVsSWQgfSBmcm9tIFwiLi9ZanNUZXh0TW9kZWxcIlxuaW1wb3J0IHsgaXNZanNDb250YWluZXJVcFRvRGF0ZSwgc2V0WWpzQ29udGFpbmVyU25hcHNob3QgfSBmcm9tIFwiLi95anNTbmFwc2hvdFRyYWNraW5nXCJcblxuLyoqXG4gKiBPcHRpb25zIGZvciBhcHBseWluZyBKU09OIGRhdGEgdG8gWS5qcyBkYXRhIHN0cnVjdHVyZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbHlKc29uVG9ZanNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBtb2RlIHRvIHVzZSB3aGVuIGFwcGx5aW5nIEpTT04gZGF0YSB0byBZLmpzIGRhdGEgc3RydWN0dXJlcy5cbiAgICogLSBgYWRkYDogQ3JlYXRlcyBuZXcgWS5qcyBjb250YWluZXJzIGZvciBvYmplY3RzL2FycmF5cyAoZGVmYXVsdCwgYmFja3dhcmRzIGNvbXBhdGlibGUpXG4gICAqIC0gYG1lcmdlYDogUmVjdXJzaXZlbHkgbWVyZ2VzIHZhbHVlcywgcHJlc2VydmluZyBleGlzdGluZyBjb250YWluZXIgcmVmZXJlbmNlcyB3aGVyZSBwb3NzaWJsZVxuICAgKi9cbiAgbW9kZT86IFwiYWRkXCIgfCBcIm1lcmdlXCJcbn1cblxuZnVuY3Rpb24gaXNQbGFpblByaW1pdGl2ZSh2OiBQbGFpblZhbHVlKTogdiBpcyBQbGFpblByaW1pdGl2ZSB7XG4gIGNvbnN0IHQgPSB0eXBlb2YgdlxuICByZXR1cm4gdCA9PT0gXCJzdHJpbmdcIiB8fCB0ID09PSBcIm51bWJlclwiIHx8IHQgPT09IFwiYm9vbGVhblwiIHx8IHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5BcnJheSh2OiBQbGFpblZhbHVlKTogdiBpcyBQbGFpbkFycmF5IHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodilcbn1cblxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2OiBQbGFpblZhbHVlKTogdiBpcyBQbGFpbk9iamVjdCB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHYpXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBwbGFpbiB2YWx1ZSB0byBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gKiBPYmplY3RzIGFyZSBjb252ZXJ0ZWQgdG8gWS5NYXBzLCBhcnJheXMgdG8gWS5BcnJheXMsIHByaW1pdGl2ZXMgYXJlIHVudG91Y2hlZC5cbiAqIEZyb3plbiB2YWx1ZXMgYXJlIGEgc3BlY2lhbCBjYXNlIGFuZCB0aGV5IGFyZSBrZXB0IGFzIGltbXV0YWJsZSBwbGFpbiB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0SnNvblRvWWpzRGF0YSh2OiBQbGFpblZhbHVlKTogWWpzRGF0YSB7XG4gIGlmIChpc1BsYWluUHJpbWl0aXZlKHYpKSB7XG4gICAgcmV0dXJuIHZcbiAgfVxuXG4gIGlmIChpc1BsYWluQXJyYXkodikpIHtcbiAgICBjb25zdCBhcnIgPSBuZXcgWS5BcnJheSgpXG4gICAgYXBwbHlKc29uQXJyYXlUb1lBcnJheShhcnIsIHYpXG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgaWYgKGlzUGxhaW5PYmplY3QodikpIHtcbiAgICBpZiAodltmcm96ZW5LZXldID09PSB0cnVlKSB7XG4gICAgICAvLyBmcm96ZW4gdmFsdWUsIHNhdmUgYXMgaW1tdXRhYmxlIG9iamVjdFxuICAgICAgcmV0dXJuIHZcbiAgICB9XG5cbiAgICBpZiAodlttb2RlbFR5cGVLZXldID09PSB5anNUZXh0TW9kZWxJZCkge1xuICAgICAgY29uc3QgdGV4dCA9IG5ldyBZLlRleHQoKVxuICAgICAgY29uc3QgeWpzVGV4dE1vZGVsID0gdiBhcyB1bmtub3duIGFzIFNuYXBzaG90T3V0T2Y8WWpzVGV4dE1vZGVsPlxuICAgICAgeWpzVGV4dE1vZGVsLmRlbHRhTGlzdC5mb3JFYWNoKChmcm96ZW5EZWx0YXMpID0+IHtcbiAgICAgICAgdGV4dC5hcHBseURlbHRhKGZyb3plbkRlbHRhcy5kYXRhKVxuICAgICAgfSlcbiAgICAgIHJldHVybiB0ZXh0XG4gICAgfVxuXG4gICAgY29uc3QgbWFwID0gbmV3IFkuTWFwKClcbiAgICBhcHBseUpzb25PYmplY3RUb1lNYXAobWFwLCB2KVxuICAgIHJldHVybiBtYXBcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgdmFsdWUgdHlwZTogJHt2fWApXG59XG5cbi8qKlxuICogQXBwbGllcyBhIEpTT04gYXJyYXkgdG8gYSBZLkFycmF5LCB1c2luZyB0aGUgY29udmVydEpzb25Ub1lqc0RhdGEgdG8gY29udmVydCB0aGUgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSBkZXN0IFRoZSBkZXN0aW5hdGlvbiBZLkFycmF5LlxuICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIEpTT04gYXJyYXkuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBhcHBseWluZyB0aGUgSlNPTiBkYXRhLlxuICovXG5leHBvcnQgY29uc3QgYXBwbHlKc29uQXJyYXlUb1lBcnJheSA9IChcbiAgZGVzdDogWS5BcnJheTxhbnk+LFxuICBzb3VyY2U6IFBsYWluQXJyYXksXG4gIG9wdGlvbnM6IEFwcGx5SnNvblRvWWpzT3B0aW9ucyA9IHt9XG4pID0+IHtcbiAgY29uc3QgeyBtb2RlID0gXCJhZGRcIiB9ID0gb3B0aW9uc1xuXG4gIC8vIEluIG1lcmdlIG1vZGUsIGNoZWNrIGlmIHRoZSBjb250YWluZXIgaXMgYWxyZWFkeSB1cC10by1kYXRlIHdpdGggdGhpcyBzbmFwc2hvdFxuICBpZiAobW9kZSA9PT0gXCJtZXJnZVwiICYmIGlzWWpzQ29udGFpbmVyVXBUb0RhdGUoZGVzdCwgc291cmNlKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc3JjTGVuID0gc291cmNlLmxlbmd0aFxuXG4gIGlmIChtb2RlID09PSBcImFkZFwiKSB7XG4gICAgLy8gQWRkIG1vZGU6IGp1c3QgcHVzaCBhbGwgaXRlbXMgdG8gdGhlIGVuZFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3JjTGVuOyBpKyspIHtcbiAgICAgIGRlc3QucHVzaChbY29udmVydEpzb25Ub1lqc0RhdGEoc291cmNlW2ldKV0pXG4gICAgfVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gTWVyZ2UgbW9kZTogcmVjdXJzaXZlbHkgbWVyZ2UgdmFsdWVzLCBwcmVzZXJ2aW5nIGV4aXN0aW5nIGNvbnRhaW5lciByZWZlcmVuY2VzXG4gIGNvbnN0IGRlc3RMZW4gPSBkZXN0Lmxlbmd0aFxuXG4gIC8vIFJlbW92ZSBleHRyYSBpdGVtcyBmcm9tIHRoZSBlbmRcbiAgaWYgKGRlc3RMZW4gPiBzcmNMZW4pIHtcbiAgICBkZXN0LmRlbGV0ZShzcmNMZW4sIGRlc3RMZW4gLSBzcmNMZW4pXG4gIH1cblxuICAvLyBVcGRhdGUgZXhpc3RpbmcgaXRlbXNcbiAgY29uc3QgbWluTGVuID0gTWF0aC5taW4oZGVzdExlbiwgc3JjTGVuKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG1pbkxlbjsgaSsrKSB7XG4gICAgY29uc3Qgc3JjSXRlbSA9IHNvdXJjZVtpXVxuICAgIGNvbnN0IGRlc3RJdGVtID0gZGVzdC5nZXQoaSlcblxuICAgIC8vIElmIGJvdGggYXJlIG9iamVjdHMsIG1lcmdlIHJlY3Vyc2l2ZWx5XG4gICAgaWYgKGlzUGxhaW5PYmplY3Qoc3JjSXRlbSkgJiYgZGVzdEl0ZW0gaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgICAgYXBwbHlKc29uT2JqZWN0VG9ZTWFwKGRlc3RJdGVtLCBzcmNJdGVtLCBvcHRpb25zKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBJZiBib3RoIGFyZSBhcnJheXMsIG1lcmdlIHJlY3Vyc2l2ZWx5XG4gICAgaWYgKGlzUGxhaW5BcnJheShzcmNJdGVtKSAmJiBkZXN0SXRlbSBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICAgIGFwcGx5SnNvbkFycmF5VG9ZQXJyYXkoZGVzdEl0ZW0sIHNyY0l0ZW0sIG9wdGlvbnMpXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIFNraXAgaWYgcHJpbWl0aXZlIHZhbHVlIGlzIHVuY2hhbmdlZCAob3B0aW1pemF0aW9uKVxuICAgIGlmIChpc1BsYWluUHJpbWl0aXZlKHNyY0l0ZW0pICYmIGRlc3RJdGVtID09PSBzcmNJdGVtKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSwgcmVwbGFjZSB0aGUgaXRlbVxuICAgIGRlc3QuZGVsZXRlKGksIDEpXG4gICAgZGVzdC5pbnNlcnQoaSwgW2NvbnZlcnRKc29uVG9ZanNEYXRhKHNyY0l0ZW0pXSlcbiAgfVxuXG4gIC8vIEFkZCBuZXcgaXRlbXMgYXQgdGhlIGVuZFxuICBmb3IgKGxldCBpID0gZGVzdExlbjsgaSA8IHNyY0xlbjsgaSsrKSB7XG4gICAgZGVzdC5wdXNoKFtjb252ZXJ0SnNvblRvWWpzRGF0YShzb3VyY2VbaV0pXSlcbiAgfVxuXG4gIC8vIFVwZGF0ZSBzbmFwc2hvdCB0cmFja2luZyBhZnRlciBzdWNjZXNzZnVsIG1lcmdlXG4gIHNldFlqc0NvbnRhaW5lclNuYXBzaG90KGRlc3QsIHNvdXJjZSlcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgSlNPTiBvYmplY3QgdG8gYSBZLk1hcCwgdXNpbmcgdGhlIGNvbnZlcnRKc29uVG9ZanNEYXRhIHRvIGNvbnZlcnQgdGhlIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gWS5NYXAuXG4gKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2UgSlNPTiBvYmplY3QuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBhcHBseWluZyB0aGUgSlNPTiBkYXRhLlxuICovXG5leHBvcnQgY29uc3QgYXBwbHlKc29uT2JqZWN0VG9ZTWFwID0gKFxuICBkZXN0OiBZLk1hcDxhbnk+LFxuICBzb3VyY2U6IFBsYWluT2JqZWN0LFxuICBvcHRpb25zOiBBcHBseUpzb25Ub1lqc09wdGlvbnMgPSB7fVxuKSA9PiB7XG4gIGNvbnN0IHsgbW9kZSA9IFwiYWRkXCIgfSA9IG9wdGlvbnNcblxuICAvLyBJbiBtZXJnZSBtb2RlLCBjaGVjayBpZiB0aGUgY29udGFpbmVyIGlzIGFscmVhZHkgdXAtdG8tZGF0ZSB3aXRoIHRoaXMgc25hcHNob3RcbiAgaWYgKG1vZGUgPT09IFwibWVyZ2VcIiAmJiBpc1lqc0NvbnRhaW5lclVwVG9EYXRlKGRlc3QsIHNvdXJjZSkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChtb2RlID09PSBcImFkZFwiKSB7XG4gICAgLy8gQWRkIG1vZGU6IGp1c3Qgc2V0IGFsbCB2YWx1ZXNcbiAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMoc291cmNlKSkge1xuICAgICAgY29uc3QgdiA9IHNvdXJjZVtrXVxuICAgICAgaWYgKHYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZXN0LnNldChrLCBjb252ZXJ0SnNvblRvWWpzRGF0YSh2KSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBNZXJnZSBtb2RlOiByZWN1cnNpdmVseSBtZXJnZSB2YWx1ZXMsIHByZXNlcnZpbmcgZXhpc3RpbmcgY29udGFpbmVyIHJlZmVyZW5jZXNcblxuICAvLyBEZWxldGUga2V5cyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiBzb3VyY2UgKG9yIGhhdmUgdW5kZWZpbmVkIHZhbHVlKVxuICBjb25zdCBzb3VyY2VLZXlzV2l0aFZhbHVlcyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoc291cmNlKS5maWx0ZXIoKGspID0+IHNvdXJjZVtrXSAhPT0gdW5kZWZpbmVkKSlcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVzdC5rZXlzKCkpIHtcbiAgICBpZiAoIXNvdXJjZUtleXNXaXRoVmFsdWVzLmhhcyhrZXkpKSB7XG4gICAgICBkZXN0LmRlbGV0ZShrZXkpXG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHNvdXJjZSkpIHtcbiAgICBjb25zdCB2ID0gc291cmNlW2tdXG4gICAgLy8gU2tpcCB1bmRlZmluZWQgdmFsdWVzIC0gWS5qcyBtYXBzIGNhbm5vdCBzdG9yZSB1bmRlZmluZWRcbiAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nID0gZGVzdC5nZXQoaylcblxuICAgIC8vIElmIHNvdXJjZSBpcyBhbiBvYmplY3QgYW5kIGRlc3QgaGFzIGEgWS5NYXAsIG1lcmdlIHJlY3Vyc2l2ZWx5XG4gICAgaWYgKGlzUGxhaW5PYmplY3QodikgJiYgZXhpc3RpbmcgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgICAgYXBwbHlKc29uT2JqZWN0VG9ZTWFwKGV4aXN0aW5nLCB2LCBvcHRpb25zKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBJZiBzb3VyY2UgaXMgYW4gYXJyYXkgYW5kIGRlc3QgaGFzIGEgWS5BcnJheSwgbWVyZ2UgcmVjdXJzaXZlbHlcbiAgICBpZiAoaXNQbGFpbkFycmF5KHYpICYmIGV4aXN0aW5nIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgYXBwbHlKc29uQXJyYXlUb1lBcnJheShleGlzdGluZywgdiwgb3B0aW9ucylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgLy8gU2tpcCBpZiBwcmltaXRpdmUgdmFsdWUgaXMgdW5jaGFuZ2VkIChvcHRpbWl6YXRpb24pXG4gICAgaWYgKGlzUGxhaW5QcmltaXRpdmUodikgJiYgZXhpc3RpbmcgPT09IHYpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlLCBjb252ZXJ0IGFuZCBzZXQgdGhlIHZhbHVlICh0aGlzIGNyZWF0ZXMgbmV3IGNvbnRhaW5lcnMgaWYgbmVlZGVkKVxuICAgIGRlc3Quc2V0KGssIGNvbnZlcnRKc29uVG9ZanNEYXRhKHYpKVxuICB9XG5cbiAgLy8gVXBkYXRlIHNuYXBzaG90IHRyYWNraW5nIGFmdGVyIHN1Y2Nlc3NmdWwgbWVyZ2VcbiAgc2V0WWpzQ29udGFpbmVyU25hcHNob3QoZGVzdCwgc291cmNlKVxufVxuIiwiaW1wb3J0IHsgRGVlcENoYW5nZSwgRGVlcENoYW5nZVR5cGUgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBpc1lqc1ZhbHVlRGVsZXRlZCB9IGZyb20gXCIuLi91dGlscy9pc1lqc1ZhbHVlRGVsZXRlZFwiXG5pbXBvcnQgeyBjb252ZXJ0SnNvblRvWWpzRGF0YSB9IGZyb20gXCIuL2NvbnZlcnRKc29uVG9ZanNEYXRhXCJcbmltcG9ydCB7IHJlc29sdmVZanNQYXRoIH0gZnJvbSBcIi4vcmVzb2x2ZVlqc1BhdGhcIlxuXG4vKipcbiAqIENvbnZlcnRzIGEgc25hcHNob3QgdmFsdWUgdG8gYSBZanMtY29tcGF0aWJsZSB2YWx1ZS5cbiAqIE5vdGU6IEFsbCB2YWx1ZXMgcGFzc2VkIGhlcmUgYXJlIGFscmVhZHkgc25hcHNob3RzIChjYXB0dXJlZCBhdCBjaGFuZ2UgdGltZSkuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRWYWx1ZSh2OiB1bmtub3duKTogYW55IHtcbiAgLy8gSGFuZGxlIHByaW1pdGl2ZXMgZGlyZWN0bHlcbiAgaWYgKHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB2ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIHZcbiAgfVxuICAvLyBIYW5kbGUgcGxhaW4gYXJyYXlzIC0gdXNlZCBmb3IgZW1wdHkgYXJyYXkgaW5pdFxuICBpZiAoQXJyYXkuaXNBcnJheSh2KSAmJiB2Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBuZXcgWS5BcnJheSgpXG4gIH1cbiAgLy8gVmFsdWUgaXMgYWxyZWFkeSBhIHNuYXBzaG90LCBjb252ZXJ0IHRvIFlqcyBkYXRhXG4gIHJldHVybiBjb252ZXJ0SnNvblRvWWpzRGF0YSh2IGFzIGFueSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TW9ieENoYW5nZVRvWWpzT2JqZWN0KFxuICBjaGFuZ2U6IERlZXBDaGFuZ2UsXG4gIHlqc09iamVjdDogWS5NYXA8YW55PiB8IFkuQXJyYXk8YW55PiB8IFkuVGV4dFxuKTogdm9pZCB7XG4gIC8vIENoZWNrIGlmIHRoZSBZSlMgb2JqZWN0IGlzIGRlbGV0ZWRcbiAgaWYgKGlzWWpzVmFsdWVEZWxldGVkKHlqc09iamVjdCkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiY2Fubm90IGFwcGx5IHBhdGNoIHRvIGRlbGV0ZWQgWWpzIHZhbHVlXCIpXG4gIH1cblxuICBjb25zdCB5anNDb250YWluZXIgPSByZXNvbHZlWWpzUGF0aCh5anNPYmplY3QsIGNoYW5nZS5wYXRoKVxuXG4gIGlmICgheWpzQ29udGFpbmVyKSB7XG4gICAgLy8gQ29udGFpbmVyIG5vdCBmb3VuZCwgc2tpcCB0aGlzIGNoYW5nZVxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKHlqc0NvbnRhaW5lciBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICBpZiAoY2hhbmdlLnR5cGUgPT09IERlZXBDaGFuZ2VUeXBlLkFycmF5U3BsaWNlKSB7XG4gICAgICAvLyBzcGxpY2VcbiAgICAgIHlqc0NvbnRhaW5lci5kZWxldGUoY2hhbmdlLmluZGV4LCBjaGFuZ2UucmVtb3ZlZFZhbHVlcy5sZW5ndGgpXG4gICAgICBpZiAoY2hhbmdlLmFkZGVkVmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdmFsdWVzVG9JbnNlcnQgPSBjaGFuZ2UuYWRkZWRWYWx1ZXMubWFwKGNvbnZlcnRWYWx1ZSlcbiAgICAgICAgeWpzQ29udGFpbmVyLmluc2VydChjaGFuZ2UuaW5kZXgsIHZhbHVlc1RvSW5zZXJ0KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2hhbmdlLnR5cGUgPT09IERlZXBDaGFuZ2VUeXBlLkFycmF5VXBkYXRlKSB7XG4gICAgICAvLyB1cGRhdGVcbiAgICAgIHlqc0NvbnRhaW5lci5kZWxldGUoY2hhbmdlLmluZGV4LCAxKVxuICAgICAgeWpzQ29udGFpbmVyLmluc2VydChjaGFuZ2UuaW5kZXgsIFtjb252ZXJ0VmFsdWUoY2hhbmdlLm5ld1ZhbHVlKV0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYHVuc3VwcG9ydGVkIGFycmF5IGNoYW5nZSB0eXBlOiAke2NoYW5nZS50eXBlfWApXG4gICAgfVxuICB9IGVsc2UgaWYgKHlqc0NvbnRhaW5lciBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgaWYgKGNoYW5nZS50eXBlID09PSBEZWVwQ2hhbmdlVHlwZS5PYmplY3RBZGQgfHwgY2hhbmdlLnR5cGUgPT09IERlZXBDaGFuZ2VUeXBlLk9iamVjdFVwZGF0ZSkge1xuICAgICAgY29uc3Qga2V5ID0gY2hhbmdlLmtleVxuICAgICAgaWYgKGNoYW5nZS5uZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHlqc0NvbnRhaW5lci5kZWxldGUoa2V5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeWpzQ29udGFpbmVyLnNldChrZXksIGNvbnZlcnRWYWx1ZShjaGFuZ2UubmV3VmFsdWUpKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2hhbmdlLnR5cGUgPT09IERlZXBDaGFuZ2VUeXBlLk9iamVjdFJlbW92ZSkge1xuICAgICAgY29uc3Qga2V5ID0gY2hhbmdlLmtleVxuICAgICAgeWpzQ29udGFpbmVyLmRlbGV0ZShrZXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYHVuc3VwcG9ydGVkIG9iamVjdCBjaGFuZ2UgdHlwZTogJHtjaGFuZ2UudHlwZX1gKVxuICAgIH1cbiAgfSBlbHNlIGlmICh5anNDb250YWluZXIgaW5zdGFuY2VvZiBZLlRleHQpIHtcbiAgICAvLyBZLlRleHQgaXMgaGFuZGxlZCBkaWZmZXJlbnRseSAtIGluaXQgY2hhbmdlcyBmb3IgdGV4dCBhcmUgbWFuYWdlZCBieSBZanNUZXh0TW9kZWxcbiAgICAvLyBTa2lwIGluaXQgY2hhbmdlcyBmb3IgWS5UZXh0IGNvbnRhaW5lcnNcbiAgICByZXR1cm5cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBmYWlsdXJlKGB1bnN1cHBvcnRlZCBZanMgY29udGFpbmVyIHR5cGU6ICR7eWpzQ29udGFpbmVyfWApXG4gIH1cbn1cbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IG1vZGVsU25hcHNob3RPdXRXaXRoTWV0YWRhdGEgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgUGxhaW5PYmplY3QsIFBsYWluVmFsdWUgfSBmcm9tIFwiLi4vcGxhaW5UeXBlc1wiXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwgfSBmcm9tIFwiLi9ZanNUZXh0TW9kZWxcIlxuXG5leHBvcnQgdHlwZSBZanNEYXRhID0gWS5BcnJheTxhbnk+IHwgWS5NYXA8YW55PiB8IFkuVGV4dCB8IFBsYWluVmFsdWVcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRZanNEYXRhVG9Kc29uID0gYWN0aW9uKCh5anNEYXRhOiBZanNEYXRhKTogUGxhaW5WYWx1ZSA9PiB7XG4gIGlmICh5anNEYXRhIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgIHJldHVybiB5anNEYXRhLm1hcCgodikgPT4gY29udmVydFlqc0RhdGFUb0pzb24odikpXG4gIH1cblxuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgY29uc3Qgb2JqOiBQbGFpbk9iamVjdCA9IHt9XG4gICAgeWpzRGF0YS5mb3JFYWNoKCh2LCBrKSA9PiB7XG4gICAgICBvYmpba10gPSBjb252ZXJ0WWpzRGF0YVRvSnNvbih2KVxuICAgIH0pXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgaWYgKHlqc0RhdGEgaW5zdGFuY2VvZiBZLlRleHQpIHtcbiAgICBjb25zdCBkZWx0YXMgPSB5anNEYXRhLnRvRGVsdGEoKSBhcyB1bmtub3duW11cblxuICAgIHJldHVybiBtb2RlbFNuYXBzaG90T3V0V2l0aE1ldGFkYXRhKFlqc1RleHRNb2RlbCwge1xuICAgICAgZGVsdGFMaXN0OiBkZWx0YXMubGVuZ3RoID4gMCA/IFt7ICRmcm96ZW46IHRydWUsIGRhdGE6IGRlbHRhcyB9XSA6IFtdLFxuICAgIH0pIGFzIHVua25vd24gYXMgUGxhaW5WYWx1ZVxuICB9XG5cbiAgLy8gYXNzdW1lIGl0J3MgYSBwcmltaXRpdmVcbiAgcmV0dXJuIHlqc0RhdGFcbn0pXG4iLCJpbXBvcnQgeyByZW1vdmUgfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQge1xuICBGcm96ZW4sXG4gIGZyb21TbmFwc2hvdCxcbiAgZnJvemVuLFxuICBnZXRTbmFwc2hvdCxcbiAgZ2V0U25hcHNob3RNb2RlbElkLFxuICBpc0Zyb3plblNuYXBzaG90LFxuICBpc01vZGVsLFxuICBQYXRoLFxuICByZXNvbHZlUGF0aCxcbiAgcnVuVW5wcm90ZWN0ZWQsXG59IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcbmltcG9ydCB7IGNvbnZlcnRZanNEYXRhVG9Kc29uIH0gZnJvbSBcIi4vY29udmVydFlqc0RhdGFUb0pzb25cIlxuXG4vLyBSZXByZXNlbnRzIHRoZSBtYXAgb2YgcG90ZW50aWFsIG9iamVjdHMgdG8gcmVjb25jaWxlIChJRCAtPiBPYmplY3QpXG5leHBvcnQgdHlwZSBSZWNvbmNpbGlhdGlvbk1hcCA9IE1hcDxzdHJpbmcsIG9iamVjdD5cblxuLyoqXG4gKiBBcHBsaWVzIGEgWS5qcyBldmVudCBkaXJlY3RseSB0byB0aGUgTW9iWCBtb2RlbCB0cmVlIHVzaW5nIHByb3BlciBtdXRhdGlvbnNcbiAqIChzcGxpY2UgZm9yIGFycmF5cywgcHJvcGVydHkgYXNzaWdubWVudCBmb3Igb2JqZWN0cykuXG4gKiBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gY29udmVydGluZyB0byBwYXRjaGVzIGZpcnN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlZanNFdmVudFRvTW9ieChcbiAgZXZlbnQ6IFkuWUV2ZW50PGFueT4sXG4gIGJvdW5kT2JqZWN0OiBvYmplY3QsXG4gIHJlY29uY2lsaWF0aW9uTWFwOiBSZWNvbmNpbGlhdGlvbk1hcFxuKTogdm9pZCB7XG4gIGNvbnN0IHBhdGggPSBldmVudC5wYXRoIGFzIFBhdGhcbiAgY29uc3QgeyB2YWx1ZTogdGFyZ2V0IH0gPSByZXNvbHZlUGF0aChib3VuZE9iamVjdCwgcGF0aClcblxuICBpZiAoIXRhcmdldCkge1xuICAgIHRocm93IGZhaWx1cmUoYGNhbm5vdCByZXNvbHZlIHBhdGggJHtKU09OLnN0cmluZ2lmeShwYXRoKX1gKVxuICB9XG5cbiAgLy8gV3JhcCBpbiBydW5VbnByb3RlY3RlZCBzaW5jZSB3ZSdyZSBtb2RpZnlpbmcgdGhlIHRyZWUgZnJvbSBvdXRzaWRlIGEgbW9kZWwgYWN0aW9uXG4gIHJ1blVucHJvdGVjdGVkKCgpID0+IHtcbiAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllNYXBFdmVudCkge1xuICAgICAgYXBwbHlZTWFwRXZlbnRUb01vYngoZXZlbnQsIHRhcmdldCwgcmVjb25jaWxpYXRpb25NYXApXG4gICAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWUFycmF5RXZlbnQpIHtcbiAgICAgIGFwcGx5WUFycmF5RXZlbnRUb01vYngoZXZlbnQsIHRhcmdldCwgcmVjb25jaWxpYXRpb25NYXApXG4gICAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWVRleHRFdmVudCkge1xuICAgICAgYXBwbHlZVGV4dEV2ZW50VG9Nb2J4KGV2ZW50LCB0YXJnZXQpXG4gICAgfVxuICB9KVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzRGVsZXRlZFZhbHVlKHZhbDogdW5rbm93biwgcmVjb25jaWxpYXRpb25NYXA6IFJlY29uY2lsaWF0aW9uTWFwKSB7XG4gIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiAmJiBpc01vZGVsKHZhbCkpIHtcbiAgICBjb25zdCBzbiA9IGdldFNuYXBzaG90KHZhbClcbiAgICBjb25zdCBpZCA9IGdldFNuYXBzaG90TW9kZWxJZChzbilcbiAgICBpZiAoaWQpIHtcbiAgICAgIHJlY29uY2lsaWF0aW9uTWFwLnNldChpZCwgdmFsKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXZpdmVWYWx1ZShqc29uVmFsdWU6IGFueSwgcmVjb25jaWxpYXRpb25NYXA6IFJlY29uY2lsaWF0aW9uTWFwKTogYW55IHtcbiAgLy8gSGFuZGxlIHByaW1pdGl2ZXNcbiAgaWYgKGpzb25WYWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YganNvblZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIGpzb25WYWx1ZVxuICB9XG5cbiAgLy8gSGFuZGxlIGZyb3plblxuICBpZiAoaXNGcm96ZW5TbmFwc2hvdChqc29uVmFsdWUpKSB7XG4gICAgcmV0dXJuIGZyb3plbihqc29uVmFsdWUuZGF0YSlcbiAgfVxuXG4gIC8vIElmIHdlIGhhdmUgYSByZWNvbmNpbGlhdGlvbiBtYXAgYW5kIHRoZSB2YWx1ZSBsb29rcyBsaWtlIGEgbW9kZWwgd2l0aCBhbiBJRCwgY2hlY2sgaWYgd2UgaGF2ZSBpdFxuICBpZiAocmVjb25jaWxpYXRpb25NYXAgJiYganNvblZhbHVlICYmIHR5cGVvZiBqc29uVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCBtb2RlbElkID0gZ2V0U25hcHNob3RNb2RlbElkKGpzb25WYWx1ZSlcbiAgICBpZiAobW9kZWxJZCkge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSByZWNvbmNpbGlhdGlvbk1hcC5nZXQobW9kZWxJZClcbiAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICByZWNvbmNpbGlhdGlvbk1hcC5kZWxldGUobW9kZWxJZClcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZyb21TbmFwc2hvdChqc29uVmFsdWUpXG59XG5cbmZ1bmN0aW9uIGFwcGx5WU1hcEV2ZW50VG9Nb2J4KFxuICBldmVudDogWS5ZTWFwRXZlbnQ8YW55PixcbiAgdGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICByZWNvbmNpbGlhdGlvbk1hcDogUmVjb25jaWxpYXRpb25NYXBcbik6IHZvaWQge1xuICBjb25zdCBzb3VyY2UgPSBldmVudC50YXJnZXRcblxuICBldmVudC5jaGFuZ2VzLmtleXMuZm9yRWFjaCgoY2hhbmdlLCBrZXkpID0+IHtcbiAgICBzd2l0Y2ggKGNoYW5nZS5hY3Rpb24pIHtcbiAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgIGNhc2UgXCJ1cGRhdGVcIjoge1xuICAgICAgICBjb25zdCB5anNWYWx1ZSA9IHNvdXJjZS5nZXQoa2V5KVxuICAgICAgICBjb25zdCBqc29uVmFsdWUgPSBjb252ZXJ0WWpzRGF0YVRvSnNvbih5anNWYWx1ZSlcblxuICAgICAgICAvLyBJZiB1cGRhdGluZywgdGhlIG9sZCB2YWx1ZSBpcyBvdmVyd3JpdHRlbiAoZGVsZXRlZCBjb25jZXB0dWFsbHkpXG4gICAgICAgIGlmIChjaGFuZ2UuYWN0aW9uID09PSBcInVwZGF0ZVwiKSB7XG4gICAgICAgICAgcHJvY2Vzc0RlbGV0ZWRWYWx1ZSh0YXJnZXRba2V5XSwgcmVjb25jaWxpYXRpb25NYXApXG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXRba2V5XSA9IHJldml2ZVZhbHVlKGpzb25WYWx1ZSwgcmVjb25jaWxpYXRpb25NYXApXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJkZWxldGVcIjoge1xuICAgICAgICBwcm9jZXNzRGVsZXRlZFZhbHVlKHRhcmdldFtrZXldLCByZWNvbmNpbGlhdGlvbk1hcClcbiAgICAgICAgLy8gVXNlIE1vYlgncyByZW1vdmUgdG8gcHJvcGVybHkgZGVsZXRlIHRoZSBrZXkgZnJvbSB0aGUgb2JzZXJ2YWJsZSBvYmplY3RcbiAgICAgICAgLy8gVGhpcyB0cmlnZ2VycyB0aGUgXCJyZW1vdmVcIiBpbnRlcmNlcHRvciBpbiBtb2J4LWtleXN0b25lJ3MgdHdlYWtlclxuICAgICAgICBpZiAoaXNNb2RlbCh0YXJnZXQpKSB7XG4gICAgICAgICAgcmVtb3ZlKHRhcmdldC4kLCBrZXkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVtb3ZlKHRhcmdldCwga2V5KVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IGZhaWx1cmUoYHVuc3VwcG9ydGVkIFlqcyBtYXAgZXZlbnQgYWN0aW9uOiAke2NoYW5nZS5hY3Rpb259YClcbiAgICB9XG4gIH0pXG59XG5cbmZ1bmN0aW9uIGFwcGx5WUFycmF5RXZlbnRUb01vYngoXG4gIGV2ZW50OiBZLllBcnJheUV2ZW50PGFueT4sXG4gIHRhcmdldDogYW55W10sXG4gIHJlY29uY2lsaWF0aW9uTWFwOiBSZWNvbmNpbGlhdGlvbk1hcFxuKTogdm9pZCB7XG4gIC8vIFByb2Nlc3MgZGVsdGEgb3BlcmF0aW9ucyBpbiBvcmRlclxuICBsZXQgY3VycmVudEluZGV4ID0gMFxuXG4gIGZvciAoY29uc3QgY2hhbmdlIG9mIGV2ZW50LmNoYW5nZXMuZGVsdGEpIHtcbiAgICBpZiAoY2hhbmdlLnJldGFpbikge1xuICAgICAgY3VycmVudEluZGV4ICs9IGNoYW5nZS5yZXRhaW5cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlLmRlbGV0ZSkge1xuICAgICAgLy8gQ2FwdHVyZSBkZWxldGVkIGl0ZW1zIGZvciByZWNvbmNpbGlhdGlvblxuICAgICAgY29uc3QgZGVsZXRlZEl0ZW1zID0gdGFyZ2V0LnNsaWNlKGN1cnJlbnRJbmRleCwgY3VycmVudEluZGV4ICsgY2hhbmdlLmRlbGV0ZSlcbiAgICAgIGRlbGV0ZWRJdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIHByb2Nlc3NEZWxldGVkVmFsdWUoaXRlbSwgcmVjb25jaWxpYXRpb25NYXApXG4gICAgICB9KVxuXG4gICAgICAvLyBEZWxldGUgaXRlbXMgYXQgY3VycmVudCBwb3NpdGlvblxuICAgICAgdGFyZ2V0LnNwbGljZShjdXJyZW50SW5kZXgsIGNoYW5nZS5kZWxldGUpXG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZS5pbnNlcnQpIHtcbiAgICAgIC8vIEluc2VydCBpdGVtcyBhdCBjdXJyZW50IHBvc2l0aW9uXG4gICAgICBjb25zdCBpbnNlcnRlZEl0ZW1zID0gQXJyYXkuaXNBcnJheShjaGFuZ2UuaW5zZXJ0KSA/IGNoYW5nZS5pbnNlcnQgOiBbY2hhbmdlLmluc2VydF1cbiAgICAgIGNvbnN0IHZhbHVlcyA9IGluc2VydGVkSXRlbXMubWFwKCh5anNWYWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCBqc29uVmFsdWUgPSBjb252ZXJ0WWpzRGF0YVRvSnNvbih5anNWYWx1ZSlcbiAgICAgICAgcmV0dXJuIHJldml2ZVZhbHVlKGpzb25WYWx1ZSwgcmVjb25jaWxpYXRpb25NYXApXG4gICAgICB9KVxuXG4gICAgICB0YXJnZXQuc3BsaWNlKGN1cnJlbnRJbmRleCwgMCwgLi4udmFsdWVzKVxuICAgICAgY3VycmVudEluZGV4ICs9IHZhbHVlcy5sZW5ndGhcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlZVGV4dEV2ZW50VG9Nb2J4KFxuICBldmVudDogWS5ZVGV4dEV2ZW50LFxuICB0YXJnZXQ6IHsgZGVsdGFMaXN0PzogRnJvemVuPHVua25vd25bXT5bXSB9XG4pOiB2b2lkIHtcbiAgLy8gWWpzVGV4dE1vZGVsIGhhbmRsZXMgdGV4dCBldmVudHMgYnkgYXBwZW5kaW5nIGRlbHRhIHRvIGRlbHRhTGlzdFxuICBpZiAodGFyZ2V0Py5kZWx0YUxpc3QpIHtcbiAgICB0YXJnZXQuZGVsdGFMaXN0LnB1c2goZnJvemVuKGV2ZW50LmRlbHRhKSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgYWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHtcbiAgQW55RGF0YU1vZGVsLFxuICBBbnlNb2RlbCxcbiAgQW55U3RhbmRhcmRUeXBlLFxuICBEZWVwQ2hhbmdlLFxuICBEZWVwQ2hhbmdlVHlwZSxcbiAgZnJvbVNuYXBzaG90LFxuICBnZXRQYXJlbnRUb0NoaWxkUGF0aCxcbiAgZ2V0U25hcHNob3QsXG4gIGlzVHJlZU5vZGUsXG4gIE1vZGVsQ2xhc3MsXG4gIG9uRGVlcENoYW5nZSxcbiAgb25HbG9iYWxEZWVwQ2hhbmdlLFxuICBvblNuYXBzaG90LFxuICBTbmFwc2hvdEluT2YsXG4gIFR5cGVUb0RhdGEsXG59IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgdHlwZSB7IFBsYWluQXJyYXksIFBsYWluT2JqZWN0IH0gZnJvbSBcIi4uL3BsYWluVHlwZXNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBnZXRZanNDb2xsZWN0aW9uQXRvbSB9IGZyb20gXCIuLi91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tXCJcbmltcG9ydCB7IGlzWWpzVmFsdWVEZWxldGVkIH0gZnJvbSBcIi4uL3V0aWxzL2lzWWpzVmFsdWVEZWxldGVkXCJcbmltcG9ydCB7IGFwcGx5TW9ieENoYW5nZVRvWWpzT2JqZWN0IH0gZnJvbSBcIi4vYXBwbHlNb2J4Q2hhbmdlVG9ZanNPYmplY3RcIlxuaW1wb3J0IHsgYXBwbHlZanNFdmVudFRvTW9ieCwgUmVjb25jaWxpYXRpb25NYXAgfSBmcm9tIFwiLi9hcHBseVlqc0V2ZW50VG9Nb2J4XCJcbmltcG9ydCB7IGFwcGx5SnNvbkFycmF5VG9ZQXJyYXksIGFwcGx5SnNvbk9iamVjdFRvWU1hcCB9IGZyb20gXCIuL2NvbnZlcnRKc29uVG9ZanNEYXRhXCJcbmltcG9ydCB7IGNvbnZlcnRZanNEYXRhVG9Kc29uIH0gZnJvbSBcIi4vY29udmVydFlqc0RhdGFUb0pzb25cIlxuaW1wb3J0IHsgWWpzQmluZGluZ0NvbnRleHQsIHlqc0JpbmRpbmdDb250ZXh0IH0gZnJvbSBcIi4veWpzQmluZGluZ0NvbnRleHRcIlxuaW1wb3J0IHsgc2V0WWpzQ29udGFpbmVyU25hcHNob3QgfSBmcm9tIFwiLi95anNTbmFwc2hvdFRyYWNraW5nXCJcblxuLyoqXG4gKiBDYXB0dXJlcyBzbmFwc2hvdHMgb2YgdHJlZSBub2RlcyBpbiBhIERlZXBDaGFuZ2UuXG4gKiBUaGlzIGVuc3VyZXMgdmFsdWVzIGFyZSBjYXB0dXJlZCBhdCBjaGFuZ2UgdGltZSwgbm90IGF0IGFwcGx5IHRpbWUsXG4gKiBwcmV2ZW50aW5nIGlzc3VlcyB3aGVuIHZhbHVlcyBhcmUgbXV0YXRlZCBhZnRlciBiZWluZyBhZGRlZCB0byBhIGNvbGxlY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNhcHR1cmVDaGFuZ2VTbmFwc2hvdHMoY2hhbmdlOiBEZWVwQ2hhbmdlKTogRGVlcENoYW5nZSB7XG4gIGlmIChjaGFuZ2UudHlwZSA9PT0gRGVlcENoYW5nZVR5cGUuQXJyYXlTcGxpY2UgJiYgY2hhbmdlLmFkZGVkVmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBzbmFwc2hvdHMgPSBjaGFuZ2UuYWRkZWRWYWx1ZXMubWFwKCh2KSA9PiAoaXNUcmVlTm9kZSh2KSA/IGdldFNuYXBzaG90KHYpIDogdikpXG4gICAgcmV0dXJuIHsgLi4uY2hhbmdlLCBhZGRlZFZhbHVlczogc25hcHNob3RzIH1cbiAgfSBlbHNlIGlmIChjaGFuZ2UudHlwZSA9PT0gRGVlcENoYW5nZVR5cGUuQXJyYXlVcGRhdGUpIHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IGlzVHJlZU5vZGUoY2hhbmdlLm5ld1ZhbHVlKSA/IGdldFNuYXBzaG90KGNoYW5nZS5uZXdWYWx1ZSkgOiBjaGFuZ2UubmV3VmFsdWVcbiAgICByZXR1cm4geyAuLi5jaGFuZ2UsIG5ld1ZhbHVlOiBzbmFwc2hvdCB9XG4gIH0gZWxzZSBpZiAoXG4gICAgY2hhbmdlLnR5cGUgPT09IERlZXBDaGFuZ2VUeXBlLk9iamVjdEFkZCB8fFxuICAgIGNoYW5nZS50eXBlID09PSBEZWVwQ2hhbmdlVHlwZS5PYmplY3RVcGRhdGVcbiAgKSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSBpc1RyZWVOb2RlKGNoYW5nZS5uZXdWYWx1ZSkgPyBnZXRTbmFwc2hvdChjaGFuZ2UubmV3VmFsdWUpIDogY2hhbmdlLm5ld1ZhbHVlXG4gICAgcmV0dXJuIHsgLi4uY2hhbmdlLCBuZXdWYWx1ZTogc25hcHNob3QgfVxuICB9XG4gIHJldHVybiBjaGFuZ2Vcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgYmlkaXJlY3Rpb25hbCBiaW5kaW5nIGJldHdlZW4gYSBZLmpzIGRhdGEgc3RydWN0dXJlIGFuZCBhIG1vYngta2V5c3RvbmUgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kWWpzVG9Nb2J4S2V5c3RvbmU8XG4gIFRUeXBlIGV4dGVuZHMgQW55U3RhbmRhcmRUeXBlIHwgTW9kZWxDbGFzczxBbnlNb2RlbD4gfCBNb2RlbENsYXNzPEFueURhdGFNb2RlbD4sXG4+KHtcbiAgeWpzRG9jLFxuICB5anNPYmplY3QsXG4gIG1vYnhLZXlzdG9uZVR5cGUsXG59OiB7XG4gIC8qKlxuICAgKiBUaGUgWS5qcyBkb2N1bWVudC5cbiAgICovXG4gIHlqc0RvYzogWS5Eb2NcbiAgLyoqXG4gICAqIFRoZSBib3VuZCBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICAgKi9cbiAgeWpzT2JqZWN0OiBZLk1hcDxhbnk+IHwgWS5BcnJheTxhbnk+IHwgWS5UZXh0XG4gIC8qKlxuICAgKiBUaGUgbW9ieC1rZXlzdG9uZSBtb2RlbCB0eXBlLlxuICAgKi9cbiAgbW9ieEtleXN0b25lVHlwZTogVFR5cGVcbn0pOiB7XG4gIC8qKlxuICAgKiBUaGUgYm91bmQgbW9ieC1rZXlzdG9uZSBpbnN0YW5jZS5cbiAgICovXG4gIGJvdW5kT2JqZWN0OiBUeXBlVG9EYXRhPFRUeXBlPlxuICAvKipcbiAgICogRGlzcG9zZXMgdGhlIGJpbmRpbmcuXG4gICAqL1xuICBkaXNwb3NlOiAoKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBUaGUgWS5qcyBvcmlnaW4gc3ltYm9sIHVzZWQgZm9yIGJpbmRpbmcgdHJhbnNhY3Rpb25zLlxuICAgKi9cbiAgeWpzT3JpZ2luOiBzeW1ib2xcbn0ge1xuICBjb25zdCB5anNPcmlnaW4gPSBTeW1ib2woXCJiaW5kWWpzVG9Nb2J4S2V5c3RvbmVUcmFuc2FjdGlvbk9yaWdpblwiKVxuXG4gIGxldCBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSA9IDBcblxuICBjb25zdCBiaW5kaW5nQ29udGV4dDogWWpzQmluZGluZ0NvbnRleHQgPSB7XG4gICAgeWpzRG9jLFxuICAgIHlqc09iamVjdCxcbiAgICBtb2J4S2V5c3RvbmVUeXBlLFxuICAgIHlqc09yaWdpbixcbiAgICBib3VuZE9iamVjdDogdW5kZWZpbmVkLCAvLyBub3QgeWV0IGNyZWF0ZWRcblxuICAgIGdldCBpc0FwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lKCkge1xuICAgICAgcmV0dXJuIGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID4gMFxuICAgIH0sXG4gIH1cblxuICBpZiAoaXNZanNWYWx1ZURlbGV0ZWQoeWpzT2JqZWN0KSkge1xuICAgIHRocm93IGZhaWx1cmUoXCJjYW5ub3QgYXBwbHkgcGF0Y2ggdG8gZGVsZXRlZCBZanMgdmFsdWVcIilcbiAgfVxuXG4gIGNvbnN0IHlqc0pzb24gPSBjb252ZXJ0WWpzRGF0YVRvSnNvbih5anNPYmplY3QpXG5cbiAgbGV0IGJvdW5kT2JqZWN0OiBUeXBlVG9EYXRhPFRUeXBlPlxuXG4gIC8vIFRyYWNrIGlmIGFueSBpbml0IGNoYW5nZXMgb2NjdXIgZHVyaW5nIGZyb21TbmFwc2hvdFxuICAvLyAoZS5nLiwgZGVmYXVsdHMgYmVpbmcgYXBwbGllZCwgb25Jbml0IGhvb2tzIG11dGF0aW5nIHRoZSBtb2RlbClcbiAgbGV0IGhhc0luaXRDaGFuZ2VzID0gZmFsc2VcblxuICBjb25zdCBjcmVhdGVCb3VuZE9iamVjdCA9ICgpID0+IHtcbiAgICAvLyBTZXQgdXAgYSB0ZW1wb3JhcnkgZ2xvYmFsIGxpc3RlbmVyIHRvIGRldGVjdCBpZiBhbnkgaW5pdCBjaGFuZ2VzIG9jY3VyIGR1cmluZyBmcm9tU25hcHNob3RcbiAgICBjb25zdCBkaXNwb3NlR2xvYmFsTGlzdGVuZXIgPSBvbkdsb2JhbERlZXBDaGFuZ2UoKF90YXJnZXQsIGNoYW5nZSkgPT4ge1xuICAgICAgaWYgKGNoYW5nZS5pc0luaXQpIHtcbiAgICAgICAgaGFzSW5pdENoYW5nZXMgPSB0cnVlXG4gICAgICB9XG4gICAgfSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB5anNCaW5kaW5nQ29udGV4dC5hcHBseShcbiAgICAgICAgKCkgPT4gZnJvbVNuYXBzaG90KG1vYnhLZXlzdG9uZVR5cGUsIHlqc0pzb24gYXMgdW5rbm93biBhcyBTbmFwc2hvdEluT2Y8VHlwZVRvRGF0YTxUVHlwZT4+KSxcbiAgICAgICAgYmluZGluZ0NvbnRleHRcbiAgICAgIClcbiAgICAgIHlqc0JpbmRpbmdDb250ZXh0LnNldChyZXN1bHQsIHsgLi4uYmluZGluZ0NvbnRleHQsIGJvdW5kT2JqZWN0OiByZXN1bHQgfSlcbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZGlzcG9zZUdsb2JhbExpc3RlbmVyKClcbiAgICB9XG4gIH1cblxuICBib3VuZE9iamVjdCA9IGNyZWF0ZUJvdW5kT2JqZWN0KClcblxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20geWpzIHRvIG1vYngta2V5c3RvbmVcbiAgY29uc3Qgb2JzZXJ2ZURlZXBDYiA9IGFjdGlvbigoZXZlbnRzOiBZLllFdmVudDxhbnk+W10pID0+IHtcbiAgICBjb25zdCBldmVudHNUb0FwcGx5OiBZLllFdmVudDxhbnk+W10gPSBbXVxuXG4gICAgZXZlbnRzLmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQudHJhbnNhY3Rpb24ub3JpZ2luICE9PSB5anNPcmlnaW4pIHtcbiAgICAgICAgZXZlbnRzVG9BcHBseS5wdXNoKGV2ZW50KVxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgWS5NYXAgfHwgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgICBnZXRZanNDb2xsZWN0aW9uQXRvbShldmVudC50YXJnZXQpPy5yZXBvcnRDaGFuZ2VkKClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKGV2ZW50c1RvQXBwbHkubGVuZ3RoID4gMCkge1xuICAgICAgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUrK1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVjb25jaWxpYXRpb25NYXA6IFJlY29uY2lsaWF0aW9uTWFwID0gbmV3IE1hcCgpXG5cbiAgICAgICAgLy8gQ29sbGVjdCBpbml0IGNoYW5nZXMgdGhhdCBvY2N1ciBkdXJpbmcgZXZlbnQgYXBwbGljYXRpb25cbiAgICAgICAgLy8gKGUuZy4sIGZyb21TbmFwc2hvdCBjYWxscyB0aGF0IHRyaWdnZXIgb25Jbml0IGhvb2tzKVxuICAgICAgICAvLyBXZSBzdG9yZSBib3RoIHRhcmdldCBhbmQgY2hhbmdlIHNvIHdlIGNhbiBjb21wdXRlIHRoZSBjb3JyZWN0IHBhdGggbGF0ZXJcbiAgICAgICAgLy8gU25hcHNob3RzIGFyZSBjYXB0dXJlZCBpbW1lZGlhdGVseSB0byBwcmVzZXJ2ZSB2YWx1ZXMgYXQgaW5pdCB0aW1lXG4gICAgICAgIGNvbnN0IGluaXRDaGFuZ2VzOiB7IHRhcmdldDogb2JqZWN0OyBjaGFuZ2U6IERlZXBDaGFuZ2UgfVtdID0gW11cbiAgICAgICAgY29uc3QgZGlzcG9zZUdsb2JhbExpc3RlbmVyID0gb25HbG9iYWxEZWVwQ2hhbmdlKCh0YXJnZXQsIGNoYW5nZSkgPT4ge1xuICAgICAgICAgIGlmIChjaGFuZ2UuaXNJbml0KSB7XG4gICAgICAgICAgICBpbml0Q2hhbmdlcy5wdXNoKHsgdGFyZ2V0LCBjaGFuZ2U6IGNhcHR1cmVDaGFuZ2VTbmFwc2hvdHMoY2hhbmdlKSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGV2ZW50c1RvQXBwbHkuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGFwcGx5WWpzRXZlbnRUb01vYngoZXZlbnQsIGJvdW5kT2JqZWN0LCByZWNvbmNpbGlhdGlvbk1hcClcbiAgICAgICAgICB9KVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGRpc3Bvc2VHbG9iYWxMaXN0ZW5lcigpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBTeW5jIGJhY2sgYW55IGluaXQtdGltZSBtdXRhdGlvbnMgZnJvbSBmcm9tU25hcHNob3QgY2FsbHNcbiAgICAgICAgLy8gKGUuZy4sIG9uSW5pdCBob29rcyB0aGF0IG1vZGlmeSB0aGUgbW9kZWwpXG4gICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgaW5pdCBjaGFuZ2VzIGR1cmluZyBZanMgZXZlbnQgaGFuZGxpbmcgYXJlIG5vdFxuICAgICAgICAvLyBjYXB0dXJlZCBieSB0aGUgbWFpbiBvbkRlZXBDaGFuZ2UgKGl0IHNraXBzIGNoYW5nZXMgd2hlbiBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSA+IDApXG4gICAgICAgIGlmIChpbml0Q2hhbmdlcy5sZW5ndGggPiAwICYmICFpc1lqc1ZhbHVlRGVsZXRlZCh5anNPYmplY3QpKSB7XG4gICAgICAgICAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgeyB0YXJnZXQsIGNoYW5nZSB9IG9mIGluaXRDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIHBhdGggZnJvbSBib3VuZE9iamVjdCB0byB0aGUgdGFyZ2V0XG4gICAgICAgICAgICAgIGNvbnN0IHBhdGhUb1RhcmdldCA9IGdldFBhcmVudFRvQ2hpbGRQYXRoKGJvdW5kT2JqZWN0LCB0YXJnZXQpXG4gICAgICAgICAgICAgIGlmIChwYXRoVG9UYXJnZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBjaGFuZ2Ugd2l0aCB0aGUgY29ycmVjdCBwYXRoIGZyb20gdGhlIHJvb3RcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VXaXRoQ29ycmVjdFBhdGg6IERlZXBDaGFuZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAuLi5jaGFuZ2UsXG4gICAgICAgICAgICAgICAgICBwYXRoOiBbLi4ucGF0aFRvVGFyZ2V0LCAuLi5jaGFuZ2UucGF0aF0sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFwcGx5TW9ieENoYW5nZVRvWWpzT2JqZWN0KGNoYW5nZVdpdGhDb3JyZWN0UGF0aCwgeWpzT2JqZWN0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgeWpzT3JpZ2luKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIHNuYXBzaG90IHRyYWNraW5nOiB0aGUgWS5qcyBjb250YWluZXIgaXMgbm93IGluIHN5bmMgd2l0aCB0aGUgY3VycmVudCBNb2JYIHNuYXBzaG90XG4gICAgICAgIC8vIFRoaXMgZW5hYmxlcyB0aGUgbWVyZ2Ugb3B0aW1pemF0aW9uIHRvIHNraXAgdW5jaGFuZ2VkIHN1YnRyZWVzIGR1cmluZyByZWNvbmNpbGlhdGlvblxuICAgICAgICBpZiAoeWpzT2JqZWN0IGluc3RhbmNlb2YgWS5NYXAgfHwgeWpzT2JqZWN0IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgICAgIHNldFlqc0NvbnRhaW5lclNuYXBzaG90KHlqc09iamVjdCwgZ2V0U25hcHNob3QoYm91bmRPYmplY3QpKVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZS0tXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIHlqc09iamVjdC5vYnNlcnZlRGVlcChvYnNlcnZlRGVlcENiKVxuXG4gIC8vIGJpbmQgYW55IGNoYW5nZXMgZnJvbSBtb2J4LWtleXN0b25lIHRvIHlqcyB1c2luZyBkZWVwIGNoYW5nZSBvYnNlcnZhdGlvblxuICAvLyBUaGlzIHByb3ZpZGVzIHByb3BlciBzcGxpY2UgZGV0ZWN0aW9uIGZvciBhcnJheSBvcGVyYXRpb25zXG4gIGxldCBwZW5kaW5nQ2hhbmdlczogRGVlcENoYW5nZVtdID0gW11cblxuICBjb25zdCBkaXNwb3NlT25EZWVwQ2hhbmdlID0gb25EZWVwQ2hhbmdlKGJvdW5kT2JqZWN0LCAoY2hhbmdlKSA9PiB7XG4gICAgaWYgKGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID4gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gU2tpcCBpbml0IGNoYW5nZXMgLSB0aGV5IGFyZSBoYW5kbGVkIGJ5IHRoZSBnZXRTbmFwc2hvdCArIG1lcmdlIGF0IHRoZSBlbmQgb2YgYmluZGluZ1xuICAgIGlmIChjaGFuZ2UuaXNJbml0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBDYXB0dXJlIHNuYXBzaG90cyBub3cgYmVmb3JlIHRoZSB2YWx1ZXMgY2FuIGJlIG11dGF0ZWQgd2l0aGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uLlxuICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgY2hhbmdlcyBhcmUgY29sbGVjdGVkIGFuZCBhcHBsaWVkIGFmdGVyIHRoZSBhY3Rpb24gY29tcGxldGVzLFxuICAgIC8vIGJ5IHdoaWNoIHRpbWUgdGhlIG9yaWdpbmFsIHZhbHVlcyBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkLlxuICAgIC8vIEV4YW1wbGU6IGBvYmouaXRlbXMgPSBbYSwgYl07IG9iai5pdGVtcy5zcGxpY2UoMCwgMSlgIC0gd2l0aG91dCBlYXJseSBjYXB0dXJlLFxuICAgIC8vIHRoZSBPYmplY3RVcGRhdGUgZm9yIGBpdGVtc2Agd291bGQgZ2V0IHRoZSBwb3N0LXNwbGljZSBhcnJheSBzdGF0ZS5cbiAgICBwZW5kaW5nQ2hhbmdlcy5wdXNoKGNhcHR1cmVDaGFuZ2VTbmFwc2hvdHMoY2hhbmdlKSlcbiAgfSlcblxuICAvLyB0aGlzIGlzIG9ubHkgdXNlZCBzbyB3ZSBjYW4gdHJhbnNhY3QgYWxsIGNoYW5nZXMgdG8gdGhlIHNuYXBzaG90IGJvdW5kYXJ5XG4gIGNvbnN0IGRpc3Bvc2VPblNuYXBzaG90ID0gb25TbmFwc2hvdChib3VuZE9iamVjdCwgKGJvdW5kT2JqZWN0U25hcHNob3QpID0+IHtcbiAgICBpZiAocGVuZGluZ0NoYW5nZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjaGFuZ2VzVG9BcHBseSA9IHBlbmRpbmdDaGFuZ2VzXG4gICAgcGVuZGluZ0NoYW5nZXMgPSBbXVxuXG4gICAgLy8gU2tpcCBzeW5jaW5nIHRvIFlqcyBpZiB0aGUgWWpzIG9iamVjdCBoYXMgYmVlbiBkZWxldGVkL2RldGFjaGVkXG4gICAgaWYgKGlzWWpzVmFsdWVEZWxldGVkKHlqc09iamVjdCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICBjaGFuZ2VzVG9BcHBseS5mb3JFYWNoKChjaGFuZ2UpID0+IHtcbiAgICAgICAgYXBwbHlNb2J4Q2hhbmdlVG9ZanNPYmplY3QoY2hhbmdlLCB5anNPYmplY3QpXG4gICAgICB9KVxuICAgIH0sIHlqc09yaWdpbilcblxuICAgIC8vIFVwZGF0ZSBzbmFwc2hvdCB0cmFja2luZzogdGhlIFkuanMgY29udGFpbmVyIGlzIG5vdyBpbiBzeW5jIHdpdGggdGhlIGN1cnJlbnQgTW9iWCBzbmFwc2hvdFxuICAgIGlmICh5anNPYmplY3QgaW5zdGFuY2VvZiBZLk1hcCB8fCB5anNPYmplY3QgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBzZXRZanNDb250YWluZXJTbmFwc2hvdCh5anNPYmplY3QsIGJvdW5kT2JqZWN0U25hcHNob3QpXG4gICAgfVxuICB9KVxuXG4gIC8vIFN5bmMgdGhlIGluaXQgY2hhbmdlcyB0byB0aGUgQ1JEVC5cbiAgLy8gSW5pdCBjaGFuZ2VzIGluY2x1ZGU6IGRlZmF1bHRzIGJlaW5nIGFwcGxpZWQsIG9uSW5pdCBob29rcyBtdXRhdGluZyB0aGUgbW9kZWwuXG4gIC8vIFdlIHVzZSBnZXRTbmFwc2hvdCArIG1lcmdlIGJlY2F1c2UgdGhlIHBlci1jaGFuZ2UgYXBwcm9hY2ggaGFzIGlzc3VlcyB3aXRoIHJlZmVyZW5jZSBtdXRhdGlvblxuICAvLyAodmFsdWVzIGNhcHR1cmVkIGluIERlZXBDaGFuZ2UgY2FuIGJlIG11dGF0ZWQgYmVmb3JlIHdlIGFwcGx5IHRoZW0pLlxuICAvLyBUaGUgc25hcHNob3QgdHJhY2tpbmcgb3B0aW1pemF0aW9uIGVuc3VyZXMgdW5jaGFuZ2VkIHN1YnRyZWVzIGFyZSBza2lwcGVkIGR1cmluZyBtZXJnZS5cbiAgY29uc3QgZmluYWxTbmFwc2hvdCA9IGdldFNuYXBzaG90KGJvdW5kT2JqZWN0KVxuXG4gIGlmIChoYXNJbml0Q2hhbmdlcykge1xuICAgIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICBpZiAoeWpzT2JqZWN0IGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgICAgYXBwbHlKc29uT2JqZWN0VG9ZTWFwKHlqc09iamVjdCwgZmluYWxTbmFwc2hvdCBhcyB1bmtub3duIGFzIFBsYWluT2JqZWN0LCB7XG4gICAgICAgICAgbW9kZTogXCJtZXJnZVwiLFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmICh5anNPYmplY3QgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICAgIGFwcGx5SnNvbkFycmF5VG9ZQXJyYXkoeWpzT2JqZWN0LCBmaW5hbFNuYXBzaG90IGFzIHVua25vd24gYXMgUGxhaW5BcnJheSwge1xuICAgICAgICAgIG1vZGU6IFwibWVyZ2VcIixcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9LCB5anNPcmlnaW4pXG4gIH1cblxuICAvLyBBbHdheXMgdXBkYXRlIHNuYXBzaG90IHRyYWNraW5nIGFmdGVyIGJpbmRpbmcgaW5pdGlhbGl6YXRpb25cbiAgLy8gVGhpcyBlbnN1cmVzIHRoZSBtZXJnZSBvcHRpbWl6YXRpb24gY2FuIHNraXAgdW5jaGFuZ2VkIHN1YnRyZWVzIGluIGZ1dHVyZSByZWNvbmNpbGlhdGlvbnNcbiAgaWYgKHlqc09iamVjdCBpbnN0YW5jZW9mIFkuTWFwIHx8IHlqc09iamVjdCBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICBzZXRZanNDb250YWluZXJTbmFwc2hvdCh5anNPYmplY3QsIGZpbmFsU25hcHNob3QpXG4gIH1cblxuICBjb25zdCBkaXNwb3NlID0gKCkgPT4ge1xuICAgIHlqc0RvYy5vZmYoXCJkZXN0cm95XCIsIGRpc3Bvc2UpXG4gICAgZGlzcG9zZU9uRGVlcENoYW5nZSgpXG4gICAgZGlzcG9zZU9uU25hcHNob3QoKVxuICAgIHlqc09iamVjdC51bm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXG4gIH1cblxuICB5anNEb2Mub24oXCJkZXN0cm95XCIsIGRpc3Bvc2UpXG5cbiAgcmV0dXJuIHtcbiAgICBib3VuZE9iamVjdCxcbiAgICBkaXNwb3NlLFxuICAgIHlqc09yaWdpbixcbiAgfVxufVxuIl0sIm5hbWVzIjpbImNyZWF0ZUF0b20iLCJZIiwiY3JlYXRlQ29udGV4dCIsInR5cGVzIiwiWWpzVGV4dE1vZGVsIiwiTW9kZWwiLCJ0UHJvcCIsImZyb3plbiIsImdldFBhcmVudFRvQ2hpbGRQYXRoIiwicmVhY3Rpb24iLCJvYnNlcnZlIiwib25TbmFwc2hvdCIsImNvbXB1dGVkIiwibW9kZWwiLCJmcm96ZW5LZXkiLCJtb2RlbFR5cGVLZXkiLCJEZWVwQ2hhbmdlVHlwZSIsImFjdGlvbiIsIm1vZGVsU25hcHNob3RPdXRXaXRoTWV0YWRhdGEiLCJyZXNvbHZlUGF0aCIsInJ1blVucHJvdGVjdGVkIiwiaXNNb2RlbCIsImdldFNuYXBzaG90IiwiZ2V0U25hcHNob3RNb2RlbElkIiwiaXNGcm96ZW5TbmFwc2hvdCIsImZyb21TbmFwc2hvdCIsInJlbW92ZSIsImlzVHJlZU5vZGUiLCJvbkdsb2JhbERlZXBDaGFuZ2UiLCJvbkRlZXBDaGFuZ2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQUdPLE1BQU0sNkJBQTZCLE1BQU07QUFBQSxJQUM5QyxZQUFZLEtBQWE7QUFDdkIsWUFBTSxHQUFHO0FBR1QsYUFBTyxlQUFlLE1BQU0scUJBQXFCLFNBQVM7QUFBQSxJQUM1RDtBQUFBLEVBQ0Y7QUFLTyxXQUFTLFFBQVEsS0FBYTtBQUNuQyxXQUFPLElBQUkscUJBQXFCLEdBQUc7QUFBQSxFQUNyQztBQ2RBLFFBQU0seUNBQXlCLFFBQUE7QUFLeEIsUUFBTSx1QkFBdUIsQ0FDbEMsa0JBQ3NCO0FBQ3RCLFdBQU8sbUJBQW1CLElBQUksYUFBYTtBQUFBLEVBQzdDO0FBS08sUUFBTSwrQkFBK0IsQ0FDMUMsa0JBQ1U7QUFDVixRQUFJLE9BQU8sbUJBQW1CLElBQUksYUFBYTtBQUMvQyxRQUFJLENBQUMsTUFBTTtBQUNULGFBQU9BLEtBQUFBLFdBQVcsbUJBQW1CO0FBQ3JDLHlCQUFtQixJQUFJLGVBQWUsSUFBSTtBQUFBLElBQzVDO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUNsQk8sV0FBUyxrQkFBa0IsVUFBNEI7O0FBQzVELFFBQUksb0JBQW9CQyxhQUFFLGNBQWM7QUFDdEMsYUFBTyxDQUFDLEdBQUUsY0FBaUIsVUFBakIsbUJBQXdCLFlBQVcsQ0FBQyxHQUFDLGNBQVMsUUFBVCxtQkFBYztBQUFBLElBQy9EO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUNHTyxXQUFTLGVBQ2QsV0FDQSxNQUNTO0FBQ1QsUUFBSSxtQkFBNEI7QUFFaEMsUUFBSSxJQUFJO0FBQ1IsZUFBVyxZQUFZLE1BQU07QUFDM0I7QUFJQSxVQUFJLDRCQUE0QkEsYUFBRSxNQUFN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
|