mobx-keystone-yjs 1.5.3 → 1.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/dist/mobx-keystone-yjs.esm.js +176 -116
- package/dist/mobx-keystone-yjs.esm.mjs +176 -116
- package/dist/mobx-keystone-yjs.umd.js +177 -117
- package/dist/types/binding/YjsTextModel.d.ts +5 -4
- package/dist/types/binding/applyMobxKeystonePatchToYjsObject.d.ts +1 -1
- package/dist/types/binding/bindYjsToMobxKeystone.d.ts +2 -2
- package/dist/types/binding/convertJsonToYjsData.d.ts +4 -4
- package/dist/types/binding/convertYjsDataToJson.d.ts +3 -3
- package/dist/types/binding/convertYjsEventToPatches.d.ts +1 -1
- package/dist/types/binding/yjsBindingContext.d.ts +2 -2
- package/dist/types/index.d.ts +6 -6
- package/dist/types/utils/isYjsValueDeleted.d.ts +7 -0
- package/package.json +12 -14
- package/src/binding/YjsTextModel.ts +280 -247
- package/src/binding/applyMobxKeystonePatchToYjsObject.ts +6 -1
- package/src/binding/bindYjsToMobxKeystone.ts +22 -12
- package/src/binding/convertJsonToYjsData.ts +6 -6
- package/src/binding/convertYjsDataToJson.ts +4 -3
- package/src/binding/convertYjsEventToPatches.ts +4 -12
- package/src/index.ts +2 -2
- package/src/utils/isYjsValueDeleted.ts +14 -0
|
@@ -2,28 +2,8 @@ var __defProp = Object.defineProperty;
|
|
|
2
2
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
3
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
4
|
import { createAtom, reaction, observe, computed, action } from "mobx";
|
|
5
|
-
import { createContext,
|
|
5
|
+
import { createContext, Model, tProp, types, frozen, getParentToChildPath, onSnapshot, model, modelSnapshotOutWithMetadata, applyPatches, onPatches, onGlobalPatches, fromSnapshot } from "mobx-keystone";
|
|
6
6
|
import * as Y from "yjs";
|
|
7
|
-
function __decorate(decorators, target, key, desc) {
|
|
8
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
9
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
10
|
-
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;
|
|
11
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
12
|
-
}
|
|
13
|
-
typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
|
|
14
|
-
var e = new Error(message);
|
|
15
|
-
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
16
|
-
};
|
|
17
|
-
class MobxKeystoneYjsError extends Error {
|
|
18
|
-
constructor(msg) {
|
|
19
|
-
super(msg);
|
|
20
|
-
Object.setPrototypeOf(this, MobxKeystoneYjsError.prototype);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
function failure(msg) {
|
|
24
|
-
return new MobxKeystoneYjsError(msg);
|
|
25
|
-
}
|
|
26
|
-
const yjsBindingContext = createContext(void 0);
|
|
27
7
|
const yjsCollectionAtoms = /* @__PURE__ */ new WeakMap();
|
|
28
8
|
const getYjsCollectionAtom = (yjsCollection) => {
|
|
29
9
|
return yjsCollectionAtoms.get(yjsCollection);
|
|
@@ -36,6 +16,22 @@ const getOrCreateYjsCollectionAtom = (yjsCollection) => {
|
|
|
36
16
|
}
|
|
37
17
|
return atom;
|
|
38
18
|
};
|
|
19
|
+
function isYjsValueDeleted(yjsValue) {
|
|
20
|
+
var _a, _b;
|
|
21
|
+
if (yjsValue instanceof Y.AbstractType) {
|
|
22
|
+
return !!((_a = yjsValue._item) == null ? void 0 : _a.deleted) || !!((_b = yjsValue.doc) == null ? void 0 : _b.isDestroyed);
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
class MobxKeystoneYjsError extends Error {
|
|
27
|
+
constructor(msg) {
|
|
28
|
+
super(msg);
|
|
29
|
+
Object.setPrototypeOf(this, MobxKeystoneYjsError.prototype);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function failure(msg) {
|
|
33
|
+
return new MobxKeystoneYjsError(msg);
|
|
34
|
+
}
|
|
39
35
|
function resolveYjsPath(yjsObject, path) {
|
|
40
36
|
let currentYjsObject = yjsObject;
|
|
41
37
|
path.forEach((pathPart, i) => {
|
|
@@ -48,14 +44,29 @@ function resolveYjsPath(yjsObject, path) {
|
|
|
48
44
|
const key = Number(pathPart);
|
|
49
45
|
currentYjsObject = currentYjsObject.get(key);
|
|
50
46
|
} else {
|
|
51
|
-
throw failure(
|
|
47
|
+
throw failure(
|
|
48
|
+
`Y.Map or Y.Array was expected at path ${JSON.stringify(
|
|
49
|
+
path.slice(0, i)
|
|
50
|
+
)} in order to resolve path ${JSON.stringify(path)}, but got ${currentYjsObject} instead`
|
|
51
|
+
);
|
|
52
52
|
}
|
|
53
53
|
});
|
|
54
54
|
return currentYjsObject;
|
|
55
55
|
}
|
|
56
|
+
const yjsBindingContext = createContext(void 0);
|
|
57
|
+
var __defProp2 = Object.defineProperty;
|
|
58
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
59
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
60
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
61
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
62
|
+
if (decorator = decorators[i])
|
|
63
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
64
|
+
if (kind && result) __defProp2(target, key, result);
|
|
65
|
+
return result;
|
|
66
|
+
};
|
|
56
67
|
const deltaListType = types.array(types.frozen(types.unchecked()));
|
|
57
68
|
const yjsTextModelId = "mobx-keystone-yjs/YjsTextModel";
|
|
58
|
-
let YjsTextModel = class
|
|
69
|
+
let YjsTextModel = class extends Model({
|
|
59
70
|
deltaList: tProp(deltaListType, () => [])
|
|
60
71
|
}) {
|
|
61
72
|
constructor() {
|
|
@@ -79,13 +90,12 @@ let YjsTextModel = class YjsTextModel2 extends Model({
|
|
|
79
90
|
]
|
|
80
91
|
});
|
|
81
92
|
}
|
|
82
|
-
/**
|
|
83
|
-
* The Y.js path from the bound object to the YjsTextModel instance.
|
|
84
|
-
*/
|
|
85
93
|
get _yjsObjectPath() {
|
|
86
94
|
const ctx = yjsBindingContext.get(this);
|
|
87
95
|
if ((ctx == null ? void 0 : ctx.boundObject) == null) {
|
|
88
|
-
throw failure(
|
|
96
|
+
throw failure(
|
|
97
|
+
"the YjsTextModel instance must be part of a bound object before it can be accessed"
|
|
98
|
+
);
|
|
89
99
|
}
|
|
90
100
|
const path = getParentToChildPath(ctx.boundObject, this);
|
|
91
101
|
if (!path) {
|
|
@@ -93,17 +103,11 @@ let YjsTextModel = class YjsTextModel2 extends Model({
|
|
|
93
103
|
}
|
|
94
104
|
return path;
|
|
95
105
|
}
|
|
96
|
-
/**
|
|
97
|
-
* The Yjs.Text object present at this mobx-keystone node's path.
|
|
98
|
-
*/
|
|
99
106
|
get _yjsObjectAtPath() {
|
|
100
107
|
const path = this._yjsObjectPath;
|
|
101
108
|
const ctx = yjsBindingContext.get(this);
|
|
102
109
|
return resolveYjsPath(ctx.yjsObject, path);
|
|
103
110
|
}
|
|
104
|
-
/**
|
|
105
|
-
* The Yjs.Text object represented by this mobx-keystone node.
|
|
106
|
-
*/
|
|
107
111
|
get yjsText() {
|
|
108
112
|
const yjsObject = this._yjsObjectAtPath;
|
|
109
113
|
if (!(yjsObject instanceof Y.Text)) {
|
|
@@ -111,13 +115,27 @@ let YjsTextModel = class YjsTextModel2 extends Model({
|
|
|
111
115
|
}
|
|
112
116
|
return yjsObject;
|
|
113
117
|
}
|
|
114
|
-
/**
|
|
115
|
-
* The text value of the Yjs.Text object.
|
|
116
|
-
* Shortcut for `yjsText.toString()`, but computed.
|
|
117
|
-
*/
|
|
118
118
|
get text() {
|
|
119
119
|
this.yjsTextChangedAtom.reportObserved();
|
|
120
|
-
|
|
120
|
+
const ctx = yjsBindingContext.get(this);
|
|
121
|
+
if ((ctx == null ? void 0 : ctx.boundObject) != null) {
|
|
122
|
+
try {
|
|
123
|
+
const yjsTextString = this.yjsText.toString();
|
|
124
|
+
if (yjsTextString !== "" || this.deltaList.length === 0) {
|
|
125
|
+
return yjsTextString;
|
|
126
|
+
}
|
|
127
|
+
} catch {
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return this.deltaListToText();
|
|
131
|
+
}
|
|
132
|
+
deltaListToText() {
|
|
133
|
+
const doc = new Y.Doc();
|
|
134
|
+
const text = doc.getText();
|
|
135
|
+
this.deltaList.forEach((d) => {
|
|
136
|
+
text.applyDelta(d.data);
|
|
137
|
+
});
|
|
138
|
+
return text.toString();
|
|
121
139
|
}
|
|
122
140
|
onInit() {
|
|
123
141
|
const shouldReplicateToYjs = (ctx) => {
|
|
@@ -126,29 +144,36 @@ let YjsTextModel = class YjsTextModel2 extends Model({
|
|
|
126
144
|
let reapplyDeltasToYjsText = false;
|
|
127
145
|
const newDeltas = [];
|
|
128
146
|
let disposeObserveDeltaList;
|
|
129
|
-
const disposeReactionToDeltaListRefChange = reaction(
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
147
|
+
const disposeReactionToDeltaListRefChange = reaction(
|
|
148
|
+
() => this.$.deltaList,
|
|
149
|
+
(deltaList) => {
|
|
150
|
+
disposeObserveDeltaList == null ? void 0 : disposeObserveDeltaList();
|
|
151
|
+
disposeObserveDeltaList = void 0;
|
|
152
|
+
disposeObserveDeltaList = observe(deltaList, (change) => {
|
|
153
|
+
if (reapplyDeltasToYjsText) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
if (!shouldReplicateToYjs(yjsBindingContext.get(this))) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (change.type === "splice" && change.removedCount === 0 && change.addedCount > 0 && change.index === this.deltaList.length) {
|
|
160
|
+
newDeltas.push(...change.added);
|
|
161
|
+
} else {
|
|
162
|
+
reapplyDeltasToYjsText = true;
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
},
|
|
166
|
+
{ fireImmediately: true }
|
|
167
|
+
);
|
|
146
168
|
const disposeOnSnapshot = onSnapshot(this, () => {
|
|
147
169
|
try {
|
|
148
170
|
if (reapplyDeltasToYjsText) {
|
|
149
171
|
const ctx = yjsBindingContext.get(this);
|
|
150
172
|
if (shouldReplicateToYjs(ctx)) {
|
|
151
173
|
const { yjsText } = this;
|
|
174
|
+
if (isYjsValueDeleted(yjsText)) {
|
|
175
|
+
throw failure("cannot reapply deltas to deleted Yjs.Text");
|
|
176
|
+
}
|
|
152
177
|
ctx.yjsDoc.transact(() => {
|
|
153
178
|
if (yjsText.length > 0) {
|
|
154
179
|
yjsText.delete(0, yjsText.length);
|
|
@@ -162,6 +187,9 @@ let YjsTextModel = class YjsTextModel2 extends Model({
|
|
|
162
187
|
const ctx = yjsBindingContext.get(this);
|
|
163
188
|
if (shouldReplicateToYjs(ctx)) {
|
|
164
189
|
const { yjsText } = this;
|
|
190
|
+
if (isYjsValueDeleted(yjsText)) {
|
|
191
|
+
throw failure("cannot reapply deltas to deleted Yjs.Text");
|
|
192
|
+
}
|
|
165
193
|
ctx.yjsDoc.transact(() => {
|
|
166
194
|
newDeltas.forEach((frozenDeltas) => {
|
|
167
195
|
yjsText.applyDelta(frozenDeltas.data);
|
|
@@ -174,7 +202,10 @@ let YjsTextModel = class YjsTextModel2 extends Model({
|
|
|
174
202
|
newDeltas.length = 0;
|
|
175
203
|
}
|
|
176
204
|
});
|
|
177
|
-
const diposeYjsTextChangedAtom = hookYjsTextChangedAtom(
|
|
205
|
+
const diposeYjsTextChangedAtom = hookYjsTextChangedAtom(
|
|
206
|
+
() => this.yjsText,
|
|
207
|
+
this.yjsTextChangedAtom
|
|
208
|
+
);
|
|
178
209
|
return () => {
|
|
179
210
|
disposeOnSnapshot();
|
|
180
211
|
disposeReactionToDeltaListRefChange();
|
|
@@ -184,19 +215,19 @@ let YjsTextModel = class YjsTextModel2 extends Model({
|
|
|
184
215
|
};
|
|
185
216
|
}
|
|
186
217
|
};
|
|
187
|
-
|
|
218
|
+
__decorateClass([
|
|
188
219
|
computed
|
|
189
|
-
], YjsTextModel.prototype, "_yjsObjectPath",
|
|
190
|
-
|
|
220
|
+
], YjsTextModel.prototype, "_yjsObjectPath", 1);
|
|
221
|
+
__decorateClass([
|
|
191
222
|
computed
|
|
192
|
-
], YjsTextModel.prototype, "_yjsObjectAtPath",
|
|
193
|
-
|
|
223
|
+
], YjsTextModel.prototype, "_yjsObjectAtPath", 1);
|
|
224
|
+
__decorateClass([
|
|
194
225
|
computed
|
|
195
|
-
], YjsTextModel.prototype, "yjsText",
|
|
196
|
-
|
|
226
|
+
], YjsTextModel.prototype, "yjsText", 1);
|
|
227
|
+
__decorateClass([
|
|
197
228
|
computed
|
|
198
|
-
], YjsTextModel.prototype, "text",
|
|
199
|
-
YjsTextModel =
|
|
229
|
+
], YjsTextModel.prototype, "text", 1);
|
|
230
|
+
YjsTextModel = __decorateClass([
|
|
200
231
|
model(yjsTextModelId)
|
|
201
232
|
], YjsTextModel);
|
|
202
233
|
const DecoratedYjsTextModel = YjsTextModel;
|
|
@@ -205,25 +236,30 @@ function hookYjsTextChangedAtom(getYjsText, textChangedAtom) {
|
|
|
205
236
|
const observeFn = () => {
|
|
206
237
|
textChangedAtom.reportChanged();
|
|
207
238
|
};
|
|
208
|
-
const disposeReactionToYTextChange = reaction(
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
disposeObserveYjsText =
|
|
220
|
-
|
|
221
|
-
|
|
239
|
+
const disposeReactionToYTextChange = reaction(
|
|
240
|
+
() => {
|
|
241
|
+
try {
|
|
242
|
+
const yjsText = getYjsText();
|
|
243
|
+
return isYjsValueDeleted(yjsText) ? void 0 : yjsText;
|
|
244
|
+
} catch {
|
|
245
|
+
return void 0;
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
(yjsText) => {
|
|
249
|
+
disposeObserveYjsText == null ? void 0 : disposeObserveYjsText();
|
|
250
|
+
disposeObserveYjsText = void 0;
|
|
251
|
+
if (yjsText) {
|
|
252
|
+
yjsText.observe(observeFn);
|
|
253
|
+
disposeObserveYjsText = () => {
|
|
254
|
+
yjsText.unobserve(observeFn);
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
textChangedAtom.reportChanged();
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
fireImmediately: true
|
|
222
261
|
}
|
|
223
|
-
|
|
224
|
-
}, {
|
|
225
|
-
fireImmediately: true
|
|
226
|
-
});
|
|
262
|
+
);
|
|
227
263
|
return () => {
|
|
228
264
|
disposeReactionToYTextChange();
|
|
229
265
|
disposeObserveYjsText == null ? void 0 : disposeObserveYjsText();
|
|
@@ -267,32 +303,45 @@ function convertJsonToYjsData(v) {
|
|
|
267
303
|
}
|
|
268
304
|
throw new Error(`unsupported value type: ${v}`);
|
|
269
305
|
}
|
|
270
|
-
|
|
306
|
+
const applyJsonArrayToYArray = (dest, source) => {
|
|
271
307
|
dest.push(source.map(convertJsonToYjsData));
|
|
272
|
-
}
|
|
273
|
-
|
|
308
|
+
};
|
|
309
|
+
const applyJsonObjectToYMap = (dest, source) => {
|
|
274
310
|
Object.entries(source).forEach(([k, v]) => {
|
|
275
311
|
dest.set(k, convertJsonToYjsData(v));
|
|
276
312
|
});
|
|
277
|
-
}
|
|
313
|
+
};
|
|
278
314
|
function applyMobxKeystonePatchToYjsObject(patch, yjs) {
|
|
315
|
+
if (isYjsValueDeleted(yjs)) {
|
|
316
|
+
throw failure("cannot apply patch to deleted Yjs value");
|
|
317
|
+
}
|
|
279
318
|
if (patch.path.length > 1) {
|
|
280
319
|
const [key, ...rest] = patch.path;
|
|
281
320
|
if (yjs instanceof Y.Map) {
|
|
282
321
|
const child = yjs.get(String(key));
|
|
283
322
|
if (child === void 0) {
|
|
284
|
-
throw failure(
|
|
323
|
+
throw failure(
|
|
324
|
+
`invalid patch path, key "${key}" not found in Yjs map - patch: ${JSON.stringify(patch)}`
|
|
325
|
+
);
|
|
285
326
|
}
|
|
286
327
|
applyMobxKeystonePatchToYjsObject({ ...patch, path: rest }, child);
|
|
287
328
|
} else if (yjs instanceof Y.Array) {
|
|
288
329
|
const child = yjs.get(Number(key));
|
|
289
330
|
if (child === void 0) {
|
|
290
|
-
throw failure(
|
|
331
|
+
throw failure(
|
|
332
|
+
`invalid patch path, key "${key}" not found in Yjs array - patch: ${JSON.stringify(
|
|
333
|
+
patch
|
|
334
|
+
)}`
|
|
335
|
+
);
|
|
291
336
|
}
|
|
292
337
|
applyMobxKeystonePatchToYjsObject({ ...patch, path: rest }, child);
|
|
293
338
|
} else if (yjs instanceof Y.Text) ;
|
|
294
339
|
else {
|
|
295
|
-
throw failure(
|
|
340
|
+
throw failure(
|
|
341
|
+
`invalid patch path, key "${key}" not found in unknown Yjs object - patch: ${JSON.stringify(
|
|
342
|
+
patch
|
|
343
|
+
)}`
|
|
344
|
+
);
|
|
296
345
|
}
|
|
297
346
|
} else if (patch.path.length === 1) {
|
|
298
347
|
if (yjs instanceof Y.Map) {
|
|
@@ -344,13 +393,15 @@ function applyMobxKeystonePatchToYjsObject(patch, yjs) {
|
|
|
344
393
|
}
|
|
345
394
|
} else if (yjs instanceof Y.Text) ;
|
|
346
395
|
else {
|
|
347
|
-
throw failure(
|
|
396
|
+
throw failure(
|
|
397
|
+
`invalid patch path, the Yjs object is of an unkown type, so key "${String(patch.path[0])}" cannot be found in it`
|
|
398
|
+
);
|
|
348
399
|
}
|
|
349
400
|
} else {
|
|
350
401
|
throw failure(`invalid patch path, it cannot be empty`);
|
|
351
402
|
}
|
|
352
403
|
}
|
|
353
|
-
|
|
404
|
+
const convertYjsDataToJson = action((yjsData) => {
|
|
354
405
|
if (yjsData instanceof Y.Array) {
|
|
355
406
|
return yjsData.map((v) => convertYjsDataToJson(v));
|
|
356
407
|
}
|
|
@@ -368,7 +419,7 @@ function convertYjsDataToJson(yjsData) {
|
|
|
368
419
|
});
|
|
369
420
|
}
|
|
370
421
|
return yjsData;
|
|
371
|
-
}
|
|
422
|
+
});
|
|
372
423
|
function convertYjsEventToPatches(event) {
|
|
373
424
|
const patches = [];
|
|
374
425
|
if (event instanceof Y.YMapEvent) {
|
|
@@ -380,14 +431,14 @@ function convertYjsEventToPatches(event) {
|
|
|
380
431
|
patches.push({
|
|
381
432
|
op: "add",
|
|
382
433
|
path,
|
|
383
|
-
value:
|
|
434
|
+
value: convertYjsDataToJson(source.get(key))
|
|
384
435
|
});
|
|
385
436
|
break;
|
|
386
437
|
case "update":
|
|
387
438
|
patches.push({
|
|
388
439
|
op: "replace",
|
|
389
440
|
path,
|
|
390
|
-
value:
|
|
441
|
+
value: convertYjsDataToJson(source.get(key))
|
|
391
442
|
});
|
|
392
443
|
break;
|
|
393
444
|
case "delete":
|
|
@@ -422,7 +473,7 @@ function convertYjsEventToPatches(event) {
|
|
|
422
473
|
patches.push({
|
|
423
474
|
op: "add",
|
|
424
475
|
path,
|
|
425
|
-
value:
|
|
476
|
+
value: convertYjsDataToJson(v)
|
|
426
477
|
});
|
|
427
478
|
retain++;
|
|
428
479
|
});
|
|
@@ -443,15 +494,12 @@ function convertYjsEventToPatches(event) {
|
|
|
443
494
|
}
|
|
444
495
|
return patches;
|
|
445
496
|
}
|
|
446
|
-
function
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
}
|
|
453
|
-
function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
|
|
454
|
-
const yjsOrigin = Symbol("bindYjsToMobxKeystoneTransactionOrigin");
|
|
497
|
+
function bindYjsToMobxKeystone({
|
|
498
|
+
yjsDoc,
|
|
499
|
+
yjsObject,
|
|
500
|
+
mobxKeystoneType
|
|
501
|
+
}) {
|
|
502
|
+
const yjsOrigin = /* @__PURE__ */ Symbol("bindYjsToMobxKeystoneTransactionOrigin");
|
|
455
503
|
let applyingYjsChangesToMobxKeystone = 0;
|
|
456
504
|
const bindingContext = {
|
|
457
505
|
yjsDoc,
|
|
@@ -471,7 +519,10 @@ function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
|
|
|
471
519
|
initializationGlobalPatches.push({ target, patches });
|
|
472
520
|
});
|
|
473
521
|
try {
|
|
474
|
-
const boundObject2 = yjsBindingContext.apply(
|
|
522
|
+
const boundObject2 = yjsBindingContext.apply(
|
|
523
|
+
() => fromSnapshot(mobxKeystoneType, yjsJson),
|
|
524
|
+
bindingContext
|
|
525
|
+
);
|
|
475
526
|
yjsBindingContext.set(boundObject2, { ...bindingContext, boundObject: boundObject2 });
|
|
476
527
|
return boundObject2;
|
|
477
528
|
} finally {
|
|
@@ -513,6 +564,9 @@ function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
|
|
|
513
564
|
}
|
|
514
565
|
const arrayOfArrayOfPatches = pendingArrayOfArrayOfPatches;
|
|
515
566
|
pendingArrayOfArrayOfPatches = [];
|
|
567
|
+
if (isYjsValueDeleted(yjsObject)) {
|
|
568
|
+
return;
|
|
569
|
+
}
|
|
516
570
|
yjsDoc.transact(() => {
|
|
517
571
|
arrayOfArrayOfPatches.forEach((arrayOfPatches) => {
|
|
518
572
|
arrayOfPatches.forEach((patch) => {
|
|
@@ -533,21 +587,27 @@ function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
|
|
|
533
587
|
const parentToChildPath = getParentToChildPath(boundObject, target);
|
|
534
588
|
if (parentToChildPath !== void 0) {
|
|
535
589
|
patches.forEach((patch) => {
|
|
536
|
-
applyMobxKeystonePatchToYjsObject(
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
590
|
+
applyMobxKeystonePatchToYjsObject(
|
|
591
|
+
{
|
|
592
|
+
...patch,
|
|
593
|
+
path: [...parentToChildPath, ...patch.path]
|
|
594
|
+
},
|
|
595
|
+
yjsObject
|
|
596
|
+
);
|
|
540
597
|
});
|
|
541
598
|
}
|
|
542
599
|
});
|
|
543
600
|
}, yjsOrigin);
|
|
601
|
+
const dispose = () => {
|
|
602
|
+
yjsDoc.off("destroy", dispose);
|
|
603
|
+
disposeOnPatches();
|
|
604
|
+
disposeOnSnapshot();
|
|
605
|
+
yjsObject.unobserveDeep(observeDeepCb);
|
|
606
|
+
};
|
|
607
|
+
yjsDoc.on("destroy", dispose);
|
|
544
608
|
return {
|
|
545
609
|
boundObject,
|
|
546
|
-
dispose
|
|
547
|
-
disposeOnPatches();
|
|
548
|
-
disposeOnSnapshot();
|
|
549
|
-
yjsObject.unobserveDeep(observeDeepCb);
|
|
550
|
-
},
|
|
610
|
+
dispose,
|
|
551
611
|
yjsOrigin
|
|
552
612
|
};
|
|
553
613
|
}
|
|
@@ -561,4 +621,4 @@ export {
|
|
|
561
621
|
yjsBindingContext,
|
|
562
622
|
yjsTextModelId
|
|
563
623
|
};
|
|
564
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2Vycm9yLnRzIiwiLi4vc3JjL2JpbmRpbmcveWpzQmluZGluZ0NvbnRleHQudHMiLCIuLi9zcmMvdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbS50cyIsIi4uL3NyYy9iaW5kaW5nL3Jlc29sdmVZanNQYXRoLnRzIiwiLi4vc3JjL2JpbmRpbmcvWWpzVGV4dE1vZGVsLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydEpzb25Ub1lqc0RhdGEudHMiLCIuLi9zcmMvYmluZGluZy9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0WWpzRGF0YVRvSnNvbi50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlcy50cyIsIi4uL3NyYy9iaW5kaW5nL2JpbmRZanNUb01vYnhLZXlzdG9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQSBtb2J4LWtleXN0b25lLXlqcyBlcnJvci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBNb2J4S2V5c3RvbmVZanNFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xyXG4gICAgc3VwZXIobXNnKVxyXG5cclxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTW9ieEtleXN0b25lWWpzRXJyb3IucHJvdG90eXBlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUobXNnOiBzdHJpbmcpIHtcclxuICByZXR1cm4gbmV3IE1vYnhLZXlzdG9uZVlqc0Vycm9yKG1zZylcclxufVxyXG4iLCJpbXBvcnQgeyBBbnlUeXBlLCBjcmVhdGVDb250ZXh0IH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcblxuLyoqXG4gKiBDb250ZXh0IHdpdGggaW5mbyBvbiBob3cgYSBtb2J4LWtleXN0b25lIG1vZGVsIGlzIGJvdW5kIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBZanNCaW5kaW5nQ29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgWS5qcyBkb2N1bWVudC5cbiAgICovXG4gIHlqc0RvYzogWS5Eb2NcblxuICAvKipcbiAgICogVGhlIGJvdW5kIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gICAqL1xuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPiB8IFkuVGV4dFxuXG4gIC8qKlxuICAgKiBUaGUgbW9ieC1rZXlzdG9uZSBtb2RlbCB0eXBlLlxuICAgKi9cbiAgbW9ieEtleXN0b25lVHlwZTogQW55VHlwZVxuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luIHN5bWJvbCB1c2VkIGZvciB0cmFuc2FjdGlvbnMuXG4gICAqL1xuICB5anNPcmlnaW46IHN5bWJvbFxuXG4gIC8qKlxuICAgKiBUaGUgYm91bmQgbW9ieC1rZXlzdG9uZSBpbnN0YW5jZS5cbiAgICovXG4gIGJvdW5kT2JqZWN0OiB1bmtub3duXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBhcHBseWluZyBZLmpzIGNoYW5nZXMgdG8gdGhlIG1vYngta2V5c3RvbmUgbW9kZWwuXG4gICAqL1xuICBpc0FwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lOiBib29sZWFuXG59XG5cbi8qKlxuICogQ29udGV4dCB3aXRoIGluZm8gb24gaG93IGEgbW9ieC1rZXlzdG9uZSBtb2RlbCBpcyBib3VuZCB0byBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCBjb25zdCB5anNCaW5kaW5nQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8WWpzQmluZGluZ0NvbnRleHQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbiIsImltcG9ydCB7IElBdG9tLCBjcmVhdGVBdG9tIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcblxuY29uc3QgeWpzQ29sbGVjdGlvbkF0b21zID0gbmV3IFdlYWtNYXA8WS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+LCBJQXRvbT4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZ2V0WWpzQ29sbGVjdGlvbkF0b20gPSAoXG4gIHlqc0NvbGxlY3Rpb246IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPlxuKTogSUF0b20gfCB1bmRlZmluZWQgPT4ge1xuICByZXR1cm4geWpzQ29sbGVjdGlvbkF0b21zLmdldCh5anNDb2xsZWN0aW9uKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSA9IChcbiAgeWpzQ29sbGVjdGlvbjogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+XG4pOiBJQXRvbSA9PiB7XG4gIGxldCBhdG9tID0geWpzQ29sbGVjdGlvbkF0b21zLmdldCh5anNDb2xsZWN0aW9uKVxuICBpZiAoIWF0b20pIHtcbiAgICBhdG9tID0gY3JlYXRlQXRvbShgeWpzQ29sbGVjdGlvbkF0b21gKVxuICAgIHlqc0NvbGxlY3Rpb25BdG9tcy5zZXQoeWpzQ29sbGVjdGlvbiwgYXRvbSlcbiAgfVxuICByZXR1cm4gYXRvbVxufVxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSB9IGZyb20gXCIuLi91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVZanNQYXRoKHlqc09iamVjdDogdW5rbm93biwgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSk6IHVua25vd24ge1xuICBsZXQgY3VycmVudFlqc09iamVjdDogdW5rbm93biA9IHlqc09iamVjdFxuXG4gIHBhdGguZm9yRWFjaCgocGF0aFBhcnQsIGkpID0+IHtcbiAgICBpZiAoY3VycmVudFlqc09iamVjdCBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGN1cnJlbnRZanNPYmplY3QpLnJlcG9ydE9ic2VydmVkKClcbiAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwYXRoUGFydClcbiAgICAgIGN1cnJlbnRZanNPYmplY3QgPSBjdXJyZW50WWpzT2JqZWN0LmdldChrZXkpXG4gICAgfSBlbHNlIGlmIChjdXJyZW50WWpzT2JqZWN0IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbShjdXJyZW50WWpzT2JqZWN0KS5yZXBvcnRPYnNlcnZlZCgpXG4gICAgICBjb25zdCBrZXkgPSBOdW1iZXIocGF0aFBhcnQpXG4gICAgICBjdXJyZW50WWpzT2JqZWN0ID0gY3VycmVudFlqc09iamVjdC5nZXQoa2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgWS5NYXAgb3IgWS5BcnJheSB3YXMgZXhwZWN0ZWQgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHBhdGguc2xpY2UoMCwgaSlcbiAgICAgICAgKX0gaW4gb3JkZXIgdG8gcmVzb2x2ZSBwYXRoICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9LCBidXQgZ290ICR7Y3VycmVudFlqc09iamVjdH0gaW5zdGVhZGBcbiAgICAgIClcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIGN1cnJlbnRZanNPYmplY3Rcbn1cbiIsImltcG9ydCB7IElBdG9tLCBjb21wdXRlZCwgY3JlYXRlQXRvbSwgb2JzZXJ2ZSwgcmVhY3Rpb24gfSBmcm9tIFwibW9ieFwiXHJcbmltcG9ydCB7XHJcbiAgRnJvemVuLFxyXG4gIE1vZGVsLFxyXG4gIGZyb3plbixcclxuICBnZXRQYXJlbnRUb0NoaWxkUGF0aCxcclxuICBtb2RlbCxcclxuICBvblNuYXBzaG90LFxyXG4gIHRQcm9wLFxyXG4gIHR5cGVzLFxyXG59IGZyb20gXCJtb2J4LWtleXN0b25lXCJcclxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXHJcbmltcG9ydCB7IFlqc0JpbmRpbmdDb250ZXh0LCB5anNCaW5kaW5nQ29udGV4dCB9IGZyb20gXCIuL3lqc0JpbmRpbmdDb250ZXh0XCJcclxuaW1wb3J0IHsgcmVzb2x2ZVlqc1BhdGggfSBmcm9tIFwiLi9yZXNvbHZlWWpzUGF0aFwiXHJcblxyXG4vLyBEZWx0YVtdW10sIHNpbmNlIGVhY2ggc2luZ2xlIGNoYW5nZSBpcyBhIERlbHRhW11cclxuLy8gd2UgdXNlIGZyb3plbiBzbyB0aGF0IHdlIGNhbiByZXVzZSBlYWNoIGRlbHRhIGNoYW5nZVxyXG5jb25zdCBkZWx0YUxpc3RUeXBlID0gdHlwZXMuYXJyYXkodHlwZXMuZnJvemVuKHR5cGVzLnVuY2hlY2tlZDx1bmtub3duW10+KCkpKVxyXG5cclxuZXhwb3J0IGNvbnN0IHlqc1RleHRNb2RlbElkID0gXCJtb2J4LWtleXN0b25lLXlqcy9ZanNUZXh0TW9kZWxcIlxyXG5cclxuLyoqXHJcbiAqIEEgbW9ieC1rZXlzdG9uZSBtb2RlbCB0aGF0IHJlcHJlc2VudHMgYSBZanMuVGV4dCBvYmplY3QuXHJcbiAqL1xyXG5AbW9kZWwoeWpzVGV4dE1vZGVsSWQpXHJcbmV4cG9ydCBjbGFzcyBZanNUZXh0TW9kZWwgZXh0ZW5kcyBNb2RlbCh7XHJcbiAgZGVsdGFMaXN0OiB0UHJvcChkZWx0YUxpc3RUeXBlLCAoKSA9PiBbXSksXHJcbn0pIHtcclxuICAvKipcclxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgWWpzVGV4dE1vZGVsIGluc3RhbmNlIHdpdGggYSBzaW1wbGUgdGV4dC5cclxuICAgKi9cclxuICBzdGF0aWMgd2l0aFRleHQodGV4dDogc3RyaW5nKTogWWpzVGV4dE1vZGVsIHtcclxuICAgIHJldHVybiBuZXcgRGVjb3JhdGVkWWpzVGV4dE1vZGVsKHtcclxuICAgICAgZGVsdGFMaXN0OiBbXHJcbiAgICAgICAgZnJvemVuKFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaW5zZXJ0OiB0ZXh0LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICBdKSxcclxuICAgICAgXSxcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgWS5qcyBwYXRoIGZyb20gdGhlIGJvdW5kIG9iamVjdCB0byB0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlLlxyXG4gICAqL1xyXG4gIEBjb21wdXRlZFxyXG4gIHByaXZhdGUgZ2V0IF95anNPYmplY3RQYXRoKCkge1xyXG4gICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXHJcbiAgICBpZiAoY3R4Py5ib3VuZE9iamVjdCA9PSBudWxsKSB7XHJcbiAgICAgIHRocm93IGZhaWx1cmUoXHJcbiAgICAgICAgXCJ0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlIG11c3QgYmUgcGFydCBvZiBhIGJvdW5kIG9iamVjdCBiZWZvcmUgaXQgY2FuIGJlIGFjY2Vzc2VkXCJcclxuICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChjdHguYm91bmRPYmplY3QsIHRoaXMpXHJcbiAgICBpZiAoIXBhdGgpIHtcclxuICAgICAgdGhyb3cgZmFpbHVyZShcImEgcGF0aCBmcm9tIHRoZSBib3VuZCBvYmplY3QgdG8gdGhlIFlqc1RleHRNb2RlbCBpbnN0YW5jZSBpcyBub3QgYXZhaWxhYmxlXCIpXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBhdGhcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBZanMuVGV4dCBvYmplY3QgcHJlc2VudCBhdCB0aGlzIG1vYngta2V5c3RvbmUgbm9kZSdzIHBhdGguXHJcbiAgICovXHJcbiAgQGNvbXB1dGVkXHJcbiAgcHJpdmF0ZSBnZXQgX3lqc09iamVjdEF0UGF0aCgpOiB1bmtub3duIHtcclxuICAgIGNvbnN0IHBhdGggPSB0aGlzLl95anNPYmplY3RQYXRoXHJcblxyXG4gICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpIVxyXG5cclxuICAgIHJldHVybiByZXNvbHZlWWpzUGF0aChjdHgueWpzT2JqZWN0LCBwYXRoKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIFlqcy5UZXh0IG9iamVjdCByZXByZXNlbnRlZCBieSB0aGlzIG1vYngta2V5c3RvbmUgbm9kZS5cclxuICAgKi9cclxuICBAY29tcHV0ZWRcclxuICBnZXQgeWpzVGV4dCgpOiBZLlRleHQge1xyXG4gICAgY29uc3QgeWpzT2JqZWN0ID0gdGhpcy5feWpzT2JqZWN0QXRQYXRoXHJcblxyXG4gICAgaWYgKCEoeWpzT2JqZWN0IGluc3RhbmNlb2YgWS5UZXh0KSkge1xyXG4gICAgICB0aHJvdyBmYWlsdXJlKGBZLlRleHQgd2FzIGV4cGVjdGVkIGF0IHBhdGggJHtKU09OLnN0cmluZ2lmeSh0aGlzLl95anNPYmplY3RQYXRoKX1gKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB5anNPYmplY3RcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEF0b20gdGhhdCBnZXRzIGNoYW5nZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBZLmpzIHRleHQgY2hhbmdlcy5cclxuICAgKi9cclxuICB5anNUZXh0Q2hhbmdlZEF0b20gPSBjcmVhdGVBdG9tKFwieWpzVGV4dENoYW5nZWRBdG9tXCIpXHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBZanMuVGV4dCBvYmplY3QuXHJcbiAgICogU2hvcnRjdXQgZm9yIGB5anNUZXh0LnRvU3RyaW5nKClgLCBidXQgY29tcHV0ZWQuXHJcbiAgICovXHJcbiAgQGNvbXB1dGVkXHJcbiAgZ2V0IHRleHQoKTogc3RyaW5nIHtcclxuICAgIHRoaXMueWpzVGV4dENoYW5nZWRBdG9tLnJlcG9ydE9ic2VydmVkKClcclxuICAgIHJldHVybiB0aGlzLnlqc1RleHQudG9TdHJpbmcoKVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uSW5pdCgpIHtcclxuICAgIGNvbnN0IHNob3VsZFJlcGxpY2F0ZVRvWWpzID0gKGN0eDogWWpzQmluZGluZ0NvbnRleHQgfCB1bmRlZmluZWQpOiBjdHggaXMgWWpzQmluZGluZ0NvbnRleHQgPT4ge1xyXG4gICAgICByZXR1cm4gISFjdHggJiYgISFjdHguYm91bmRPYmplY3QgJiYgIWN0eC5pc0FwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlYXBwbHlEZWx0YXNUb1lqc1RleHQgPSBmYWxzZVxyXG4gICAgY29uc3QgbmV3RGVsdGFzOiBGcm96ZW48dW5rbm93bltdPltdID0gW11cclxuXHJcbiAgICBsZXQgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxyXG5cclxuICAgIGNvbnN0IGRpc3Bvc2VSZWFjdGlvblRvRGVsdGFMaXN0UmVmQ2hhbmdlID0gcmVhY3Rpb24oXHJcbiAgICAgICgpID0+IHRoaXMuJC5kZWx0YUxpc3QsXHJcbiAgICAgIChkZWx0YUxpc3QpID0+IHtcclxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdD8uKClcclxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IG9ic2VydmUoZGVsdGFMaXN0LCAoY2hhbmdlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVhcHBseURlbHRhc1RvWWpzVGV4dCkge1xyXG4gICAgICAgICAgICAvLyBhbHJlYWR5IGdvbm5hIHJlcGxhY2UgdGhlbSBhbGxcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoIXNob3VsZFJlcGxpY2F0ZVRvWWpzKHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKSkpIHtcclxuICAgICAgICAgICAgLy8geWpzIHRleHQgaXMgYWxyZWFkeSB1cCB0byBkYXRlIHdpdGggdGhlc2UgY2hhbmdlc1xyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGNoYW5nZS50eXBlID09PSBcInNwbGljZVwiICYmXHJcbiAgICAgICAgICAgIGNoYW5nZS5yZW1vdmVkQ291bnQgPT09IDAgJiZcclxuICAgICAgICAgICAgY2hhbmdlLmFkZGVkQ291bnQgPiAwICYmXHJcbiAgICAgICAgICAgIGNoYW5nZS5pbmRleCA9PT0gdGhpcy5kZWx0YUxpc3QubGVuZ3RoXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgLy8gb3B0aW1pemF0aW9uLCBqdXN0IGFkZGluZyBuZXcgb25lcyB0byB0aGUgZW5kXHJcbiAgICAgICAgICAgIG5ld0RlbHRhcy5wdXNoKC4uLmNoYW5nZS5hZGRlZClcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGFueSBvdGhlciBjaGFuZ2UsIHdlIG5lZWQgdG8gcmVhcHBseSBhbGwgZGVsdGFzXHJcbiAgICAgICAgICAgIHJlYXBwbHlEZWx0YXNUb1lqc1RleHQgPSB0cnVlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSxcclxuICAgICAgeyBmaXJlSW1tZWRpYXRlbHk6IHRydWUgfVxyXG4gICAgKVxyXG5cclxuICAgIGNvbnN0IGRpc3Bvc2VPblNuYXBzaG90ID0gb25TbmFwc2hvdCh0aGlzLCAoKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgaWYgKHJlYXBwbHlEZWx0YXNUb1lqc1RleHQpIHtcclxuICAgICAgICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKVxyXG5cclxuICAgICAgICAgIGlmIChzaG91bGRSZXBsaWNhdGVUb1lqcyhjdHgpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgeWpzVGV4dCB9ID0gdGhpc1xyXG5cclxuICAgICAgICAgICAgY3R4Lnlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgLy8gZGlkbid0IGZpbmQgYSBiZXR0ZXIgd2F5IHRoYW4gdGhpcyB0byByZWFwcGx5IGFsbCBkZWx0YXNcclxuICAgICAgICAgICAgICAvLyB3aXRob3V0IGhhdmluZyB0byByZS1jcmVhdGUgdGhlIFkuVGV4dCBvYmplY3RcclxuICAgICAgICAgICAgICBpZiAoeWpzVGV4dC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB5anNUZXh0LmRlbGV0ZSgwLCB5anNUZXh0Lmxlbmd0aClcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuZGVsdGFMaXN0LmZvckVhY2goKGZyb3plbkRlbHRhcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgeWpzVGV4dC5hcHBseURlbHRhKGZyb3plbkRlbHRhcy5kYXRhKVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0sIGN0eC55anNPcmlnaW4pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChuZXdEZWx0YXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXHJcblxyXG4gICAgICAgICAgaWYgKHNob3VsZFJlcGxpY2F0ZVRvWWpzKGN0eCkpIHtcclxuICAgICAgICAgICAgY29uc3QgeyB5anNUZXh0IH0gPSB0aGlzXHJcblxyXG4gICAgICAgICAgICBjdHgueWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcclxuICAgICAgICAgICAgICBuZXdEZWx0YXMuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB5anNUZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSwgY3R4Lnlqc09yaWdpbilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgcmVhcHBseURlbHRhc1RvWWpzVGV4dCA9IGZhbHNlXHJcbiAgICAgICAgbmV3RGVsdGFzLmxlbmd0aCA9IDBcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICBjb25zdCBkaXBvc2VZanNUZXh0Q2hhbmdlZEF0b20gPSBob29rWWpzVGV4dENoYW5nZWRBdG9tKFxyXG4gICAgICAoKSA9PiB0aGlzLnlqc1RleHQsXHJcbiAgICAgIHRoaXMueWpzVGV4dENoYW5nZWRBdG9tXHJcbiAgICApXHJcblxyXG4gICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgZGlzcG9zZU9uU25hcHNob3QoKVxyXG4gICAgICBkaXNwb3NlUmVhY3Rpb25Ub0RlbHRhTGlzdFJlZkNoYW5nZSgpXHJcbiAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0Py4oKVxyXG4gICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IHVuZGVmaW5lZFxyXG5cclxuICAgICAgZGlwb3NlWWpzVGV4dENoYW5nZWRBdG9tKClcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vIHdlIHVzZSB0aGlzIHRyaWNrIGp1c3QgdG8gYXZvaWQgYSBiYWJlbCBidWcgdGhhdCBjYXVzZXMgY2xhc3NlcyB1c2VkIGluc2lkZSBjbGFzc2VzIG5vdCB0byBiZSBvdmVycmlkZW5cclxuLy8gYnkgdGhlIGRlY29yYXRvclxyXG5jb25zdCBEZWNvcmF0ZWRZanNUZXh0TW9kZWwgPSBZanNUZXh0TW9kZWxcclxuXHJcbmZ1bmN0aW9uIGhvb2tZanNUZXh0Q2hhbmdlZEF0b20oZ2V0WWpzVGV4dDogKCkgPT4gWS5UZXh0LCB0ZXh0Q2hhbmdlZEF0b206IElBdG9tKSB7XHJcbiAgbGV0IGRpc3Bvc2VPYnNlcnZlWWpzVGV4dDogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkXHJcblxyXG4gIGNvbnN0IG9ic2VydmVGbiA9ICgpID0+IHtcclxuICAgIHRleHRDaGFuZ2VkQXRvbS5yZXBvcnRDaGFuZ2VkKClcclxuICB9XHJcblxyXG4gIGNvbnN0IGRpc3Bvc2VSZWFjdGlvblRvWVRleHRDaGFuZ2UgPSByZWFjdGlvbihcclxuICAgICgpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gZ2V0WWpzVGV4dCgpXHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgICh5anNUZXh0KSA9PiB7XHJcbiAgICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dD8uKClcclxuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXHJcblxyXG4gICAgICBpZiAoeWpzVGV4dCkge1xyXG4gICAgICAgIHlqc1RleHQub2JzZXJ2ZShvYnNlcnZlRm4pXHJcblxyXG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dCA9ICgpID0+IHtcclxuICAgICAgICAgIHlqc1RleHQudW5vYnNlcnZlKG9ic2VydmVGbilcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRleHRDaGFuZ2VkQXRvbS5yZXBvcnRDaGFuZ2VkKClcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZpcmVJbW1lZGlhdGVseTogdHJ1ZSxcclxuICAgIH1cclxuICApXHJcblxyXG4gIHJldHVybiAoKSA9PiB7XHJcbiAgICBkaXNwb3NlUmVhY3Rpb25Ub1lUZXh0Q2hhbmdlKClcclxuICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dD8uKClcclxuICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dCA9IHVuZGVmaW5lZFxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgWWpzVGV4dE1vZGVsLCB5anNUZXh0TW9kZWxJZCB9IGZyb20gXCIuL1lqc1RleHRNb2RlbFwiXG5pbXBvcnQgeyBTbmFwc2hvdE91dE9mIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0IHsgWWpzRGF0YSB9IGZyb20gXCIuL2NvbnZlcnRZanNEYXRhVG9Kc29uXCJcbmltcG9ydCB7IFBsYWluQXJyYXksIFBsYWluT2JqZWN0LCBQbGFpblByaW1pdGl2ZSwgUGxhaW5WYWx1ZSB9IGZyb20gXCIuLi9wbGFpblR5cGVzXCJcblxuZnVuY3Rpb24gaXNQbGFpblByaW1pdGl2ZSh2OiBQbGFpblZhbHVlKTogdiBpcyBQbGFpblByaW1pdGl2ZSB7XG4gIGNvbnN0IHQgPSB0eXBlb2YgdlxuICByZXR1cm4gdCA9PT0gXCJzdHJpbmdcIiB8fCB0ID09PSBcIm51bWJlclwiIHx8IHQgPT09IFwiYm9vbGVhblwiIHx8IHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5BcnJheSh2OiBQbGFpblZhbHVlKTogdiBpcyBQbGFpbkFycmF5IHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodilcbn1cblxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2OiBQbGFpblZhbHVlKTogdiBpcyBQbGFpbk9iamVjdCB7XG4gIHJldHVybiAhaXNQbGFpbkFycmF5KHYpICYmIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT09IG51bGxcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHBsYWluIHZhbHVlIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqIE9iamVjdHMgYXJlIGNvbnZlcnRlZCB0byBZLk1hcHMsIGFycmF5cyB0byBZLkFycmF5cywgcHJpbWl0aXZlcyBhcmUgdW50b3VjaGVkLlxuICogRnJvemVuIHZhbHVlcyBhcmUgYSBzcGVjaWFsIGNhc2UgYW5kIHRoZXkgYXJlIGtlcHQgYXMgaW1tdXRhYmxlIHBsYWluIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRKc29uVG9ZanNEYXRhKHY6IFBsYWluVmFsdWUpOiBZanNEYXRhIHtcbiAgaWYgKGlzUGxhaW5QcmltaXRpdmUodikpIHtcbiAgICByZXR1cm4gdlxuICB9XG5cbiAgaWYgKGlzUGxhaW5BcnJheSh2KSkge1xuICAgIGNvbnN0IGFyciA9IG5ldyBZLkFycmF5PFlqc0RhdGE+KClcbiAgICBhcHBseUpzb25BcnJheVRvWUFycmF5KGFyciwgdilcbiAgICByZXR1cm4gYXJyIGFzIFlqc0RhdGFcbiAgfVxuXG4gIGlmIChpc1BsYWluT2JqZWN0KHYpKSB7XG4gICAgaWYgKHYuJGZyb3plbiA9PT0gdHJ1ZSkge1xuICAgICAgLy8gZnJvemVuIHZhbHVlLCBzYXZlIGFzIGltbXV0YWJsZSBvYmplY3RcbiAgICAgIHJldHVybiB2XG4gICAgfVxuXG4gICAgaWYgKHYuJG1vZGVsVHlwZSA9PT0geWpzVGV4dE1vZGVsSWQpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBuZXcgWS5UZXh0KClcbiAgICAgIGNvbnN0IHlqc1RleHRNb2RlbCA9IHYgYXMgdW5rbm93biBhcyBTbmFwc2hvdE91dE9mPFlqc1RleHRNb2RlbD5cbiAgICAgIHlqc1RleHRNb2RlbC5kZWx0YUxpc3QuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XG4gICAgICAgIHRleHQuYXBwbHlEZWx0YShmcm96ZW5EZWx0YXMuZGF0YSlcbiAgICAgIH0pXG4gICAgICByZXR1cm4gdGV4dFxuICAgIH1cblxuICAgIGNvbnN0IG1hcCA9IG5ldyBZLk1hcDxZanNEYXRhPigpXG4gICAgYXBwbHlKc29uT2JqZWN0VG9ZTWFwKG1hcCwgdilcbiAgICByZXR1cm4gbWFwIGFzIFlqc0RhdGFcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgdmFsdWUgdHlwZTogJHt2fWApXG59XG5cbi8qKlxuICogQXBwbGllcyBhIEpTT04gYXJyYXkgdG8gYSBZLkFycmF5LCB1c2luZyB0aGUgY29udmVydEpzb25Ub1lqc0RhdGEgdG8gY29udmVydCB0aGUgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlKc29uQXJyYXlUb1lBcnJheShkZXN0OiBZLkFycmF5PFlqc0RhdGE+LCBzb3VyY2U6IFBsYWluQXJyYXkpIHtcbiAgZGVzdC5wdXNoKHNvdXJjZS5tYXAoY29udmVydEpzb25Ub1lqc0RhdGEpKVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBKU09OIG9iamVjdCB0byBhIFkuTWFwLCB1c2luZyB0aGUgY29udmVydEpzb25Ub1lqc0RhdGEgdG8gY29udmVydCB0aGUgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlKc29uT2JqZWN0VG9ZTWFwKGRlc3Q6IFkuTWFwPFlqc0RhdGE+LCBzb3VyY2U6IFBsYWluT2JqZWN0KSB7XG4gIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgZGVzdC5zZXQoaywgY29udmVydEpzb25Ub1lqc0RhdGEodikpXG4gIH0pXG59XG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcbmltcG9ydCB7IGNvbnZlcnRKc29uVG9ZanNEYXRhIH0gZnJvbSBcIi4vY29udmVydEpzb25Ub1lqc0RhdGFcIlxuaW1wb3J0IHsgUGxhaW5WYWx1ZSB9IGZyb20gXCIuLi9wbGFpblR5cGVzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaDogUGF0Y2gsIHlqczogdW5rbm93bik6IHZvaWQge1xuICBpZiAocGF0Y2gucGF0aC5sZW5ndGggPiAxKSB7XG4gICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRjaC5wYXRoXG5cbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGNvbnN0IGNoaWxkID0geWpzLmdldChTdHJpbmcoa2V5KSkgYXMgdW5rbm93blxuICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gWWpzIG1hcCAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KHBhdGNoKX1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgY29uc3QgY2hpbGQgPSB5anMuZ2V0KE51bWJlcihrZXkpKSBhcyB1bmtub3duXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgYXJyYXkgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHBhdGNoXG4gICAgICAgICAgKX1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgICAvLyBjaGFuZ2VzIHRvIGRlbHRhTGlzdCB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIGFycmF5IG9ic2VydmUgaW4gdGhlIFlqc1RleHRNb2RlbCBjbGFzc1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gdW5rbm93biBZanMgb2JqZWN0IC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgcGF0Y2hcbiAgICAgICAgKX1gXG4gICAgICApXG4gICAgfVxuICB9IGVsc2UgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcocGF0Y2gucGF0aFswXSlcblxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xuICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICB5anMuc2V0KGtleSwgY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUgYXMgUGxhaW5WYWx1ZSkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICB5anMuZGVsZXRlKGtleSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIG9wZXJhdGlvbiBmb3IgbWFwYClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgY29uc3Qga2V5ID0gcGF0Y2gucGF0aFswXVxuXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSBcImxlbmd0aFwiKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdMZW5ndGggPSBwYXRjaC52YWx1ZSBhcyBudW1iZXJcbiAgICAgICAgICAgIGlmICh5anMubGVuZ3RoID4gbmV3TGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvRGVsZXRlID0geWpzLmxlbmd0aCAtIG5ld0xlbmd0aFxuICAgICAgICAgICAgICB5anMuZGVsZXRlKG5ld0xlbmd0aCwgdG9EZWxldGUpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHlqcy5sZW5ndGggPCBwYXRjaC52YWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCB0b0luc2VydCA9IHBhdGNoLnZhbHVlIC0geWpzLmxlbmd0aFxuICAgICAgICAgICAgICB5anMuaW5zZXJ0KHlqcy5sZW5ndGgsIEFycmF5LmZyb20oeyBsZW5ndGg6IHRvSW5zZXJ0IH0pLmZpbGwodW5kZWZpbmVkKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcbiAgICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSBhcyBQbGFpblZhbHVlKV0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImFkZFwiOiB7XG4gICAgICAgICAgeWpzLmluc2VydChOdW1iZXIoa2V5KSwgW2NvbnZlcnRKc29uVG9ZanNEYXRhKHBhdGNoLnZhbHVlIGFzIFBsYWluVmFsdWUpXSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIGFycmF5YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgICAvLyBpbml0aWFsaXphdGlvbiBvZiBhIFlqc1RleHRNb2RlbCwgZG8gbm90aGluZ1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCB0aGUgWWpzIG9iamVjdCBpcyBvZiBhbiB1bmtvd24gdHlwZSwgc28ga2V5IFwiJHtTdHJpbmcocGF0Y2gucGF0aFswXSl9XCIgY2Fubm90IGJlIGZvdW5kIGluIGl0YFxuICAgICAgKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIHBhdGgsIGl0IGNhbm5vdCBiZSBlbXB0eWApXG4gIH1cbn1cbiIsImltcG9ydCB7IG1vZGVsU25hcHNob3RPdXRXaXRoTWV0YWRhdGEgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgUGxhaW5PYmplY3QsIFBsYWluVmFsdWUgfSBmcm9tIFwiLi4vcGxhaW5UeXBlc1wiXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwgfSBmcm9tIFwiLi9ZanNUZXh0TW9kZWxcIlxuXG5leHBvcnQgdHlwZSBZanNEYXRhID0gWS5BcnJheTxZanNEYXRhPiB8IFkuTWFwPFlqc0RhdGE+IHwgWS5UZXh0IHwgUGxhaW5WYWx1ZVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFlqc0RhdGFUb0pzb24oeWpzRGF0YTogWWpzRGF0YSk6IFBsYWluVmFsdWUge1xuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICByZXR1cm4geWpzRGF0YS5tYXAoKHYpID0+IGNvbnZlcnRZanNEYXRhVG9Kc29uKHYpKVxuICB9XG5cbiAgaWYgKHlqc0RhdGEgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgIGNvbnN0IG9iajogUGxhaW5PYmplY3QgPSB7fVxuICAgIHlqc0RhdGEuZm9yRWFjaCgodiwgaykgPT4ge1xuICAgICAgb2JqW2tdID0gY29udmVydFlqc0RhdGFUb0pzb24odilcbiAgICB9KVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIGlmICh5anNEYXRhIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgY29uc3QgZGVsdGFzID0geWpzRGF0YS50b0RlbHRhKCkgYXMgdW5rbm93bltdXG5cbiAgICByZXR1cm4gbW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YShZanNUZXh0TW9kZWwsIHtcbiAgICAgIGRlbHRhTGlzdDogZGVsdGFzLmxlbmd0aCA+IDAgPyBbeyAkZnJvemVuOiB0cnVlLCBkYXRhOiBkZWx0YXMgfV0gOiBbXSxcbiAgICB9KSBhcyB1bmtub3duIGFzIFBsYWluVmFsdWVcbiAgfVxuXG4gIC8vIGFzc3VtZSBpdCdzIGEgcHJpbWl0aXZlXG4gIHJldHVybiB5anNEYXRhXG59XG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBQbGFpbkFycmF5LCBQbGFpbk9iamVjdCwgUGxhaW5WYWx1ZSB9IGZyb20gXCIuLi9wbGFpblR5cGVzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50OiBZLllFdmVudDxhbnk+KTogUGF0Y2hbXSB7XG4gIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxuXG4gIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWU1hcEV2ZW50KSB7XG4gICAgY29uc3Qgc291cmNlID0gZXZlbnQudGFyZ2V0XG5cbiAgICBldmVudC5jaGFuZ2VzLmtleXMuZm9yRWFjaCgoY2hhbmdlLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwga2V5XVxuXG4gICAgICBzd2l0Y2ggKGNoYW5nZS5hY3Rpb24pIHtcbiAgICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJhZGRcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUoc291cmNlLmdldChrZXkpKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBcImRlbGV0ZVwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgdW5zdXBwb3J0ZWQgWWpzIG1hcCBldmVudCBhY3Rpb246ICR7Y2hhbmdlLmFjdGlvbn1gKVxuICAgICAgfVxuICAgIH0pXG4gIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllBcnJheUV2ZW50KSB7XG4gICAgbGV0IHJldGFpbiA9IDBcbiAgICBldmVudC5jaGFuZ2VzLmRlbHRhLmZvckVhY2goKGNoYW5nZSkgPT4ge1xuICAgICAgaWYgKGNoYW5nZS5yZXRhaW4pIHtcbiAgICAgICAgcmV0YWluICs9IGNoYW5nZS5yZXRhaW5cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZS5kZWxldGUpIHtcbiAgICAgICAgLy8gcmVtb3ZlIFggaXRlbXMgYXQgcmV0YWluIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgcmV0YWluXVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZS5kZWxldGU7IGkrKykge1xuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlLmluc2VydCkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGNoYW5nZS5pbnNlcnQpID8gY2hhbmdlLmluc2VydCA6IFtjaGFuZ2UuaW5zZXJ0XVxuICAgICAgICBuZXdWYWx1ZXMuZm9yRWFjaCgodikgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgcmV0YWluXVxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJhZGRcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHYpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgcmV0YWluKytcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZVGV4dEV2ZW50KSB7XG4gICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCBcImRlbHRhTGlzdFwiLCAtMSAvKiBsYXN0IGl0ZW0gKi9dXG4gICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgIG9wOiBcImFkZFwiLFxuICAgICAgcGF0aCxcbiAgICAgIHZhbHVlOiB7ICRmcm96ZW46IHRydWUsIGRhdGE6IGV2ZW50LmRlbHRhIH0sXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBwYXRjaGVzXG59XG5cbmZ1bmN0aW9uIHRvUGxhaW5WYWx1ZSh2OiBZLk1hcDxhbnk+IHwgWS5BcnJheTxhbnk+IHwgUGxhaW5WYWx1ZSkge1xuICBpZiAodiBpbnN0YW5jZW9mIFkuTWFwIHx8IHYgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgcmV0dXJuIHYudG9KU09OKCkgYXMgUGxhaW5PYmplY3QgfCBQbGFpbkFycmF5XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZcbiAgfVxufVxuIiwiaW1wb3J0IHsgYWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHtcbiAgQW55RGF0YU1vZGVsLFxuICBBbnlNb2RlbCxcbiAgQW55U3RhbmRhcmRUeXBlLFxuICBNb2RlbENsYXNzLFxuICBQYXRjaCxcbiAgU25hcHNob3RJbk9mLFxuICBUeXBlVG9EYXRhLFxuICBhcHBseVBhdGNoZXMsXG4gIGZyb21TbmFwc2hvdCxcbiAgZ2V0UGFyZW50VG9DaGlsZFBhdGgsXG4gIG9uR2xvYmFsUGF0Y2hlcyxcbiAgb25QYXRjaGVzLFxuICBvblNuYXBzaG90LFxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZ2V0WWpzQ29sbGVjdGlvbkF0b20gfSBmcm9tIFwiLi4vdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbVwiXG5pbXBvcnQgeyBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QgfSBmcm9tIFwiLi9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3RcIlxuaW1wb3J0IHsgWWpzRGF0YSwgY29udmVydFlqc0RhdGFUb0pzb24gfSBmcm9tIFwiLi9jb252ZXJ0WWpzRGF0YVRvSnNvblwiXG5pbXBvcnQgeyBjb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMgfSBmcm9tIFwiLi9jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXNcIlxuaW1wb3J0IHsgWWpzQmluZGluZ0NvbnRleHQsIHlqc0JpbmRpbmdDb250ZXh0IH0gZnJvbSBcIi4veWpzQmluZGluZ0NvbnRleHRcIlxuXG4vKipcbiAqIENyZWF0ZXMgYSBiaWRpcmVjdGlvbmFsIGJpbmRpbmcgYmV0d2VlbiBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUgYW5kIGEgbW9ieC1rZXlzdG9uZSBtb2RlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmRZanNUb01vYnhLZXlzdG9uZTxcbiAgVFR5cGUgZXh0ZW5kcyBBbnlTdGFuZGFyZFR5cGUgfCBNb2RlbENsYXNzPEFueU1vZGVsPiB8IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPixcbj4oe1xuICB5anNEb2MsXG4gIHlqc09iamVjdCxcbiAgbW9ieEtleXN0b25lVHlwZSxcbn06IHtcbiAgLyoqXG4gICAqIFRoZSBZLmpzIGRvY3VtZW50LlxuICAgKi9cbiAgeWpzRG9jOiBZLkRvY1xuICAvKipcbiAgICogVGhlIGJvdW5kIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gICAqL1xuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPiB8IFkuVGV4dFxuICAvKipcbiAgICogVGhlIG1vYngta2V5c3RvbmUgbW9kZWwgdHlwZS5cbiAgICovXG4gIG1vYnhLZXlzdG9uZVR5cGU6IFRUeXBlXG59KToge1xuICAvKipcbiAgICogVGhlIGJvdW5kIG1vYngta2V5c3RvbmUgaW5zdGFuY2UuXG4gICAqL1xuICBib3VuZE9iamVjdDogVHlwZVRvRGF0YTxUVHlwZT5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBiaW5kaW5nLlxuICAgKi9cbiAgZGlzcG9zZTogKCkgPT4gdm9pZFxuICAvKipcbiAgICogVGhlIFkuanMgb3JpZ2luIHN5bWJvbCB1c2VkIGZvciBiaW5kaW5nIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIHlqc09yaWdpbjogc3ltYm9sXG59IHtcbiAgY29uc3QgeWpzT3JpZ2luID0gU3ltYm9sKFwiYmluZFlqc1RvTW9ieEtleXN0b25lVHJhbnNhY3Rpb25PcmlnaW5cIilcblxuICBsZXQgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPSAwXG5cbiAgY29uc3QgYmluZGluZ0NvbnRleHQ6IFlqc0JpbmRpbmdDb250ZXh0ID0ge1xuICAgIHlqc0RvYyxcbiAgICB5anNPYmplY3QsXG4gICAgbW9ieEtleXN0b25lVHlwZSxcbiAgICB5anNPcmlnaW4sXG4gICAgYm91bmRPYmplY3Q6IHVuZGVmaW5lZCwgLy8gbm90IHlldCBjcmVhdGVkXG5cbiAgICBnZXQgaXNBcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSgpIHtcbiAgICAgIHJldHVybiBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSA+IDBcbiAgICB9LFxuICB9XG5cbiAgY29uc3QgeWpzSnNvbiA9IGNvbnZlcnRZanNEYXRhVG9Kc29uKHlqc09iamVjdCBhcyBZanNEYXRhKVxuXG4gIGNvbnN0IGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlczogeyB0YXJnZXQ6IG9iamVjdDsgcGF0Y2hlczogUGF0Y2hbXSB9W10gPSBbXVxuXG4gIGNvbnN0IGNyZWF0ZUJvdW5kT2JqZWN0ID0gKCkgPT4ge1xuICAgIGNvbnN0IGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMgPSBvbkdsb2JhbFBhdGNoZXMoKHRhcmdldCwgcGF0Y2hlcykgPT4ge1xuICAgICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLnB1c2goeyB0YXJnZXQsIHBhdGNoZXMgfSlcbiAgICB9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJvdW5kT2JqZWN0ID0geWpzQmluZGluZ0NvbnRleHQuYXBwbHkoXG4gICAgICAgICgpID0+IGZyb21TbmFwc2hvdChtb2J4S2V5c3RvbmVUeXBlLCB5anNKc29uIGFzIHVua25vd24gYXMgU25hcHNob3RJbk9mPFR5cGVUb0RhdGE8VFR5cGU+PiksXG4gICAgICAgIGJpbmRpbmdDb250ZXh0XG4gICAgICApXG4gICAgICB5anNCaW5kaW5nQ29udGV4dC5zZXQoYm91bmRPYmplY3QsIHsgLi4uYmluZGluZ0NvbnRleHQsIGJvdW5kT2JqZWN0IH0pXG4gICAgICByZXR1cm4gYm91bmRPYmplY3RcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZGlzcG9zZU9uR2xvYmFsUGF0Y2hlcygpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYm91bmRPYmplY3QgPSBjcmVhdGVCb3VuZE9iamVjdCgpXG5cbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIHlqcyB0byBtb2J4LWtleXN0b25lXG4gIGNvbnN0IG9ic2VydmVEZWVwQ2IgPSBhY3Rpb24oKGV2ZW50czogWS5ZRXZlbnQ8YW55PltdKSA9PiB7XG4gICAgY29uc3QgcGF0Y2hlczogUGF0Y2hbXSA9IFtdXG4gICAgZXZlbnRzLmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQudHJhbnNhY3Rpb24ub3JpZ2luICE9PSB5anNPcmlnaW4pIHtcbiAgICAgICAgcGF0Y2hlcy5wdXNoKC4uLmNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudCkpXG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBZLk1hcCB8fCBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICAgIGdldFlqc0NvbGxlY3Rpb25BdG9tKGV2ZW50LnRhcmdldCk/LnJlcG9ydENoYW5nZWQoKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAocGF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSsrXG4gICAgICB0cnkge1xuICAgICAgICBhcHBseVBhdGNoZXMoYm91bmRPYmplY3QsIHBhdGNoZXMpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZS0tXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIHlqc09iamVjdC5vYnNlcnZlRGVlcChvYnNlcnZlRGVlcENiKVxuXG4gIC8vIGJpbmQgYW55IGNoYW5nZXMgZnJvbSBtb2J4LWtleXN0b25lIHRvIHlqc1xuICBsZXQgcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlczogUGF0Y2hbXVtdID0gW11cbiAgY29uc3QgZGlzcG9zZU9uUGF0Y2hlcyA9IG9uUGF0Y2hlcyhib3VuZE9iamVjdCwgKHBhdGNoZXMpID0+IHtcbiAgICBpZiAoYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPiAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzLnB1c2gocGF0Y2hlcylcbiAgfSlcblxuICAvLyB0aGlzIGlzIG9ubHkgdXNlZCBzbyB3ZSBjYW4gdHJhbnNhY3QgYWxsIHBhdGNoZXMgdG8gdGhlIHNuYXBzaG90IGJvdW5kYXJ5XG4gIGNvbnN0IGRpc3Bvc2VPblNuYXBzaG90ID0gb25TbmFwc2hvdChib3VuZE9iamVjdCwgKCkgPT4ge1xuICAgIGlmIChwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgYXJyYXlPZkFycmF5T2ZQYXRjaGVzID0gcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlc1xuICAgIHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXMgPSBbXVxuXG4gICAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgIGFycmF5T2ZBcnJheU9mUGF0Y2hlcy5mb3JFYWNoKChhcnJheU9mUGF0Y2hlcykgPT4ge1xuICAgICAgICBhcnJheU9mUGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaCwgeWpzT2JqZWN0KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9LCB5anNPcmlnaW4pXG4gIH0pXG5cbiAgLy8gc3luYyBpbml0aWFsIHBhdGNoZXMsIHRoYXQgbWlnaHQgaW5jbHVkZSBzZXR0aW5nIGRlZmF1bHRzLCBJRHMsIGV0Y1xuICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgIC8vIHdlIG5lZWQgdG8gc2tpcCBpbml0aWFsaXphdGlvbnMgdW50aWwgd2UgaGl0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgYm91bmQgb2JqZWN0XG4gICAgLy8gdGhpcyBpcyBiZWNhdXNlIGRlZmF1bHQgb2JqZWN0cyBtaWdodCBiZSBjcmVhdGVkIGFuZCBpbml0aWFsaXplZCBiZWZvcmUgdGhlIG1haW4gb2JqZWN0XG4gICAgLy8gYnV0IHdlIGp1c3QgbmVlZCB0byBjYXRjaCB3aGVuIHRob3NlIGFyZSBhY3R1YWxseSBhc3NpZ25lZCB0byB0aGUgYm91bmQgb2JqZWN0XG4gICAgbGV0IGJvdW5kT2JqZWN0Rm91bmQgPSBmYWxzZVxuXG4gICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLmZvckVhY2goKHsgdGFyZ2V0LCBwYXRjaGVzIH0pID0+IHtcbiAgICAgIGlmICghYm91bmRPYmplY3RGb3VuZCkge1xuICAgICAgICBpZiAodGFyZ2V0ICE9PSBib3VuZE9iamVjdCkge1xuICAgICAgICAgIHJldHVybiAvLyBza2lwXG4gICAgICAgIH1cbiAgICAgICAgYm91bmRPYmplY3RGb3VuZCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50VG9DaGlsZFBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChib3VuZE9iamVjdCwgdGFyZ2V0KVxuICAgICAgLy8gdGhpcyBpcyB1bmRlZmluZWQgb25seSBpZiB0YXJnZXQgaXMgbm90IGEgY2hpbGQgb2YgYm91bmRNb2RlbFxuICAgICAgaWYgKHBhcmVudFRvQ2hpbGRQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4ucGF0Y2gsXG4gICAgICAgICAgICAgIHBhdGg6IFsuLi5wYXJlbnRUb0NoaWxkUGF0aCwgLi4ucGF0Y2gucGF0aF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeWpzT2JqZWN0XG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH0sIHlqc09yaWdpbilcblxuICByZXR1cm4ge1xuICAgIGJvdW5kT2JqZWN0LFxuICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgIGRpc3Bvc2VPblBhdGNoZXMoKVxuICAgICAgZGlzcG9zZU9uU25hcHNob3QoKVxuICAgICAgeWpzT2JqZWN0LnVub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcbiAgICB9LFxuICAgIHlqc09yaWdpbixcbiAgfVxufVxuIl0sIm5hbWVzIjpbIllqc1RleHRNb2RlbCIsImJvdW5kT2JqZWN0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBR00sTUFBTyw2QkFBNkIsTUFBSztBQUFBLEVBQzdDLFlBQVksS0FBVztBQUNyQixVQUFNLEdBQUc7QUFHRixXQUFBLGVBQWUsTUFBTSxxQkFBcUIsU0FBUztBQUFBLEVBQUE7QUFFN0Q7QUFLSyxTQUFVLFFBQVEsS0FBVztBQUMxQixTQUFBLElBQUkscUJBQXFCLEdBQUc7QUFDckM7QUN3QmEsTUFBQSxvQkFBb0IsY0FBNkMsTUFBUztBQ3RDdkYsTUFBTSx5Q0FBeUI7QUFLbEIsTUFBQSx1QkFBdUIsQ0FDbEMsa0JBQ3FCO0FBQ2QsU0FBQSxtQkFBbUIsSUFBSSxhQUFhO0FBQzdDO0FBS2EsTUFBQSwrQkFBK0IsQ0FDMUMsa0JBQ1M7QUFDTCxNQUFBLE9BQU8sbUJBQW1CLElBQUksYUFBYTtBQUMvQyxNQUFJLENBQUMsTUFBTTtBQUNULFdBQU8sV0FBVyxtQkFBbUI7QUFDbEIsdUJBQUEsSUFBSSxlQUFlLElBQUk7QUFBQSxFQUFBO0FBRXJDLFNBQUE7QUFDVDtBQ3RCZ0IsU0FBQSxlQUFlLFdBQW9CLE1BQWtDO0FBQ25GLE1BQUksbUJBQTRCO0FBRTNCLE9BQUEsUUFBUSxDQUFDLFVBQVUsTUFBSztBQUN2QixRQUFBLDRCQUE0QixFQUFFLEtBQUs7QUFDUixtQ0FBQSxnQkFBZ0IsRUFBRTtBQUN6QyxZQUFBLE1BQU0sT0FBTyxRQUFRO0FBQ1IseUJBQUEsaUJBQWlCLElBQUksR0FBRztBQUFBLElBQUEsV0FDbEMsNEJBQTRC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
|
|
624
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2dldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20udHMiLCIuLi9zcmMvdXRpbHMvaXNZanNWYWx1ZURlbGV0ZWQudHMiLCIuLi9zcmMvdXRpbHMvZXJyb3IudHMiLCIuLi9zcmMvYmluZGluZy9yZXNvbHZlWWpzUGF0aC50cyIsIi4uL3NyYy9iaW5kaW5nL3lqc0JpbmRpbmdDb250ZXh0LnRzIiwiLi4vc3JjL2JpbmRpbmcvWWpzVGV4dE1vZGVsLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydEpzb25Ub1lqc0RhdGEudHMiLCIuLi9zcmMvYmluZGluZy9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0WWpzRGF0YVRvSnNvbi50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlcy50cyIsIi4uL3NyYy9iaW5kaW5nL2JpbmRZanNUb01vYnhLZXlzdG9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJQXRvbSwgY3JlYXRlQXRvbSB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5cbmNvbnN0IHlqc0NvbGxlY3Rpb25BdG9tcyA9IG5ldyBXZWFrTWFwPFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPiwgSUF0b20+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFlqc0NvbGxlY3Rpb25BdG9tID0gKFxuICB5anNDb2xsZWN0aW9uOiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj5cbik6IElBdG9tIHwgdW5kZWZpbmVkID0+IHtcbiAgcmV0dXJuIHlqc0NvbGxlY3Rpb25BdG9tcy5nZXQoeWpzQ29sbGVjdGlvbilcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20gPSAoXG4gIHlqc0NvbGxlY3Rpb246IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPlxuKTogSUF0b20gPT4ge1xuICBsZXQgYXRvbSA9IHlqc0NvbGxlY3Rpb25BdG9tcy5nZXQoeWpzQ29sbGVjdGlvbilcbiAgaWYgKCFhdG9tKSB7XG4gICAgYXRvbSA9IGNyZWF0ZUF0b20oYHlqc0NvbGxlY3Rpb25BdG9tYClcbiAgICB5anNDb2xsZWN0aW9uQXRvbXMuc2V0KHlqc0NvbGxlY3Rpb24sIGF0b20pXG4gIH1cbiAgcmV0dXJuIGF0b21cbn1cbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgWS5qcyB2YWx1ZSBoYXMgYmVlbiBkZWxldGVkIG9yIGl0cyBkb2N1bWVudCBkZXN0cm95ZWQuXG4gKlxuICogQHBhcmFtIHlqc1ZhbHVlIFRoZSBZLmpzIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZSBpcyBkZWxldGVkIG9yIGRlc3Ryb3llZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1lqc1ZhbHVlRGVsZXRlZCh5anNWYWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoeWpzVmFsdWUgaW5zdGFuY2VvZiBZLkFic3RyYWN0VHlwZSkge1xuICAgIHJldHVybiAhISh5anNWYWx1ZSBhcyBhbnkpLl9pdGVtPy5kZWxldGVkIHx8ICEheWpzVmFsdWUuZG9jPy5pc0Rlc3Ryb3llZFxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuIiwiLyoqXHJcbiAqIEEgbW9ieC1rZXlzdG9uZS15anMgZXJyb3IuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTW9ieEtleXN0b25lWWpzRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcpIHtcclxuICAgIHN1cGVyKG1zZylcclxuXHJcbiAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5LlxyXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIE1vYnhLZXlzdG9uZVlqc0Vycm9yLnByb3RvdHlwZSlcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmYWlsdXJlKG1zZzogc3RyaW5nKSB7XHJcbiAgcmV0dXJuIG5ldyBNb2J4S2V5c3RvbmVZanNFcnJvcihtc2cpXHJcbn1cclxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSB9IGZyb20gXCIuLi91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVZanNQYXRoKHlqc09iamVjdDogdW5rbm93biwgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSk6IHVua25vd24ge1xuICBsZXQgY3VycmVudFlqc09iamVjdDogdW5rbm93biA9IHlqc09iamVjdFxuXG4gIHBhdGguZm9yRWFjaCgocGF0aFBhcnQsIGkpID0+IHtcbiAgICBpZiAoY3VycmVudFlqc09iamVjdCBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGN1cnJlbnRZanNPYmplY3QpLnJlcG9ydE9ic2VydmVkKClcbiAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwYXRoUGFydClcbiAgICAgIGN1cnJlbnRZanNPYmplY3QgPSBjdXJyZW50WWpzT2JqZWN0LmdldChrZXkpXG4gICAgfSBlbHNlIGlmIChjdXJyZW50WWpzT2JqZWN0IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbShjdXJyZW50WWpzT2JqZWN0KS5yZXBvcnRPYnNlcnZlZCgpXG4gICAgICBjb25zdCBrZXkgPSBOdW1iZXIocGF0aFBhcnQpXG4gICAgICBjdXJyZW50WWpzT2JqZWN0ID0gY3VycmVudFlqc09iamVjdC5nZXQoa2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgWS5NYXAgb3IgWS5BcnJheSB3YXMgZXhwZWN0ZWQgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHBhdGguc2xpY2UoMCwgaSlcbiAgICAgICAgKX0gaW4gb3JkZXIgdG8gcmVzb2x2ZSBwYXRoICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9LCBidXQgZ290ICR7Y3VycmVudFlqc09iamVjdH0gaW5zdGVhZGBcbiAgICAgIClcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIGN1cnJlbnRZanNPYmplY3Rcbn1cbiIsImltcG9ydCB7IEFueVR5cGUsIGNyZWF0ZUNvbnRleHQgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuXG4vKipcbiAqIENvbnRleHQgd2l0aCBpbmZvIG9uIGhvdyBhIG1vYngta2V5c3RvbmUgbW9kZWwgaXMgYm91bmQgdG8gYSBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlqc0JpbmRpbmdDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBZLmpzIGRvY3VtZW50LlxuICAgKi9cbiAgeWpzRG9jOiBZLkRvY1xuXG4gIC8qKlxuICAgKiBUaGUgYm91bmQgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAgICovXG4gIHlqc09iamVjdDogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+IHwgWS5UZXh0XG5cbiAgLyoqXG4gICAqIFRoZSBtb2J4LWtleXN0b25lIG1vZGVsIHR5cGUuXG4gICAqL1xuICBtb2J4S2V5c3RvbmVUeXBlOiBBbnlUeXBlXG5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW4gc3ltYm9sIHVzZWQgZm9yIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIHlqc09yaWdpbjogc3ltYm9sXG5cbiAgLyoqXG4gICAqIFRoZSBib3VuZCBtb2J4LWtleXN0b25lIGluc3RhbmNlLlxuICAgKi9cbiAgYm91bmRPYmplY3Q6IHVua25vd25cblxuICAvKipcbiAgICogV2hldGhlciB3ZSBhcmUgY3VycmVudGx5IGFwcGx5aW5nIFkuanMgY2hhbmdlcyB0byB0aGUgbW9ieC1rZXlzdG9uZSBtb2RlbC5cbiAgICovXG4gIGlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmU6IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBDb250ZXh0IHdpdGggaW5mbyBvbiBob3cgYSBtb2J4LWtleXN0b25lIG1vZGVsIGlzIGJvdW5kIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHlqc0JpbmRpbmdDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxZanNCaW5kaW5nQ29udGV4dCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuIiwiaW1wb3J0IHsgY29tcHV0ZWQsIGNyZWF0ZUF0b20sIElBdG9tLCBvYnNlcnZlLCByZWFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7XG4gIEZyb3plbixcbiAgZnJvemVuLFxuICBnZXRQYXJlbnRUb0NoaWxkUGF0aCxcbiAgTW9kZWwsXG4gIG1vZGVsLFxuICBvblNuYXBzaG90LFxuICB0UHJvcCxcbiAgdHlwZXMsXG59IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcbmltcG9ydCB7IGlzWWpzVmFsdWVEZWxldGVkIH0gZnJvbSBcIi4uL3V0aWxzL2lzWWpzVmFsdWVEZWxldGVkXCJcbmltcG9ydCB7IHJlc29sdmVZanNQYXRoIH0gZnJvbSBcIi4vcmVzb2x2ZVlqc1BhdGhcIlxuaW1wb3J0IHsgWWpzQmluZGluZ0NvbnRleHQsIHlqc0JpbmRpbmdDb250ZXh0IH0gZnJvbSBcIi4veWpzQmluZGluZ0NvbnRleHRcIlxuXG4vLyBEZWx0YVtdW10sIHNpbmNlIGVhY2ggc2luZ2xlIGNoYW5nZSBpcyBhIERlbHRhW11cbi8vIHdlIHVzZSBmcm96ZW4gc28gdGhhdCB3ZSBjYW4gcmV1c2UgZWFjaCBkZWx0YSBjaGFuZ2VcbmNvbnN0IGRlbHRhTGlzdFR5cGUgPSB0eXBlcy5hcnJheSh0eXBlcy5mcm96ZW4odHlwZXMudW5jaGVja2VkPHVua25vd25bXT4oKSkpXG5cbmV4cG9ydCBjb25zdCB5anNUZXh0TW9kZWxJZCA9IFwibW9ieC1rZXlzdG9uZS15anMvWWpzVGV4dE1vZGVsXCJcblxuLyoqXG4gKiBBIG1vYngta2V5c3RvbmUgbW9kZWwgdGhhdCByZXByZXNlbnRzIGEgWWpzLlRleHQgb2JqZWN0LlxuICovXG5AbW9kZWwoeWpzVGV4dE1vZGVsSWQpXG5leHBvcnQgY2xhc3MgWWpzVGV4dE1vZGVsIGV4dGVuZHMgTW9kZWwoe1xuICBkZWx0YUxpc3Q6IHRQcm9wKGRlbHRhTGlzdFR5cGUsICgpID0+IFtdKSxcbn0pIHtcbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBZanNUZXh0TW9kZWwgaW5zdGFuY2Ugd2l0aCBhIHNpbXBsZSB0ZXh0LlxuICAgKi9cbiAgc3RhdGljIHdpdGhUZXh0KHRleHQ6IHN0cmluZyk6IFlqc1RleHRNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0ZWRZanNUZXh0TW9kZWwoe1xuICAgICAgZGVsdGFMaXN0OiBbXG4gICAgICAgIGZyb3plbihbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaW5zZXJ0OiB0ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pLFxuICAgICAgXSxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBZLmpzIHBhdGggZnJvbSB0aGUgYm91bmQgb2JqZWN0IHRvIHRoZSBZanNUZXh0TW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgcHJpdmF0ZSBnZXQgX3lqc09iamVjdFBhdGgoKSB7XG4gICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXG4gICAgaWYgKGN0eD8uYm91bmRPYmplY3QgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgXCJ0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlIG11c3QgYmUgcGFydCBvZiBhIGJvdW5kIG9iamVjdCBiZWZvcmUgaXQgY2FuIGJlIGFjY2Vzc2VkXCJcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gZ2V0UGFyZW50VG9DaGlsZFBhdGgoY3R4LmJvdW5kT2JqZWN0LCB0aGlzKVxuICAgIGlmICghcGF0aCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcImEgcGF0aCBmcm9tIHRoZSBib3VuZCBvYmplY3QgdG8gdGhlIFlqc1RleHRNb2RlbCBpbnN0YW5jZSBpcyBub3QgYXZhaWxhYmxlXCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgWWpzLlRleHQgb2JqZWN0IHByZXNlbnQgYXQgdGhpcyBtb2J4LWtleXN0b25lIG5vZGUncyBwYXRoLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIHByaXZhdGUgZ2V0IF95anNPYmplY3RBdFBhdGgoKTogdW5rbm93biB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuX3lqc09iamVjdFBhdGhcblxuICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKSFcblxuICAgIHJldHVybiByZXNvbHZlWWpzUGF0aChjdHgueWpzT2JqZWN0LCBwYXRoKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBZanMuVGV4dCBvYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhpcyBtb2J4LWtleXN0b25lIG5vZGUuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IHlqc1RleHQoKTogWS5UZXh0IHtcbiAgICBjb25zdCB5anNPYmplY3QgPSB0aGlzLl95anNPYmplY3RBdFBhdGhcblxuICAgIGlmICghKHlqc09iamVjdCBpbnN0YW5jZW9mIFkuVGV4dCkpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYFkuVGV4dCB3YXMgZXhwZWN0ZWQgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KHRoaXMuX3lqc09iamVjdFBhdGgpfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHlqc09iamVjdFxuICB9XG5cbiAgLyoqXG4gICAqIEF0b20gdGhhdCBnZXRzIGNoYW5nZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBZLmpzIHRleHQgY2hhbmdlcy5cbiAgICovXG4gIHlqc1RleHRDaGFuZ2VkQXRvbSA9IGNyZWF0ZUF0b20oXCJ5anNUZXh0Q2hhbmdlZEF0b21cIilcblxuICAvKipcbiAgICogVGhlIHRleHQgdmFsdWUgb2YgdGhlIFlqcy5UZXh0IG9iamVjdC5cbiAgICogU2hvcnRjdXQgZm9yIGB5anNUZXh0LnRvU3RyaW5nKClgLCBidXQgY29tcHV0ZWQuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IHRleHQoKTogc3RyaW5nIHtcbiAgICB0aGlzLnlqc1RleHRDaGFuZ2VkQXRvbS5yZXBvcnRPYnNlcnZlZCgpXG5cbiAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcbiAgICBpZiAoY3R4Py5ib3VuZE9iamVjdCAhPSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB5anNUZXh0U3RyaW5nID0gdGhpcy55anNUZXh0LnRvU3RyaW5nKClcbiAgICAgICAgLy8gaWYgdGhlIHlqc1RleHQgaXMgZGV0YWNoZWQsIHRvU3RyaW5nKCkgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmdcbiAgICAgICAgLy8gaW4gdGhhdCBjYXNlIHdlIHNob3VsZCB1c2UgdGhlIGRlbHRhTGlzdCBhcyBhIGZhbGxiYWNrXG4gICAgICAgIGlmICh5anNUZXh0U3RyaW5nICE9PSBcIlwiIHx8IHRoaXMuZGVsdGFMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB5anNUZXh0U3RyaW5nXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBmYWxsIGJhY2tcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmYWxsIGJhY2sgdG8gZGVsdGFMaXN0XG4gICAgcmV0dXJuIHRoaXMuZGVsdGFMaXN0VG9UZXh0KClcbiAgfVxuXG4gIHByaXZhdGUgZGVsdGFMaXN0VG9UZXh0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgZG9jID0gbmV3IFkuRG9jKClcbiAgICBjb25zdCB0ZXh0ID0gZG9jLmdldFRleHQoKVxuICAgIHRoaXMuZGVsdGFMaXN0LmZvckVhY2goKGQpID0+IHtcbiAgICAgIHRleHQuYXBwbHlEZWx0YShkLmRhdGEpXG4gICAgfSlcbiAgICByZXR1cm4gdGV4dC50b1N0cmluZygpXG4gIH1cblxuICBwcm90ZWN0ZWQgb25Jbml0KCkge1xuICAgIGNvbnN0IHNob3VsZFJlcGxpY2F0ZVRvWWpzID0gKGN0eDogWWpzQmluZGluZ0NvbnRleHQgfCB1bmRlZmluZWQpOiBjdHggaXMgWWpzQmluZGluZ0NvbnRleHQgPT4ge1xuICAgICAgcmV0dXJuICEhY3R4ICYmICEhY3R4LmJvdW5kT2JqZWN0ICYmICFjdHguaXNBcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZVxuICAgIH1cblxuICAgIGxldCByZWFwcGx5RGVsdGFzVG9ZanNUZXh0ID0gZmFsc2VcbiAgICBjb25zdCBuZXdEZWx0YXM6IEZyb3plbjx1bmtub3duW10+W10gPSBbXVxuXG4gICAgbGV0IGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWRcblxuICAgIGNvbnN0IGRpc3Bvc2VSZWFjdGlvblRvRGVsdGFMaXN0UmVmQ2hhbmdlID0gcmVhY3Rpb24oXG4gICAgICAoKSA9PiB0aGlzLiQuZGVsdGFMaXN0LFxuICAgICAgKGRlbHRhTGlzdCkgPT4ge1xuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdD8uKClcbiAgICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3QgPSB1bmRlZmluZWRcblxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IG9ic2VydmUoZGVsdGFMaXN0LCAoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgaWYgKHJlYXBwbHlEZWx0YXNUb1lqc1RleHQpIHtcbiAgICAgICAgICAgIC8vIGFscmVhZHkgZ29ubmEgcmVwbGFjZSB0aGVtIGFsbFxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc2hvdWxkUmVwbGljYXRlVG9ZanMoeWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpKSkge1xuICAgICAgICAgICAgLy8geWpzIHRleHQgaXMgYWxyZWFkeSB1cCB0byBkYXRlIHdpdGggdGhlc2UgY2hhbmdlc1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2hhbmdlLnR5cGUgPT09IFwic3BsaWNlXCIgJiZcbiAgICAgICAgICAgIGNoYW5nZS5yZW1vdmVkQ291bnQgPT09IDAgJiZcbiAgICAgICAgICAgIGNoYW5nZS5hZGRlZENvdW50ID4gMCAmJlxuICAgICAgICAgICAgY2hhbmdlLmluZGV4ID09PSB0aGlzLmRlbHRhTGlzdC5sZW5ndGhcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIG9wdGltaXphdGlvbiwganVzdCBhZGRpbmcgbmV3IG9uZXMgdG8gdGhlIGVuZFxuICAgICAgICAgICAgbmV3RGVsdGFzLnB1c2goLi4uY2hhbmdlLmFkZGVkKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBhbnkgb3RoZXIgY2hhbmdlLCB3ZSBuZWVkIHRvIHJlYXBwbHkgYWxsIGRlbHRhc1xuICAgICAgICAgICAgcmVhcHBseURlbHRhc1RvWWpzVGV4dCA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgeyBmaXJlSW1tZWRpYXRlbHk6IHRydWUgfVxuICAgIClcblxuICAgIGNvbnN0IGRpc3Bvc2VPblNuYXBzaG90ID0gb25TbmFwc2hvdCh0aGlzLCAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAocmVhcHBseURlbHRhc1RvWWpzVGV4dCkge1xuICAgICAgICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKVxuXG4gICAgICAgICAgaWYgKHNob3VsZFJlcGxpY2F0ZVRvWWpzKGN0eCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgeWpzVGV4dCB9ID0gdGhpc1xuICAgICAgICAgICAgaWYgKGlzWWpzVmFsdWVEZWxldGVkKHlqc1RleHQpKSB7XG4gICAgICAgICAgICAgIHRocm93IGZhaWx1cmUoXCJjYW5ub3QgcmVhcHBseSBkZWx0YXMgdG8gZGVsZXRlZCBZanMuVGV4dFwiKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdHgueWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgLy8gZGlkbid0IGZpbmQgYSBiZXR0ZXIgd2F5IHRoYW4gdGhpcyB0byByZWFwcGx5IGFsbCBkZWx0YXNcbiAgICAgICAgICAgICAgLy8gd2l0aG91dCBoYXZpbmcgdG8gcmUtY3JlYXRlIHRoZSBZLlRleHQgb2JqZWN0XG4gICAgICAgICAgICAgIGlmICh5anNUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB5anNUZXh0LmRlbGV0ZSgwLCB5anNUZXh0Lmxlbmd0aClcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRoaXMuZGVsdGFMaXN0LmZvckVhY2goKGZyb3plbkRlbHRhcykgPT4ge1xuICAgICAgICAgICAgICAgIHlqc1RleHQuYXBwbHlEZWx0YShmcm96ZW5EZWx0YXMuZGF0YSlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIGN0eC55anNPcmlnaW4pXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG5ld0RlbHRhcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXG5cbiAgICAgICAgICBpZiAoc2hvdWxkUmVwbGljYXRlVG9ZanMoY3R4KSkge1xuICAgICAgICAgICAgY29uc3QgeyB5anNUZXh0IH0gPSB0aGlzXG4gICAgICAgICAgICBpZiAoaXNZanNWYWx1ZURlbGV0ZWQoeWpzVGV4dCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgZmFpbHVyZShcImNhbm5vdCByZWFwcGx5IGRlbHRhcyB0byBkZWxldGVkIFlqcy5UZXh0XCIpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN0eC55anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgICAgICAgICAgICBuZXdEZWx0YXMuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XG4gICAgICAgICAgICAgICAgeWpzVGV4dC5hcHBseURlbHRhKGZyb3plbkRlbHRhcy5kYXRhKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgY3R4Lnlqc09yaWdpbilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlYXBwbHlEZWx0YXNUb1lqc1RleHQgPSBmYWxzZVxuICAgICAgICBuZXdEZWx0YXMubGVuZ3RoID0gMFxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCBkaXBvc2VZanNUZXh0Q2hhbmdlZEF0b20gPSBob29rWWpzVGV4dENoYW5nZWRBdG9tKFxuICAgICAgKCkgPT4gdGhpcy55anNUZXh0LFxuICAgICAgdGhpcy55anNUZXh0Q2hhbmdlZEF0b21cbiAgICApXG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZGlzcG9zZU9uU25hcHNob3QoKVxuICAgICAgZGlzcG9zZVJlYWN0aW9uVG9EZWx0YUxpc3RSZWZDaGFuZ2UoKVxuICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q/LigpXG4gICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IHVuZGVmaW5lZFxuXG4gICAgICBkaXBvc2VZanNUZXh0Q2hhbmdlZEF0b20oKVxuICAgIH1cbiAgfVxufVxuXG4vLyB3ZSB1c2UgdGhpcyB0cmljayBqdXN0IHRvIGF2b2lkIGEgYmFiZWwgYnVnIHRoYXQgY2F1c2VzIGNsYXNzZXMgdXNlZCBpbnNpZGUgY2xhc3NlcyBub3QgdG8gYmUgb3ZlcnJpZGVuXG4vLyBieSB0aGUgZGVjb3JhdG9yXG5jb25zdCBEZWNvcmF0ZWRZanNUZXh0TW9kZWwgPSBZanNUZXh0TW9kZWxcblxuZnVuY3Rpb24gaG9va1lqc1RleHRDaGFuZ2VkQXRvbShnZXRZanNUZXh0OiAoKSA9PiBZLlRleHQsIHRleHRDaGFuZ2VkQXRvbTogSUF0b20pIHtcbiAgbGV0IGRpc3Bvc2VPYnNlcnZlWWpzVGV4dDogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkXG5cbiAgY29uc3Qgb2JzZXJ2ZUZuID0gKCkgPT4ge1xuICAgIHRleHRDaGFuZ2VkQXRvbS5yZXBvcnRDaGFuZ2VkKClcbiAgfVxuXG4gIGNvbnN0IGRpc3Bvc2VSZWFjdGlvblRvWVRleHRDaGFuZ2UgPSByZWFjdGlvbihcbiAgICAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB5anNUZXh0ID0gZ2V0WWpzVGV4dCgpXG4gICAgICAgIHJldHVybiBpc1lqc1ZhbHVlRGVsZXRlZCh5anNUZXh0KSA/IHVuZGVmaW5lZCA6IHlqc1RleHRcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSxcbiAgICAoeWpzVGV4dCkgPT4ge1xuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0Py4oKVxuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXG5cbiAgICAgIGlmICh5anNUZXh0KSB7XG4gICAgICAgIHlqc1RleHQub2JzZXJ2ZShvYnNlcnZlRm4pXG5cbiAgICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gKCkgPT4ge1xuICAgICAgICAgIHlqc1RleHQudW5vYnNlcnZlKG9ic2VydmVGbilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0ZXh0Q2hhbmdlZEF0b20ucmVwb3J0Q2hhbmdlZCgpXG4gICAgfSxcbiAgICB7XG4gICAgICBmaXJlSW1tZWRpYXRlbHk6IHRydWUsXG4gICAgfVxuICApXG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBkaXNwb3NlUmVhY3Rpb25Ub1lUZXh0Q2hhbmdlKClcbiAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQ/LigpXG4gICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwsIHlqc1RleHRNb2RlbElkIH0gZnJvbSBcIi4vWWpzVGV4dE1vZGVsXCJcbmltcG9ydCB7IFNuYXBzaG90T3V0T2YgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgeyBZanNEYXRhIH0gZnJvbSBcIi4vY29udmVydFlqc0RhdGFUb0pzb25cIlxuaW1wb3J0IHsgUGxhaW5BcnJheSwgUGxhaW5PYmplY3QsIFBsYWluUHJpbWl0aXZlLCBQbGFpblZhbHVlIH0gZnJvbSBcIi4uL3BsYWluVHlwZXNcIlxuXG5mdW5jdGlvbiBpc1BsYWluUHJpbWl0aXZlKHY6IFBsYWluVmFsdWUpOiB2IGlzIFBsYWluUHJpbWl0aXZlIHtcbiAgY29uc3QgdCA9IHR5cGVvZiB2XG4gIHJldHVybiB0ID09PSBcInN0cmluZ1wiIHx8IHQgPT09IFwibnVtYmVyXCIgfHwgdCA9PT0gXCJib29sZWFuXCIgfHwgdiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gaXNQbGFpbkFycmF5KHY6IFBsYWluVmFsdWUpOiB2IGlzIFBsYWluQXJyYXkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2KVxufVxuXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHY6IFBsYWluVmFsdWUpOiB2IGlzIFBsYWluT2JqZWN0IHtcbiAgcmV0dXJuICFpc1BsYWluQXJyYXkodikgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPT0gbnVsbFxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgcGxhaW4gdmFsdWUgdG8gYSBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICogT2JqZWN0cyBhcmUgY29udmVydGVkIHRvIFkuTWFwcywgYXJyYXlzIHRvIFkuQXJyYXlzLCBwcmltaXRpdmVzIGFyZSB1bnRvdWNoZWQuXG4gKiBGcm96ZW4gdmFsdWVzIGFyZSBhIHNwZWNpYWwgY2FzZSBhbmQgdGhleSBhcmUga2VwdCBhcyBpbW11dGFibGUgcGxhaW4gdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEpzb25Ub1lqc0RhdGEodjogUGxhaW5WYWx1ZSk6IFlqc0RhdGEge1xuICBpZiAoaXNQbGFpblByaW1pdGl2ZSh2KSkge1xuICAgIHJldHVybiB2XG4gIH1cblxuICBpZiAoaXNQbGFpbkFycmF5KHYpKSB7XG4gICAgY29uc3QgYXJyID0gbmV3IFkuQXJyYXkoKVxuICAgIGFwcGx5SnNvbkFycmF5VG9ZQXJyYXkoYXJyLCB2KVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIGlmIChpc1BsYWluT2JqZWN0KHYpKSB7XG4gICAgaWYgKHYuJGZyb3plbiA9PT0gdHJ1ZSkge1xuICAgICAgLy8gZnJvemVuIHZhbHVlLCBzYXZlIGFzIGltbXV0YWJsZSBvYmplY3RcbiAgICAgIHJldHVybiB2XG4gICAgfVxuXG4gICAgaWYgKHYuJG1vZGVsVHlwZSA9PT0geWpzVGV4dE1vZGVsSWQpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBuZXcgWS5UZXh0KClcbiAgICAgIGNvbnN0IHlqc1RleHRNb2RlbCA9IHYgYXMgdW5rbm93biBhcyBTbmFwc2hvdE91dE9mPFlqc1RleHRNb2RlbD5cbiAgICAgIHlqc1RleHRNb2RlbC5kZWx0YUxpc3QuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XG4gICAgICAgIHRleHQuYXBwbHlEZWx0YShmcm96ZW5EZWx0YXMuZGF0YSlcbiAgICAgIH0pXG4gICAgICByZXR1cm4gdGV4dFxuICAgIH1cblxuICAgIGNvbnN0IG1hcCA9IG5ldyBZLk1hcCgpXG4gICAgYXBwbHlKc29uT2JqZWN0VG9ZTWFwKG1hcCwgdilcbiAgICByZXR1cm4gbWFwXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHZhbHVlIHR5cGU6ICR7dn1gKVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBKU09OIGFycmF5IHRvIGEgWS5BcnJheSwgdXNpbmcgdGhlIGNvbnZlcnRKc29uVG9ZanNEYXRhIHRvIGNvbnZlcnQgdGhlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGFwcGx5SnNvbkFycmF5VG9ZQXJyYXkgPSAoZGVzdDogWS5BcnJheTxhbnk+LCBzb3VyY2U6IFBsYWluQXJyYXkpID0+IHtcbiAgZGVzdC5wdXNoKHNvdXJjZS5tYXAoY29udmVydEpzb25Ub1lqc0RhdGEpKVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBKU09OIG9iamVjdCB0byBhIFkuTWFwLCB1c2luZyB0aGUgY29udmVydEpzb25Ub1lqc0RhdGEgdG8gY29udmVydCB0aGUgdmFsdWVzLlxuICovXG5leHBvcnQgY29uc3QgYXBwbHlKc29uT2JqZWN0VG9ZTWFwID0gKGRlc3Q6IFkuTWFwPGFueT4sIHNvdXJjZTogUGxhaW5PYmplY3QpID0+IHtcbiAgT2JqZWN0LmVudHJpZXMoc291cmNlKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICBkZXN0LnNldChrLCBjb252ZXJ0SnNvblRvWWpzRGF0YSh2KSlcbiAgfSlcbn1cbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IFBsYWluVmFsdWUgfSBmcm9tIFwiLi4vcGxhaW5UeXBlc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcbmltcG9ydCB7IGlzWWpzVmFsdWVEZWxldGVkIH0gZnJvbSBcIi4uL3V0aWxzL2lzWWpzVmFsdWVEZWxldGVkXCJcbmltcG9ydCB7IGNvbnZlcnRKc29uVG9ZanNEYXRhIH0gZnJvbSBcIi4vY29udmVydEpzb25Ub1lqc0RhdGFcIlxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoOiBQYXRjaCwgeWpzOiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChpc1lqc1ZhbHVlRGVsZXRlZCh5anMpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcImNhbm5vdCBhcHBseSBwYXRjaCB0byBkZWxldGVkIFlqcyB2YWx1ZVwiKVxuICB9XG5cbiAgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IFtrZXksIC4uLnJlc3RdID0gcGF0Y2gucGF0aFxuXG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoU3RyaW5nKGtleSkpIGFzIHVua25vd25cbiAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIFlqcyBtYXAgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShwYXRjaCl9YFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoeyAuLi5wYXRjaCwgcGF0aDogcmVzdCB9LCBjaGlsZClcbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICAgIGNvbnN0IGNoaWxkID0geWpzLmdldChOdW1iZXIoa2V5KSkgYXMgdW5rbm93blxuICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gWWpzIGFycmF5IC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBwYXRjaFxuICAgICAgICAgICl9YFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoeyAuLi5wYXRjaCwgcGF0aDogcmVzdCB9LCBjaGlsZClcbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuVGV4dCkge1xuICAgICAgLy8gY2hhbmdlcyB0byBkZWx0YUxpc3Qgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBhcnJheSBvYnNlcnZlIGluIHRoZSBZanNUZXh0TW9kZWwgY2xhc3NcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIHVua25vd24gWWpzIG9iamVjdCAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHBhdGNoXG4gICAgICAgICl9YFxuICAgICAgKVxuICAgIH1cbiAgfSBlbHNlIGlmIChwYXRjaC5wYXRoLmxlbmd0aCA9PT0gMSkge1xuICAgIGlmICh5anMgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHBhdGNoLnBhdGhbMF0pXG5cbiAgICAgIHN3aXRjaCAocGF0Y2gub3ApIHtcbiAgICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICBjYXNlIFwicmVwbGFjZVwiOiB7XG4gICAgICAgICAgeWpzLnNldChrZXksIGNvbnZlcnRKc29uVG9ZanNEYXRhKHBhdGNoLnZhbHVlIGFzIFBsYWluVmFsdWUpKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgeWpzLmRlbGV0ZShrZXkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIG1hcGApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHBhdGNoLnBhdGhbMF1cblxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xuICAgICAgICBjYXNlIFwicmVwbGFjZVwiOiB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJsZW5ndGhcIikge1xuICAgICAgICAgICAgY29uc3QgbmV3TGVuZ3RoID0gcGF0Y2gudmFsdWUgYXMgbnVtYmVyXG4gICAgICAgICAgICBpZiAoeWpzLmxlbmd0aCA+IG5ld0xlbmd0aCkge1xuICAgICAgICAgICAgICBjb25zdCB0b0RlbGV0ZSA9IHlqcy5sZW5ndGggLSBuZXdMZW5ndGhcbiAgICAgICAgICAgICAgeWpzLmRlbGV0ZShuZXdMZW5ndGgsIHRvRGVsZXRlKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh5anMubGVuZ3RoIDwgcGF0Y2gudmFsdWUpIHtcbiAgICAgICAgICAgICAgY29uc3QgdG9JbnNlcnQgPSBwYXRjaC52YWx1ZSAtIHlqcy5sZW5ndGhcbiAgICAgICAgICAgICAgeWpzLmluc2VydCh5anMubGVuZ3RoLCBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0b0luc2VydCB9KS5maWxsKHVuZGVmaW5lZCkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXG4gICAgICAgICAgICB5anMuaW5zZXJ0KE51bWJlcihrZXkpLCBbY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUgYXMgUGxhaW5WYWx1ZSldKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJhZGRcIjoge1xuICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSBhcyBQbGFpblZhbHVlKV0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICB5anMuZGVsZXRlKE51bWJlcihrZXkpKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggb3BlcmF0aW9uIGZvciBhcnJheWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuVGV4dCkge1xuICAgICAgLy8gaW5pdGlhbGl6YXRpb24gb2YgYSBZanNUZXh0TW9kZWwsIGRvIG5vdGhpbmdcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwgdGhlIFlqcyBvYmplY3QgaXMgb2YgYW4gdW5rb3duIHR5cGUsIHNvIGtleSBcIiR7U3RyaW5nKHBhdGNoLnBhdGhbMF0pfVwiIGNhbm5vdCBiZSBmb3VuZCBpbiBpdGBcbiAgICAgIClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBwYXRoLCBpdCBjYW5ub3QgYmUgZW1wdHlgKVxuICB9XG59XG4iLCJpbXBvcnQgeyBhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBtb2RlbFNuYXBzaG90T3V0V2l0aE1ldGFkYXRhIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IFBsYWluT2JqZWN0LCBQbGFpblZhbHVlIH0gZnJvbSBcIi4uL3BsYWluVHlwZXNcIlxuaW1wb3J0IHsgWWpzVGV4dE1vZGVsIH0gZnJvbSBcIi4vWWpzVGV4dE1vZGVsXCJcblxuZXhwb3J0IHR5cGUgWWpzRGF0YSA9IFkuQXJyYXk8YW55PiB8IFkuTWFwPGFueT4gfCBZLlRleHQgfCBQbGFpblZhbHVlXG5cbmV4cG9ydCBjb25zdCBjb252ZXJ0WWpzRGF0YVRvSnNvbiA9IGFjdGlvbigoeWpzRGF0YTogWWpzRGF0YSk6IFBsYWluVmFsdWUgPT4ge1xuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICByZXR1cm4geWpzRGF0YS5tYXAoKHYpID0+IGNvbnZlcnRZanNEYXRhVG9Kc29uKHYpKVxuICB9XG5cbiAgaWYgKHlqc0RhdGEgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgIGNvbnN0IG9iajogUGxhaW5PYmplY3QgPSB7fVxuICAgIHlqc0RhdGEuZm9yRWFjaCgodiwgaykgPT4ge1xuICAgICAgb2JqW2tdID0gY29udmVydFlqc0RhdGFUb0pzb24odilcbiAgICB9KVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIGlmICh5anNEYXRhIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgY29uc3QgZGVsdGFzID0geWpzRGF0YS50b0RlbHRhKCkgYXMgdW5rbm93bltdXG5cbiAgICByZXR1cm4gbW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YShZanNUZXh0TW9kZWwsIHtcbiAgICAgIGRlbHRhTGlzdDogZGVsdGFzLmxlbmd0aCA+IDAgPyBbeyAkZnJvemVuOiB0cnVlLCBkYXRhOiBkZWx0YXMgfV0gOiBbXSxcbiAgICB9KSBhcyB1bmtub3duIGFzIFBsYWluVmFsdWVcbiAgfVxuXG4gIC8vIGFzc3VtZSBpdCdzIGEgcHJpbWl0aXZlXG4gIHJldHVybiB5anNEYXRhXG59KVxuIiwiaW1wb3J0IHsgUGF0Y2ggfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBjb252ZXJ0WWpzRGF0YVRvSnNvbiB9IGZyb20gXCIuL2NvbnZlcnRZanNEYXRhVG9Kc29uXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudDogWS5ZRXZlbnQ8YW55Pik6IFBhdGNoW10ge1xuICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cblxuICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllNYXBFdmVudCkge1xuICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50LnRhcmdldFxuXG4gICAgZXZlbnQuY2hhbmdlcy5rZXlzLmZvckVhY2goKGNoYW5nZSwga2V5KSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIGtleV1cblxuICAgICAgc3dpdGNoIChjaGFuZ2UuYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IGNvbnZlcnRZanNEYXRhVG9Kc29uKHNvdXJjZS5nZXQoa2V5KSksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiBjb252ZXJ0WWpzRGF0YVRvSnNvbihzb3VyY2UuZ2V0KGtleSkpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIFwiZGVsZXRlXCI6XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGB1bnN1cHBvcnRlZCBZanMgbWFwIGV2ZW50IGFjdGlvbjogJHtjaGFuZ2UuYWN0aW9ufWApXG4gICAgICB9XG4gICAgfSlcbiAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWUFycmF5RXZlbnQpIHtcbiAgICBsZXQgcmV0YWluID0gMFxuICAgIGV2ZW50LmNoYW5nZXMuZGVsdGEuZm9yRWFjaCgoY2hhbmdlKSA9PiB7XG4gICAgICBpZiAoY2hhbmdlLnJldGFpbikge1xuICAgICAgICByZXRhaW4gKz0gY2hhbmdlLnJldGFpblxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlLmRlbGV0ZSkge1xuICAgICAgICAvLyByZW1vdmUgWCBpdGVtcyBhdCByZXRhaW4gcG9zaXRpb25cbiAgICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCByZXRhaW5dXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlLmRlbGV0ZTsgaSsrKSB7XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2UuaW5zZXJ0KSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IEFycmF5LmlzQXJyYXkoY2hhbmdlLmluc2VydCkgPyBjaGFuZ2UuaW5zZXJ0IDogW2NoYW5nZS5pbnNlcnRdXG4gICAgICAgIG5ld1ZhbHVlcy5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCByZXRhaW5dXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcImFkZFwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiBjb252ZXJ0WWpzRGF0YVRvSnNvbih2KSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldGFpbisrXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWVRleHRFdmVudCkge1xuICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgXCJkZWx0YUxpc3RcIiwgLTEgLyogbGFzdCBpdGVtICovXVxuICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICBvcDogXCJhZGRcIixcbiAgICAgIHBhdGgsXG4gICAgICB2YWx1ZTogeyAkZnJvemVuOiB0cnVlLCBkYXRhOiBldmVudC5kZWx0YSB9LFxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gcGF0Y2hlc1xufVxuIiwiaW1wb3J0IHsgYWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHtcbiAgQW55RGF0YU1vZGVsLFxuICBBbnlNb2RlbCxcbiAgQW55U3RhbmRhcmRUeXBlLFxuICBhcHBseVBhdGNoZXMsXG4gIGZyb21TbmFwc2hvdCxcbiAgZ2V0UGFyZW50VG9DaGlsZFBhdGgsXG4gIE1vZGVsQ2xhc3MsXG4gIG9uR2xvYmFsUGF0Y2hlcyxcbiAgb25QYXRjaGVzLFxuICBvblNuYXBzaG90LFxuICBQYXRjaCxcbiAgU25hcHNob3RJbk9mLFxuICBUeXBlVG9EYXRhLFxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZ2V0WWpzQ29sbGVjdGlvbkF0b20gfSBmcm9tIFwiLi4vdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbVwiXG5pbXBvcnQgeyBpc1lqc1ZhbHVlRGVsZXRlZCB9IGZyb20gXCIuLi91dGlscy9pc1lqc1ZhbHVlRGVsZXRlZFwiXG5pbXBvcnQgeyBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QgfSBmcm9tIFwiLi9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3RcIlxuaW1wb3J0IHsgY29udmVydFlqc0RhdGFUb0pzb24gfSBmcm9tIFwiLi9jb252ZXJ0WWpzRGF0YVRvSnNvblwiXG5pbXBvcnQgeyBjb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMgfSBmcm9tIFwiLi9jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXNcIlxuaW1wb3J0IHsgWWpzQmluZGluZ0NvbnRleHQsIHlqc0JpbmRpbmdDb250ZXh0IH0gZnJvbSBcIi4veWpzQmluZGluZ0NvbnRleHRcIlxuXG4vKipcbiAqIENyZWF0ZXMgYSBiaWRpcmVjdGlvbmFsIGJpbmRpbmcgYmV0d2VlbiBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUgYW5kIGEgbW9ieC1rZXlzdG9uZSBtb2RlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmRZanNUb01vYnhLZXlzdG9uZTxcbiAgVFR5cGUgZXh0ZW5kcyBBbnlTdGFuZGFyZFR5cGUgfCBNb2RlbENsYXNzPEFueU1vZGVsPiB8IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPixcbj4oe1xuICB5anNEb2MsXG4gIHlqc09iamVjdCxcbiAgbW9ieEtleXN0b25lVHlwZSxcbn06IHtcbiAgLyoqXG4gICAqIFRoZSBZLmpzIGRvY3VtZW50LlxuICAgKi9cbiAgeWpzRG9jOiBZLkRvY1xuICAvKipcbiAgICogVGhlIGJvdW5kIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gICAqL1xuICB5anNPYmplY3Q6IFkuTWFwPGFueT4gfCBZLkFycmF5PGFueT4gfCBZLlRleHRcbiAgLyoqXG4gICAqIFRoZSBtb2J4LWtleXN0b25lIG1vZGVsIHR5cGUuXG4gICAqL1xuICBtb2J4S2V5c3RvbmVUeXBlOiBUVHlwZVxufSk6IHtcbiAgLyoqXG4gICAqIFRoZSBib3VuZCBtb2J4LWtleXN0b25lIGluc3RhbmNlLlxuICAgKi9cbiAgYm91bmRPYmplY3Q6IFR5cGVUb0RhdGE8VFR5cGU+XG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgYmluZGluZy5cbiAgICovXG4gIGRpc3Bvc2U6ICgpID0+IHZvaWRcbiAgLyoqXG4gICAqIFRoZSBZLmpzIG9yaWdpbiBzeW1ib2wgdXNlZCBmb3IgYmluZGluZyB0cmFuc2FjdGlvbnMuXG4gICAqL1xuICB5anNPcmlnaW46IHN5bWJvbFxufSB7XG4gIGNvbnN0IHlqc09yaWdpbiA9IFN5bWJvbChcImJpbmRZanNUb01vYnhLZXlzdG9uZVRyYW5zYWN0aW9uT3JpZ2luXCIpXG5cbiAgbGV0IGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID0gMFxuXG4gIGNvbnN0IGJpbmRpbmdDb250ZXh0OiBZanNCaW5kaW5nQ29udGV4dCA9IHtcbiAgICB5anNEb2MsXG4gICAgeWpzT2JqZWN0LFxuICAgIG1vYnhLZXlzdG9uZVR5cGUsXG4gICAgeWpzT3JpZ2luLFxuICAgIGJvdW5kT2JqZWN0OiB1bmRlZmluZWQsIC8vIG5vdCB5ZXQgY3JlYXRlZFxuXG4gICAgZ2V0IGlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUoKSB7XG4gICAgICByZXR1cm4gYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPiAwXG4gICAgfSxcbiAgfVxuXG4gIGNvbnN0IHlqc0pzb24gPSBjb252ZXJ0WWpzRGF0YVRvSnNvbih5anNPYmplY3QpXG5cbiAgY29uc3QgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzOiB7IHRhcmdldDogb2JqZWN0OyBwYXRjaGVzOiBQYXRjaFtdIH1bXSA9IFtdXG5cbiAgY29uc3QgY3JlYXRlQm91bmRPYmplY3QgPSAoKSA9PiB7XG4gICAgY29uc3QgZGlzcG9zZU9uR2xvYmFsUGF0Y2hlcyA9IG9uR2xvYmFsUGF0Y2hlcygodGFyZ2V0LCBwYXRjaGVzKSA9PiB7XG4gICAgICBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXMucHVzaCh7IHRhcmdldCwgcGF0Y2hlcyB9KVxuICAgIH0pXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYm91bmRPYmplY3QgPSB5anNCaW5kaW5nQ29udGV4dC5hcHBseShcbiAgICAgICAgKCkgPT4gZnJvbVNuYXBzaG90KG1vYnhLZXlzdG9uZVR5cGUsIHlqc0pzb24gYXMgdW5rbm93biBhcyBTbmFwc2hvdEluT2Y8VHlwZVRvRGF0YTxUVHlwZT4+KSxcbiAgICAgICAgYmluZGluZ0NvbnRleHRcbiAgICAgIClcbiAgICAgIHlqc0JpbmRpbmdDb250ZXh0LnNldChib3VuZE9iamVjdCwgeyAuLi5iaW5kaW5nQ29udGV4dCwgYm91bmRPYmplY3QgfSlcbiAgICAgIHJldHVybiBib3VuZE9iamVjdFxuICAgIH0gZmluYWxseSB7XG4gICAgICBkaXNwb3NlT25HbG9iYWxQYXRjaGVzKClcbiAgICB9XG4gIH1cblxuICBjb25zdCBib3VuZE9iamVjdCA9IGNyZWF0ZUJvdW5kT2JqZWN0KClcblxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20geWpzIHRvIG1vYngta2V5c3RvbmVcbiAgY29uc3Qgb2JzZXJ2ZURlZXBDYiA9IGFjdGlvbigoZXZlbnRzOiBZLllFdmVudDxhbnk+W10pID0+IHtcbiAgICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cbiAgICBldmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC50cmFuc2FjdGlvbi5vcmlnaW4gIT09IHlqc09yaWdpbikge1xuICAgICAgICBwYXRjaGVzLnB1c2goLi4uY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50KSlcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIFkuTWFwIHx8IGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICAgICAgZ2V0WWpzQ29sbGVjdGlvbkF0b20oZXZlbnQudGFyZ2V0KT8ucmVwb3J0Q2hhbmdlZCgpXG4gICAgICB9XG4gICAgfSlcblxuICAgIGlmIChwYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lKytcbiAgICAgIHRyeSB7XG4gICAgICAgIGFwcGx5UGF0Y2hlcyhib3VuZE9iamVjdCwgcGF0Y2hlcylcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lLS1cbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgeWpzT2JqZWN0Lm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXG5cbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIG1vYngta2V5c3RvbmUgdG8geWpzXG4gIGxldCBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzOiBQYXRjaFtdW10gPSBbXVxuICBjb25zdCBkaXNwb3NlT25QYXRjaGVzID0gb25QYXRjaGVzKGJvdW5kT2JqZWN0LCAocGF0Y2hlcykgPT4ge1xuICAgIGlmIChhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSA+IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXMucHVzaChwYXRjaGVzKVxuICB9KVxuXG4gIC8vIHRoaXMgaXMgb25seSB1c2VkIHNvIHdlIGNhbiB0cmFuc2FjdCBhbGwgcGF0Y2hlcyB0byB0aGUgc25hcHNob3QgYm91bmRhcnlcbiAgY29uc3QgZGlzcG9zZU9uU25hcHNob3QgPSBvblNuYXBzaG90KGJvdW5kT2JqZWN0LCAoKSA9PiB7XG4gICAgaWYgKHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBhcnJheU9mQXJyYXlPZlBhdGNoZXMgPSBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzXG4gICAgcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcyA9IFtdXG5cbiAgICBpZiAoaXNZanNWYWx1ZURlbGV0ZWQoeWpzT2JqZWN0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgIGFycmF5T2ZBcnJheU9mUGF0Y2hlcy5mb3JFYWNoKChhcnJheU9mUGF0Y2hlcykgPT4ge1xuICAgICAgICBhcnJheU9mUGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaCwgeWpzT2JqZWN0KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9LCB5anNPcmlnaW4pXG4gIH0pXG5cbiAgLy8gc3luYyBpbml0aWFsIHBhdGNoZXMsIHRoYXQgbWlnaHQgaW5jbHVkZSBzZXR0aW5nIGRlZmF1bHRzLCBJRHMsIGV0Y1xuICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgIC8vIHdlIG5lZWQgdG8gc2tpcCBpbml0aWFsaXphdGlvbnMgdW50aWwgd2UgaGl0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgYm91bmQgb2JqZWN0XG4gICAgLy8gdGhpcyBpcyBiZWNhdXNlIGRlZmF1bHQgb2JqZWN0cyBtaWdodCBiZSBjcmVhdGVkIGFuZCBpbml0aWFsaXplZCBiZWZvcmUgdGhlIG1haW4gb2JqZWN0XG4gICAgLy8gYnV0IHdlIGp1c3QgbmVlZCB0byBjYXRjaCB3aGVuIHRob3NlIGFyZSBhY3R1YWxseSBhc3NpZ25lZCB0byB0aGUgYm91bmQgb2JqZWN0XG4gICAgbGV0IGJvdW5kT2JqZWN0Rm91bmQgPSBmYWxzZVxuXG4gICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLmZvckVhY2goKHsgdGFyZ2V0LCBwYXRjaGVzIH0pID0+IHtcbiAgICAgIGlmICghYm91bmRPYmplY3RGb3VuZCkge1xuICAgICAgICBpZiAodGFyZ2V0ICE9PSBib3VuZE9iamVjdCkge1xuICAgICAgICAgIHJldHVybiAvLyBza2lwXG4gICAgICAgIH1cbiAgICAgICAgYm91bmRPYmplY3RGb3VuZCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50VG9DaGlsZFBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChib3VuZE9iamVjdCwgdGFyZ2V0KVxuICAgICAgLy8gdGhpcyBpcyB1bmRlZmluZWQgb25seSBpZiB0YXJnZXQgaXMgbm90IGEgY2hpbGQgb2YgYm91bmRNb2RlbFxuICAgICAgaWYgKHBhcmVudFRvQ2hpbGRQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4ucGF0Y2gsXG4gICAgICAgICAgICAgIHBhdGg6IFsuLi5wYXJlbnRUb0NoaWxkUGF0aCwgLi4ucGF0Y2gucGF0aF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeWpzT2JqZWN0XG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH0sIHlqc09yaWdpbilcblxuICBjb25zdCBkaXNwb3NlID0gKCkgPT4ge1xuICAgIHlqc0RvYy5vZmYoXCJkZXN0cm95XCIsIGRpc3Bvc2UpXG4gICAgZGlzcG9zZU9uUGF0Y2hlcygpXG4gICAgZGlzcG9zZU9uU25hcHNob3QoKVxuICAgIHlqc09iamVjdC51bm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXG4gIH1cblxuICB5anNEb2Mub24oXCJkZXN0cm95XCIsIGRpc3Bvc2UpXG5cbiAgcmV0dXJuIHtcbiAgICBib3VuZE9iamVjdCxcbiAgICBkaXNwb3NlLFxuICAgIHlqc09yaWdpbixcbiAgfVxufVxuIl0sIm5hbWVzIjpbImJvdW5kT2JqZWN0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSxNQUFNLHlDQUF5QixRQUFBO0FBS3hCLE1BQU0sdUJBQXVCLENBQ2xDLGtCQUNzQjtBQUN0QixTQUFPLG1CQUFtQixJQUFJLGFBQWE7QUFDN0M7QUFLTyxNQUFNLCtCQUErQixDQUMxQyxrQkFDVTtBQUNWLE1BQUksT0FBTyxtQkFBbUIsSUFBSSxhQUFhO0FBQy9DLE1BQUksQ0FBQyxNQUFNO0FBQ1QsV0FBTyxXQUFXLG1CQUFtQjtBQUNyQyx1QkFBbUIsSUFBSSxlQUFlLElBQUk7QUFBQSxFQUM1QztBQUNBLFNBQU87QUFDVDtBQ2xCTyxTQUFTLGtCQUFrQixVQUE0Qjs7QUFDNUQsTUFBSSxv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
|