velocious 1.0.397 → 1.0.398
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/README.md +1 -1
- package/build/src/configuration.d.ts +9 -0
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +19 -7
- package/build/src/frontend-models/base.d.ts +22 -5
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +176 -33
- package/build/src/frontend-models/query.d.ts +63 -0
- package/build/src/frontend-models/query.d.ts.map +1 -1
- package/build/src/frontend-models/query.js +51 -1
- package/build/src/frontend-models/use-destroyed-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-destroyed-event.js +12 -8
- package/build/src/frontend-models/use-model-class-event.d.ts +1 -1
- package/build/src/frontend-models/use-model-class-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-model-class-event.js +14 -10
- package/build/src/frontend-models/use-updated-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-updated-event.js +12 -8
- package/build/src/frontend-models/websocket-channel.d.ts +54 -12
- package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-channel.js +116 -6
- package/build/src/http-server/client/websocket-session.js +2 -2
- package/build/src/http-server/websocket-channel.d.ts +29 -9
- package/build/src/http-server/websocket-channel.d.ts.map +1 -1
- package/build/src/http-server/websocket-channel.js +23 -5
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts +24 -3
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts.map +1 -1
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +152 -37
- package/package.json +1 -1
|
@@ -3,13 +3,19 @@ import React from "react";
|
|
|
3
3
|
import { createRoot } from "react-dom/client";
|
|
4
4
|
import useDestroyedEvent from "../frontend-models/use-destroyed-event.js";
|
|
5
5
|
import useCreatedEvent from "../frontend-models/use-created-event.js";
|
|
6
|
+
import FrontendModelBase from "../frontend-models/base.js";
|
|
6
7
|
import useModelClassEvent from "../frontend-models/use-model-class-event.js";
|
|
7
8
|
import useUpdatedEvent from "../frontend-models/use-updated-event.js";
|
|
9
|
+
/** @typedef {import("../frontend-models/query.js").FrontendModelProjectionOptions} FrontendModelProjectionOptions */
|
|
10
|
+
/** @typedef {import("../frontend-models/base.js").FrontendModelResourceConfig} FrontendModelResourceConfig */
|
|
11
|
+
/** @typedef {{id: string, model: FrontendModelBase}} FrontendModelHookTestCreateUpdatePayload */
|
|
12
|
+
/** @typedef {{id: string}} FrontendModelHookTestDestroyPayload */
|
|
8
13
|
/**
|
|
9
14
|
* @typedef {object} FakeSubscriptions
|
|
10
|
-
* @property {Set<(payload:
|
|
11
|
-
* @property {Set<(payload:
|
|
12
|
-
* @property {
|
|
15
|
+
* @property {Set<(payload: FrontendModelHookTestCreateUpdatePayload) => void>} create - Create callbacks.
|
|
16
|
+
* @property {Set<(payload: FrontendModelHookTestDestroyPayload) => void>} destroy - Destroy callbacks.
|
|
17
|
+
* @property {{create: FrontendModelProjectionOptions[], destroy: FrontendModelProjectionOptions[], update: FrontendModelProjectionOptions[]}} options - Subscription options.
|
|
18
|
+
* @property {Set<(payload: FrontendModelHookTestCreateUpdatePayload) => void>} update - Update callbacks.
|
|
13
19
|
*/
|
|
14
20
|
/** @returns {Promise<void>} - Resolves after React effects have run. */
|
|
15
21
|
async function flushEffects() {
|
|
@@ -35,6 +41,26 @@ async function waitFor(callback) {
|
|
|
35
41
|
await sleep(10);
|
|
36
42
|
}
|
|
37
43
|
}
|
|
44
|
+
/** @returns {FakeSubscriptions} - Empty fake subscription store. */
|
|
45
|
+
function buildFakeSubscriptions() {
|
|
46
|
+
return {
|
|
47
|
+
create: new Set(),
|
|
48
|
+
destroy: new Set(),
|
|
49
|
+
options: { create: [], destroy: [], update: [] },
|
|
50
|
+
update: new Set()
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* @param {string} modelName - Fake frontend model name.
|
|
55
|
+
* @returns {FrontendModelResourceConfig} - Minimal resource config for fake subclasses.
|
|
56
|
+
*/
|
|
57
|
+
function fakeResourceConfig(modelName) {
|
|
58
|
+
return {
|
|
59
|
+
attributes: ["id"],
|
|
60
|
+
modelName,
|
|
61
|
+
primaryKey: "id"
|
|
62
|
+
};
|
|
63
|
+
}
|
|
38
64
|
/**
|
|
39
65
|
* @param {React.ReactElement} element - Element to render.
|
|
40
66
|
* @returns {Promise<{rerender: (nextElement: React.ReactElement) => Promise<void>, unmount: () => Promise<void>}>} - Render controls.
|
|
@@ -57,36 +83,63 @@ async function renderElement(element) {
|
|
|
57
83
|
}
|
|
58
84
|
};
|
|
59
85
|
}
|
|
60
|
-
/** @returns {{ModelClass: typeof
|
|
86
|
+
/** @returns {{ModelClass: typeof FrontendModelBase, subscriptions: FakeSubscriptions}} - Fake model class setup. */
|
|
61
87
|
function buildFakeModelClass() {
|
|
62
|
-
const subscriptions =
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
88
|
+
const subscriptions = buildFakeSubscriptions();
|
|
89
|
+
class FakeModelClass extends FrontendModelBase {
|
|
90
|
+
/** @returns {FrontendModelResourceConfig} - Fake resource config. */
|
|
91
|
+
static resourceConfig() {
|
|
92
|
+
return fakeResourceConfig("HookFakeClassModel");
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* @param {(payload: FrontendModelHookTestCreateUpdatePayload) => void} callback - Event callback.
|
|
96
|
+
* @param {FrontendModelProjectionOptions} [options] - Projection options.
|
|
97
|
+
* @returns {Promise<() => void>} - Unsubscribe callback.
|
|
98
|
+
*/
|
|
99
|
+
static async onCreate(callback, options = {}) {
|
|
69
100
|
subscriptions.create.add(callback);
|
|
101
|
+
subscriptions.options.create.push(options);
|
|
70
102
|
return () => subscriptions.create.delete(callback);
|
|
71
|
-
}
|
|
72
|
-
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* @param {(payload: FrontendModelHookTestDestroyPayload) => void} callback - Event callback.
|
|
106
|
+
* @param {FrontendModelProjectionOptions} [options] - Projection options.
|
|
107
|
+
* @returns {Promise<() => void>} - Unsubscribe callback.
|
|
108
|
+
*/
|
|
109
|
+
static async onDestroy(callback, options = {}) {
|
|
73
110
|
subscriptions.destroy.add(callback);
|
|
111
|
+
subscriptions.options.destroy.push(options);
|
|
74
112
|
return () => subscriptions.destroy.delete(callback);
|
|
75
|
-
}
|
|
76
|
-
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* @param {(payload: FrontendModelHookTestCreateUpdatePayload) => void} callback - Event callback.
|
|
116
|
+
* @param {FrontendModelProjectionOptions} [options] - Projection options.
|
|
117
|
+
* @returns {Promise<() => void>} - Unsubscribe callback.
|
|
118
|
+
*/
|
|
119
|
+
static async onUpdate(callback, options = {}) {
|
|
77
120
|
subscriptions.update.add(callback);
|
|
121
|
+
subscriptions.options.update.push(options);
|
|
78
122
|
return () => subscriptions.update.delete(callback);
|
|
79
123
|
}
|
|
80
|
-
}
|
|
81
|
-
return { ModelClass, subscriptions };
|
|
124
|
+
}
|
|
125
|
+
return { ModelClass: FakeModelClass, subscriptions };
|
|
82
126
|
}
|
|
83
127
|
/**
|
|
84
128
|
* @param {FakeSubscriptions} subscriptions - Callback sets.
|
|
85
129
|
* @param {"create" | "destroy" | "update"} eventName - Event name.
|
|
86
|
-
* @param {
|
|
130
|
+
* @param {FrontendModelHookTestCreateUpdatePayload | FrontendModelHookTestDestroyPayload} payload - Event payload.
|
|
87
131
|
* @returns {void}
|
|
88
132
|
*/
|
|
89
133
|
function emitEvent(subscriptions, eventName, payload) {
|
|
134
|
+
if (eventName === "destroy") {
|
|
135
|
+
for (const callback of subscriptions.destroy) {
|
|
136
|
+
callback({ id: payload.id });
|
|
137
|
+
}
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
if (!("model" in payload)) {
|
|
141
|
+
throw new Error(`Expected model payload for ${eventName}`);
|
|
142
|
+
}
|
|
90
143
|
for (const callback of subscriptions[eventName]) {
|
|
91
144
|
callback(payload);
|
|
92
145
|
}
|
|
@@ -94,25 +147,47 @@ function emitEvent(subscriptions, eventName, payload) {
|
|
|
94
147
|
/**
|
|
95
148
|
* @param {string} id - Model id.
|
|
96
149
|
* @param {FakeSubscriptions} subscriptions - Callback sets.
|
|
97
|
-
* @returns {
|
|
150
|
+
* @returns {FrontendModelBase} - Fake model instance.
|
|
98
151
|
*/
|
|
99
152
|
function buildFakeModel(id, subscriptions) {
|
|
100
|
-
|
|
101
|
-
|
|
153
|
+
class FakeModel extends FrontendModelBase {
|
|
154
|
+
/** @returns {FrontendModelResourceConfig} - Fake resource config. */
|
|
155
|
+
static resourceConfig() {
|
|
156
|
+
return fakeResourceConfig("HookFakeInstanceModel");
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* @param {(payload: FrontendModelHookTestDestroyPayload) => void} callback - Event callback.
|
|
160
|
+
* @param {FrontendModelProjectionOptions} [options] - Projection options.
|
|
161
|
+
* @returns {Promise<() => void>} - Unsubscribe callback.
|
|
162
|
+
*/
|
|
163
|
+
async onDestroy(callback, options = {}) {
|
|
102
164
|
subscriptions.destroy.add(callback);
|
|
165
|
+
subscriptions.options.destroy.push(options);
|
|
103
166
|
return () => subscriptions.destroy.delete(callback);
|
|
104
|
-
}
|
|
105
|
-
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* @param {(payload: FrontendModelHookTestCreateUpdatePayload) => void} callback - Event callback.
|
|
170
|
+
* @param {FrontendModelProjectionOptions} [options] - Projection options.
|
|
171
|
+
* @returns {Promise<() => void>} - Unsubscribe callback.
|
|
172
|
+
*/
|
|
173
|
+
async onUpdate(callback, options = {}) {
|
|
106
174
|
subscriptions.update.add(callback);
|
|
175
|
+
subscriptions.options.update.push(options);
|
|
107
176
|
return () => subscriptions.update.delete(callback);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
|
|
177
|
+
}
|
|
178
|
+
/** @returns {string} - Primary key value. */
|
|
179
|
+
primaryKeyValue() {
|
|
180
|
+
return id;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return new FakeModel({ id });
|
|
111
184
|
}
|
|
112
185
|
/** @returns {Promise<Record<string, number>>} - Scenario result. */
|
|
113
186
|
async function classLifecycleScenario() {
|
|
114
187
|
const { ModelClass, subscriptions } = buildFakeModelClass();
|
|
115
|
-
const
|
|
188
|
+
const eventModel = buildFakeModel("1", buildFakeSubscriptions());
|
|
189
|
+
/** @type {Array<FrontendModelHookTestCreateUpdatePayload | FrontendModelHookTestDestroyPayload>} */
|
|
190
|
+
const receivedEvents = [];
|
|
116
191
|
let connectedCount = 0;
|
|
117
192
|
/** @returns {React.ReactElement} - Test element. */
|
|
118
193
|
function TestComponent() {
|
|
@@ -128,8 +203,8 @@ async function classLifecycleScenario() {
|
|
|
128
203
|
const mountedUpdateSubscriptions = subscriptions.update.size;
|
|
129
204
|
const mountedDestroySubscriptions = subscriptions.destroy.size;
|
|
130
205
|
const mountedConnectedCount = connectedCount;
|
|
131
|
-
emitEvent(subscriptions, "create", { id: "1", model:
|
|
132
|
-
emitEvent(subscriptions, "update", { id: "1", model:
|
|
206
|
+
emitEvent(subscriptions, "create", { id: "1", model: eventModel });
|
|
207
|
+
emitEvent(subscriptions, "update", { id: "1", model: eventModel });
|
|
133
208
|
emitEvent(subscriptions, "destroy", { id: "1" });
|
|
134
209
|
const receivedEventsAfterEmit = receivedEvents.length;
|
|
135
210
|
await controls.unmount();
|
|
@@ -145,9 +220,10 @@ async function classLifecycleScenario() {
|
|
|
145
220
|
}
|
|
146
221
|
/** @returns {Promise<Record<string, number>>} - Scenario result. */
|
|
147
222
|
async function instanceLifecycleScenario() {
|
|
148
|
-
const subscriptions =
|
|
223
|
+
const subscriptions = buildFakeSubscriptions();
|
|
149
224
|
const model = buildFakeModel("task-1", subscriptions);
|
|
150
|
-
|
|
225
|
+
/** @type {Array<FrontendModelHookTestCreateUpdatePayload | FrontendModelHookTestDestroyPayload>} */
|
|
226
|
+
const receivedEvents = [];
|
|
151
227
|
let connectedCount = 0;
|
|
152
228
|
/** @returns {React.ReactElement} - Test element. */
|
|
153
229
|
function TestComponent() {
|
|
@@ -178,11 +254,48 @@ async function instanceLifecycleScenario() {
|
|
|
178
254
|
};
|
|
179
255
|
}
|
|
180
256
|
/** @returns {Promise<Record<string, number>>} - Scenario result. */
|
|
257
|
+
async function projectionOptionsScenario() {
|
|
258
|
+
const { ModelClass, subscriptions: classSubscriptions } = buildFakeModelClass();
|
|
259
|
+
const instanceSubscriptions = buildFakeSubscriptions();
|
|
260
|
+
const model = buildFakeModel("task-1", instanceSubscriptions);
|
|
261
|
+
/** @returns {React.ReactElement} - Test element. */
|
|
262
|
+
function TestComponent() {
|
|
263
|
+
useCreatedEvent(ModelClass, () => { }, {
|
|
264
|
+
preload: "project",
|
|
265
|
+
select: { Task: ["id", "nameUppercase"] }
|
|
266
|
+
});
|
|
267
|
+
useUpdatedEvent(model, () => { }, {
|
|
268
|
+
select: ["id"],
|
|
269
|
+
withCount: "comments"
|
|
270
|
+
});
|
|
271
|
+
useDestroyedEvent(model, () => { }, {
|
|
272
|
+
preload: "project",
|
|
273
|
+
select: ["id"]
|
|
274
|
+
});
|
|
275
|
+
return React.createElement("div");
|
|
276
|
+
}
|
|
277
|
+
const controls = await renderElement(React.createElement(TestComponent));
|
|
278
|
+
await waitFor(() => classSubscriptions.create.size === 1 && instanceSubscriptions.update.size === 1 && instanceSubscriptions.destroy.size === 1);
|
|
279
|
+
const createOptions = classSubscriptions.options.create[0] || {};
|
|
280
|
+
const updateOptions = instanceSubscriptions.options.update[0] || {};
|
|
281
|
+
const destroyOptions = instanceSubscriptions.options.destroy[0] || {};
|
|
282
|
+
await controls.unmount();
|
|
283
|
+
return {
|
|
284
|
+
classCreatePreloadProject: createOptions.preload === "project" ? 1 : 0,
|
|
285
|
+
classCreateSelectCount: createOptions.select && typeof createOptions.select === "object" && !Array.isArray(createOptions.select) && Array.isArray(createOptions.select.Task) ? createOptions.select.Task.length : 0,
|
|
286
|
+
instanceDestroyPreloadProject: destroyOptions.preload === "project" ? 1 : 0,
|
|
287
|
+
instanceDestroySelectCount: Array.isArray(destroyOptions.select) ? destroyOptions.select.length : 0,
|
|
288
|
+
instanceUpdateSelectCount: Array.isArray(updateOptions.select) ? updateOptions.select.length : 0,
|
|
289
|
+
instanceUpdateWithCountComments: updateOptions.withCount === "comments" ? 1 : 0
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
/** @returns {Promise<Record<string, number>>} - Scenario result. */
|
|
181
293
|
async function debounceUnmountScenario() {
|
|
182
294
|
const { ModelClass, subscriptions: classSubscriptions } = buildFakeModelClass();
|
|
183
|
-
const instanceSubscriptions =
|
|
295
|
+
const instanceSubscriptions = buildFakeSubscriptions();
|
|
184
296
|
const model = buildFakeModel("task-1", instanceSubscriptions);
|
|
185
|
-
|
|
297
|
+
/** @type {Array<FrontendModelHookTestCreateUpdatePayload | FrontendModelHookTestDestroyPayload>} */
|
|
298
|
+
const receivedEvents = [];
|
|
186
299
|
/** @returns {React.ReactElement} - Test element. */
|
|
187
300
|
function TestComponent() {
|
|
188
301
|
useModelClassEvent(ModelClass, "update", (payload) => receivedEvents.push(payload), { debounce: 20 });
|
|
@@ -201,11 +314,12 @@ async function debounceUnmountScenario() {
|
|
|
201
314
|
}
|
|
202
315
|
/** @returns {Promise<Record<string, number>>} - Scenario result. */
|
|
203
316
|
async function resubscribeInstanceScenario() {
|
|
204
|
-
const firstSubscriptions =
|
|
205
|
-
const secondSubscriptions =
|
|
317
|
+
const firstSubscriptions = buildFakeSubscriptions();
|
|
318
|
+
const secondSubscriptions = buildFakeSubscriptions();
|
|
206
319
|
const firstModel = buildFakeModel("task-1", firstSubscriptions);
|
|
207
320
|
const secondModel = buildFakeModel("task-1", secondSubscriptions);
|
|
208
|
-
|
|
321
|
+
/** @type {Array<FrontendModelHookTestCreateUpdatePayload | FrontendModelHookTestDestroyPayload>} */
|
|
322
|
+
const receivedEvents = [];
|
|
209
323
|
/**
|
|
210
324
|
* @param {{model: import("../frontend-models/base.js").default}} props - Component props.
|
|
211
325
|
* @returns {React.ReactElement} - Test element.
|
|
@@ -244,6 +358,7 @@ const scenarios = {
|
|
|
244
358
|
classLifecycle: classLifecycleScenario,
|
|
245
359
|
debounceUnmount: debounceUnmountScenario,
|
|
246
360
|
instanceLifecycle: instanceLifecycleScenario,
|
|
361
|
+
projectionOptions: projectionOptionsScenario,
|
|
247
362
|
resubscribeInstance: resubscribeInstanceScenario
|
|
248
363
|
};
|
|
249
364
|
/**
|
|
@@ -256,4 +371,4 @@ export default async function runFrontendModelEventHookScenario(scenarioName) {
|
|
|
256
371
|
throw new Error(`Unknown frontend model event hook scenario: ${scenarioName}`);
|
|
257
372
|
return await scenario();
|
|
258
373
|
}
|
|
259
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci1mcm9udGVuZC1tb2RlbC1ldmVudC1ob29rLXNjZW5hcmlvcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL2Jyb3dzZXItZnJvbnRlbmQtbW9kZWwtZXZlbnQtaG9vay1zY2VuYXJpb3MuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUN6QixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFFM0MsT0FBTyxpQkFBaUIsTUFBTSwyQ0FBMkMsQ0FBQTtBQUN6RSxPQUFPLGVBQWUsTUFBTSx5Q0FBeUMsQ0FBQTtBQUNyRSxPQUFPLGtCQUFrQixNQUFNLDZDQUE2QyxDQUFBO0FBQzVFLE9BQU8sZUFBZSxNQUFNLHlDQUF5QyxDQUFBO0FBRXJFOzs7OztHQUtHO0FBRUgsd0VBQXdFO0FBQ3hFLEtBQUssVUFBVSxZQUFZO0lBQ3pCLE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQ3ZCLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUN4RCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsS0FBSyxVQUFVLEtBQUssQ0FBQyxZQUFZO0lBQy9CLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQTtBQUNuRSxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsS0FBSyxVQUFVLE9BQU8sQ0FBQyxRQUFRO0lBQzdCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQTtJQUU1QixPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztRQUNuQixJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxT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QUMsSUFBSSxDQUFBO0lBRTlFLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsRUFBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFBO0lBQzFFLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsRUFBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFBO0lBQzVFLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsRUFBQyxFQUFFLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtJQUV6RCxNQUFNLHVCQUF1QixHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUE7SUFFckQsTUFBTSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUE7SUFFeEIsT0FBTztRQUNMLHNDQUFzQztRQUN0QyxxQ0FBcUM7UUFDckMsZ0NBQWdDO1FBQ2hDLCtCQUErQjtRQUMvQix1QkFBdUI7UUFDdkIsdUNBQXVDO1FBQ3ZDLHNDQUFzQztLQUN2QyxDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sU0FBUyxHQUFHO0lBQ2hCLGNBQWMsRUFBRSxzQkFBc0I7SUFDdEMsZUFBZSxFQUFFLHVCQUF1QjtJQUN4QyxpQkFBaUIsRUFBRSx5QkFBeUI7SUFDNUMsbUJBQW1CLEVBQUUsMkJBQTJCO0NBQ2pELENBQUE7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssVUFBVSxpQ0FBaUMsQ0FBQyxZQUFZO0lBQzFFLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUV4QyxJQUFJLENBQUMsUUFBUTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLFlBQVksRUFBRSxDQUFDLENBQUE7SUFFN0YsT0FBTyxNQUFNLFFBQVEsRUFBRSxDQUFBO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQge2NyZWF0ZVJvb3R9IGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCJcblxuaW1wb3J0IHVzZURlc3Ryb3llZEV2ZW50IGZyb20gXCIuLi9mcm9udGVuZC1tb2RlbHMvdXNlLWRlc3Ryb3llZC1ldmVudC5qc1wiXG5pbXBvcnQgdXNlQ3JlYXRlZEV2ZW50IGZyb20gXCIuLi9mcm9udGVuZC1tb2RlbHMvdXNlLWNyZWF0ZWQtZXZlbnQuanNcIlxuaW1wb3J0IHVzZU1vZGVsQ2xhc3NFdmVudCBmcm9tIFwiLi4vZnJvbnRlbmQtbW9kZWxzL3VzZS1tb2RlbC1jbGFzcy1ldmVudC5qc1wiXG5pbXBvcnQgdXNlVXBkYXRlZEV2ZW50IGZyb20gXCIuLi9mcm9udGVuZC1tb2RlbHMvdXNlLXVwZGF0ZWQtZXZlbnQuanNcIlxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZha2VTdWJzY3JpcHRpb25zXG4gKiBAcHJvcGVydHkge1NldDwocGF5bG9hZDogdW5rbm93bikgPT4gdm9pZD59IGNyZWF0ZSAtIENyZWF0ZSBjYWxsYmFja3MuXG4gKiBAcHJvcGVydHkge1NldDwocGF5bG9hZDogdW5rbm93bikgPT4gdm9pZD59IGRlc3Ryb3kgLSBEZXN0cm95IGNhbGxiYWNrcy5cbiAqIEBwcm9wZXJ0eSB7U2V0PChwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkPn0gdXBkYXRlIC0gVXBkYXRlIGNhbGxiYWNrcy5cbiAqL1xuXG4vKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgUmVhY3QgZWZmZWN0cyBoYXZlIHJ1bi4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZsdXNoRWZmZWN0cygpIHtcbiAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKClcbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG1pbGxpc2Vjb25kcyAtIE1pbGxpc2Vjb25kcyB0byB3YWl0LlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgdGhlIGRlbGF5LlxuICovXG5hc3luYyBmdW5jdGlvbiBzbGVlcChtaWxsaXNlY29uZHMpIHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmRzKSlcbn1cblxuLyoqXG4gKiBAcGFyYW0geygpID0+IGJvb2xlYW59IGNhbGxiYWNrIC0gUHJlZGljYXRlIHRvIHdhaXQgZm9yLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiB0aGUgcHJlZGljYXRlIHJldHVybnMgdHJ1ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2FpdEZvcihjYWxsYmFjaykge1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpXG5cbiAgd2hpbGUgKCFjYWxsYmFjaygpKSB7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGFydGVkQXQgPiAxMDAwKSByZXR1cm5cblxuICAgIGF3YWl0IHNsZWVwKDEwKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWFjdC5SZWFjdEVsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJlbmRlci5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHtyZXJlbmRlcjogKG5leHRFbGVtZW50OiBSZWFjdC5SZWFjdEVsZW1lbnQpID0+IFByb21pc2U8dm9pZD4sIHVubW91bnQ6ICgpID0+IFByb21pc2U8dm9pZD59Pn0gLSBSZW5kZXIgY29udHJvbHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlbmRlckVsZW1lbnQoZWxlbWVudCkge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyKVxuICBjb25zdCByb290ID0gY3JlYXRlUm9vdChjb250YWluZXIpXG5cbiAgcm9vdC5yZW5kZXIoZWxlbWVudClcbiAgYXdhaXQgZmx1c2hFZmZlY3RzKClcblxuICByZXR1cm4ge1xuICAgIHJlcmVuZGVyOiBhc3luYyAobmV4dEVsZW1lbnQpID0+IHtcbiAgICAgIHJvb3QucmVuZGVyKG5leHRFbGVtZW50KVxuICAgICAgYXdhaXQgZmx1c2hFZmZlY3RzKClcbiAgICB9LFxuICAgIHVubW91bnQ6IGFzeW5jICgpID0+IHtcbiAgICAgIHJvb3QudW5tb3VudCgpXG4gICAgICBjb250YWluZXIucmVtb3ZlKClcbiAgICAgIGF3YWl0IGZsdXNoRWZmZWN0cygpXG4gICAgfVxuICB9XG59XG5cbi8qKiBAcmV0dXJucyB7e01vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbHMvYmFzZS5qc1wiKS5kZWZhdWx0LCBzdWJzY3JpcHRpb25zOiBGYWtlU3Vic2NyaXB0aW9uc319IC0gRmFrZSBtb2RlbCBjbGFzcyBzZXR1cC4gKi9cbmZ1bmN0aW9uIGJ1aWxkRmFrZU1vZGVsQ2xhc3MoKSB7XG4gIGNvbnN0IHN1YnNjcmlwdGlvbnMgPSB7XG4gICAgY3JlYXRlOiBuZXcgU2V0KCksXG4gICAgZGVzdHJveTogbmV3IFNldCgpLFxuICAgIHVwZGF0ZTogbmV3IFNldCgpXG4gIH1cbiAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVscy9iYXNlLmpzXCIpLmRlZmF1bHR9ICovICgvKiogQHR5cGUge3Vua25vd259ICovICh7XG4gICAgb25DcmVhdGU6IGFzeW5jICgvKiogQHR5cGUgeyhwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkfSAqLyBjYWxsYmFjaykgPT4ge1xuICAgICAgc3Vic2NyaXB0aW9ucy5jcmVhdGUuYWRkKGNhbGxiYWNrKVxuXG4gICAgICByZXR1cm4gKCkgPT4gc3Vic2NyaXB0aW9ucy5jcmVhdGUuZGVsZXRlKGNhbGxiYWNrKVxuICAgIH0sXG4gICAgb25EZXN0cm95OiBhc3luYyAoLyoqIEB0eXBlIHsocGF5bG9hZDogdW5rbm93bikgPT4gdm9pZH0gKi8gY2FsbGJhY2spID0+IHtcbiAgICAgIHN1YnNjcmlwdGlvbnMuZGVzdHJveS5hZGQoY2FsbGJhY2spXG5cbiAgICAgIHJldHVybiAoKSA9PiBzdWJzY3JpcHRpb25zLmRlc3Ryb3kuZGVsZXRlKGNhbGxiYWNrKVxuICAgIH0sXG4gICAgb25VcGRhdGU6IGFzeW5jICgvKiogQHR5cGUgeyhwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkfSAqLyBjYWxsYmFjaykgPT4ge1xuICAgICAgc3Vic2NyaXB0aW9ucy51cGRhdGUuYWRkKGNhbGxiYWNrKVxuXG4gICAgICByZXR1cm4gKCkgPT4gc3Vic2NyaXB0aW9ucy51cGRhdGUuZGVsZXRlKGNhbGxiYWNrKVxuICAgIH1cbiAgfSkpXG5cbiAgcmV0dXJuIHtNb2RlbENsYXNzLCBzdWJzY3JpcHRpb25zfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7RmFrZVN1YnNjcmlwdGlvbnN9IHN1YnNjcmlwdGlvbnMgLSBDYWxsYmFjayBzZXRzLlxuICogQHBhcmFtIHtcImNyZWF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcInVwZGF0ZVwifSBldmVudE5hbWUgLSBFdmVudCBuYW1lLlxuICogQHBhcmFtIHt1bmtub3dufSBwYXlsb2FkIC0gRXZlbnQgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBlbWl0RXZlbnQoc3Vic2NyaXB0aW9ucywgZXZlbnROYW1lLCBwYXlsb2FkKSB7XG4gIGZvciAoY29uc3QgY2FsbGJhY2sgb2Ygc3Vic2NyaXB0aW9uc1tldmVudE5hbWVdKSB7XG4gICAgY2FsbGJhY2socGF5bG9hZClcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIE1vZGVsIGlkLlxuICogQHBhcmFtIHtGYWtlU3Vic2NyaXB0aW9uc30gc3Vic2NyaXB0aW9ucyAtIENhbGxiYWNrIHNldHMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWxzL2Jhc2UuanNcIikuZGVmYXVsdH0gLSBGYWtlIG1vZGVsIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBidWlsZEZha2VNb2RlbChpZCwgc3Vic2NyaXB0aW9ucykge1xuICByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbHMvYmFzZS5qc1wiKS5kZWZhdWx0fSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoe1xuICAgIG9uRGVzdHJveTogYXN5bmMgKC8qKiBAdHlwZSB7KHBheWxvYWQ6IHVua25vd24pID0+IHZvaWR9ICovIGNhbGxiYWNrKSA9PiB7XG4gICAgICBzdWJzY3JpcHRpb25zLmRlc3Ryb3kuYWRkKGNhbGxiYWNrKVxuXG4gICAgICByZXR1cm4gKCkgPT4gc3Vic2NyaXB0aW9ucy5kZXN0cm95LmRlbGV0ZShjYWxsYmFjaylcbiAgICB9LFxuICAgIG9uVXBkYXRlOiBhc3luYyAoLyoqIEB0eXBlIHsocGF5bG9hZDogdW5rbm93bikgPT4gdm9pZH0gKi8gY2FsbGJhY2spID0+IHtcbiAgICAgIHN1YnNjcmlwdGlvbnMudXBkYXRlLmFkZChjYWxsYmFjaylcblxuICAgICAgcmV0dXJuICgpID0+IHN1YnNjcmlwdGlvbnMudXBkYXRlLmRlbGV0ZShjYWxsYmFjaylcbiAgICB9LFxuICAgIHByaW1hcnlLZXlWYWx1ZTogKCkgPT4gaWRcbiAgfSkpXG59XG5cbi8qKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+Pn0gLSBTY2VuYXJpbyByZXN1bHQuICovXG5hc3luYyBmdW5jdGlvbiBjbGFzc0xpZmVjeWNsZVNjZW5hcmlvKCkge1xuICBjb25zdCB7TW9kZWxDbGFzcywgc3Vic2NyaXB0aW9uc30gPSBidWlsZEZha2VNb2RlbENsYXNzKClcbiAgY29uc3QgcmVjZWl2ZWRFdmVudHMgPSAvKiogQHR5cGUge3Vua25vd25bXX0gKi8gKFtdKVxuICBsZXQgY29ubmVjdGVkQ291bnQgPSAwXG5cbiAgLyoqIEByZXR1cm5zIHtSZWFjdC5SZWFjdEVsZW1lbnR9IC0gVGVzdCBlbGVtZW50LiAqL1xuICBmdW5jdGlvbiBUZXN0Q29tcG9uZW50KCkge1xuICAgIHVzZU1vZGVsQ2xhc3NFdmVudChNb2RlbENsYXNzLCBbXCJjcmVhdGVcIiwgXCJ1cGRhdGVcIl0sIChwYXlsb2FkKSA9PiByZWNlaXZlZEV2ZW50cy5wdXNoKHBheWxvYWQpLCB7XG4gICAgICBvbkNvbm5lY3RlZDogKCkgPT4geyBjb25uZWN0ZWRDb3VudCArPSAxIH1cbiAgICB9KVxuICAgIHVzZUNyZWF0ZWRFdmVudChNb2RlbENsYXNzLCAocGF5bG9hZCkgPT4gcmVjZWl2ZWRFdmVudHMucHVzaChwYXlsb2FkKSlcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gIH1cblxuICBjb25zdCBjb250cm9scyA9IGF3YWl0IHJlbmRlckVsZW1lbnQoUmVhY3QuY3JlYXRlRWxlbWVudChUZXN0Q29tcG9uZW50KSlcbiAgYXdhaXQgd2FpdEZvcigoKSA9PiBzdWJzY3JpcHRpb25zLmNyZWF0ZS5zaXplID09PSAyICYmIHN1YnNjcmlwdGlvbnMudXBkYXRlLnNpemUgPT09IDEpXG5cbiAgY29uc3QgbW91bnRlZENyZWF0ZVN1YnNjcmlwdGlvbnMgPSBzdWJzY3JpcHRpb25zLmNyZWF0ZS5zaXplXG4gIGNvbnN0IG1vdW50ZWRVcGRhdGVTdWJzY3JpcHRpb25zID0gc3Vic2NyaXB0aW9ucy51cGRhdGUuc2l6ZVxuICBjb25zdCBtb3VudGVkRGVzdHJveVN1YnNjcmlwdGlvbnMgPSBzdWJzY3JpcHRpb25zLmRlc3Ryb3kuc2l6ZVxuICBjb25zdCBtb3VudGVkQ29ubmVjdGVkQ291bnQgPSBjb25uZWN0ZWRDb3VudFxuXG4gIGVtaXRFdmVudChzdWJzY3JpcHRpb25zLCBcImNyZWF0ZVwiLCB7aWQ6IFwiMVwiLCBtb2RlbDoge2lkOiBcIjFcIn19KVxuICBlbWl0RXZlbnQoc3Vic2NyaXB0aW9ucywgXCJ1cGRhdGVcIiwge2lkOiBcIjFcIiwgbW9kZWw6IHtpZDogXCIxXCJ9fSlcbiAgZW1pdEV2ZW50KHN1YnNjcmlwdGlvbnMsIFwiZGVzdHJveVwiLCB7aWQ6IFwiMVwifSlcblxuICBjb25zdCByZWNlaXZlZEV2ZW50c0FmdGVyRW1pdCA9IHJlY2VpdmVkRXZlbnRzLmxlbmd0aFxuXG4gIGF3YWl0IGNvbnRyb2xzLnVubW91bnQoKVxuXG4gIHJldHVybiB7XG4gICAgbW91bnRlZENvbm5lY3RlZENvdW50LFxuICAgIG1vdW50ZWRDcmVhdGVTdWJzY3JpcHRpb25zLFxuICAgIG1vdW50ZWREZXN0cm95U3Vic2NyaXB0aW9ucyxcbiAgICBtb3VudGVkVXBkYXRlU3Vic2NyaXB0aW9ucyxcbiAgICByZWNlaXZlZEV2ZW50c0FmdGVyRW1pdCxcbiAgICB1bm1vdW50ZWRDcmVhdGVTdWJzY3JpcHRpb25zOiBzdWJzY3JpcHRpb25zLmNyZWF0ZS5zaXplLFxuICAgIHVubW91bnRlZFVwZGF0ZVN1YnNjcmlwdGlvbnM6IHN1YnNjcmlwdGlvbnMudXBkYXRlLnNpemVcbiAgfVxufVxuXG4vKiogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj59IC0gU2NlbmFyaW8gcmVzdWx0LiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5zdGFuY2VMaWZlY3ljbGVTY2VuYXJpbygpIHtcbiAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IHtjcmVhdGU6IG5ldyBTZXQoKSwgZGVzdHJveTogbmV3IFNldCgpLCB1cGRhdGU6IG5ldyBTZXQoKX1cbiAgY29uc3QgbW9kZWwgPSBidWlsZEZha2VNb2RlbChcInRhc2stMVwiLCBzdWJzY3JpcHRpb25zKVxuICBjb25zdCByZWNlaXZlZEV2ZW50cyA9IC8qKiBAdHlwZSB7dW5rbm93bltdfSAqLyAoW10pXG4gIGxldCBjb25uZWN0ZWRDb3VudCA9IDBcblxuICAvKiogQHJldHVybnMge1JlYWN0LlJlYWN0RWxlbWVudH0gLSBUZXN0IGVsZW1lbnQuICovXG4gIGZ1bmN0aW9uIFRlc3RDb21wb25lbnQoKSB7XG4gICAgdXNlVXBkYXRlZEV2ZW50KG1vZGVsLCAocGF5bG9hZCkgPT4gcmVjZWl2ZWRFdmVudHMucHVzaChwYXlsb2FkKSwge1xuICAgICAgb25Db25uZWN0ZWQ6ICgpID0+IHsgY29ubmVjdGVkQ291bnQgKz0gMSB9XG4gICAgfSlcbiAgICB1c2VEZXN0cm95ZWRFdmVudChbbW9kZWxdLCAocGF5bG9hZCkgPT4gcmVjZWl2ZWRFdmVudHMucHVzaChwYXlsb2FkKSwge1xuICAgICAgb25Db25uZWN0ZWQ6ICgpID0+IHsgY29ubmVjdGVkQ291bnQgKz0gMSB9XG4gICAgfSlcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gIH1cblxuICBjb25zdCBjb250cm9scyA9IGF3YWl0IHJlbmRlckVsZW1lbnQoUmVhY3QuY3JlYXRlRWxlbWVudChUZXN0Q29tcG9uZW50KSlcbiAgYXdhaXQgd2FpdEZvcigoKSA9PiBzdWJzY3JpcHRpb25zLnVwZGF0ZS5zaXplID09PSAxICYmIHN1YnNjcmlwdGlvbnMuZGVzdHJveS5zaXplID09PSAxKVxuXG4gIGNvbnN0IG1vdW50ZWRDb25uZWN0ZWRDb3VudCA9IGNvbm5lY3RlZENvdW50XG4gIGNvbnN0IG1vdW50ZWREZXN0cm95U3Vic2NyaXB0aW9ucyA9IHN1YnNjcmlwdGlvbnMuZGVzdHJveS5zaXplXG4gIGNvbnN0IG1vdW50ZWRVcGRhdGVTdWJzY3JpcHRpb25zID0gc3Vic2NyaXB0aW9ucy51cGRhdGUuc2l6ZVxuXG4gIGVtaXRFdmVudChzdWJzY3JpcHRpb25zLCBcInVwZGF0ZVwiLCB7aWQ6IFwidGFzay0xXCIsIG1vZGVsfSlcbiAgZW1pdEV2ZW50KHN1YnNjcmlwdGlvbnMsIFwiZGVzdHJveVwiLCB7aWQ6IFwidGFzay0xXCJ9KVxuXG4gIGNvbnN0IHJlY2VpdmVkRXZlbnRzQWZ0ZXJFbWl0ID0gcmVjZWl2ZWRFdmVudHMubGVuZ3RoXG5cbiAgYXdhaXQgY29udHJvbHMudW5tb3VudCgpXG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudGVkQ29ubmVjdGVkQ291bnQsXG4gICAgbW91bnRlZERlc3Ryb3lTdWJzY3JpcHRpb25zLFxuICAgIG1vdW50ZWRVcGRhdGVTdWJzY3JpcHRpb25zLFxuICAgIHJlY2VpdmVkRXZlbnRzQWZ0ZXJFbWl0LFxuICAgIHVubW91bnRlZERlc3Ryb3lTdWJzY3JpcHRpb25zOiBzdWJzY3JpcHRpb25zLmRlc3Ryb3kuc2l6ZSxcbiAgICB1bm1vdW50ZWRVcGRhdGVTdWJzY3JpcHRpb25zOiBzdWJzY3JpcHRpb25zLnVwZGF0ZS5zaXplXG4gIH1cbn1cblxuLyoqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+fSAtIFNjZW5hcmlvIHJlc3VsdC4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlYm91bmNlVW5tb3VudFNjZW5hcmlvKCkge1xuICBjb25zdCB7TW9kZWxDbGFzcywgc3Vic2NyaXB0aW9uczogY2xhc3NTdWJzY3JpcHRpb25zfSA9IGJ1aWxkRmFrZU1vZGVsQ2xhc3MoKVxuICBjb25zdCBpbnN0YW5jZVN1YnNjcmlwdGlvbnMgPSB7Y3JlYXRlOiBuZXcgU2V0KCksIGRlc3Ryb3k6IG5ldyBTZXQoKSwgdXBkYXRlOiBuZXcgU2V0KCl9XG4gIGNvbnN0IG1vZGVsID0gYnVpbGRGYWtlTW9kZWwoXCJ0YXNrLTFcIiwgaW5zdGFuY2VTdWJzY3JpcHRpb25zKVxuICBjb25zdCByZWNlaXZlZEV2ZW50cyA9IC8qKiBAdHlwZSB7dW5rbm93bltdfSAqLyAoW10pXG5cbiAgLyoqIEByZXR1cm5zIHtSZWFjdC5SZWFjdEVsZW1lbnR9IC0gVGVzdCBlbGVtZW50LiAqL1xuICBmdW5jdGlvbiBUZXN0Q29tcG9uZW50KCkge1xuICAgIHVzZU1vZGVsQ2xhc3NFdmVudChNb2RlbENsYXNzLCBcInVwZGF0ZVwiLCAocGF5bG9hZCkgPT4gcmVjZWl2ZWRFdmVudHMucHVzaChwYXlsb2FkKSwge2RlYm91bmNlOiAyMH0pXG4gICAgdXNlVXBkYXRlZEV2ZW50KG1vZGVsLCAocGF5bG9hZCkgPT4gcmVjZWl2ZWRFdmVudHMucHVzaChwYXlsb2FkKSwge2RlYm91bmNlOiAyMH0pXG4gICAgdXNlRGVzdHJveWVkRXZlbnQobW9kZWwsIChwYXlsb2FkKSA9PiByZWNlaXZlZEV2ZW50cy5wdXNoKHBheWxvYWQpLCB7ZGVib3VuY2U6IDIwfSlcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gIH1cblxuICBjb25zdCBjb250cm9scyA9IGF3YWl0IHJlbmRlckVsZW1lbnQoUmVhY3QuY3JlYXRlRWxlbWVudChUZXN0Q29tcG9uZW50KSlcbiAgYXdhaXQgd2FpdEZvcigoKSA9PiBjbGFzc1N1YnNjcmlwdGlvbnMudXBkYXRlLnNpemUgPT09IDEgJiYgaW5zdGFuY2VTdWJzY3JpcHRpb25zLnVwZGF0ZS5zaXplID09PSAxICYmIGluc3RhbmNlU3Vic2NyaXB0aW9ucy5kZXN0cm95LnNpemUgPT09IDEpXG5cbiAgZW1pdEV2ZW50KGNsYXNzU3Vic2NyaXB0aW9ucywgXCJ1cGRhdGVcIiwge2lkOiBcInRhc2stMVwiLCBtb2RlbH0pXG4gIGVtaXRFdmVudChpbnN0YW5jZVN1YnNjcmlwdGlvbnMsIFwidXBkYXRlXCIsIHtpZDogXCJ0YXNrLTFcIiwgbW9kZWx9KVxuICBlbWl0RXZlbnQoaW5zdGFuY2VTdWJzY3JpcHRpb25zLCBcImRlc3Ryb3lcIiwge2lkOiBcInRhc2stMVwifSlcblxuICBhd2FpdCBjb250cm9scy51bm1vdW50KClcbiAgYXdhaXQgc2xlZXAoMzApXG5cbiAgcmV0dXJuIHtyZWNlaXZlZEV2ZW50c0FmdGVyRGVib3VuY2VXaW5kb3c6IHJlY2VpdmVkRXZlbnRzLmxlbmd0aH1cbn1cblxuLyoqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+fSAtIFNjZW5hcmlvIHJlc3VsdC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc3Vic2NyaWJlSW5zdGFuY2VTY2VuYXJpbygpIHtcbiAgY29uc3QgZmlyc3RTdWJzY3JpcHRpb25zID0ge2NyZWF0ZTogbmV3IFNldCgpLCBkZXN0cm95OiBuZXcgU2V0KCksIHVwZGF0ZTogbmV3IFNldCgpfVxuICBjb25zdCBzZWNvbmRTdWJzY3JpcHRpb25zID0ge2NyZWF0ZTogbmV3IFNldCgpLCBkZXN0cm95OiBuZXcgU2V0KCksIHVwZGF0ZTogbmV3IFNldCgpfVxuICBjb25zdCBmaXJzdE1vZGVsID0gYnVpbGRGYWtlTW9kZWwoXCJ0YXNrLTFcIiwgZmlyc3RTdWJzY3JpcHRpb25zKVxuICBjb25zdCBzZWNvbmRNb2RlbCA9IGJ1aWxkRmFrZU1vZGVsKFwidGFzay0xXCIsIHNlY29uZFN1YnNjcmlwdGlvbnMpXG4gIGNvbnN0IHJlY2VpdmVkRXZlbnRzID0gLyoqIEB0eXBlIHt1bmtub3duW119ICovIChbXSlcblxuICAvKipcbiAgICogQHBhcmFtIHt7bW9kZWw6IGltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVscy9iYXNlLmpzXCIpLmRlZmF1bHR9fSBwcm9wcyAtIENvbXBvbmVudCBwcm9wcy5cbiAgICogQHJldHVybnMge1JlYWN0LlJlYWN0RWxlbWVudH0gLSBUZXN0IGVsZW1lbnQuXG4gICAqL1xuICBmdW5jdGlvbiBUZXN0Q29tcG9uZW50KHttb2RlbH0pIHtcbiAgICB1c2VVcGRhdGVkRXZlbnQobW9kZWwsIChwYXlsb2FkKSA9PiByZWNlaXZlZEV2ZW50cy5wdXNoKHBheWxvYWQpKVxuICAgIHVzZURlc3Ryb3llZEV2ZW50KG1vZGVsLCAocGF5bG9hZCkgPT4gcmVjZWl2ZWRFdmVudHMucHVzaChwYXlsb2FkKSlcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gIH1cblxuICBjb25zdCBjb250cm9scyA9IGF3YWl0IHJlbmRlckVsZW1lbnQoUmVhY3QuY3JlYXRlRWxlbWVudChUZXN0Q29tcG9uZW50LCB7bW9kZWw6IGZpcnN0TW9kZWx9KSlcbiAgYXdhaXQgd2FpdEZvcigoKSA9PiBmaXJzdFN1YnNjcmlwdGlvbnMudXBkYXRlLnNpemUgPT09IDEgJiYgZmlyc3RTdWJzY3JpcHRpb25zLmRlc3Ryb3kuc2l6ZSA9PT0gMSlcblxuICBjb25zdCBmaXJzdE1vdW50ZWREZXN0cm95U3Vic2NyaXB0aW9ucyA9IGZpcnN0U3Vic2NyaXB0aW9ucy5kZXN0cm95LnNpemVcbiAgY29uc3QgZmlyc3RNb3VudGVkVXBkYXRlU3Vic2NyaXB0aW9ucyA9IGZpcnN0U3Vic2NyaXB0aW9ucy51cGRhdGUuc2l6ZVxuXG4gIGF3YWl0IGNvbnRyb2xzLnJlcmVuZGVyKFJlYWN0LmNyZWF0ZUVsZW1lbnQoVGVzdENvbXBvbmVudCwge21vZGVsOiBzZWNvbmRNb2RlbH0pKVxuICBhd2FpdCB3YWl0Rm9yKCgpID0+IGZpcnN0U3Vic2NyaXB0aW9ucy51cGRhdGUuc2l6ZSA9PT0gMCAmJiBmaXJzdFN1YnNjcmlwdGlvbnMuZGVzdHJveS5zaXplID09PSAwICYmIHNlY29uZFN1YnNjcmlwdGlvbnMudXBkYXRlLnNpemUgPT09IDEgJiYgc2Vjb25kU3Vic2NyaXB0aW9ucy5kZXN0cm95LnNpemUgPT09IDEpXG5cbiAgY29uc3QgZmlyc3RBZnRlclJlcmVuZGVyRGVzdHJveVN1YnNjcmlwdGlvbnMgPSBmaXJzdFN1YnNjcmlwdGlvbnMuZGVzdHJveS5zaXplXG4gIGNvbnN0IGZpcnN0QWZ0ZXJSZXJlbmRlclVwZGF0ZVN1YnNjcmlwdGlvbnMgPSBmaXJzdFN1YnNjcmlwdGlvbnMudXBkYXRlLnNpemVcbiAgY29uc3Qgc2Vjb25kQWZ0ZXJSZXJlbmRlckRlc3Ryb3lTdWJzY3JpcHRpb25zID0gc2Vjb25kU3Vic2NyaXB0aW9ucy5kZXN0cm95LnNpemVcbiAgY29uc3Qgc2Vjb25kQWZ0ZXJSZXJlbmRlclVwZGF0ZVN1YnNjcmlwdGlvbnMgPSBzZWNvbmRTdWJzY3JpcHRpb25zLnVwZGF0ZS5zaXplXG5cbiAgZW1pdEV2ZW50KGZpcnN0U3Vic2NyaXB0aW9ucywgXCJ1cGRhdGVcIiwge2lkOiBcInRhc2stMVwiLCBtb2RlbDogZmlyc3RNb2RlbH0pXG4gIGVtaXRFdmVudChzZWNvbmRTdWJzY3JpcHRpb25zLCBcInVwZGF0ZVwiLCB7aWQ6IFwidGFzay0xXCIsIG1vZGVsOiBzZWNvbmRNb2RlbH0pXG4gIGVtaXRFdmVudChzZWNvbmRTdWJzY3JpcHRpb25zLCBcImRlc3Ryb3lcIiwge2lkOiBcInRhc2stMVwifSlcblxuICBjb25zdCByZWNlaXZlZEV2ZW50c0FmdGVyRW1pdCA9IHJlY2VpdmVkRXZlbnRzLmxlbmd0aFxuXG4gIGF3YWl0IGNvbnRyb2xzLnVubW91bnQoKVxuXG4gIHJldHVybiB7XG4gICAgZmlyc3RBZnRlclJlcmVuZGVyRGVzdHJveVN1YnNjcmlwdGlvbnMsXG4gICAgZmlyc3RBZnRlclJlcmVuZGVyVXBkYXRlU3Vic2NyaXB0aW9ucyxcbiAgICBmaXJzdE1vdW50ZWREZXN0cm95U3Vic2NyaXB0aW9ucyxcbiAgICBmaXJzdE1vdW50ZWRVcGRhdGVTdWJzY3JpcHRpb25zLFxuICAgIHJlY2VpdmVkRXZlbnRzQWZ0ZXJFbWl0LFxuICAgIHNlY29uZEFmdGVyUmVyZW5kZXJEZXN0cm95U3Vic2NyaXB0aW9ucyxcbiAgICBzZWNvbmRBZnRlclJlcmVuZGVyVXBkYXRlU3Vic2NyaXB0aW9uc1xuICB9XG59XG5cbmNvbnN0IHNjZW5hcmlvcyA9IHtcbiAgY2xhc3NMaWZlY3ljbGU6IGNsYXNzTGlmZWN5Y2xlU2NlbmFyaW8sXG4gIGRlYm91bmNlVW5tb3VudDogZGVib3VuY2VVbm1vdW50U2NlbmFyaW8sXG4gIGluc3RhbmNlTGlmZWN5Y2xlOiBpbnN0YW5jZUxpZmVjeWNsZVNjZW5hcmlvLFxuICByZXN1YnNjcmliZUluc3RhbmNlOiByZXN1YnNjcmliZUluc3RhbmNlU2NlbmFyaW9cbn1cblxuLyoqXG4gKiBAcGFyYW0ge2tleW9mIHR5cGVvZiBzY2VuYXJpb3N9IHNjZW5hcmlvTmFtZSAtIFNjZW5hcmlvIG5hbWUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+Pn0gLSBTY2VuYXJpbyByZXN1bHQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIHJ1bkZyb250ZW5kTW9kZWxFdmVudEhvb2tTY2VuYXJpbyhzY2VuYXJpb05hbWUpIHtcbiAgY29uc3Qgc2NlbmFyaW8gPSBzY2VuYXJpb3Nbc2NlbmFyaW9OYW1lXVxuXG4gIGlmICghc2NlbmFyaW8pIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmcm9udGVuZCBtb2RlbCBldmVudCBob29rIHNjZW5hcmlvOiAke3NjZW5hcmlvTmFtZX1gKVxuXG4gIHJldHVybiBhd2FpdCBzY2VuYXJpbygpXG59XG4iXX0=
|
|
374
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci1mcm9udGVuZC1tb2RlbC1ldmVudC1ob29rLXNjZW5hcmlvcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL2Jyb3dzZXItZnJvbnRlbmQtbW9kZWwtZXZlbnQtaG9vay1zY2VuYXJpb3MuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUN6QixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFFM0MsT0FBTyxpQkFBaUIsTUFBTSwyQ0FBMkMsQ0FBQTtBQUN6RSxPQUFPLGVBQWUsTUFBTSx5Q0FBeUMsQ0FBQTtBQUNyRSxPQUFPLGlCQUFpQixNQUFNLDRCQUE0QixDQUFBO0FBQzFELE9BQU8sa0JBQWtCLE1BQU0sNkNBQTZDLENBQUE7QUFDNUUsT0FBTyxlQUFlLE1BQU0seUNBQXlDLENBQUE7QUFFckUscUhBQXFIO0FBQ3JILDhHQUE4RztBQUM5RyxpR0FBaUc7QUFDakcsa0VBQWtFO0FBQ2xFOzs7Ozs7R0FNRztBQUVILHdFQUF3RTtBQUN4RSxLQUFLLFVBQVUsWUFBWTtJQUN6QixNQUFNLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUN2QixNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDeEQsQ0FBQztBQUVEOzs7R0FHRztBQUNILEtBQUssVUFBVSxLQUFLLENBQUMsWUFBWTtJQUMvQixNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUE7QUFDbkUsQ0FBQztBQUVEOzs7R0FHRztBQUNILEtBQUssVUFBVSxPQUFPLENBQUMsUUFBUTtJQUM3QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMs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QUksS0FBSyxDQUFDLCtDQUErQyxZQUFZLEVBQUUsQ0FBQyxDQUFBO0lBRTdGLE9BQU8sTUFBTSxRQUFRLEVBQUUsQ0FBQTtBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHtjcmVhdGVSb290fSBmcm9tIFwicmVhY3QtZG9tL2NsaWVudFwiXG5cbmltcG9ydCB1c2VEZXN0cm95ZWRFdmVudCBmcm9tIFwiLi4vZnJvbnRlbmQtbW9kZWxzL3VzZS1kZXN0cm95ZWQtZXZlbnQuanNcIlxuaW1wb3J0IHVzZUNyZWF0ZWRFdmVudCBmcm9tIFwiLi4vZnJvbnRlbmQtbW9kZWxzL3VzZS1jcmVhdGVkLWV2ZW50LmpzXCJcbmltcG9ydCBGcm9udGVuZE1vZGVsQmFzZSBmcm9tIFwiLi4vZnJvbnRlbmQtbW9kZWxzL2Jhc2UuanNcIlxuaW1wb3J0IHVzZU1vZGVsQ2xhc3NFdmVudCBmcm9tIFwiLi4vZnJvbnRlbmQtbW9kZWxzL3VzZS1tb2RlbC1jbGFzcy1ldmVudC5qc1wiXG5pbXBvcnQgdXNlVXBkYXRlZEV2ZW50IGZyb20gXCIuLi9mcm9udGVuZC1tb2RlbHMvdXNlLXVwZGF0ZWQtZXZlbnQuanNcIlxuXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVscy9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsUHJvamVjdGlvbk9wdGlvbnN9IEZyb250ZW5kTW9kZWxQcm9qZWN0aW9uT3B0aW9ucyAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbHMvYmFzZS5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd9IEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZyAqL1xuLyoqIEB0eXBlZGVmIHt7aWQ6IHN0cmluZywgbW9kZWw6IEZyb250ZW5kTW9kZWxCYXNlfX0gRnJvbnRlbmRNb2RlbEhvb2tUZXN0Q3JlYXRlVXBkYXRlUGF5bG9hZCAqL1xuLyoqIEB0eXBlZGVmIHt7aWQ6IHN0cmluZ319IEZyb250ZW5kTW9kZWxIb29rVGVzdERlc3Ryb3lQYXlsb2FkICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZha2VTdWJzY3JpcHRpb25zXG4gKiBAcHJvcGVydHkge1NldDwocGF5bG9hZDogRnJvbnRlbmRNb2RlbEhvb2tUZXN0Q3JlYXRlVXBkYXRlUGF5bG9hZCkgPT4gdm9pZD59IGNyZWF0ZSAtIENyZWF0ZSBjYWxsYmFja3MuXG4gKiBAcHJvcGVydHkge1NldDwocGF5bG9hZDogRnJvbnRlbmRNb2RlbEhvb2tUZXN0RGVzdHJveVBheWxvYWQpID0+IHZvaWQ+fSBkZXN0cm95IC0gRGVzdHJveSBjYWxsYmFja3MuXG4gKiBAcHJvcGVydHkge3tjcmVhdGU6IEZyb250ZW5kTW9kZWxQcm9qZWN0aW9uT3B0aW9uc1tdLCBkZXN0cm95OiBGcm9udGVuZE1vZGVsUHJvamVjdGlvbk9wdGlvbnNbXSwgdXBkYXRlOiBGcm9udGVuZE1vZGVsUHJvamVjdGlvbk9wdGlvbnNbXX19IG9wdGlvbnMgLSBTdWJzY3JpcHRpb24gb3B0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7U2V0PChwYXlsb2FkOiBGcm9udGVuZE1vZGVsSG9va1Rlc3RDcmVhdGVVcGRhdGVQYXlsb2FkKSA9PiB2b2lkPn0gdXBkYXRlIC0gVXBkYXRlIGNhbGxiYWNrcy5cbiAqL1xuXG4vKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgUmVhY3QgZWZmZWN0cyBoYXZlIHJ1bi4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZsdXNoRWZmZWN0cygpIHtcbiAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKClcbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG1pbGxpc2Vjb25kcyAtIE1pbGxpc2Vjb25kcyB0byB3YWl0LlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgdGhlIGRlbGF5LlxuICovXG5hc3luYyBmdW5jdGlvbiBzbGVlcChtaWxsaXNlY29uZHMpIHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmRzKSlcbn1cblxuLyoqXG4gKiBAcGFyYW0geygpID0+IGJvb2xlYW59IGNhbGxiYWNrIC0gUHJlZGljYXRlIHRvIHdhaXQgZm9yLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiB0aGUgcHJlZGljYXRlIHJldHVybnMgdHJ1ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2FpdEZvcihjYWxsYmFjaykge1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpXG5cbiAgd2hpbGUgKCFjYWxsYmFjaygpKSB7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGFydGVkQXQgPiAxMDAwKSByZXR1cm5cblxuICAgIGF3YWl0IHNsZWVwKDEwKVxuICB9XG59XG5cbi8qKiBAcmV0dXJucyB7RmFrZVN1YnNjcmlwdGlvbnN9IC0gRW1wdHkgZmFrZSBzdWJzY3JpcHRpb24gc3RvcmUuICovXG5mdW5jdGlvbiBidWlsZEZha2VTdWJzY3JpcHRpb25zKCkge1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZTogbmV3IFNldCgpLFxuICAgIGRlc3Ryb3k6IG5ldyBTZXQoKSxcbiAgICBvcHRpb25zOiB7Y3JlYXRlOiBbXSwgZGVzdHJveTogW10sIHVwZGF0ZTogW119LFxuICAgIHVwZGF0ZTogbmV3IFNldCgpXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lIC0gRmFrZSBmcm9udGVuZCBtb2RlbCBuYW1lLlxuICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ30gLSBNaW5pbWFsIHJlc291cmNlIGNvbmZpZyBmb3IgZmFrZSBzdWJjbGFzc2VzLlxuICovXG5mdW5jdGlvbiBmYWtlUmVzb3VyY2VDb25maWcobW9kZWxOYW1lKSB7XG4gIHJldHVybiB7XG4gICAgYXR0cmlidXRlczogW1wiaWRcIl0sXG4gICAgbW9kZWxOYW1lLFxuICAgIHByaW1hcnlLZXk6IFwiaWRcIlxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWFjdC5SZWFjdEVsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJlbmRlci5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHtyZXJlbmRlcjogKG5leHRFbGVtZW50OiBSZWFjdC5SZWFjdEVsZW1lbnQpID0+IFByb21pc2U8dm9pZD4sIHVubW91bnQ6ICgpID0+IFByb21pc2U8dm9pZD59Pn0gLSBSZW5kZXIgY29udHJvbHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlbmRlckVsZW1lbnQoZWxlbWVudCkge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyKVxuICBjb25zdCByb290ID0gY3JlYXRlUm9vdChjb250YWluZXIpXG5cbiAgcm9vdC5yZW5kZXIoZWxlbWVudClcbiAgYXdhaXQgZmx1c2hFZmZlY3RzKClcblxuICByZXR1cm4ge1xuICAgIHJlcmVuZGVyOiBhc3luYyAobmV4dEVsZW1lbnQpID0+IHtcbiAgICAgIHJvb3QucmVuZGVyKG5leHRFbGVtZW50KVxuICAgICAgYXdhaXQgZmx1c2hFZmZlY3RzKClcbiAgICB9LFxuICAgIHVubW91bnQ6IGFzeW5jICgpID0+IHtcbiAgICAgIHJvb3QudW5tb3VudCgpXG4gICAgICBjb250YWluZXIucmVtb3ZlKClcbiAgICAgIGF3YWl0IGZsdXNoRWZmZWN0cygpXG4gICAgfVxuICB9XG59XG5cbi8qKiBAcmV0dXJucyB7e01vZGVsQ2xhc3M6IHR5cGVvZiBGcm9udGVuZE1vZGVsQmFzZSwgc3Vic2NyaXB0aW9uczogRmFrZVN1YnNjcmlwdGlvbnN9fSAtIEZha2UgbW9kZWwgY2xhc3Mgc2V0dXAuICovXG5mdW5jdGlvbiBidWlsZEZha2VNb2RlbENsYXNzKCkge1xuICBjb25zdCBzdWJzY3JpcHRpb25zID0gYnVpbGRGYWtlU3Vic2NyaXB0aW9ucygpXG5cbiAgY2xhc3MgRmFrZU1vZGVsQ2xhc3MgZXh0ZW5kcyBGcm9udGVuZE1vZGVsQmFzZSB7XG4gICAgLyoqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd9IC0gRmFrZSByZXNvdXJjZSBjb25maWcuICovXG4gICAgc3RhdGljIHJlc291cmNlQ29uZmlnKCkge1xuICAgICAgcmV0dXJuIGZha2VSZXNvdXJjZUNvbmZpZyhcIkhvb2tGYWtlQ2xhc3NNb2RlbFwiKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7KHBheWxvYWQ6IEZyb250ZW5kTW9kZWxIb29rVGVzdENyZWF0ZVVwZGF0ZVBheWxvYWQpID0+IHZvaWR9IGNhbGxiYWNrIC0gRXZlbnQgY2FsbGJhY2suXG4gICAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsUHJvamVjdGlvbk9wdGlvbnN9IFtvcHRpb25zXSAtIFByb2plY3Rpb24gb3B0aW9ucy5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTwoKSA9PiB2b2lkPn0gLSBVbnN1YnNjcmliZSBjYWxsYmFjay5cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgb25DcmVhdGUoY2FsbGJhY2ssIG9wdGlvbnMgPSB7fSkge1xuICAgICAgc3Vic2NyaXB0aW9ucy5jcmVhdGUuYWRkKGNhbGxiYWNrKVxuICAgICAgc3Vic2NyaXB0aW9ucy5vcHRpb25zLmNyZWF0ZS5wdXNoKG9wdGlvbnMpXG5cbiAgICAgIHJldHVybiAoKSA9PiBzdWJzY3JpcHRpb25zLmNyZWF0ZS5kZWxldGUoY2FsbGJhY2spXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHsocGF5bG9hZDogRnJvbnRlbmRNb2RlbEhvb2tUZXN0RGVzdHJveVBheWxvYWQpID0+IHZvaWR9IGNhbGxiYWNrIC0gRXZlbnQgY2FsbGJhY2suXG4gICAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsUHJvamVjdGlvbk9wdGlvbnN9IFtvcHRpb25zXSAtIFByb2plY3Rpb24gb3B0aW9ucy5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTwoKSA9PiB2b2lkPn0gLSBVbnN1YnNjcmliZSBjYWxsYmFjay5cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgb25EZXN0cm95KGNhbGxiYWNrLCBvcHRpb25zID0ge30pIHtcbiAgICAgIHN1YnNjcmlwdGlvbnMuZGVzdHJveS5hZGQoY2FsbGJhY2spXG4gICAgICBzdWJzY3JpcHRpb25zLm9wdGlvbnMuZGVzdHJveS5wdXNoKG9wdGlvbnMpXG5cbiAgICAgIHJldHVybiAoKSA9PiBzdWJzY3JpcHRpb25zLmRlc3Ryb3kuZGVsZXRlKGNhbGxiYWNrKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7KHBheWxvYWQ6IEZyb250ZW5kTW9kZWxIb29rVGVzdENyZWF0ZVVwZGF0ZVBheWxvYWQpID0+IHZvaWR9IGNhbGxiYWNrIC0gRXZlbnQgY2FsbGJhY2suXG4gICAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsUHJvamVjdGlvbk9wdGlvbnN9IFtvcHRpb25zXSAtIFByb2plY3Rpb24gb3B0aW9ucy5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTwoKSA9PiB2b2lkPn0gLSBVbnN1YnNjcmliZSBjYWxsYmFjay5cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgb25VcGRhdGUoY2FsbGJhY2ssIG9wdGlvbnMgPSB7fSkge1xuICAgICAgc3Vic2NyaXB0aW9ucy51cGRhdGUuYWRkKGNhbGxiYWNrKVxuICAgICAgc3Vic2NyaXB0aW9ucy5vcHRpb25zLnVwZGF0ZS5wdXNoKG9wdGlvbnMpXG5cbiAgICAgIHJldHVybiAoKSA9PiBzdWJzY3JpcHRpb25zLnVwZGF0ZS5kZWxldGUoY2FsbGJhY2spXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtNb2RlbENsYXNzOiBGYWtlTW9kZWxDbGFzcywgc3Vic2NyaXB0aW9uc31cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0Zha2VTdWJzY3JpcHRpb25zfSBzdWJzY3JpcHRpb25zIC0gQ2FsbGJhY2sgc2V0cy5cbiAqIEBwYXJhbSB7XCJjcmVhdGVcIiB8IFwiZGVzdHJveVwiIHwgXCJ1cGRhdGVcIn0gZXZlbnROYW1lIC0gRXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbEhvb2tUZXN0Q3JlYXRlVXBkYXRlUGF5bG9hZCB8IEZyb250ZW5kTW9kZWxIb29rVGVzdERlc3Ryb3lQYXlsb2FkfSBwYXlsb2FkIC0gRXZlbnQgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBlbWl0RXZlbnQoc3Vic2NyaXB0aW9ucywgZXZlbnROYW1lLCBwYXlsb2FkKSB7XG4gIGlmIChldmVudE5hbWUgPT09IFwiZGVzdHJveVwiKSB7XG4gICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiBzdWJzY3JpcHRpb25zLmRlc3Ryb3kpIHtcbiAgICAgIGNhbGxiYWNrKHtpZDogcGF5bG9hZC5pZH0pXG4gICAgfVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoIShcIm1vZGVsXCIgaW4gcGF5bG9hZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG1vZGVsIHBheWxvYWQgZm9yICR7ZXZlbnROYW1lfWApXG4gIH1cblxuICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIHN1YnNjcmlwdGlvbnNbZXZlbnROYW1lXSkge1xuICAgIGNhbGxiYWNrKHBheWxvYWQpXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBNb2RlbCBpZC5cbiAqIEBwYXJhbSB7RmFrZVN1YnNjcmlwdGlvbnN9IHN1YnNjcmlwdGlvbnMgLSBDYWxsYmFjayBzZXRzLlxuICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxCYXNlfSAtIEZha2UgbW9kZWwgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkRmFrZU1vZGVsKGlkLCBzdWJzY3JpcHRpb25zKSB7XG4gIGNsYXNzIEZha2VNb2RlbCBleHRlbmRzIEZyb250ZW5kTW9kZWxCYXNlIHtcbiAgICAvKiogQHJldHVybnMge0Zyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ30gLSBGYWtlIHJlc291cmNlIGNvbmZpZy4gKi9cbiAgICBzdGF0aWMgcmVzb3VyY2VDb25maWcoKSB7XG4gICAgICByZXR1cm4gZmFrZVJlc291cmNlQ29uZmlnKFwiSG9va0Zha2VJbnN0YW5jZU1vZGVsXCIpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHsocGF5bG9hZDogRnJvbnRlbmRNb2RlbEhvb2tUZXN0RGVzdHJveVBheWxvYWQpID0+IHZvaWR9IGNhbGxiYWNrIC0gRXZlbnQgY2FsbGJhY2suXG4gICAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsUHJvamVjdGlvbk9wdGlvbnN9IFtvcHRpb25zXSAtIFByb2plY3Rpb24gb3B0aW9ucy5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTwoKSA9PiB2b2lkPn0gLSBVbnN1YnNjcmliZSBjYWxsYmFjay5cbiAgICAgKi9cbiAgICBhc3luYyBvbkRlc3Ryb3koY2FsbGJhY2ssIG9wdGlvbnMgPSB7fSkge1xuICAgICAgc3Vic2NyaXB0aW9ucy5kZXN0cm95LmFkZChjYWxsYmFjaylcbiAgICAgIHN1YnNjcmlwdGlvbnMub3B0aW9ucy5kZXN0cm95LnB1c2gob3B0aW9ucylcblxuICAgICAgcmV0dXJuICgpID0+IHN1YnNjcmlwdGlvbnMuZGVzdHJveS5kZWxldGUoY2FsbGJhY2spXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHsocGF5bG9hZDogRnJvbnRlbmRNb2RlbEhvb2tUZXN0Q3JlYXRlVXBkYXRlUGF5bG9hZCkgPT4gdm9pZH0gY2FsbGJhY2sgLSBFdmVudCBjYWxsYmFjay5cbiAgICAgKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxQcm9qZWN0aW9uT3B0aW9uc30gW29wdGlvbnNdIC0gUHJvamVjdGlvbiBvcHRpb25zLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPCgpID0+IHZvaWQ+fSAtIFVuc3Vic2NyaWJlIGNhbGxiYWNrLlxuICAgICAqL1xuICAgIGFzeW5jIG9uVXBkYXRlKGNhbGxiYWNrLCBvcHRpb25zID0ge30pIHtcbiAgICAgIHN1YnNjcmlwdGlvbnMudXBkYXRlLmFkZChjYWxsYmFjaylcbiAgICAgIHN1YnNjcmlwdGlvbnMub3B0aW9ucy51cGRhdGUucHVzaChvcHRpb25zKVxuXG4gICAgICByZXR1cm4gKCkgPT4gc3Vic2NyaXB0aW9ucy51cGRhdGUuZGVsZXRlKGNhbGxiYWNrKVxuICAgIH1cblxuICAgIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAtIFByaW1hcnkga2V5IHZhbHVlLiAqL1xuICAgIHByaW1hcnlLZXlWYWx1ZSgpIHtcbiAgICAgIHJldHVybiBpZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgRmFrZU1vZGVsKHtpZH0pXG59XG5cbi8qKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+Pn0gLSBTY2VuYXJpbyByZXN1bHQuICovXG5hc3luYyBmdW5jdGlvbiBjbGFzc0xpZmVjeWNsZVNjZW5hcmlvKCkge1xuICBjb25zdCB7TW9kZWxDbGFzcywgc3Vic2NyaXB0aW9uc30gPSBidWlsZEZha2VNb2RlbENsYXNzKClcbiAgY29uc3QgZXZlbnRNb2RlbCA9IGJ1aWxkRmFrZU1vZGVsKFwiMVwiLCBidWlsZEZha2VTdWJzY3JpcHRpb25zKCkpXG4gIC8qKiBAdHlwZSB7QXJyYXk8RnJvbnRlbmRNb2RlbEhvb2tUZXN0Q3JlYXRlVXBkYXRlUGF5bG9hZCB8IEZyb250ZW5kTW9kZWxIb29rVGVzdERlc3Ryb3lQYXlsb2FkPn0gKi9cbiAgY29uc3QgcmVjZWl2ZWRFdmVudHMgPSBbXVxuICBsZXQgY29ubmVjdGVkQ291bnQgPSAwXG5cbiAgLyoqIEByZXR1cm5zIHtSZWFjdC5SZWFjdEVsZW1lbnR9IC0gVGVzdCBlbGVtZW50LiAqL1xuICBmdW5jdGlvbiBUZXN0Q29tcG9uZW50KCkge1xuICAgIHVzZU1vZGVsQ2xhc3NFdmVudChNb2RlbENsYXNzLCBbXCJjcmVhdGVcIiwgXCJ1cGRhdGVcIl0sIChwYXlsb2FkKSA9PiByZWNlaXZlZEV2ZW50cy5wdXNoKHBheWxvYWQpLCB7XG4gICAgICBvbkNvbm5lY3RlZDogKCkgPT4geyBjb25uZWN0ZWRDb3VudCArPSAxIH1cbiAgICB9KVxuICAgIHVzZUNyZWF0ZWRFdmVudChNb2RlbENsYXNzLCAocGF5bG9hZCkgPT4gcmVjZWl2ZWRFdmVudHMucHVzaChwYXlsb2FkKSlcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gIH1cblxuICBjb25zdCBjb250cm9scyA9IGF3YWl0IHJlbmRlckVsZW1lbnQoUmVhY3QuY3JlYXRlRWxlbWVudChUZXN0Q29tcG9uZW50KSlcbiAgYXdhaXQgd2FpdEZvcigoKSA9PiBzdWJzY3JpcHRpb25zLmNyZWF0ZS5zaXplID09PSAyICYmIHN1YnNjcmlwdGlvbnMudXBkYXRlLnNpemUgPT09IDEpXG5cbiAgY29uc3QgbW91bnRlZENyZWF0ZVN1YnNjcmlwdGlvbnMgPSBzdWJzY3JpcHRpb25zLmNyZWF0ZS5zaXplXG4gIGNvbnN0IG1vdW50ZWRVcGRhdGVTdWJzY3JpcHRpb25zID0gc3Vic2NyaXB0aW9ucy51cGRhdGUuc2l6ZVxuICBjb25zdCBtb3VudGVkRGVzdHJveVN1YnNjcmlwdGlvbnMgPSBzdWJzY3JpcHRpb25zLmRlc3Ryb3kuc2l6ZVxuICBjb25zdCBtb3VudGVkQ29ubmVjdGVkQ291bnQgPSBjb25uZWN0ZWRDb3VudFxuXG4gIGVtaXRFdmVudChzdWJzY3JpcHRpb25zLCBcImNyZWF0ZVwiLCB7aWQ6IFwiMVwiLCBtb2RlbDogZXZlbnRNb2RlbH0pXG4gIGVtaXRFdmVudChzdWJzY3JpcHRpb25zLCBcInVwZGF0ZVwiLCB7aWQ6IFwiMVwiLCBtb2RlbDogZXZlbnRNb2RlbH0pXG4gIGVtaXRFdmVudChzdWJzY3JpcHRpb25zLCBcImRlc3Ryb3lcIiwge2lkOiBcIjFcIn0pXG5cbiAgY29uc3QgcmVjZWl2ZWRFdmVudHNBZnRlckVtaXQgPSByZWNlaXZlZEV2ZW50cy5sZW5ndGhcblxuICBhd2FpdCBjb250cm9scy51bm1vdW50KClcblxuICByZXR1cm4ge1xuICAgIG1vdW50ZWRDb25uZWN0ZWRDb3VudCxcbiAgICBtb3VudGVkQ3JlYXRlU3Vic2NyaXB0aW9ucyxcbiAgICBtb3VudGVkRGVzdHJveVN1YnNjcmlwdGlvbnMsXG4gICAgbW91bnRlZFVwZGF0ZVN1YnNjcmlwdGlvbnMsXG4gICAgcmVjZWl2ZWRFdmVudHNBZnRlckVtaXQsXG4gICAgdW5tb3VudGVkQ3JlYXRlU3Vic2NyaXB0aW9uczogc3Vic2NyaXB0aW9ucy5jcmVhdGUuc2l6ZSxcbiAgICB1bm1vdW50ZWRVcGRhdGVTdWJzY3JpcHRpb25zOiBzdWJzY3JpcHRpb25zLnVwZGF0ZS5zaXplXG4gIH1cbn1cblxuLyoqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+fSAtIFNjZW5hcmlvIHJlc3VsdC4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluc3RhbmNlTGlmZWN5Y2xlU2NlbmFyaW8oKSB7XG4gIGNvbnN0IHN1YnNjcmlwdGlvbnMgPSBidWlsZEZha2VTdWJzY3JpcHRpb25zKClcbiAgY29uc3QgbW9kZWwgPSBidWlsZEZha2VNb2RlbChcInRhc2stMVwiLCBzdWJzY3JpcHRpb25zKVxuICAvKiogQHR5cGUge0FycmF5PEZyb250ZW5kTW9kZWxIb29rVGVzdENyZWF0ZVVwZGF0ZVBheWxvYWQgfCBGcm9udGVuZE1vZGVsSG9va1Rlc3REZXN0cm95UGF5bG9hZD59ICovXG4gIGNvbnN0IHJlY2VpdmVkRXZlbnRzID0gW11cbiAgbGV0IGNvbm5lY3RlZENvdW50ID0gMFxuXG4gIC8qKiBAcmV0dXJucyB7UmVhY3QuUmVhY3RFbGVtZW50fSAtIFRlc3QgZWxlbWVudC4gKi9cbiAgZnVuY3Rpb24gVGVzdENvbXBvbmVudCgpIHtcbiAgICB1c2VVcGRhdGVkRXZlbnQobW9kZWwsIChwYXlsb2FkKSA9PiByZWNlaXZlZEV2ZW50cy5wdXNoKHBheWxvYWQpLCB7XG4gICAgICBvbkNvbm5lY3RlZDogKCkgPT4geyBjb25uZWN0ZWRDb3VudCArPSAxIH1cbiAgICB9KVxuICAgIHVzZURlc3Ryb3llZEV2ZW50KFttb2RlbF0sIChwYXlsb2FkKSA9PiByZWNlaXZlZEV2ZW50cy5wdXNoKHBheWxvYWQpLCB7XG4gICAgICBvbkNvbm5lY3RlZDogKCkgPT4geyBjb25uZWN0ZWRDb3VudCArPSAxIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgfVxuXG4gIGNvbnN0IGNvbnRyb2xzID0gYXdhaXQgcmVuZGVyRWxlbWVudChSZWFjdC5jcmVhdGVFbGVtZW50KFRlc3RDb21wb25lbnQpKVxuICBhd2FpdCB3YWl0Rm9yKCgpID0+IHN1YnNjcmlwdGlvbnMudXBkYXRlLnNpemUgPT09IDEgJiYgc3Vic2NyaXB0aW9ucy5kZXN0cm95LnNpemUgPT09IDEpXG5cbiAgY29uc3QgbW91bnRlZENvbm5lY3RlZENvdW50ID0gY29ubmVjdGVkQ291bnRcbiAgY29uc3QgbW91bnRlZERlc3Ryb3lTdWJzY3JpcHRpb25zID0gc3Vic2NyaXB0aW9ucy5kZXN0cm95LnNpemVcbiAgY29uc3QgbW91bnRlZFVwZGF0ZVN1YnNjcmlwdGlvbnMgPSBzdWJzY3JpcHRpb25zLnVwZGF0ZS5zaXplXG5cbiAgZW1pdEV2ZW50KHN1YnNjcmlwdGlvbnMsIFwidXBkYXRlXCIsIHtpZDogXCJ0YXNrLTFcIiwgbW9kZWx9KVxuICBlbWl0RXZlbnQoc3Vic2NyaXB0aW9ucywgXCJkZXN0cm95XCIsIHtpZDogXCJ0YXNrLTFcIn0pXG5cbiAgY29uc3QgcmVjZWl2ZWRFdmVudHNBZnRlckVtaXQgPSByZWNlaXZlZEV2ZW50cy5sZW5ndGhcblxuICBhd2FpdCBjb250cm9scy51bm1vdW50KClcblxuICByZXR1cm4ge1xuICAgIG1vdW50ZWRDb25uZWN0ZWRDb3VudCxcbiAgICBtb3VudGVkRGVzdHJveVN1YnNjcmlwdGlvbnMsXG4gICAgbW91bnRlZFVwZGF0ZVN1YnNjcmlwdGlvbnMsXG4gICAgcmVjZWl2ZWRFdmVudHNBZnRlckVtaXQsXG4gICAgdW5tb3VudGVkRGVzdHJveVN1YnNjcmlwdGlvbnM6IHN1YnNjcmlwdGlvbnMuZGVzdHJveS5zaXplLFxuICAgIHVubW91bnRlZFVwZGF0ZVN1YnNjcmlwdGlvbnM6IHN1YnNjcmlwdGlvbnMudXBkYXRlLnNpemVcbiAgfVxufVxuXG4vKiogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj59IC0gU2NlbmFyaW8gcmVzdWx0LiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvamVjdGlvbk9wdGlvbnNTY2VuYXJpbygpIHtcbiAgY29uc3Qge01vZGVsQ2xhc3MsIHN1YnNjcmlwdGlvbnM6IGNsYXNzU3Vic2NyaXB0aW9uc30gPSBidWlsZEZha2VNb2RlbENsYXNzKClcbiAgY29uc3QgaW5zdGFuY2VTdWJzY3JpcHRpb25zID0gYnVpbGRGYWtlU3Vic2NyaXB0aW9ucygpXG4gIGNvbnN0IG1vZGVsID0gYnVpbGRGYWtlTW9kZWwoXCJ0YXNrLTFcIiwgaW5zdGFuY2VTdWJzY3JpcHRpb25zKVxuXG4gIC8qKiBAcmV0dXJucyB7UmVhY3QuUmVhY3RFbGVtZW50fSAtIFRlc3QgZWxlbWVudC4gKi9cbiAgZnVuY3Rpb24gVGVzdENvbXBvbmVudCgpIHtcbiAgICB1c2VDcmVhdGVkRXZlbnQoTW9kZWxDbGFzcywgKCkgPT4ge30sIHtcbiAgICAgIHByZWxvYWQ6IFwicHJvamVjdFwiLFxuICAgICAgc2VsZWN0OiB7VGFzazogW1wiaWRcIiwgXCJuYW1lVXBwZXJjYXNlXCJdfVxuICAgIH0pXG4gICAgdXNlVXBkYXRlZEV2ZW50KG1vZGVsLCAoKSA9PiB7fSwge1xuICAgICAgc2VsZWN0OiBbXCJpZFwiXSxcbiAgICAgIHdpdGhDb3VudDogXCJjb21tZW50c1wiXG4gICAgfSlcbiAgICB1c2VEZXN0cm95ZWRFdmVudChtb2RlbCwgKCkgPT4ge30sIHtcbiAgICAgIHByZWxvYWQ6IFwicHJvamVjdFwiLFxuICAgICAgc2VsZWN0OiBbXCJpZFwiXVxuICAgIH0pXG5cbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICB9XG5cbiAgY29uc3QgY29udHJvbHMgPSBhd2FpdCByZW5kZXJFbGVtZW50KFJlYWN0LmNyZWF0ZUVsZW1lbnQoVGVzdENvbXBvbmVudCkpXG4gIGF3YWl0IHdhaXRGb3IoKCkgPT4gY2xhc3NTdWJzY3JpcHRpb25zLmNyZWF0ZS5zaXplID09PSAxICYmIGluc3RhbmNlU3Vic2NyaXB0aW9ucy51cGRhdGUuc2l6ZSA9PT0gMSAmJiBpbnN0YW5jZVN1YnNjcmlwdGlvbnMuZGVzdHJveS5zaXplID09PSAxKVxuXG4gIGNvbnN0IGNyZWF0ZU9wdGlvbnMgPSBjbGFzc1N1YnNjcmlwdGlvbnMub3B0aW9ucy5jcmVhdGVbMF0gfHwge31cbiAgY29uc3QgdXBkYXRlT3B0aW9ucyA9IGluc3RhbmNlU3Vic2NyaXB0aW9ucy5vcHRpb25zLnVwZGF0ZVswXSB8fCB7fVxuICBjb25zdCBkZXN0cm95T3B0aW9ucyA9IGluc3RhbmNlU3Vic2NyaXB0aW9ucy5vcHRpb25zLmRlc3Ryb3lbMF0gfHwge31cblxuICBhd2FpdCBjb250cm9scy51bm1vdW50KClcblxuICByZXR1cm4ge1xuICAgIGNsYXNzQ3JlYXRlUHJlbG9hZFByb2plY3Q6IGNyZWF0ZU9wdGlvbnMucHJlbG9hZCA9PT0gXCJwcm9qZWN0XCIgPyAxIDogMCxcbiAgICBjbGFzc0NyZWF0ZVNlbGVjdENvdW50OiBjcmVhdGVPcHRpb25zLnNlbGVjdCAmJiB0eXBlb2YgY3JlYXRlT3B0aW9ucy5zZWxlY3QgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoY3JlYXRlT3B0aW9ucy5zZWxlY3QpICYmIEFycmF5LmlzQXJyYXkoY3JlYXRlT3B0aW9ucy5zZWxlY3QuVGFzaykgPyBjcmVhdGVPcHRpb25zLnNlbGVjdC5UYXNrLmxlbmd0aCA6IDAsXG4gICAgaW5zdGFuY2VEZXN0cm95UHJlbG9hZFByb2plY3Q6IGRlc3Ryb3lPcHRpb25zLnByZWxvYWQgPT09IFwicHJvamVjdFwiID8gMSA6IDAsXG4gICAgaW5zdGFuY2VEZXN0cm95U2VsZWN0Q291bnQ6IEFycmF5LmlzQXJyYXkoZGVzdHJveU9wdGlvbnMuc2VsZWN0KSA/IGRlc3Ryb3lPcHRpb25zLnNlbGVjdC5sZW5ndGggOiAwLFxuICAgIGluc3RhbmNlVXBkYXRlU2VsZWN0Q291bnQ6IEFycmF5LmlzQXJyYXkodXBkYXRlT3B0aW9ucy5zZWxlY3QpID8gdXBkYXRlT3B0aW9ucy5zZWxlY3QubGVuZ3RoIDogMCxcbiAgICBpbnN0YW5jZVVwZGF0ZVdpdGhDb3VudENvbW1lbnRzOiB1cGRhdGVPcHRpb25zLndpdGhDb3VudCA9PT0gXCJjb21tZW50c1wiID8gMSA6IDBcbiAgfVxufVxuXG4vKiogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj59IC0gU2NlbmFyaW8gcmVzdWx0LiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVib3VuY2VVbm1vdW50U2NlbmFyaW8oKSB7XG4gIGNvbnN0IHtNb2RlbENsYXNzLCBzdWJzY3JpcHRpb25zOiBjbGFzc1N1YnNjcmlwdGlvbnN9ID0gYnVpbGRGYWtlTW9kZWxDbGFzcygpXG4gIGNvbnN0IGluc3RhbmNlU3Vic2NyaXB0aW9ucyA9IGJ1aWxkRmFrZVN1YnNjcmlwdGlvbnMoKVxuICBjb25zdCBtb2RlbCA9IGJ1aWxkRmFrZU1vZGVsKFwidGFzay0xXCIsIGluc3RhbmNlU3Vic2NyaXB0aW9ucylcbiAgLyoqIEB0eXBlIHtBcnJheTxGcm9udGVuZE1vZGVsSG9va1Rlc3RDcmVhdGVVcGRhdGVQYXlsb2FkIHwgRnJvbnRlbmRNb2RlbEhvb2tUZXN0RGVzdHJveVBheWxvYWQ+fSAqL1xuICBjb25zdCByZWNlaXZlZEV2ZW50cyA9IFtdXG5cbiAgLyoqIEByZXR1cm5zIHtSZWFjdC5SZWFjdEVsZW1lbnR9IC0gVGVzdCBlbGVtZW50LiAqL1xuICBmdW5jdGlvbiBUZXN0Q29tcG9uZW50KCkge1xuICAgIHVzZU1vZGVsQ2xhc3NFdmVudChNb2RlbENsYXNzLCBcInVwZGF0ZVwiLCAocGF5bG9hZCkgPT4gcmVjZWl2ZWRFdmVudHMucHVzaChwYXlsb2FkKSwge2RlYm91bmNlOiAyMH0pXG4gICAgdXNlVXBkYXRlZEV2ZW50KG1vZGVsLCAocGF5bG9hZCkgPT4gcmVjZWl2ZWRFdmVudHMucHVzaChwYXlsb2FkKSwge2RlYm91bmNlOiAyMH0pXG4gICAgdXNlRGVzdHJveWVkRXZlbnQobW9kZWwsIChwYXlsb2FkKSA9PiByZWNlaXZlZEV2ZW50cy5wdXNoKHBheWxvYWQpLCB7ZGVib3VuY2U6IDIwfSlcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gIH1cblxuICBjb25zdCBjb250cm9scyA9IGF3YWl0IHJlbmRlckVsZW1lbnQoUmVhY3QuY3JlYXRlRWxlbWVudChUZXN0Q29tcG9uZW50KSlcbiAgYXdhaXQgd2FpdEZvcigoKSA9PiBjbGFzc1N1YnNjcmlwdGlvbnMudXBkYXRlLnNpemUgPT09IDEgJiYgaW5zdGFuY2VTdWJzY3JpcHRpb25zLnVwZGF0ZS5zaXplID09PSAxICYmIGluc3RhbmNlU3Vic2NyaXB0aW9ucy5kZXN0cm95LnNpemUgPT09IDEpXG5cbiAgZW1pdEV2ZW50KGNsYXNzU3Vic2NyaXB0aW9ucywgXCJ1cGRhdGVcIiwge2lkOiBcInRhc2stMVwiLCBtb2RlbH0pXG4gIGVtaXRFdmVudChpbnN0YW5jZVN1YnNjcmlwdGlvbnMsIFwidXBkYXRlXCIsIHtpZDogXCJ0YXNrLTFcIiwgbW9kZWx9KVxuICBlbWl0RXZlbnQoaW5zdGFuY2VTdWJzY3JpcHRpb25zLCBcImRlc3Ryb3lcIiwge2lkOiBcInRhc2stMVwifSlcblxuICBhd2FpdCBjb250cm9scy51bm1vdW50KClcbiAgYXdhaXQgc2xlZXAoMzApXG5cbiAgcmV0dXJuIHtyZWNlaXZlZEV2ZW50c0FmdGVyRGVib3VuY2VXaW5kb3c6IHJlY2VpdmVkRXZlbnRzLmxlbmd0aH1cbn1cblxuLyoqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+fSAtIFNjZW5hcmlvIHJlc3VsdC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc3Vic2NyaWJlSW5zdGFuY2VTY2VuYXJpbygpIHtcbiAgY29uc3QgZmlyc3RTdWJzY3JpcHRpb25zID0gYnVpbGRGYWtlU3Vic2NyaXB0aW9ucygpXG4gIGNvbnN0IHNlY29uZFN1YnNjcmlwdGlvbnMgPSBidWlsZEZha2VTdWJzY3JpcHRpb25zKClcbiAgY29uc3QgZmlyc3RNb2RlbCA9IGJ1aWxkRmFrZU1vZGVsKFwidGFzay0xXCIsIGZpcnN0U3Vic2NyaXB0aW9ucylcbiAgY29uc3Qgc2Vjb25kTW9kZWwgPSBidWlsZEZha2VNb2RlbChcInRhc2stMVwiLCBzZWNvbmRTdWJzY3JpcHRpb25zKVxuICAvKiogQHR5cGUge0FycmF5PEZyb250ZW5kTW9kZWxIb29rVGVzdENyZWF0ZVVwZGF0ZVBheWxvYWQgfCBGcm9udGVuZE1vZGVsSG9va1Rlc3REZXN0cm95UGF5bG9hZD59ICovXG4gIGNvbnN0IHJlY2VpdmVkRXZlbnRzID0gW11cblxuICAvKipcbiAgICogQHBhcmFtIHt7bW9kZWw6IGltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVscy9iYXNlLmpzXCIpLmRlZmF1bHR9fSBwcm9wcyAtIENvbXBvbmVudCBwcm9wcy5cbiAgICogQHJldHVybnMge1JlYWN0LlJlYWN0RWxlbWVudH0gLSBUZXN0IGVsZW1lbnQuXG4gICAqL1xuICBmdW5jdGlvbiBUZXN0Q29tcG9uZW50KHttb2RlbH0pIHtcbiAgICB1c2VVcGRhdGVkRXZlbnQobW9kZWwsIChwYXlsb2FkKSA9PiByZWNlaXZlZEV2ZW50cy5wdXNoKHBheWxvYWQpKVxuICAgIHVzZURlc3Ryb3llZEV2ZW50KG1vZGVsLCAocGF5bG9hZCkgPT4gcmVjZWl2ZWRFdmVudHMucHVzaChwYXlsb2FkKSlcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gIH1cblxuICBjb25zdCBjb250cm9scyA9IGF3YWl0IHJlbmRlckVsZW1lbnQoUmVhY3QuY3JlYXRlRWxlbWVudChUZXN0Q29tcG9uZW50LCB7bW9kZWw6IGZpcnN0TW9kZWx9KSlcbiAgYXdhaXQgd2FpdEZvcigoKSA9PiBmaXJzdFN1YnNjcmlwdGlvbnMudXBkYXRlLnNpemUgPT09IDEgJiYgZmlyc3RTdWJzY3JpcHRpb25zLmRlc3Ryb3kuc2l6ZSA9PT0gMSlcblxuICBjb25zdCBmaXJzdE1vdW50ZWREZXN0cm95U3Vic2NyaXB0aW9ucyA9IGZpcnN0U3Vic2NyaXB0aW9ucy5kZXN0cm95LnNpemVcbiAgY29uc3QgZmlyc3RNb3VudGVkVXBkYXRlU3Vic2NyaXB0aW9ucyA9IGZpcnN0U3Vic2NyaXB0aW9ucy51cGRhdGUuc2l6ZVxuXG4gIGF3YWl0IGNvbnRyb2xzLnJlcmVuZGVyKFJlYWN0LmNyZWF0ZUVsZW1lbnQoVGVzdENvbXBvbmVudCwge21vZGVsOiBzZWNvbmRNb2RlbH0pKVxuICBhd2FpdCB3YWl0Rm9yKCgpID0+IGZpcnN0U3Vic2NyaXB0aW9ucy51cGRhdGUuc2l6ZSA9PT0gMCAmJiBmaXJzdFN1YnNjcmlwdGlvbnMuZGVzdHJveS5zaXplID09PSAwICYmIHNlY29uZFN1YnNjcmlwdGlvbnMudXBkYXRlLnNpemUgPT09IDEgJiYgc2Vjb25kU3Vic2NyaXB0aW9ucy5kZXN0cm95LnNpemUgPT09IDEpXG5cbiAgY29uc3QgZmlyc3RBZnRlclJlcmVuZGVyRGVzdHJveVN1YnNjcmlwdGlvbnMgPSBmaXJzdFN1YnNjcmlwdGlvbnMuZGVzdHJveS5zaXplXG4gIGNvbnN0IGZpcnN0QWZ0ZXJSZXJlbmRlclVwZGF0ZVN1YnNjcmlwdGlvbnMgPSBmaXJzdFN1YnNjcmlwdGlvbnMudXBkYXRlLnNpemVcbiAgY29uc3Qgc2Vjb25kQWZ0ZXJSZXJlbmRlckRlc3Ryb3lTdWJzY3JpcHRpb25zID0gc2Vjb25kU3Vic2NyaXB0aW9ucy5kZXN0cm95LnNpemVcbiAgY29uc3Qgc2Vjb25kQWZ0ZXJSZXJlbmRlclVwZGF0ZVN1YnNjcmlwdGlvbnMgPSBzZWNvbmRTdWJzY3JpcHRpb25zLnVwZGF0ZS5zaXplXG5cbiAgZW1pdEV2ZW50KGZpcnN0U3Vic2NyaXB0aW9ucywgXCJ1cGRhdGVcIiwge2lkOiBcInRhc2stMVwiLCBtb2RlbDogZmlyc3RNb2RlbH0pXG4gIGVtaXRFdmVudChzZWNvbmRTdWJzY3JpcHRpb25zLCBcInVwZGF0ZVwiLCB7aWQ6IFwidGFzay0xXCIsIG1vZGVsOiBzZWNvbmRNb2RlbH0pXG4gIGVtaXRFdmVudChzZWNvbmRTdWJzY3JpcHRpb25zLCBcImRlc3Ryb3lcIiwge2lkOiBcInRhc2stMVwifSlcblxuICBjb25zdCByZWNlaXZlZEV2ZW50c0FmdGVyRW1pdCA9IHJlY2VpdmVkRXZlbnRzLmxlbmd0aFxuXG4gIGF3YWl0IGNvbnRyb2xzLnVubW91bnQoKVxuXG4gIHJldHVybiB7XG4gICAgZmlyc3RBZnRlclJlcmVuZGVyRGVzdHJveVN1YnNjcmlwdGlvbnMsXG4gICAgZmlyc3RBZnRlclJlcmVuZGVyVXBkYXRlU3Vic2NyaXB0aW9ucyxcbiAgICBmaXJzdE1vdW50ZWREZXN0cm95U3Vic2NyaXB0aW9ucyxcbiAgICBmaXJzdE1vdW50ZWRVcGRhdGVTdWJzY3JpcHRpb25zLFxuICAgIHJlY2VpdmVkRXZlbnRzQWZ0ZXJFbWl0LFxuICAgIHNlY29uZEFmdGVyUmVyZW5kZXJEZXN0cm95U3Vic2NyaXB0aW9ucyxcbiAgICBzZWNvbmRBZnRlclJlcmVuZGVyVXBkYXRlU3Vic2NyaXB0aW9uc1xuICB9XG59XG5cbmNvbnN0IHNjZW5hcmlvcyA9IHtcbiAgY2xhc3NMaWZlY3ljbGU6IGNsYXNzTGlmZWN5Y2xlU2NlbmFyaW8sXG4gIGRlYm91bmNlVW5tb3VudDogZGVib3VuY2VVbm1vdW50U2NlbmFyaW8sXG4gIGluc3RhbmNlTGlmZWN5Y2xlOiBpbnN0YW5jZUxpZmVjeWNsZVNjZW5hcmlvLFxuICBwcm9qZWN0aW9uT3B0aW9uczogcHJvamVjdGlvbk9wdGlvbnNTY2VuYXJpbyxcbiAgcmVzdWJzY3JpYmVJbnN0YW5jZTogcmVzdWJzY3JpYmVJbnN0YW5jZVNjZW5hcmlvXG59XG5cbi8qKlxuICogQHBhcmFtIHtrZXlvZiB0eXBlb2Ygc2NlbmFyaW9zfSBzY2VuYXJpb05hbWUgLSBTY2VuYXJpbyBuYW1lLlxuICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj59IC0gU2NlbmFyaW8gcmVzdWx0LlxuICovXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBydW5Gcm9udGVuZE1vZGVsRXZlbnRIb29rU2NlbmFyaW8oc2NlbmFyaW9OYW1lKSB7XG4gIGNvbnN0IHNjZW5hcmlvID0gc2NlbmFyaW9zW3NjZW5hcmlvTmFtZV1cblxuICBpZiAoIXNjZW5hcmlvKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZnJvbnRlbmQgbW9kZWwgZXZlbnQgaG9vayBzY2VuYXJpbzogJHtzY2VuYXJpb05hbWV9YClcblxuICByZXR1cm4gYXdhaXQgc2NlbmFyaW8oKVxufVxuIl19
|