velocious 1.0.666 → 1.0.668

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.
Files changed (174) hide show
  1. package/README.md +40 -11
  2. package/build/background-jobs/adapter-client.js +22 -0
  3. package/build/background-jobs/adapter.js +15 -0
  4. package/build/background-jobs/client.js +147 -1
  5. package/build/background-jobs/job-semantics.js +30 -0
  6. package/build/background-jobs/job.js +26 -1
  7. package/build/background-jobs/local-adapter.js +36 -8
  8. package/build/background-jobs/local-store.js +410 -39
  9. package/build/background-jobs/main.js +69 -2
  10. package/build/background-jobs/platform-job.js +26 -1
  11. package/build/background-jobs/runtime.js +58 -0
  12. package/build/background-jobs/store.js +374 -6
  13. package/build/background-jobs/types.js +27 -2
  14. package/build/background-jobs/web/controller.js +1 -0
  15. package/build/configuration.js +30 -6
  16. package/build/database/drivers/mssql/column.js +2 -2
  17. package/build/database/drivers/mssql/table.js +19 -5
  18. package/build/database/pool/async-tracked-multi-connection.js +2 -1
  19. package/build/database/query/alter-table-base.js +8 -1
  20. package/build/database/record/attachments/store.js +2 -2
  21. package/build/environment-handlers/node/cli/commands/test/timing-manifest/merge.js +2 -48
  22. package/build/environment-handlers/node/cli/commands/test.js +17 -69
  23. package/build/frontend-model-controller.js +22 -2
  24. package/build/frontend-models/websocket-channel.js +18 -0
  25. package/build/http-server/client/websocket-session.js +41 -4
  26. package/build/http-server/websocket-channel.js +14 -0
  27. package/build/http-server/websocket-event-log-store.js +85 -12
  28. package/build/http-server/websocket-events-host.js +17 -7
  29. package/build/src/background-jobs/adapter-client.d.ts +17 -0
  30. package/build/src/background-jobs/adapter-client.d.ts.map +1 -1
  31. package/build/src/background-jobs/adapter-client.js +19 -1
  32. package/build/src/background-jobs/adapter.d.ts +15 -0
  33. package/build/src/background-jobs/adapter.d.ts.map +1 -1
  34. package/build/src/background-jobs/adapter.js +14 -1
  35. package/build/src/background-jobs/client.d.ts +17 -0
  36. package/build/src/background-jobs/client.d.ts.map +1 -1
  37. package/build/src/background-jobs/client.js +129 -1
  38. package/build/src/background-jobs/job-semantics.d.ts +18 -0
  39. package/build/src/background-jobs/job-semantics.d.ts.map +1 -1
  40. package/build/src/background-jobs/job-semantics.js +28 -1
  41. package/build/src/background-jobs/job.d.ts +15 -0
  42. package/build/src/background-jobs/job.d.ts.map +1 -1
  43. package/build/src/background-jobs/job.js +21 -2
  44. package/build/src/background-jobs/local-adapter.d.ts +23 -8
  45. package/build/src/background-jobs/local-adapter.d.ts.map +1 -1
  46. package/build/src/background-jobs/local-adapter.js +35 -9
  47. package/build/src/background-jobs/local-store.d.ts +120 -5
  48. package/build/src/background-jobs/local-store.d.ts.map +1 -1
  49. package/build/src/background-jobs/local-store.js +366 -40
  50. package/build/src/background-jobs/main.d.ts +24 -2
  51. package/build/src/background-jobs/main.d.ts.map +1 -1
  52. package/build/src/background-jobs/main.js +68 -3
  53. package/build/src/background-jobs/platform-job.d.ts +15 -0
  54. package/build/src/background-jobs/platform-job.d.ts.map +1 -1
  55. package/build/src/background-jobs/platform-job.js +19 -2
  56. package/build/src/background-jobs/runtime.d.ts +39 -0
  57. package/build/src/background-jobs/runtime.d.ts.map +1 -1
  58. package/build/src/background-jobs/runtime.js +49 -1
  59. package/build/src/background-jobs/store.d.ts +100 -1
  60. package/build/src/background-jobs/store.d.ts.map +1 -1
  61. package/build/src/background-jobs/store.js +334 -8
  62. package/build/src/background-jobs/types.d.ts +97 -4
  63. package/build/src/background-jobs/types.d.ts.map +1 -1
  64. package/build/src/background-jobs/types.js +28 -3
  65. package/build/src/background-jobs/web/controller.d.ts.map +1 -1
  66. package/build/src/background-jobs/web/controller.js +2 -1
  67. package/build/src/configuration.d.ts +18 -1
  68. package/build/src/configuration.d.ts.map +1 -1
  69. package/build/src/configuration.js +28 -6
  70. package/build/src/database/drivers/mssql/column.d.ts.map +1 -1
  71. package/build/src/database/drivers/mssql/column.js +2 -2
  72. package/build/src/database/drivers/mssql/table.d.ts.map +1 -1
  73. package/build/src/database/drivers/mssql/table.js +19 -5
  74. package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
  75. package/build/src/database/pool/async-tracked-multi-connection.js +3 -2
  76. package/build/src/database/query/alter-table-base.d.ts.map +1 -1
  77. package/build/src/database/query/alter-table-base.js +9 -2
  78. package/build/src/database/record/attachments/store.js +3 -3
  79. package/build/src/environment-handlers/node/cli/commands/test/timing-manifest/merge.d.ts.map +1 -1
  80. package/build/src/environment-handlers/node/cli/commands/test/timing-manifest/merge.js +3 -47
  81. package/build/src/environment-handlers/node/cli/commands/test.d.ts +2 -28
  82. package/build/src/environment-handlers/node/cli/commands/test.d.ts.map +1 -1
  83. package/build/src/environment-handlers/node/cli/commands/test.js +10 -61
  84. package/build/src/frontend-model-controller.d.ts.map +1 -1
  85. package/build/src/frontend-model-controller.js +18 -3
  86. package/build/src/frontend-models/websocket-channel.d.ts +9 -0
  87. package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
  88. package/build/src/frontend-models/websocket-channel.js +16 -1
  89. package/build/src/http-server/client/websocket-session.d.ts +25 -2
  90. package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
  91. package/build/src/http-server/client/websocket-session.js +40 -5
  92. package/build/src/http-server/websocket-channel.d.ts +11 -0
  93. package/build/src/http-server/websocket-channel.d.ts.map +1 -1
  94. package/build/src/http-server/websocket-channel.js +14 -1
  95. package/build/src/http-server/websocket-event-log-store.d.ts +60 -41
  96. package/build/src/http-server/websocket-event-log-store.d.ts.map +1 -1
  97. package/build/src/http-server/websocket-event-log-store.js +79 -12
  98. package/build/src/http-server/websocket-events-host.d.ts +10 -3
  99. package/build/src/http-server/websocket-events-host.d.ts.map +1 -1
  100. package/build/src/http-server/websocket-events-host.js +17 -8
  101. package/build/src/testing/test-files-finder.d.ts +17 -117
  102. package/build/src/testing/test-files-finder.d.ts.map +1 -1
  103. package/build/src/testing/test-files-finder.js +29 -294
  104. package/build/src/testing/test-filter-parser.d.ts +32 -22
  105. package/build/src/testing/test-filter-parser.d.ts.map +1 -1
  106. package/build/src/testing/test-filter-parser.js +25 -217
  107. package/build/src/testing/test-profile-activity.d.ts +1 -6
  108. package/build/src/testing/test-profile-activity.d.ts.map +1 -1
  109. package/build/src/testing/test-profile-activity.js +2 -12
  110. package/build/src/testing/test-profile-output.d.ts +1 -40
  111. package/build/src/testing/test-profile-output.d.ts.map +1 -1
  112. package/build/src/testing/test-profile-output.js +2 -217
  113. package/build/src/testing/test-profiler.d.ts +15 -659
  114. package/build/src/testing/test-profiler.d.ts.map +1 -1
  115. package/build/src/testing/test-profiler.js +35 -833
  116. package/build/src/testing/test-runner.d.ts +10 -1
  117. package/build/src/testing/test-runner.d.ts.map +1 -1
  118. package/build/src/testing/test-runner.js +26 -4
  119. package/build/src/testing/test-suite-splitter.d.ts +1 -128
  120. package/build/src/testing/test-suite-splitter.d.ts.map +1 -1
  121. package/build/src/testing/test-suite-splitter.js +2 -259
  122. package/build/src/testing/timing-manifest.d.ts +5 -93
  123. package/build/src/testing/timing-manifest.d.ts.map +1 -1
  124. package/build/src/testing/timing-manifest.js +4 -283
  125. package/build/src/testing/velocious-attempt-executor.d.ts.map +1 -1
  126. package/build/src/testing/velocious-attempt-executor.js +8 -2
  127. package/build/testing/test-files-finder.js +32 -343
  128. package/build/testing/test-filter-parser.js +29 -248
  129. package/build/testing/test-profile-activity.js +1 -12
  130. package/build/testing/test-profile-output.js +8 -253
  131. package/build/testing/test-profiler.js +38 -895
  132. package/build/testing/test-runner.js +33 -9
  133. package/build/testing/test-suite-splitter.js +1 -301
  134. package/build/testing/timing-manifest.js +10 -344
  135. package/build/testing/velocious-attempt-executor.js +7 -1
  136. package/package.json +3 -3
  137. package/scripts/test-browser.js +30 -6
  138. package/scripts/verify-docker-dev-environment.js +13 -1
  139. package/src/background-jobs/adapter-client.js +22 -0
  140. package/src/background-jobs/adapter.js +15 -0
  141. package/src/background-jobs/client.js +147 -1
  142. package/src/background-jobs/job-semantics.js +30 -0
  143. package/src/background-jobs/job.js +26 -1
  144. package/src/background-jobs/local-adapter.js +36 -8
  145. package/src/background-jobs/local-store.js +410 -39
  146. package/src/background-jobs/main.js +69 -2
  147. package/src/background-jobs/platform-job.js +26 -1
  148. package/src/background-jobs/runtime.js +58 -0
  149. package/src/background-jobs/store.js +374 -6
  150. package/src/background-jobs/types.js +27 -2
  151. package/src/background-jobs/web/controller.js +1 -0
  152. package/src/configuration.js +30 -6
  153. package/src/database/drivers/mssql/column.js +2 -2
  154. package/src/database/drivers/mssql/table.js +19 -5
  155. package/src/database/pool/async-tracked-multi-connection.js +2 -1
  156. package/src/database/query/alter-table-base.js +8 -1
  157. package/src/database/record/attachments/store.js +2 -2
  158. package/src/environment-handlers/node/cli/commands/test/timing-manifest/merge.js +2 -48
  159. package/src/environment-handlers/node/cli/commands/test.js +17 -69
  160. package/src/frontend-model-controller.js +22 -2
  161. package/src/frontend-models/websocket-channel.js +18 -0
  162. package/src/http-server/client/websocket-session.js +41 -4
  163. package/src/http-server/websocket-channel.js +14 -0
  164. package/src/http-server/websocket-event-log-store.js +85 -12
  165. package/src/http-server/websocket-events-host.js +17 -7
  166. package/src/testing/test-files-finder.js +32 -343
  167. package/src/testing/test-filter-parser.js +29 -248
  168. package/src/testing/test-profile-activity.js +1 -12
  169. package/src/testing/test-profile-output.js +8 -253
  170. package/src/testing/test-profiler.js +38 -895
  171. package/src/testing/test-runner.js +33 -9
  172. package/src/testing/test-suite-splitter.js +1 -301
  173. package/src/testing/timing-manifest.js +10 -344
  174. package/src/testing/velocious-attempt-executor.js +7 -1
@@ -1,284 +1,5 @@
1
1
  // @ts-check
2
- import sha256Hex from "../utils/sha256-hex.js";
3
- /** @typedef {Record<string, number>} TimingManifest */
4
- /**
5
- * ValidatedProfileShard type.
6
- * @typedef {object} ValidatedProfileShard
7
- * @property {number} discoveredFileCount - Complete pre-shard file count.
8
- * @property {number} fileCount - Selected post-shard file count.
9
- * @property {number} groupNumber - One-indexed shard number.
10
- * @property {number} groups - Complete shard count.
11
- * @property {string} pathBase - Profiling path-base semantics.
12
- * @property {string} testFileSetHash - Complete canonical file-set identity.
13
- * @property {TimingManifest} timingManifest - Canonical shard timing map.
14
- */
15
- /**
16
- * TestProfileTimingManifestInput type.
17
- * @typedef {object} TestProfileTimingManifestInput
18
- * @property {ReturnType<typeof JSON.parse>} profile - Parsed rich test profile.
19
- * @property {string} source - Human-readable input source for validation errors.
20
- */
21
- /**
22
- * Canonicalizes a timing-manifest path relative to its profiling base.
23
- * @param {string} filePath - Candidate relative path.
24
- * @returns {string} - Portable canonical path.
25
- */
26
- export function canonicalTimingManifestPath(filePath) {
27
- if (typeof filePath !== "string" || filePath.length === 0) {
28
- throw new Error("Timing manifest keys must be non-empty relative paths");
29
- }
30
- const portablePath = filePath.replaceAll("\\", "/");
31
- if (portablePath.startsWith("/") || /^[A-Za-z]:/.test(portablePath)) {
32
- throw new Error(`Timing manifest key must be a relative path: ${filePath}`);
33
- }
34
- const segments = [];
35
- for (const segment of portablePath.split("/")) {
36
- if (!segment || segment === ".")
37
- continue;
38
- if (segment === "..") {
39
- if (segments.length === 0) {
40
- throw new Error(`Timing manifest key must be a non-escaping relative path: ${filePath}`);
41
- }
42
- segments.pop();
43
- continue;
44
- }
45
- segments.push(segment);
46
- }
47
- if (segments.length === 0) {
48
- throw new Error(`Timing manifest key must be a non-empty relative path: ${filePath}`);
49
- }
50
- return segments.join("/");
51
- }
52
- /**
53
- * Compares timing-manifest paths by JavaScript code units without locale rules.
54
- * @param {string} filePathA - First path.
55
- * @param {string} filePathB - Second path.
56
- * @returns {number} - Negative, zero, or positive ordering result.
57
- */
58
- export function compareTimingManifestPaths(filePathA, filePathB) {
59
- if (filePathA === filePathB)
60
- return 0;
61
- return filePathA < filePathB ? -1 : 1;
62
- }
63
- /**
64
- * Validates and sorts a plain timing manifest.
65
- * @param {ReturnType<typeof JSON.parse>} timingManifest - Parsed timing manifest.
66
- * @param {{source?: string}} [options] - Validation context.
67
- * @returns {TimingManifest} - Canonical sorted timing manifest.
68
- */
69
- export function validateTimingManifest(timingManifest, { source = "timing manifest" } = {}) {
70
- if (!timingManifest || typeof timingManifest !== "object" || Array.isArray(timingManifest)) {
71
- throw new Error(`${source} must be a plain JSON object mapping relative paths to durations`);
72
- }
73
- /** @type {Map<string, {duration: number, originalPath: string}>} */
74
- const entries = new Map();
75
- for (const [originalPath, duration] of Object.entries(timingManifest)) {
76
- if (typeof duration !== "number" || !Number.isFinite(duration) || duration < 0) {
77
- throw new Error(`${source} has an invalid duration for ${originalPath}`);
78
- }
79
- const canonicalPath = canonicalTimingManifestPath(originalPath);
80
- const existing = entries.get(canonicalPath);
81
- if (existing) {
82
- throw new Error(`${source} has a normalized path collision between ${existing.originalPath} and ${originalPath}`);
83
- }
84
- entries.set(canonicalPath, { duration, originalPath });
85
- }
86
- return Object.fromEntries([...entries.entries()]
87
- .sort(([filePathA], [filePathB]) => compareTimingManifestPaths(filePathA, filePathB))
88
- .map(([filePath, entry]) => [filePath, entry.duration]));
89
- }
90
- /**
91
- * Returns an opaque deterministic identity for a complete canonical test-file set.
92
- * @param {string[]} filePaths - Paths relative to one profiling base.
93
- * @returns {string} - SHA-256 file-set identity.
94
- */
95
- export function timingManifestFileSetHash(filePaths) {
96
- const pathManifest = Object.fromEntries(filePaths.map((filePath) => [filePath, 0]));
97
- const canonicalPaths = Object.keys(validateTimingManifest(pathManifest, { source: "test file set" }));
98
- const identity = `velocious.test-file-set.v1\0${canonicalPaths.join("\0")}`;
99
- return `sha256:${sha256Hex(identity)}`;
100
- }
101
- /**
102
- * Validates that a parsed JSON value is a non-array object.
103
- * @param {ReturnType<typeof JSON.parse>} value - Candidate object.
104
- * @param {string} message - Validation error message.
105
- * @returns {void}
106
- */
107
- function assertJsonObject(value, message) {
108
- if (!value || typeof value !== "object" || Array.isArray(value))
109
- throw new Error(message);
110
- }
111
- /**
112
- * Requires unfiltered, non-focused profile selection metadata.
113
- * @param {ReturnType<typeof JSON.parse>} selection - Rich profile selection.
114
- * @param {string} source - Input source.
115
- * @returns {void}
116
- */
117
- function assertCompleteSelection(selection, source) {
118
- if (selection.focused !== false)
119
- throw new Error(`${source} must not be a focused test profile`);
120
- const selectionFilters = [
121
- [selection.includeTagCount, 0],
122
- [selection.excludeTagCount, 0],
123
- [selection.hasExampleFilters, false],
124
- [selection.hasLineFilters, false]
125
- ];
126
- if (selectionFilters.some(([value, expected]) => value !== expected)) {
127
- throw new Error(`${source} must not be a filtered test profile`);
128
- }
129
- }
130
- /**
131
- * Validates shard numbering metadata.
132
- * @param {ReturnType<typeof JSON.parse>} shard - Candidate shard selection.
133
- * @param {string} source - Input source.
134
- * @returns {{groupNumber: number, groups: number}} - Validated shard numbers.
135
- */
136
- function validatedShardNumbers(shard, source) {
137
- assertJsonObject(shard, `${source} is missing shard metadata`);
138
- if (!Number.isInteger(shard.groups) || shard.groups < 1) {
139
- throw new Error(`${source} has an invalid shard group count`);
140
- }
141
- if (!Number.isInteger(shard.groupNumber) || shard.groupNumber < 1 || shard.groupNumber > shard.groups) {
142
- throw new Error(`${source} has an invalid shard number`);
143
- }
144
- return { groupNumber: shard.groupNumber, groups: shard.groups };
145
- }
146
- /**
147
- * Validates a non-negative integer selection count.
148
- * @param {ReturnType<typeof JSON.parse>} value - Candidate count.
149
- * @param {string} message - Validation error message.
150
- * @returns {number} - Validated count.
151
- */
152
- function validatedSelectionCount(value, message) {
153
- if (!Number.isInteger(value) || value < 0)
154
- throw new Error(message);
155
- return value;
156
- }
157
- /**
158
- * Validates the selection identity used across shard profiles.
159
- * @param {ReturnType<typeof JSON.parse>} selection - Rich profile selection.
160
- * @param {string} source - Input source.
161
- * @returns {{pathBase: string, testFileSetHash: string}} - Validated identity.
162
- */
163
- function validatedSelectionIdentity(selection, source) {
164
- if (!["configuration-directory", "test-directory"].includes(selection.pathBase)) {
165
- throw new Error(`${source} has an invalid timing manifest path base`);
166
- }
167
- if (typeof selection.testFileSetHash !== "string" || !/^sha256:[a-f0-9]{64}$/.test(selection.testFileSetHash)) {
168
- throw new Error(`${source} has an invalid test file set identity`);
169
- }
170
- return { pathBase: selection.pathBase, testFileSetHash: selection.testFileSetHash };
171
- }
172
- /**
173
- * Validates one rich profile and returns its aggregation contract.
174
- * @param {TestProfileTimingManifestInput} input - Profile input.
175
- * @returns {ValidatedProfileShard} - Validated shard contract.
176
- */
177
- function validatedProfileShard(input) {
178
- const { profile, source } = input;
179
- assertJsonObject(profile, `${source} must be a rich Velocious test profile`);
180
- if (profile.schema !== "velocious.test-profile" || profile.schemaVersion !== 1) {
181
- throw new Error(`${source} has an incompatible Velocious test profile schema`);
182
- }
183
- if (profile.status !== "passed")
184
- throw new Error(`${source} must have passed status for timing aggregation`);
185
- const selection = profile.selection;
186
- assertJsonObject(selection, `${source} is missing test profile selection metadata`);
187
- assertCompleteSelection(selection, source);
188
- const { groupNumber, groups } = validatedShardNumbers(selection.shard, source);
189
- const discoveredFileCount = validatedSelectionCount(selection.discoveredFileCount, `${source} has an invalid pre-shard discovered file count`);
190
- const fileCount = validatedSelectionCount(selection.fileCount, `${source} has an invalid post-shard file count`);
191
- const { pathBase, testFileSetHash } = validatedSelectionIdentity(selection, source);
192
- const timingManifest = validateTimingManifest(profile.timingManifest, { source: `${source} timing manifest` });
193
- if (Object.keys(timingManifest).length !== fileCount) {
194
- throw new Error(`${source} timing manifest does not match its post-shard file count`);
195
- }
196
- return {
197
- discoveredFileCount,
198
- fileCount,
199
- groupNumber,
200
- groups,
201
- pathBase,
202
- testFileSetHash,
203
- timingManifest
204
- };
205
- }
206
- /**
207
- * Requires one shard to describe the same complete selection as the first.
208
- * @param {ValidatedProfileShard} shard - Candidate shard.
209
- * @param {ValidatedProfileShard} expected - First shard contract.
210
- * @param {string} source - Candidate source.
211
- * @returns {void}
212
- */
213
- function assertCompatibleShard(shard, expected, source) {
214
- if (shard.groups !== expected.groups)
215
- throw new Error(`${source} has a different shard group count`);
216
- if (shard.pathBase !== expected.pathBase)
217
- throw new Error(`${source} has a different timing manifest path base`);
218
- if (shard.discoveredFileCount !== expected.discoveredFileCount)
219
- throw new Error(`${source} has a different discovered file count`);
220
- if (shard.testFileSetHash !== expected.testFileSetHash)
221
- throw new Error(`${source} has a different test file set identity`);
222
- }
223
- /**
224
- * Adds one validated shard timing map without allowing duplicate canonical keys.
225
- * @param {object} args - Merge state.
226
- * @param {Map<string, {duration: number, source: string}>} args.mergedEntries - Destination timing entries.
227
- * @param {ValidatedProfileShard} args.shard - Candidate shard.
228
- * @param {string} args.source - Candidate source.
229
- * @returns {void}
230
- */
231
- function mergeShardTimingManifest({ mergedEntries, shard, source }) {
232
- for (const [filePath, duration] of Object.entries(shard.timingManifest)) {
233
- const existingEntry = mergedEntries.get(filePath);
234
- if (existingEntry) {
235
- throw new Error(`Duplicate timing path ${filePath} in ${existingEntry.source} and ${source}`);
236
- }
237
- mergedEntries.set(filePath, { duration, source });
238
- }
239
- }
240
- /**
241
- * Merges a complete compatible set of rich Velocious shard profiles.
242
- * @param {TestProfileTimingManifestInput[]} inputs - Parsed profile documents and sources.
243
- * @returns {TimingManifest} - Complete sorted plain timing manifest.
244
- */
245
- export function mergeTestProfileTimingManifests(inputs) {
246
- if (inputs.length === 0)
247
- throw new Error("At least one rich test profile is required");
248
- const shards = inputs.map((input) => validatedProfileShard(input));
249
- const expected = shards[0];
250
- /** @type {Map<number, string>} */
251
- const shardSources = new Map();
252
- /** @type {Map<string, {duration: number, source: string}>} */
253
- const mergedEntries = new Map();
254
- let selectedFileCount = 0;
255
- for (let index = 0; index < shards.length; index++) {
256
- const shard = shards[index];
257
- const source = inputs[index].source;
258
- assertCompatibleShard(shard, expected, source);
259
- const existingShardSource = shardSources.get(shard.groupNumber);
260
- if (existingShardSource) {
261
- throw new Error(`Duplicate shard ${shard.groupNumber} in ${existingShardSource} and ${source}`);
262
- }
263
- shardSources.set(shard.groupNumber, source);
264
- selectedFileCount += shard.fileCount;
265
- mergeShardTimingManifest({ mergedEntries, shard, source });
266
- }
267
- const missingShardNumbers = [];
268
- for (let groupNumber = 1; groupNumber <= expected.groups; groupNumber++) {
269
- if (!shardSources.has(groupNumber))
270
- missingShardNumbers.push(groupNumber);
271
- }
272
- if (missingShardNumbers.length > 0) {
273
- throw new Error(`Missing shard profiles: ${missingShardNumbers.join(", ")}`);
274
- }
275
- if (selectedFileCount !== expected.discoveredFileCount || mergedEntries.size !== expected.discoveredFileCount) {
276
- throw new Error("Merged timing manifest does not cover the complete file universe");
277
- }
278
- const merged = Object.fromEntries([...mergedEntries].map(([filePath, entry]) => [filePath, entry.duration]));
279
- if (timingManifestFileSetHash(Object.keys(merged)) !== expected.testFileSetHash) {
280
- throw new Error("Merged timing manifest does not match the complete file universe");
281
- }
282
- return validateTimingManifest(merged, { source: "merged timing manifest" });
283
- }
284
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltaW5nLW1hbmlmZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rlc3RpbmcvdGltaW5nLW1hbmlmZXN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFNBQVMsTUFBTSx3QkFBd0IsQ0FBQTtBQUU5Qyx1REFBdUQ7QUFFdkQ7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSwyQkFBMkIsQ0FBQyxRQUFRO0lBQ2xELElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFBO0lBQzFFLENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUVuRCxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQ3BFLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELFFBQVEsRUFBRSxDQUFDLENBQUE7SUFDN0UsQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQTtJQUVuQixLQUFLLE1BQU0sT0FBTyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM5QyxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sS0FBSyxHQUFHO1lBQUUsU0FBUTtRQUV6QyxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNyQixJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELFFBQVEsRUFBRSxDQUFDLENBQUE7WUFDMUYsQ0FBQztZQUVELFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtZQUNkLFNBQVE7UUFDVixDQUFDO1FBRUQsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN4QixDQUFDO0lBRUQsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELFFBQVEsRUFBRSxDQUFDLENBQUE7SUFDdkYsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUMzQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsU0FBUyxFQUFFLFNBQVM7SUFDN0QsSUFBSSxTQUFTLEtBQUssU0FBUztRQUFFLE9BQU8sQ0FBQyxDQUFBO0lBRXJDLE9BQU8sU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUN2QyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsY0FBYyxFQUFFLEVBQUMsTUFBTSxHQUFHLGlCQUFpQixFQUFDLEdBQUcsRUFBRTtJQUN0RixJQUFJLENBQUMsY0FBYyxJQUFJLE9BQU8sY0FBYyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7UUFDM0YsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLE1BQU0sa0VBQWtFLENBQUMsQ0FBQTtJQUM5RixDQUFDO0lBRUQsb0VBQW9FO0lBQ3BFLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFFekIsS0FBSyxNQUFNLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUN0RSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQy9FLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxNQUFNLGdDQUFnQyxZQUFZLEVBQUUsQ0FBQyxDQUFBO1FBQzFFLENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBRywyQkFBMkIsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUMvRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRTNDLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsTUFBTSw0Q0FBNEMsUUFBUSxDQUFDLFlBQVksUUFBUSxZQUFZLEVBQUUsQ0FBQyxDQUFBO1FBQ25ILENBQUM7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxFQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFBO0lBQ3RELENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDbkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDcEYsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUMxRCxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQUMsU0FBUztJQUNqRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNuRixNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksRUFBRSxFQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUMsQ0FBQyxDQUFDLENBQUE7SUFDbkcsTUFBTSxRQUFRLEdBQUcsK0JBQStCLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQTtJQUUzRSxPQUFPLFVBQVUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUE7QUFDeEMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsT0FBTztJQUN0QyxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDM0YsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyx1QkFBdUIsQ0FBQyxTQUFTLEVBQUUsTUFBTTtJQUNoRCxJQUFJLFNBQVMsQ0FBQyxPQUFPLEtBQUssS0FBSztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxNQUFNLHFDQUFxQyxDQUFDLENBQUE7SUFFaEcsTUFBTSxnQkFBZ0IsR0FBRztRQUN2QixDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBQzlCLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDOUIsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDO1FBQ3BDLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUM7S0FDbEMsQ0FBQTtJQUVELElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3JFLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxNQUFNLHNDQUFzQyxDQUFDLENBQUE7SUFDbEUsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMscUJBQXFCLENBQUMsS0FBSyxFQUFFLE1BQU07SUFDMUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEdBQUcsTUFBTSw0QkFBNEIsQ0FBQyxDQUFBO0lBRTlELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3hELE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxNQUFNLG1DQUFtQyxDQUFDLENBQUE7SUFDL0QsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN0RyxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsTUFBTSw4QkFBOEIsQ0FBQyxDQUFBO0lBQzFELENBQUM7SUFFRCxPQUFPLEVBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUMsQ0FBQTtBQUMvRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLHVCQUF1QixDQUFDLEtBQUssRUFBRSxPQUFPO0lBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUVuRSxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsMEJBQTBCLENBQUMsU0FBUyxFQUFFLE1BQU07SUFDbkQsSUFBSSxDQUFDLENBQUMseUJBQXlCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDaEYsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLE1BQU0sMkNBQTJDLENBQUMsQ0FBQTtJQUN2RSxDQUFDO0lBRUQsSUFBSSxPQUFPLFNBQVMsQ0FBQyxlQUFlLEtBQUssUUFBUSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1FBQzlHLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxNQUFNLHdDQUF3QyxDQUFDLENBQUE7SUFDcEUsQ0FBQztJQUVELE9BQU8sRUFBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUUsU0FBUyxDQUFDLGVBQWUsRUFBQyxDQUFBO0FBQ25GLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxLQUFLO0lBQ2xDLE1BQU0sRUFBQyxPQUFPLEVBQUUsTUFBTSxFQUFDLEdBQUcsS0FBSyxDQUFBO0lBRS9CLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLE1BQU0sd0NBQXdDLENBQUMsQ0FBQTtJQUU1RSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssd0JBQXdCLElBQUksT0FBTyxDQUFDLGFBQWEsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMvRSxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsTUFBTSxvREFBb0QsQ0FBQyxDQUFBO0lBQ2hGLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssUUFBUTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxNQUFNLGlEQUFpRCxDQUFDLENBQUE7SUFFNUcsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQTtJQUVuQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsR0FBRyxNQUFNLDZDQUE2QyxDQUFDLENBQUE7SUFDbkYsdUJBQXVCLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFBO0lBQzFDLE1BQU0sRUFBQyxXQUFXLEVBQUUsTUFBTSxFQUFDLEdBQUcscUJBQXFCLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUM1RSxNQUFNLG1CQUFtQixHQUFHLHVCQUF1QixDQUNqRCxTQUFTLENBQUMsbUJBQW1CLEVBQzdCLEdBQUcsTUFBTSxpREFBaUQsQ0FDM0QsQ0FBQTtJQUNELE1BQU0sU0FBUyxHQUFHLHVCQUF1QixDQUN2QyxTQUFTLENBQUMsU0FBUyxFQUNuQixHQUFHLE1BQU0sdUNBQXVDLENBQ2pELENBQUE7SUFDRCxNQUFNLEVBQUMsUUFBUSxFQUFFLGVBQWUsRUFBQyxHQUFHLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUVqRixNQUFNLGNBQWMsR0FBRyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEVBQUMsTUFBTSxFQUFFLEdBQUcsTUFBTSxrQkFBa0IsRUFBQyxDQUFDLENBQUE7SUFFNUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNyRCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsTUFBTSwyREFBMkQsQ0FBQyxDQUFBO0lBQ3ZGLENBQUM7SUFFRCxPQUFPO1FBQ0wsbUJBQW1CO1FBQ25CLFNBQVM7UUFDVCxXQUFXO1FBQ1gsTUFBTTtRQUNOLFFBQVE7UUFDUixlQUFlO1FBQ2YsY0FBYztLQUNmLENBQUE7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU07SUFDcEQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLE1BQU0sb0NBQW9DLENBQUMsQ0FBQTtJQUNwRyxJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLFFBQVE7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsTUFBTSw0Q0FBNEMsQ0FBQyxDQUFBO0lBQ2hILElBQUksS0FBSyxDQUFDLG1CQUFtQixLQUFLLFFBQVEsQ0FBQyxtQkFBbUI7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsTUFBTSx3Q0FBd0MsQ0FBQyxDQUFBO0lBQ2xJLElBQUksS0FBSyxDQUFDLGVBQWUsS0FBSyxRQUFRLENBQUMsZUFBZTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxNQUFNLHlDQUF5QyxDQUFDLENBQUE7QUFDN0gsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLHdCQUF3QixDQUFDLEVBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUM7SUFDOUQsS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7UUFDeEUsTUFBTSxhQUFhLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUVqRCxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLFFBQVEsT0FBTyxhQUFhLENBQUMsTUFBTSxRQUFRLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDL0YsQ0FBQztRQUVELGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUMsUUFBUSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7SUFDakQsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLCtCQUErQixDQUFDLE1BQU07SUFDcEQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUE7SUFFdEYsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUNsRSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDMUIsa0NBQWtDO0lBQ2xDLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFDOUIsOERBQThEO0lBQzlELE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFDL0IsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLENBQUE7SUFFekIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNuRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDM0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQTtRQUVuQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBRTlDLE1BQU0sbUJBQW1CLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFL0QsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLEtBQUssQ0FBQyxXQUFXLE9BQU8sbUJBQW1CLFFBQVEsTUFBTSxFQUFFLENBQUMsQ0FBQTtRQUNqRyxDQUFDO1FBRUQsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQzNDLGlCQUFpQixJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUE7UUFDcEMsd0JBQXdCLENBQUMsRUFBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7SUFDMUQsQ0FBQztJQUVELE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxDQUFBO0lBRTlCLEtBQUssSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFLFdBQVcsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUM7UUFDeEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDO1lBQUUsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQzNFLENBQUM7SUFFRCxJQUFJLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQzlFLENBQUM7SUFFRCxJQUFJLGlCQUFpQixLQUFLLFFBQVEsQ0FBQyxtQkFBbUIsSUFBSSxhQUFhLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzlHLE1BQU0sSUFBSSxLQUFLLENBQUMsa0VBQWtFLENBQUMsQ0FBQTtJQUNyRixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FDL0IsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FDMUUsQ0FBQTtJQUVELElBQUkseUJBQXlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNoRixNQUFNLElBQUksS0FBSyxDQUFDLGtFQUFrRSxDQUFDLENBQUE7SUFDckYsQ0FBQztJQUVELE9BQU8sc0JBQXNCLENBQUMsTUFBTSxFQUFFLEVBQUMsTUFBTSxFQUFFLHdCQUF3QixFQUFDLENBQUMsQ0FBQTtBQUMzRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBzaGEyNTZIZXggZnJvbSBcIi4uL3V0aWxzL3NoYTI1Ni1oZXguanNcIlxuXG4vKiogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIG51bWJlcj59IFRpbWluZ01hbmlmZXN0ICovXG5cbi8qKlxuICogVmFsaWRhdGVkUHJvZmlsZVNoYXJkIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWYWxpZGF0ZWRQcm9maWxlU2hhcmRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkaXNjb3ZlcmVkRmlsZUNvdW50IC0gQ29tcGxldGUgcHJlLXNoYXJkIGZpbGUgY291bnQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZmlsZUNvdW50IC0gU2VsZWN0ZWQgcG9zdC1zaGFyZCBmaWxlIGNvdW50LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGdyb3VwTnVtYmVyIC0gT25lLWluZGV4ZWQgc2hhcmQgbnVtYmVyLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGdyb3VwcyAtIENvbXBsZXRlIHNoYXJkIGNvdW50LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGhCYXNlIC0gUHJvZmlsaW5nIHBhdGgtYmFzZSBzZW1hbnRpY3MuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGVzdEZpbGVTZXRIYXNoIC0gQ29tcGxldGUgY2Fub25pY2FsIGZpbGUtc2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtUaW1pbmdNYW5pZmVzdH0gdGltaW5nTWFuaWZlc3QgLSBDYW5vbmljYWwgc2hhcmQgdGltaW5nIG1hcC5cbiAqL1xuXG4vKipcbiAqIFRlc3RQcm9maWxlVGltaW5nTWFuaWZlc3RJbnB1dCB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gVGVzdFByb2ZpbGVUaW1pbmdNYW5pZmVzdElucHV0XG4gKiBAcHJvcGVydHkge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBwcm9maWxlIC0gUGFyc2VkIHJpY2ggdGVzdCBwcm9maWxlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZSAtIEh1bWFuLXJlYWRhYmxlIGlucHV0IHNvdXJjZSBmb3IgdmFsaWRhdGlvbiBlcnJvcnMuXG4gKi9cblxuLyoqXG4gKiBDYW5vbmljYWxpemVzIGEgdGltaW5nLW1hbmlmZXN0IHBhdGggcmVsYXRpdmUgdG8gaXRzIHByb2ZpbGluZyBiYXNlLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoIC0gQ2FuZGlkYXRlIHJlbGF0aXZlIHBhdGguXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFBvcnRhYmxlIGNhbm9uaWNhbCBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2Fub25pY2FsVGltaW5nTWFuaWZlc3RQYXRoKGZpbGVQYXRoKSB7XG4gIGlmICh0eXBlb2YgZmlsZVBhdGggIT09IFwic3RyaW5nXCIgfHwgZmlsZVBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVGltaW5nIG1hbmlmZXN0IGtleXMgbXVzdCBiZSBub24tZW1wdHkgcmVsYXRpdmUgcGF0aHNcIilcbiAgfVxuXG4gIGNvbnN0IHBvcnRhYmxlUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2VBbGwoXCJcXFxcXCIsIFwiL1wiKVxuXG4gIGlmIChwb3J0YWJsZVBhdGguc3RhcnRzV2l0aChcIi9cIikgfHwgL15bQS1aYS16XTovLnRlc3QocG9ydGFibGVQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGltaW5nIG1hbmlmZXN0IGtleSBtdXN0IGJlIGEgcmVsYXRpdmUgcGF0aDogJHtmaWxlUGF0aH1gKVxuICB9XG5cbiAgY29uc3Qgc2VnbWVudHMgPSBbXVxuXG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBwb3J0YWJsZVBhdGguc3BsaXQoXCIvXCIpKSB7XG4gICAgaWYgKCFzZWdtZW50IHx8IHNlZ21lbnQgPT09IFwiLlwiKSBjb250aW51ZVxuXG4gICAgaWYgKHNlZ21lbnQgPT09IFwiLi5cIikge1xuICAgICAgaWYgKHNlZ21lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbWluZyBtYW5pZmVzdCBrZXkgbXVzdCBiZSBhIG5vbi1lc2NhcGluZyByZWxhdGl2ZSBwYXRoOiAke2ZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIHNlZ21lbnRzLnBvcCgpXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHNlZ21lbnRzLnB1c2goc2VnbWVudClcbiAgfVxuXG4gIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbWluZyBtYW5pZmVzdCBrZXkgbXVzdCBiZSBhIG5vbi1lbXB0eSByZWxhdGl2ZSBwYXRoOiAke2ZpbGVQYXRofWApXG4gIH1cblxuICByZXR1cm4gc2VnbWVudHMuam9pbihcIi9cIilcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0aW1pbmctbWFuaWZlc3QgcGF0aHMgYnkgSmF2YVNjcmlwdCBjb2RlIHVuaXRzIHdpdGhvdXQgbG9jYWxlIHJ1bGVzLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoQSAtIEZpcnN0IHBhdGguXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGhCIC0gU2Vjb25kIHBhdGguXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIE5lZ2F0aXZlLCB6ZXJvLCBvciBwb3NpdGl2ZSBvcmRlcmluZyByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlVGltaW5nTWFuaWZlc3RQYXRocyhmaWxlUGF0aEEsIGZpbGVQYXRoQikge1xuICBpZiAoZmlsZVBhdGhBID09PSBmaWxlUGF0aEIpIHJldHVybiAwXG5cbiAgcmV0dXJuIGZpbGVQYXRoQSA8IGZpbGVQYXRoQiA/IC0xIDogMVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhbmQgc29ydHMgYSBwbGFpbiB0aW1pbmcgbWFuaWZlc3QuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB0aW1pbmdNYW5pZmVzdCAtIFBhcnNlZCB0aW1pbmcgbWFuaWZlc3QuXG4gKiBAcGFyYW0ge3tzb3VyY2U/OiBzdHJpbmd9fSBbb3B0aW9uc10gLSBWYWxpZGF0aW9uIGNvbnRleHQuXG4gKiBAcmV0dXJucyB7VGltaW5nTWFuaWZlc3R9IC0gQ2Fub25pY2FsIHNvcnRlZCB0aW1pbmcgbWFuaWZlc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVRpbWluZ01hbmlmZXN0KHRpbWluZ01hbmlmZXN0LCB7c291cmNlID0gXCJ0aW1pbmcgbWFuaWZlc3RcIn0gPSB7fSkge1xuICBpZiAoIXRpbWluZ01hbmlmZXN0IHx8IHR5cGVvZiB0aW1pbmdNYW5pZmVzdCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHRpbWluZ01hbmlmZXN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtzb3VyY2V9IG11c3QgYmUgYSBwbGFpbiBKU09OIG9iamVjdCBtYXBwaW5nIHJlbGF0aXZlIHBhdGhzIHRvIGR1cmF0aW9uc2ApXG4gIH1cblxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHtkdXJhdGlvbjogbnVtYmVyLCBvcmlnaW5hbFBhdGg6IHN0cmluZ30+fSAqL1xuICBjb25zdCBlbnRyaWVzID0gbmV3IE1hcCgpXG5cbiAgZm9yIChjb25zdCBbb3JpZ2luYWxQYXRoLCBkdXJhdGlvbl0gb2YgT2JqZWN0LmVudHJpZXModGltaW5nTWFuaWZlc3QpKSB7XG4gICAgaWYgKHR5cGVvZiBkdXJhdGlvbiAhPT0gXCJudW1iZXJcIiB8fCAhTnVtYmVyLmlzRmluaXRlKGR1cmF0aW9uKSB8fCBkdXJhdGlvbiA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzb3VyY2V9IGhhcyBhbiBpbnZhbGlkIGR1cmF0aW9uIGZvciAke29yaWdpbmFsUGF0aH1gKVxuICAgIH1cblxuICAgIGNvbnN0IGNhbm9uaWNhbFBhdGggPSBjYW5vbmljYWxUaW1pbmdNYW5pZmVzdFBhdGgob3JpZ2luYWxQYXRoKVxuICAgIGNvbnN0IGV4aXN0aW5nID0gZW50cmllcy5nZXQoY2Fub25pY2FsUGF0aClcblxuICAgIGlmIChleGlzdGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3NvdXJjZX0gaGFzIGEgbm9ybWFsaXplZCBwYXRoIGNvbGxpc2lvbiBiZXR3ZWVuICR7ZXhpc3Rpbmcub3JpZ2luYWxQYXRofSBhbmQgJHtvcmlnaW5hbFBhdGh9YClcbiAgICB9XG5cbiAgICBlbnRyaWVzLnNldChjYW5vbmljYWxQYXRoLCB7ZHVyYXRpb24sIG9yaWdpbmFsUGF0aH0pXG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIFsuLi5lbnRyaWVzLmVudHJpZXMoKV1cbiAgICAgIC5zb3J0KChbZmlsZVBhdGhBXSwgW2ZpbGVQYXRoQl0pID0+IGNvbXBhcmVUaW1pbmdNYW5pZmVzdFBhdGhzKGZpbGVQYXRoQSwgZmlsZVBhdGhCKSlcbiAgICAgIC5tYXAoKFtmaWxlUGF0aCwgZW50cnldKSA9PiBbZmlsZVBhdGgsIGVudHJ5LmR1cmF0aW9uXSlcbiAgKVxufVxuXG4vKipcbiAqIFJldHVybnMgYW4gb3BhcXVlIGRldGVybWluaXN0aWMgaWRlbnRpdHkgZm9yIGEgY29tcGxldGUgY2Fub25pY2FsIHRlc3QtZmlsZSBzZXQuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBmaWxlUGF0aHMgLSBQYXRocyByZWxhdGl2ZSB0byBvbmUgcHJvZmlsaW5nIGJhc2UuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFNIQS0yNTYgZmlsZS1zZXQgaWRlbnRpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aW1pbmdNYW5pZmVzdEZpbGVTZXRIYXNoKGZpbGVQYXRocykge1xuICBjb25zdCBwYXRoTWFuaWZlc3QgPSBPYmplY3QuZnJvbUVudHJpZXMoZmlsZVBhdGhzLm1hcCgoZmlsZVBhdGgpID0+IFtmaWxlUGF0aCwgMF0pKVxuICBjb25zdCBjYW5vbmljYWxQYXRocyA9IE9iamVjdC5rZXlzKHZhbGlkYXRlVGltaW5nTWFuaWZlc3QocGF0aE1hbmlmZXN0LCB7c291cmNlOiBcInRlc3QgZmlsZSBzZXRcIn0pKVxuICBjb25zdCBpZGVudGl0eSA9IGB2ZWxvY2lvdXMudGVzdC1maWxlLXNldC52MVxcMCR7Y2Fub25pY2FsUGF0aHMuam9pbihcIlxcMFwiKX1gXG5cbiAgcmV0dXJuIGBzaGEyNTY6JHtzaGEyNTZIZXgoaWRlbnRpdHkpfWBcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhhdCBhIHBhcnNlZCBKU09OIHZhbHVlIGlzIGEgbm9uLWFycmF5IG9iamVjdC5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gQ2FuZGlkYXRlIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gVmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGFzc2VydEpzb25PYmplY3QodmFsdWUsIG1lc3NhZ2UpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKVxufVxuXG4vKipcbiAqIFJlcXVpcmVzIHVuZmlsdGVyZWQsIG5vbi1mb2N1c2VkIHByb2ZpbGUgc2VsZWN0aW9uIG1ldGFkYXRhLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gc2VsZWN0aW9uIC0gUmljaCBwcm9maWxlIHNlbGVjdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBJbnB1dCBzb3VyY2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0Q29tcGxldGVTZWxlY3Rpb24oc2VsZWN0aW9uLCBzb3VyY2UpIHtcbiAgaWYgKHNlbGVjdGlvbi5mb2N1c2VkICE9PSBmYWxzZSkgdGhyb3cgbmV3IEVycm9yKGAke3NvdXJjZX0gbXVzdCBub3QgYmUgYSBmb2N1c2VkIHRlc3QgcHJvZmlsZWApXG5cbiAgY29uc3Qgc2VsZWN0aW9uRmlsdGVycyA9IFtcbiAgICBbc2VsZWN0aW9uLmluY2x1ZGVUYWdDb3VudCwgMF0sXG4gICAgW3NlbGVjdGlvbi5leGNsdWRlVGFnQ291bnQsIDBdLFxuICAgIFtzZWxlY3Rpb24uaGFzRXhhbXBsZUZpbHRlcnMsIGZhbHNlXSxcbiAgICBbc2VsZWN0aW9uLmhhc0xpbmVGaWx0ZXJzLCBmYWxzZV1cbiAgXVxuXG4gIGlmIChzZWxlY3Rpb25GaWx0ZXJzLnNvbWUoKFt2YWx1ZSwgZXhwZWN0ZWRdKSA9PiB2YWx1ZSAhPT0gZXhwZWN0ZWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3NvdXJjZX0gbXVzdCBub3QgYmUgYSBmaWx0ZXJlZCB0ZXN0IHByb2ZpbGVgKVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHNoYXJkIG51bWJlcmluZyBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHNoYXJkIC0gQ2FuZGlkYXRlIHNoYXJkIHNlbGVjdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBJbnB1dCBzb3VyY2UuXG4gKiBAcmV0dXJucyB7e2dyb3VwTnVtYmVyOiBudW1iZXIsIGdyb3VwczogbnVtYmVyfX0gLSBWYWxpZGF0ZWQgc2hhcmQgbnVtYmVycy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVkU2hhcmROdW1iZXJzKHNoYXJkLCBzb3VyY2UpIHtcbiAgYXNzZXJ0SnNvbk9iamVjdChzaGFyZCwgYCR7c291cmNlfSBpcyBtaXNzaW5nIHNoYXJkIG1ldGFkYXRhYClcblxuICBpZiAoIU51bWJlci5pc0ludGVnZXIoc2hhcmQuZ3JvdXBzKSB8fCBzaGFyZC5ncm91cHMgPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3NvdXJjZX0gaGFzIGFuIGludmFsaWQgc2hhcmQgZ3JvdXAgY291bnRgKVxuICB9XG5cbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHNoYXJkLmdyb3VwTnVtYmVyKSB8fCBzaGFyZC5ncm91cE51bWJlciA8IDEgfHwgc2hhcmQuZ3JvdXBOdW1iZXIgPiBzaGFyZC5ncm91cHMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c291cmNlfSBoYXMgYW4gaW52YWxpZCBzaGFyZCBudW1iZXJgKVxuICB9XG5cbiAgcmV0dXJuIHtncm91cE51bWJlcjogc2hhcmQuZ3JvdXBOdW1iZXIsIGdyb3Vwczogc2hhcmQuZ3JvdXBzfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHNlbGVjdGlvbiBjb3VudC5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gQ2FuZGlkYXRlIGNvdW50LlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBWYWxpZGF0aW9uIGVycm9yIG1lc3NhZ2UuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIFZhbGlkYXRlZCBjb3VudC5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVkU2VsZWN0aW9uQ291bnQodmFsdWUsIG1lc3NhZ2UpIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSB8fCB2YWx1ZSA8IDApIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKVxuXG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgc2VsZWN0aW9uIGlkZW50aXR5IHVzZWQgYWNyb3NzIHNoYXJkIHByb2ZpbGVzLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gc2VsZWN0aW9uIC0gUmljaCBwcm9maWxlIHNlbGVjdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBJbnB1dCBzb3VyY2UuXG4gKiBAcmV0dXJucyB7e3BhdGhCYXNlOiBzdHJpbmcsIHRlc3RGaWxlU2V0SGFzaDogc3RyaW5nfX0gLSBWYWxpZGF0ZWQgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlZFNlbGVjdGlvbklkZW50aXR5KHNlbGVjdGlvbiwgc291cmNlKSB7XG4gIGlmICghW1wiY29uZmlndXJhdGlvbi1kaXJlY3RvcnlcIiwgXCJ0ZXN0LWRpcmVjdG9yeVwiXS5pbmNsdWRlcyhzZWxlY3Rpb24ucGF0aEJhc2UpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3NvdXJjZX0gaGFzIGFuIGludmFsaWQgdGltaW5nIG1hbmlmZXN0IHBhdGggYmFzZWApXG4gIH1cblxuICBpZiAodHlwZW9mIHNlbGVjdGlvbi50ZXN0RmlsZVNldEhhc2ggIT09IFwic3RyaW5nXCIgfHwgIS9ec2hhMjU2OlthLWYwLTldezY0fSQvLnRlc3Qoc2VsZWN0aW9uLnRlc3RGaWxlU2V0SGFzaCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c291cmNlfSBoYXMgYW4gaW52YWxpZCB0ZXN0IGZpbGUgc2V0IGlkZW50aXR5YClcbiAgfVxuXG4gIHJldHVybiB7cGF0aEJhc2U6IHNlbGVjdGlvbi5wYXRoQmFzZSwgdGVzdEZpbGVTZXRIYXNoOiBzZWxlY3Rpb24udGVzdEZpbGVTZXRIYXNofVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBvbmUgcmljaCBwcm9maWxlIGFuZCByZXR1cm5zIGl0cyBhZ2dyZWdhdGlvbiBjb250cmFjdC5cbiAqIEBwYXJhbSB7VGVzdFByb2ZpbGVUaW1pbmdNYW5pZmVzdElucHV0fSBpbnB1dCAtIFByb2ZpbGUgaW5wdXQuXG4gKiBAcmV0dXJucyB7VmFsaWRhdGVkUHJvZmlsZVNoYXJkfSAtIFZhbGlkYXRlZCBzaGFyZCBjb250cmFjdC5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVkUHJvZmlsZVNoYXJkKGlucHV0KSB7XG4gIGNvbnN0IHtwcm9maWxlLCBzb3VyY2V9ID0gaW5wdXRcblxuICBhc3NlcnRKc29uT2JqZWN0KHByb2ZpbGUsIGAke3NvdXJjZX0gbXVzdCBiZSBhIHJpY2ggVmVsb2Npb3VzIHRlc3QgcHJvZmlsZWApXG5cbiAgaWYgKHByb2ZpbGUuc2NoZW1hICE9PSBcInZlbG9jaW91cy50ZXN0LXByb2ZpbGVcIiB8fCBwcm9maWxlLnNjaGVtYVZlcnNpb24gIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c291cmNlfSBoYXMgYW4gaW5jb21wYXRpYmxlIFZlbG9jaW91cyB0ZXN0IHByb2ZpbGUgc2NoZW1hYClcbiAgfVxuXG4gIGlmIChwcm9maWxlLnN0YXR1cyAhPT0gXCJwYXNzZWRcIikgdGhyb3cgbmV3IEVycm9yKGAke3NvdXJjZX0gbXVzdCBoYXZlIHBhc3NlZCBzdGF0dXMgZm9yIHRpbWluZyBhZ2dyZWdhdGlvbmApXG5cbiAgY29uc3Qgc2VsZWN0aW9uID0gcHJvZmlsZS5zZWxlY3Rpb25cblxuICBhc3NlcnRKc29uT2JqZWN0KHNlbGVjdGlvbiwgYCR7c291cmNlfSBpcyBtaXNzaW5nIHRlc3QgcHJvZmlsZSBzZWxlY3Rpb24gbWV0YWRhdGFgKVxuICBhc3NlcnRDb21wbGV0ZVNlbGVjdGlvbihzZWxlY3Rpb24sIHNvdXJjZSlcbiAgY29uc3Qge2dyb3VwTnVtYmVyLCBncm91cHN9ID0gdmFsaWRhdGVkU2hhcmROdW1iZXJzKHNlbGVjdGlvbi5zaGFyZCwgc291cmNlKVxuICBjb25zdCBkaXNjb3ZlcmVkRmlsZUNvdW50ID0gdmFsaWRhdGVkU2VsZWN0aW9uQ291bnQoXG4gICAgc2VsZWN0aW9uLmRpc2NvdmVyZWRGaWxlQ291bnQsXG4gICAgYCR7c291cmNlfSBoYXMgYW4gaW52YWxpZCBwcmUtc2hhcmQgZGlzY292ZXJlZCBmaWxlIGNvdW50YFxuICApXG4gIGNvbnN0IGZpbGVDb3VudCA9IHZhbGlkYXRlZFNlbGVjdGlvbkNvdW50KFxuICAgIHNlbGVjdGlvbi5maWxlQ291bnQsXG4gICAgYCR7c291cmNlfSBoYXMgYW4gaW52YWxpZCBwb3N0LXNoYXJkIGZpbGUgY291bnRgXG4gIClcbiAgY29uc3Qge3BhdGhCYXNlLCB0ZXN0RmlsZVNldEhhc2h9ID0gdmFsaWRhdGVkU2VsZWN0aW9uSWRlbnRpdHkoc2VsZWN0aW9uLCBzb3VyY2UpXG5cbiAgY29uc3QgdGltaW5nTWFuaWZlc3QgPSB2YWxpZGF0ZVRpbWluZ01hbmlmZXN0KHByb2ZpbGUudGltaW5nTWFuaWZlc3QsIHtzb3VyY2U6IGAke3NvdXJjZX0gdGltaW5nIG1hbmlmZXN0YH0pXG5cbiAgaWYgKE9iamVjdC5rZXlzKHRpbWluZ01hbmlmZXN0KS5sZW5ndGggIT09IGZpbGVDb3VudCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtzb3VyY2V9IHRpbWluZyBtYW5pZmVzdCBkb2VzIG5vdCBtYXRjaCBpdHMgcG9zdC1zaGFyZCBmaWxlIGNvdW50YClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZGlzY292ZXJlZEZpbGVDb3VudCxcbiAgICBmaWxlQ291bnQsXG4gICAgZ3JvdXBOdW1iZXIsXG4gICAgZ3JvdXBzLFxuICAgIHBhdGhCYXNlLFxuICAgIHRlc3RGaWxlU2V0SGFzaCxcbiAgICB0aW1pbmdNYW5pZmVzdFxuICB9XG59XG5cbi8qKlxuICogUmVxdWlyZXMgb25lIHNoYXJkIHRvIGRlc2NyaWJlIHRoZSBzYW1lIGNvbXBsZXRlIHNlbGVjdGlvbiBhcyB0aGUgZmlyc3QuXG4gKiBAcGFyYW0ge1ZhbGlkYXRlZFByb2ZpbGVTaGFyZH0gc2hhcmQgLSBDYW5kaWRhdGUgc2hhcmQuXG4gKiBAcGFyYW0ge1ZhbGlkYXRlZFByb2ZpbGVTaGFyZH0gZXhwZWN0ZWQgLSBGaXJzdCBzaGFyZCBjb250cmFjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDYW5kaWRhdGUgc291cmNlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGFzc2VydENvbXBhdGlibGVTaGFyZChzaGFyZCwgZXhwZWN0ZWQsIHNvdXJjZSkge1xuICBpZiAoc2hhcmQuZ3JvdXBzICE9PSBleHBlY3RlZC5ncm91cHMpIHRocm93IG5ldyBFcnJvcihgJHtzb3VyY2V9IGhhcyBhIGRpZmZlcmVudCBzaGFyZCBncm91cCBjb3VudGApXG4gIGlmIChzaGFyZC5wYXRoQmFzZSAhPT0gZXhwZWN0ZWQucGF0aEJhc2UpIHRocm93IG5ldyBFcnJvcihgJHtzb3VyY2V9IGhhcyBhIGRpZmZlcmVudCB0aW1pbmcgbWFuaWZlc3QgcGF0aCBiYXNlYClcbiAgaWYgKHNoYXJkLmRpc2NvdmVyZWRGaWxlQ291bnQgIT09IGV4cGVjdGVkLmRpc2NvdmVyZWRGaWxlQ291bnQpIHRocm93IG5ldyBFcnJvcihgJHtzb3VyY2V9IGhhcyBhIGRpZmZlcmVudCBkaXNjb3ZlcmVkIGZpbGUgY291bnRgKVxuICBpZiAoc2hhcmQudGVzdEZpbGVTZXRIYXNoICE9PSBleHBlY3RlZC50ZXN0RmlsZVNldEhhc2gpIHRocm93IG5ldyBFcnJvcihgJHtzb3VyY2V9IGhhcyBhIGRpZmZlcmVudCB0ZXN0IGZpbGUgc2V0IGlkZW50aXR5YClcbn1cblxuLyoqXG4gKiBBZGRzIG9uZSB2YWxpZGF0ZWQgc2hhcmQgdGltaW5nIG1hcCB3aXRob3V0IGFsbG93aW5nIGR1cGxpY2F0ZSBjYW5vbmljYWwga2V5cy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gTWVyZ2Ugc3RhdGUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIHtkdXJhdGlvbjogbnVtYmVyLCBzb3VyY2U6IHN0cmluZ30+fSBhcmdzLm1lcmdlZEVudHJpZXMgLSBEZXN0aW5hdGlvbiB0aW1pbmcgZW50cmllcy5cbiAqIEBwYXJhbSB7VmFsaWRhdGVkUHJvZmlsZVNoYXJkfSBhcmdzLnNoYXJkIC0gQ2FuZGlkYXRlIHNoYXJkLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc291cmNlIC0gQ2FuZGlkYXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBtZXJnZVNoYXJkVGltaW5nTWFuaWZlc3Qoe21lcmdlZEVudHJpZXMsIHNoYXJkLCBzb3VyY2V9KSB7XG4gIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBkdXJhdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoc2hhcmQudGltaW5nTWFuaWZlc3QpKSB7XG4gICAgY29uc3QgZXhpc3RpbmdFbnRyeSA9IG1lcmdlZEVudHJpZXMuZ2V0KGZpbGVQYXRoKVxuXG4gICAgaWYgKGV4aXN0aW5nRW50cnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIHRpbWluZyBwYXRoICR7ZmlsZVBhdGh9IGluICR7ZXhpc3RpbmdFbnRyeS5zb3VyY2V9IGFuZCAke3NvdXJjZX1gKVxuICAgIH1cblxuICAgIG1lcmdlZEVudHJpZXMuc2V0KGZpbGVQYXRoLCB7ZHVyYXRpb24sIHNvdXJjZX0pXG4gIH1cbn1cblxuLyoqXG4gKiBNZXJnZXMgYSBjb21wbGV0ZSBjb21wYXRpYmxlIHNldCBvZiByaWNoIFZlbG9jaW91cyBzaGFyZCBwcm9maWxlcy5cbiAqIEBwYXJhbSB7VGVzdFByb2ZpbGVUaW1pbmdNYW5pZmVzdElucHV0W119IGlucHV0cyAtIFBhcnNlZCBwcm9maWxlIGRvY3VtZW50cyBhbmQgc291cmNlcy5cbiAqIEByZXR1cm5zIHtUaW1pbmdNYW5pZmVzdH0gLSBDb21wbGV0ZSBzb3J0ZWQgcGxhaW4gdGltaW5nIG1hbmlmZXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VUZXN0UHJvZmlsZVRpbWluZ01hbmlmZXN0cyhpbnB1dHMpIHtcbiAgaWYgKGlucHV0cy5sZW5ndGggPT09IDApIHRocm93IG5ldyBFcnJvcihcIkF0IGxlYXN0IG9uZSByaWNoIHRlc3QgcHJvZmlsZSBpcyByZXF1aXJlZFwiKVxuXG4gIGNvbnN0IHNoYXJkcyA9IGlucHV0cy5tYXAoKGlucHV0KSA9PiB2YWxpZGF0ZWRQcm9maWxlU2hhcmQoaW5wdXQpKVxuICBjb25zdCBleHBlY3RlZCA9IHNoYXJkc1swXVxuICAvKiogQHR5cGUge01hcDxudW1iZXIsIHN0cmluZz59ICovXG4gIGNvbnN0IHNoYXJkU291cmNlcyA9IG5ldyBNYXAoKVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHtkdXJhdGlvbjogbnVtYmVyLCBzb3VyY2U6IHN0cmluZ30+fSAqL1xuICBjb25zdCBtZXJnZWRFbnRyaWVzID0gbmV3IE1hcCgpXG4gIGxldCBzZWxlY3RlZEZpbGVDb3VudCA9IDBcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2hhcmRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHNoYXJkID0gc2hhcmRzW2luZGV4XVxuICAgIGNvbnN0IHNvdXJjZSA9IGlucHV0c1tpbmRleF0uc291cmNlXG5cbiAgICBhc3NlcnRDb21wYXRpYmxlU2hhcmQoc2hhcmQsIGV4cGVjdGVkLCBzb3VyY2UpXG5cbiAgICBjb25zdCBleGlzdGluZ1NoYXJkU291cmNlID0gc2hhcmRTb3VyY2VzLmdldChzaGFyZC5ncm91cE51bWJlcilcblxuICAgIGlmIChleGlzdGluZ1NoYXJkU291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYER1cGxpY2F0ZSBzaGFyZCAke3NoYXJkLmdyb3VwTnVtYmVyfSBpbiAke2V4aXN0aW5nU2hhcmRTb3VyY2V9IGFuZCAke3NvdXJjZX1gKVxuICAgIH1cblxuICAgIHNoYXJkU291cmNlcy5zZXQoc2hhcmQuZ3JvdXBOdW1iZXIsIHNvdXJjZSlcbiAgICBzZWxlY3RlZEZpbGVDb3VudCArPSBzaGFyZC5maWxlQ291bnRcbiAgICBtZXJnZVNoYXJkVGltaW5nTWFuaWZlc3Qoe21lcmdlZEVudHJpZXMsIHNoYXJkLCBzb3VyY2V9KVxuICB9XG5cbiAgY29uc3QgbWlzc2luZ1NoYXJkTnVtYmVycyA9IFtdXG5cbiAgZm9yIChsZXQgZ3JvdXBOdW1iZXIgPSAxOyBncm91cE51bWJlciA8PSBleHBlY3RlZC5ncm91cHM7IGdyb3VwTnVtYmVyKyspIHtcbiAgICBpZiAoIXNoYXJkU291cmNlcy5oYXMoZ3JvdXBOdW1iZXIpKSBtaXNzaW5nU2hhcmROdW1iZXJzLnB1c2goZ3JvdXBOdW1iZXIpXG4gIH1cblxuICBpZiAobWlzc2luZ1NoYXJkTnVtYmVycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHNoYXJkIHByb2ZpbGVzOiAke21pc3NpbmdTaGFyZE51bWJlcnMuam9pbihcIiwgXCIpfWApXG4gIH1cblxuICBpZiAoc2VsZWN0ZWRGaWxlQ291bnQgIT09IGV4cGVjdGVkLmRpc2NvdmVyZWRGaWxlQ291bnQgfHwgbWVyZ2VkRW50cmllcy5zaXplICE9PSBleHBlY3RlZC5kaXNjb3ZlcmVkRmlsZUNvdW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTWVyZ2VkIHRpbWluZyBtYW5pZmVzdCBkb2VzIG5vdCBjb3ZlciB0aGUgY29tcGxldGUgZmlsZSB1bml2ZXJzZVwiKVxuICB9XG5cbiAgY29uc3QgbWVyZ2VkID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIFsuLi5tZXJnZWRFbnRyaWVzXS5tYXAoKFtmaWxlUGF0aCwgZW50cnldKSA9PiBbZmlsZVBhdGgsIGVudHJ5LmR1cmF0aW9uXSlcbiAgKVxuXG4gIGlmICh0aW1pbmdNYW5pZmVzdEZpbGVTZXRIYXNoKE9iamVjdC5rZXlzKG1lcmdlZCkpICE9PSBleHBlY3RlZC50ZXN0RmlsZVNldEhhc2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXJnZWQgdGltaW5nIG1hbmlmZXN0IGRvZXMgbm90IG1hdGNoIHRoZSBjb21wbGV0ZSBmaWxlIHVuaXZlcnNlXCIpXG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVUaW1pbmdNYW5pZmVzdChtZXJnZWQsIHtzb3VyY2U6IFwibWVyZ2VkIHRpbWluZyBtYW5pZmVzdFwifSlcbn1cbiJdfQ==
2
+ /** @typedef {import("@velocious/testing/node").TimingManifest} TimingManifest */
3
+ /** @typedef {import("@velocious/testing/node").TestProfileTimingManifestInput} TestProfileTimingManifestInput */
4
+ export { canonicalTimingManifestPath, compareTimingManifestPaths, mergeTestProfileTimingManifests, timingManifestFileSetHash, validateTimingManifest } from "@velocious/testing/node";
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltaW5nLW1hbmlmZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rlc3RpbmcvdGltaW5nLW1hbmlmZXN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixpRkFBaUY7QUFDakYsaUhBQWlIO0FBRWpILE9BQU8sRUFDTCwyQkFBMkIsRUFDM0IsMEJBQTBCLEVBQzFCLCtCQUErQixFQUMvQix5QkFBeUIsRUFDekIsc0JBQXNCLEVBQ3ZCLE1BQU0seUJBQXlCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCJAdmVsb2Npb3VzL3Rlc3Rpbmcvbm9kZVwiKS5UaW1pbmdNYW5pZmVzdH0gVGltaW5nTWFuaWZlc3QgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiQHZlbG9jaW91cy90ZXN0aW5nL25vZGVcIikuVGVzdFByb2ZpbGVUaW1pbmdNYW5pZmVzdElucHV0fSBUZXN0UHJvZmlsZVRpbWluZ01hbmlmZXN0SW5wdXQgKi9cblxuZXhwb3J0IHtcbiAgY2Fub25pY2FsVGltaW5nTWFuaWZlc3RQYXRoLFxuICBjb21wYXJlVGltaW5nTWFuaWZlc3RQYXRocyxcbiAgbWVyZ2VUZXN0UHJvZmlsZVRpbWluZ01hbmlmZXN0cyxcbiAgdGltaW5nTWFuaWZlc3RGaWxlU2V0SGFzaCxcbiAgdmFsaWRhdGVUaW1pbmdNYW5pZmVzdFxufSBmcm9tIFwiQHZlbG9jaW91cy90ZXN0aW5nL25vZGVcIlxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"velocious-attempt-executor.d.ts","sourceRoot":"","sources":["../../../src/testing/velocious-attempt-executor.js"],"names":[],"mappings":"AAOI,YAA0F,sBAAsB,GAAtG,OAAO,2BAA2B,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAwB;AAIjH,YAAiD,gBAAgB,GAAvD,KAAK,GAAG;IAAC,oBAAoB,CAAC,EAAE,IAAI,CAAA;CAAC,CAAkB;AA8EpE,MAAM,CAAC,OAAO,OAAO,wBAAwB;IAQpC,UAAU;IAPjB;;;;OAIG;IACH,YAAY,EAAC,UAAU,EAAE,GAAG,QAAQ,EAAC,EAFlC;QAAiD,UAAU,EAAnD,OAAO,kBAAkB,EAAE,OAAO,CAC5C;KACoC,EAGpC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,SAAS,EAHjB,MAAM,GAAG,SAGQ,GAFf,MAAM,GAAG,SAAS,CAI9B;IAED;;;;OAIG;IACG,OAAO,CAAC,EAAC,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,QAAQ,EAAC,EAHvH,OAAO,2BAA2B,EAAE,oBAGmF,GAFrH,OAAO,CAAC,IAAI,CAAC,CA6QzB;IAED;;;;;;;OAOG;IACG,eAAe,CAAC,EAAC,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAC,EALrD;QAAuC,YAAY,EAA3C,sBAAsB,EAAE,CAChC;QAA+D,QAAQ,EAA/D,OAAO,+BAA+B,EAAE,QAAQ,CACxD;QAA+D,QAAQ,EAA/D,OAAO,+BAA+B,EAAE,QAAQ,CACxD;KAEqD,GAF3C,OAAO,CAAC,IAAI,CAAC,CAezB;IAED;;;;;;;OAOG;IACG,cAAc,CAAC,EAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAC,EALnD;QAAuC,WAAW,EAA1C,sBAAsB,EAAE,CAChC;QAA+D,QAAQ,EAA/D,OAAO,+BAA+B,EAAE,QAAQ,CACxD;QAA+D,QAAQ,EAA/D,OAAO,+BAA+B,EAAE,QAAQ,CACxD;KAEmD,GAFzC,OAAO,CAAC,IAAI,CAAC,CA2BzB;CACF"}
1
+ {"version":3,"file":"velocious-attempt-executor.d.ts","sourceRoot":"","sources":["../../../src/testing/velocious-attempt-executor.js"],"names":[],"mappings":"AAOI,YAA0F,sBAAsB,GAAtG,OAAO,2BAA2B,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAwB;AAIjH,YAAiD,gBAAgB,GAAvD,KAAK,GAAG;IAAC,oBAAoB,CAAC,EAAE,IAAI,CAAA;CAAC,CAAkB;AA8EpE,MAAM,CAAC,OAAO,OAAO,wBAAwB;IAQpC,UAAU;IAPjB;;;;OAIG;IACH,YAAY,EAAC,UAAU,EAAE,GAAG,QAAQ,EAAC,EAFlC;QAAiD,UAAU,EAAnD,OAAO,kBAAkB,EAAE,OAAO,CAC5C;KACoC,EAGpC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,SAAS,EAHjB,MAAM,GAAG,SAGQ,GAFf,MAAM,GAAG,SAAS,CAI9B;IAED;;;;OAIG;IACG,OAAO,CAAC,EAAC,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,QAAQ,EAAC,EAHvH,OAAO,2BAA2B,EAAE,oBAGmF,GAFrH,OAAO,CAAC,IAAI,CAAC,CAmRzB;IAED;;;;;;;OAOG;IACG,eAAe,CAAC,EAAC,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAC,EALrD;QAAuC,YAAY,EAA3C,sBAAsB,EAAE,CAChC;QAA+D,QAAQ,EAA/D,OAAO,+BAA+B,EAAE,QAAQ,CACxD;QAA+D,QAAQ,EAA/D,OAAO,+BAA+B,EAAE,QAAQ,CACxD;KAEqD,GAF3C,OAAO,CAAC,IAAI,CAAC,CAezB;IAED;;;;;;;OAOG;IACG,cAAc,CAAC,EAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAC,EALnD;QAAuC,WAAW,EAA1C,sBAAsB,EAAE,CAChC;QAA+D,QAAQ,EAA/D,OAAO,+BAA+B,EAAE,QAAQ,CACxD;QAA+D,QAAQ,EAA/D,OAAO,+BAA+B,EAAE,QAAQ,CACxD;KAEmD,GAFzC,OAAO,CAAC,IAAI,CAAC,CA2BzB;CACF"}
@@ -133,10 +133,16 @@ export default class VelociousAttemptExecutor {
133
133
  await testRunner.registerTransactionalTenant(args, transactionalTenantRegistrations);
134
134
  };
135
135
  const profiler = testRunner._profiler;
136
+ const profileTestData = {
137
+ ...test,
138
+ filePath: testData.filePath,
139
+ line: testData.line,
140
+ ownerFilePath: testData.ownerFilePath ?? metadata.ownerFilePath
141
+ };
136
142
  const profileAttempt = profiler?.startAttempt({
137
143
  descriptions,
138
144
  attemptNumber,
139
- testData,
145
+ testData: profileTestData,
140
146
  testDescription
141
147
  });
142
148
  try {
@@ -405,4 +411,4 @@ export default class VelociousAttemptExecutor {
405
411
  }
406
412
  }
407
413
  }
408
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVsb2Npb3VzLWF0dGVtcHQtZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy92ZWxvY2lvdXMtYXR0ZW1wdC1leGVjdXRvci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0saUNBQWlDLENBQUE7QUFDaEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUM5QyxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUN2RCxPQUFPLEVBQUMsWUFBWSxJQUFJLGdCQUFnQixFQUFFLFVBQVUsSUFBSSxjQUFjLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFFMUYsdUhBQXVIO0FBRXZIOzs7R0FHRztBQUVIOzs7Ozs7R0FNRztBQUNILFNBQVMsY0FBYyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZTtJQUN6RCxNQUFNLGNBQWMsR0FBRyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUMxRSwrQkFBK0I7SUFDL0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxLQUFLLENBQUMsbUJBQW1CLGNBQWMsTUFBTSxlQUFlLEVBQUUsQ0FBQyxDQUFBO0lBQ3hGLFlBQVksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUE7SUFFeEMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBRXJFLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdkMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDekIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2pCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2pCLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNmLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxPQUFPO0lBQzdDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUM3QixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUE7UUFDbkIsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLEdBQUcsRUFBRTtZQUNyQyxJQUFJLE9BQU87Z0JBQUUsT0FBTTtZQUVuQixPQUFPLEdBQUcsSUFBSSxDQUFBO1lBQ2QsT0FBTyxDQUFDLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7UUFDM0IsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBRVgsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQzdCLEdBQUcsRUFBRTtZQUNILElBQUksT0FBTztnQkFBRSxPQUFNO1lBRW5CLE9BQU8sR0FBRyxJQUFJLENBQUE7WUFDZCxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUM1QixPQUFPLENBQUMsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFBO1FBQy9DLENBQUMsRUFDRCxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ1QsSUFBSSxPQUFPO2dCQUFFLE9BQU07WUFFbkIsT0FBTyxHQUFHLElBQUksQ0FBQTtZQUNkLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQzVCLE9BQU8sQ0FBQyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO1FBQ3RELENBQUMsQ0FDRixDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsOEJBQThCLENBQUMsS0FBSztJQUMzQyxJQUFJLEtBQUssWUFBWSw4QkFBOEI7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUNoRSxJQUFJLEtBQUssWUFBWSxjQUFjLEVBQUUsQ0FBQztRQUNwQyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsOEJBQThCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQTtJQUNwSCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQsTUFBTSxDQUFDLE9BQU8sT0FBTyx3QkFBd0I7SUFDM0M7Ozs7T0FJRztJQUNILFlBQVksRUFBQyxVQUFVLEVBQUUsR0FBRyxRQUFRLEVBQUM7UUFDbkMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO0lBQzlCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsa0JBQWtCLENBQUMsU0FBUztRQUMxQixPQUFPLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0lBQzdHLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLFFBQVEsRUFBQztRQUNoSSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdkIsS0FBSyxPQUFPLENBQUE7UUFDWixLQUFLLGNBQWMsQ0FBQTtRQUNuQixLQUFLLEtBQUssQ0FBQTtRQUNWLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUE7UUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDN0QsTUFBTSxhQUFhLEdBQUcsTUFBTSxVQUFVLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDOUQsTUFBTSxFQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUMsR0FBRyxhQUFhLENBQUE7UUFDMUMsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM5QyxNQUFNLEVBQUMsWUFBWSxFQUFFLGVBQWUsRUFBQyxHQUFHLFFBQVEsQ0FBQTtRQUNoRCw0Q0FBNEM7UUFDNUMsSUFBSSxXQUFXLENBQUE7UUFDZixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUE7UUFDbEIsaUVBQWlFO1FBQ2pFLElBQUksYUFBYSxDQUFBO1FBQ2pCLHNKQUFzSjtRQUN0SixJQUFJLGlDQUFpQyxHQUFHLEVBQUUsQ0FBQTtRQUMxQyxJQUFJLDJCQUEyQixHQUFHLEtBQUssQ0FBQTtRQUN2Qyx5RkFBeUY7UUFDekYsSUFBSSxtQ0FBbUMsQ0FBQTtRQUN2Qyx5RkFBeUY7UUFDekYsSUFBSSxrQ0FBa0MsQ0FBQTtRQUN0QywyRUFBMkU7UUFDM0UsTUFBTSxnQ0FBZ0MsR0FBRyxFQUFFLENBQUE7UUFDM0MsOEVBQThFO1FBQzlFLE1BQU0sbUNBQW1DLEdBQUcsRUFBRSxDQUFBO1FBQzlDLE1BQU0sdUJBQXVCLEdBQUcsRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFDLENBQUE7UUFDaEQseUJBQXlCO1FBQ3pCLE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUM5QyxJQUFJLG1CQUFtQixHQUFHLEtBQUssQ0FBQTtRQUMvQixJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUE7UUFDM0IsUUFBUSxDQUFDLDJCQUEyQixHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNwRCxNQUFNLFVBQVUsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQTtRQUN0RixDQUFDLENBQUE7UUFDRCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFBO1FBQ3JDLE1BQU0sY0FBYyxHQUFHLFFBQVEsRUFBRSxZQUFZLENBQUM7WUFDNUMsWUFBWTtZQUNaLGFBQWE7WUFDYixRQUFRO1lBQ1IsZUFBZTtTQUNoQixDQUFDLENBQUE7UUFFRixJQUFJLENBQUM7WUFDSCxNQUFNLG9CQUFvQixHQUFHLEtBQUssSUFBSSxFQUFFLENBQUMsTUFBTSxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUNsRyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxLQUFLLElBQUksQ0FBQTtnQkFDdEUsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsSUFBSSxDQUFDLGNBQWMsQ0FBQTtnQkFDN0UsTUFBTSx3QkFBd0IsR0FBRyxjQUFjLElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxTQUFTLENBQUE7Z0JBQzdFLE1BQU0sa0JBQWtCLEdBQUcsd0JBQXdCLElBQUksY0FBYyxDQUFBO2dCQUNyRSxNQUFNLGNBQWMsR0FBRyxLQUFLLElBQUksRUFBRTtvQkFDaEMsSUFBSSx3QkFBd0IsRUFBRSxDQUFDO3dCQUM3QixpQ0FBaUMsR0FBRyxVQUFVLENBQUMsNkJBQTZCLEVBQUUsQ0FBQTt3QkFDOUUsMkJBQTJCLEdBQUcsSUFBSSxDQUFBO29CQUNwQyxDQUFDO29CQUNELDhDQUE4QztvQkFDOUMsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFBO29CQUMxQixJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUE7b0JBRTNCLElBQUksQ0FBQzt3QkFDSCxJQUFJLHdCQUF3QixFQUFFLENBQUM7NEJBQzdCLGtDQUFrQyxHQUFHLE1BQU0sVUFBVSxDQUFDLDhCQUE4QixFQUFFLENBQUE7d0JBQ3hGLENBQUM7d0JBQ0QsZUFBZSxHQUFHLElBQUksQ0FBQTt3QkFFdEIsZUFBZSxFQUFFLENBQUE7d0JBQ2pCLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7d0JBRTFFLElBQUksd0JBQXdCLEVBQUUsQ0FBQzs0QkFDN0IsTUFBTSxpQkFBaUIsR0FBRyxVQUFVLENBQUMsNEJBQTRCLENBQUMsRUFBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBOzRCQUMzRixJQUFJLGtDQUFrQyxJQUFJLENBQUMsVUFBVSxDQUFDLHlDQUF5QyxDQUFDLGtDQUFrQyxFQUFFLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztnQ0FDdkosVUFBVSxDQUFDLDBCQUEwQixDQUFDLGlDQUFpQyxDQUFDLENBQUE7Z0NBQ3hFLGlDQUFpQyxHQUFHLEVBQUUsQ0FBQTtnQ0FDdEMsMkJBQTJCLEdBQUcsS0FBSyxDQUFBOzRCQUNyQyxDQUFDOzRCQUVELG1DQUFtQyxHQUFHLE1BQU0sVUFBVSxDQUFDLDRCQUE0QixDQUFDLGtDQUFrQyxFQUFFLGlCQUFpQixDQUFDLENBQUE7NEJBQzFJLGtDQUFrQyxHQUFHLFNBQVMsQ0FBQTs0QkFDOUMsSUFBSSxtQ0FBbUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7Z0NBQ3hFLGlDQUFpQyxHQUFHLFVBQVUsQ0FBQyw2QkFBNkIsRUFBRSxDQUFBO2dDQUM5RSwyQkFBMkIsR0FBRyxJQUFJLENBQUE7NEJBQ3BDLENBQUM7d0JBQ0gsQ0FBQzt3QkFFRCxVQUFVLENBQUMsZ0JBQWdCLEdBQUc7NEJBQzVCLGVBQWUsRUFBRSxRQUFROzRCQUN6QixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsSUFBSSxXQUFXOzRCQUMxQyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDO3lCQUN6QixDQUFBO3dCQUNELE1BQU0sVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxhQUFhLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBQyxFQUFFLEtBQUssSUFBSSxFQUFFOzRCQUN0SCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQTt3QkFDOUIsQ0FBQyxDQUFDLENBQUE7b0JBQ0osQ0FBQztvQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO3dCQUNmLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7b0JBQzdCLENBQUM7b0JBRUQsSUFBSSxlQUFlLEVBQUUsQ0FBQzt3QkFDcEIsSUFBSSxDQUFDOzRCQUNILE1BQU0sVUFBVSxDQUFDLGdCQUFnQixFQUFFLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTt3QkFDOUQsQ0FBQzt3QkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDOzRCQUNmLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7d0JBQzdCLENBQUM7d0JBRUQsSUFBSSxDQUFDOzRCQUNILElBQUksMkJBQTJCLEVBQUUsQ0FBQztnQ0FDaEMsVUFBVSxDQUFDLDBCQUEwQixDQUFDLGlDQUFpQyxDQUFDLENBQUE7Z0NBQ3hFLGlDQUFpQyxHQUFHLEVBQUUsQ0FBQTtnQ0FDdEMsMkJBQTJCLEdBQUcsS0FBSyxDQUFBOzRCQUNyQyxDQUFDO3dCQUNILENBQUM7d0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQzs0QkFDZixlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO3dCQUM3QixDQUFDO3dCQUVELElBQUksQ0FBQzs0QkFDSCxNQUFNLFVBQVUsQ0FBQywyQkFBMkIsQ0FBQyxtQ0FBbUMsSUFBSSxrQ0FBa0MsQ0FBQyxDQUFBOzRCQUN2SCxtQ0FBbUMsR0FBRyxTQUFTLENBQUE7NEJBQy9DLGtDQUFrQyxHQUFHLFNBQVMsQ0FBQTt3QkFDaEQsQ0FBQzt3QkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDOzRCQUNmLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7d0JBQzdCLENBQUM7d0JBRUQsSUFBSSxDQUFDOzRCQUNILE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7d0JBQ3hGLENBQUM7d0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQzs0QkFDZixlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO3dCQUM3QixDQUFDO3dCQUVELElBQUksQ0FBQzs0QkFDSCxNQUFNLFVBQVUsQ0FBQywyQkFBMkIsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFBO3dCQUNoRixDQUFDO3dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7NEJBQ2YsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTt3QkFDN0IsQ0FBQztvQkFDSCxDQUFDO29CQUVELElBQUksMkJBQTJCLEVBQUUsQ0FBQzt3QkFDaEMsSUFBSSxDQUFDOzRCQUNILFVBQVUsQ0FBQywwQkFBMEIsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFBO3dCQUMxRSxDQUFDO3dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7NEJBQ2YsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTt3QkFDN0IsQ0FBQzt3QkFDRCwyQkFBMkIsR0FBRyxLQUFLLENBQUE7b0JBQ3JDLENBQUM7b0JBRUQsSUFBSSxlQUFlLENBQUMsTUFBTSxJQUFJLENBQUM7d0JBQUUsTUFBTSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUE7b0JBQ3pELElBQUksZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDL0IsTUFBTSxJQUFJLGNBQWMsQ0FBQyxlQUFlLEVBQUUsbUNBQW1DLEVBQUUsRUFBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQTtvQkFDN0csQ0FBQztnQkFDSCxDQUFDLENBQUE7Z0JBRUQsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO29CQUN2QixNQUFNLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUMsSUFBSSxFQUFFLFNBQVMsZUFBZSxFQUFFLEVBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQTtnQkFDM0csQ0FBQztxQkFBTSxDQUFDO29CQUNOLE1BQU0sY0FBYyxFQUFFLENBQUE7Z0JBQ3hCLENBQUM7WUFDSCxDQUFDLEVBQUUsbUNBQW1DLENBQUMsQ0FBQTtZQUN2QyxNQUFNLGlCQUFpQixHQUFHLEtBQUssSUFBSSxFQUFFLENBQUMsTUFBTSxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyw4QkFBOEIsQ0FBQyx1QkFBdUIsRUFBRSxvQkFBb0IsQ0FBQyxDQUFBO1lBQ3ZKLGFBQWEsR0FBRyxjQUFjLElBQUksUUFBUTtnQkFDeEMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLGlCQUFpQixDQUFDO2dCQUN4RCxDQUFDLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtZQUV2QixJQUFJLGtCQUFrQixLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNyQyxNQUFNLGNBQWMsQ0FBQyxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxDQUFDLENBQUE7WUFDMUUsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sYUFBYSxDQUFBO1lBQ3JCLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sR0FBRyxJQUFJLENBQUE7WUFDYixXQUFXLEdBQUcsS0FBSyxDQUFBO1lBQ25CLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLG9CQUFvQixDQUFDLENBQUE7WUFDdkYsZUFBZSxHQUFHLFFBQVEsQ0FBQTtZQUUxQixJQUFJLFFBQVEsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLENBQUE7Z0JBRWpDLElBQUksY0FBYyxJQUFJLFFBQVE7b0JBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUE7Z0JBQ25GLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsa0JBQWtCLElBQUksS0FBSyxDQUFDLENBQUE7Z0JBRTlGLElBQUksZ0JBQWdCLENBQUMsT0FBTyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDdkUsc0JBQXNCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUN0RCxDQUFDO2dCQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDOUIsdUJBQXVCLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQTtvQkFDdEMsS0FBSyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7d0JBQ3hDLElBQUksOEJBQThCLENBQUMsWUFBWSxDQUFDOzRCQUFFLE9BQU07d0JBQ3hELFVBQVUsQ0FBQywyQkFBMkIsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsNEJBQTRCLENBQUMsQ0FBQTtvQkFDdEcsQ0FBQyxDQUFDLENBQUE7b0JBQ0YsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLGlDQUFpQyxDQUFDLG1DQUFtQyxDQUFDLENBQUE7b0JBQ3BHLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLElBQUksS0FBSyxDQUFDLENBQUE7b0JBQzVGLE1BQU0sdUJBQXVCLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixFQUFFLFdBQVcsS0FBSyxJQUFJLENBQUE7b0JBQy9FLE1BQU0scUJBQXFCLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsSUFBSSxDQUFDLHVCQUF1QixDQUFBO29CQUU3RixtQkFBbUIsR0FBRyxVQUFVLENBQUMsaUJBQWlCLEVBQUU7MkJBQy9DLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQzsyQkFDcEMsQ0FBQyx1QkFBdUIsSUFBSSxxQkFBcUIsQ0FBQyxDQUFBO29CQUV2RCxJQUFJLGlCQUFpQixDQUFDLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7d0JBQ3pFLHNCQUFzQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtvQkFDdkQsQ0FBQzt5QkFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ3RDLEtBQUssVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFOzRCQUNyQyxVQUFVLENBQUMsMkJBQTJCLENBQUMsWUFBWSxFQUFFLHFDQUFxQyxFQUFFLDRCQUE0QixDQUFDLENBQUE7d0JBQzNILENBQUMsQ0FBQyxDQUFBO29CQUNKLENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCxJQUFJLENBQUM7b0JBQ0gsSUFBSSwyQkFBMkIsRUFBRSxDQUFDO3dCQUNoQyxVQUFVLENBQUMsMEJBQTBCLENBQUMsaUNBQWlDLENBQUMsQ0FBQTt3QkFDeEUsaUNBQWlDLEdBQUcsRUFBRSxDQUFBO3dCQUN0QywyQkFBMkIsR0FBRyxLQUFLLENBQUE7b0JBQ3JDLENBQUM7Z0JBQ0gsQ0FBQztnQkFBQyxPQUFPLFlBQVksRUFBRSxDQUFDO29CQUN0QixzQkFBc0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7Z0JBQzNDLENBQUM7Z0JBRUQsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLDJCQUEyQixDQUFDLG1DQUFtQyxJQUFJLGtDQUFrQyxDQUFDLENBQUE7Z0JBQ3ZJLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsa0JBQWtCLElBQUksS0FBSyxDQUFDLENBQUE7Z0JBRWxHLElBQUksb0JBQW9CLENBQUMsT0FBTyxJQUFJLG9CQUFvQixDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDL0Usc0JBQXNCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUMxRCxDQUFDO3FCQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDekMsS0FBSyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7d0JBQ3hDLFVBQVUsQ0FBQywyQkFBMkIsQ0FBQyxZQUFZLEVBQUUsMkJBQTJCLEVBQUUsNEJBQTRCLENBQUMsQ0FBQTtvQkFDakgsQ0FBQyxDQUFDLENBQUE7Z0JBQ0osQ0FBQztnQkFDRCxtQ0FBbUMsR0FBRyxTQUFTLENBQUE7Z0JBQy9DLGtDQUFrQyxHQUFHLFNBQVMsQ0FBQTtnQkFDOUMsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsMkJBQTJCLENBQUMsZ0NBQWdDLEVBQUUsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtnQkFDbEgsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLG1CQUFtQixDQUFDLGdCQUFnQixFQUFFLGtCQUFrQixJQUFJLEtBQUssQ0FBQyxDQUFBO2dCQUV4RyxJQUFJLHVCQUF1QixDQUFDLE9BQU8sSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7b0JBQ3JGLHNCQUFzQixDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDN0QsQ0FBQztxQkFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQzVDLEtBQUssZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7d0JBQzNDLFVBQVUsQ0FBQywyQkFBMkIsQ0FBQyxZQUFZLEVBQUUsc0JBQXNCLEVBQUUsNEJBQTRCLENBQUMsQ0FBQTtvQkFDNUcsQ0FBQyxDQUFDLENBQUE7Z0JBQ0osQ0FBQztnQkFFRCxJQUFJLHNCQUFzQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDdEMsV0FBVyxHQUFHLElBQUksY0FBYyxDQUM5QixDQUFDLFdBQVcsRUFBRSxHQUFHLHNCQUFzQixDQUFDLEVBQ3hDLDJDQUEyQyxFQUMzQyxFQUFDLEtBQUssRUFBRSxXQUFXLEVBQUMsQ0FDckIsQ0FBQTtnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksbUNBQW1DLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDekYsdUJBQXVCLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQTtnQkFDdEMsbUJBQW1CLEdBQUcsSUFBSSxDQUFBO1lBQzVCLENBQUM7UUFDSCxDQUFDO2dCQUFTLENBQUM7WUFDVCx1QkFBdUIsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBO1lBRXRDLElBQUksY0FBYyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUMvQixRQUFRLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxNQUFNO29CQUMzQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO29CQUM1QyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDZixDQUFDO1FBQ0gsQ0FBQztRQUVELFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFO1lBQ25ELG1CQUFtQjtZQUNuQixLQUFLLEVBQUUsV0FBVztZQUNsQixNQUFNO1NBQ1AsQ0FBQyxDQUFBO1FBRUYsSUFBSSxNQUFNO1lBQUUsTUFBTSxXQUFXLENBQUE7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUM7UUFDdEQsS0FBSyxNQUFNLElBQUksSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNoQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUVuRCxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDO2dCQUNuQyxLQUFLLEVBQUUsWUFBWTtnQkFDbkIsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLGdCQUFnQjtnQkFDM0Msa0JBQWtCLEVBQUUsUUFBUSxDQUFDLGtCQUFrQjtnQkFDL0MsUUFBUSxFQUFFLFFBQVEsQ0FBQyxhQUFhO2FBQ2pDLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ1osTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtZQUM5RixDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBQztRQUNwRCw4Q0FBOEM7UUFDOUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFBO1FBRWpCLEtBQUssTUFBTSxJQUFJLElBQUksV0FBVyxFQUFFLENBQUM7WUFDL0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUE7WUFFbkQsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUM7b0JBQ25DLEtBQUssRUFBRSxXQUFXO29CQUNsQixnQkFBZ0IsRUFBRSxRQUFRLENBQUMsZ0JBQWdCO29CQUMzQyxrQkFBa0IsRUFBRSxRQUFRLENBQUMsa0JBQWtCO29CQUMvQyxRQUFRLEVBQUUsUUFBUSxDQUFDLGFBQWE7aUJBQ2pDLEVBQUUsS0FBSyxJQUFJLEVBQUU7b0JBQ1osTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtnQkFDOUYsQ0FBQyxDQUFDLENBQUE7WUFDSixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3BCLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUM7WUFBRSxNQUFNLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN2QyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUUsaUNBQWlDLEVBQUUsRUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQTtRQUN6RixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7IFRlc3REYXRhYmFzZUFjY2Vzc1Jldm9rZWRFcnJvciB9IGZyb20gXCIuLi9lbnZpcm9ubWVudC1oYW5kbGVycy9iYXNlLmpzXCJcbmltcG9ydCB7IGNsZWFyRGVsaXZlcmllcyB9IGZyb20gXCIuLi9tYWlsZXIuanNcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5pbXBvcnQge2NsZWFyVGltZW91dCBhcyByZWFsQ2xlYXJUaW1lb3V0LCBzZXRUaW1lb3V0IGFzIHJlYWxTZXRUaW1lb3V0fSBmcm9tIFwibm9kZTp0aW1lcnNcIlxuXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIkB2ZWxvY2lvdXMvdGVzdGluZy9ydW5uZXJcIikuQXR0ZW1wdEV4ZWN1dG9ySW5wdXRbXCJiZWZvcmVFYWNoXCJdW251bWJlcl19IFBhY2thZ2VIb29rRGVjbGFyYXRpb24gKi9cblxuLyoqXG4gKiBNYXJrcyBvbmUgd2hvbGUtbGlmZWN5Y2xlIHRpbWVvdXQgd2hpbGUgaXRzIHVuZGVybHlpbmcgcHJvbWlzZSBrZWVwcyBydW5uaW5nLlxuICogQHR5cGVkZWYge0Vycm9yICYge3ZlbG9jaW91c1Rlc3RUaW1lb3V0PzogdHJ1ZX19IFRlc3RUaW1lb3V0RXJyb3JcbiAqL1xuXG4vKipcbiAqIFJ1bnMgb25lIHByb21pc2Ugd2l0aCBhIGxpZmVjeWNsZSB0aW1lb3V0LlxuICogQHBhcmFtIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiB8IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBwcm9taXNlIC0gUHJvbWlzZSBvciB2YWx1ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0TXMgLSBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0RGVzY3JpcHRpb24gLSBUZXN0IGRlc2NyaXB0aW9uLlxuICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIExpZmVjeWNsZSByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIHJ1bldpdGhUaW1lb3V0KHByb21pc2UsIHRpbWVvdXRNcywgdGVzdERlc2NyaXB0aW9uKSB7XG4gIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gKHRpbWVvdXRNcyAvIDEwMDApLnRvRml4ZWQoMykucmVwbGFjZSgvXFwuPzArJC8sIFwiXCIpXG4gIC8qKiBAdHlwZSB7VGVzdFRpbWVvdXRFcnJvcn0gKi9cbiAgY29uc3QgdGltZW91dEVycm9yID0gbmV3IEVycm9yKGBUaW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0U2Vjb25kc31zOiAke3Rlc3REZXNjcmlwdGlvbn1gKVxuICB0aW1lb3V0RXJyb3IudmVsb2Npb3VzVGVzdFRpbWVvdXQgPSB0cnVlXG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCB0aW1lb3V0ID0gcmVhbFNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KHRpbWVvdXRFcnJvciksIHRpbWVvdXRNcylcblxuICAgIFByb21pc2UucmVzb2x2ZShwcm9taXNlKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgIHJlYWxDbGVhclRpbWVvdXQodGltZW91dClcbiAgICAgIHJlc29sdmUocmVzdWx0KVxuICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgcmVhbENsZWFyVGltZW91dCh0aW1lb3V0KVxuICAgICAgcmVqZWN0KGVycm9yKVxuICAgIH0pXG4gIH0pXG59XG5cbi8qKlxuICogV2FpdHMgZm9yIGRldGFjaGVkIGxpZmVjeWNsZSBjbGVhbnVwIHVwIHRvIHRoZSB0aW1lb3V0IGdyYWNlIHBlcmlvZC5cbiAqIEBwYXJhbSB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGxpZmVjeWNsZSAtIERldGFjaGVkIGxpZmVjeWNsZSBwcm9taXNlLlxuICogQHBhcmFtIHtudW1iZXJ9IGdyYWNlTXMgLSBNYXhpbXVtIHdhaXQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7c2V0dGxlZDogZmFsc2V9IHwge3NldHRsZWQ6IHRydWUsIHN0YXR1czogXCJmdWxmaWxsZWRcIn0gfCB7c2V0dGxlZDogdHJ1ZSwgc3RhdHVzOiBcInJlamVjdGVkXCIsIHJlYXNvbjogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59Pn0gLSBTZXR0bGVtZW50IG91dGNvbWUuXG4gKi9cbmZ1bmN0aW9uIGF3YWl0U2V0dGxlZE9yR3JhY2UobGlmZWN5Y2xlLCBncmFjZU1zKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGxldCBzZXR0bGVkID0gZmFsc2VcbiAgICBjb25zdCBncmFjZVRpbWVyID0gcmVhbFNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHNldHRsZWQpIHJldHVyblxuXG4gICAgICBzZXR0bGVkID0gdHJ1ZVxuICAgICAgcmVzb2x2ZSh7c2V0dGxlZDogZmFsc2V9KVxuICAgIH0sIGdyYWNlTXMpXG5cbiAgICBQcm9taXNlLnJlc29sdmUobGlmZWN5Y2xlKS50aGVuKFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuXG5cbiAgICAgICAgc2V0dGxlZCA9IHRydWVcbiAgICAgICAgcmVhbENsZWFyVGltZW91dChncmFjZVRpbWVyKVxuICAgICAgICByZXNvbHZlKHtzZXR0bGVkOiB0cnVlLCBzdGF0dXM6IFwiZnVsZmlsbGVkXCJ9KVxuICAgICAgfSxcbiAgICAgIChyZWFzb24pID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVyblxuXG4gICAgICAgIHNldHRsZWQgPSB0cnVlXG4gICAgICAgIHJlYWxDbGVhclRpbWVvdXQoZ3JhY2VUaW1lcilcbiAgICAgICAgcmVzb2x2ZSh7c2V0dGxlZDogdHJ1ZSwgc3RhdHVzOiBcInJlamVjdGVkXCIsIHJlYXNvbn0pXG4gICAgICB9XG4gICAgKVxuICB9KVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbGF0ZSBsaWZlY3ljbGUgc3RvcHBlZCBvbmx5IGJlY2F1c2UgaXRzIGF0dGVtcHQgYWNjZXNzIHdhcyByZXZva2VkLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gZXJyb3IgLSBMaWZlY3ljbGUgcmVqZWN0aW9uLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBldmVyeSBjb250YWluZWQgZXJyb3IgaXMgZXhwZWN0ZWQgcmV2b2NhdGlvbi5cbiAqL1xuZnVuY3Rpb24gaXNUZXN0RGF0YWJhc2VBY2Nlc3NSZXZvY2F0aW9uKGVycm9yKSB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIFRlc3REYXRhYmFzZUFjY2Vzc1Jldm9rZWRFcnJvcikgcmV0dXJuIHRydWVcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgQWdncmVnYXRlRXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IuZXJyb3JzLmxlbmd0aCA+IDAgJiYgZXJyb3IuZXJyb3JzLmV2ZXJ5KChuZXN0ZWRFcnJvcikgPT4gaXNUZXN0RGF0YWJhc2VBY2Nlc3NSZXZvY2F0aW9uKG5lc3RlZEVycm9yKSlcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNBdHRlbXB0RXhlY3V0b3Ige1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBleGVjdXRvciBmb3IgZnJhbWV3b3JrLW93bmVkIGF0dGVtcHQgbGlmZWN5Y2xlIHdvcmsuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQ29uc3RydWN0b3IgYXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuZGVmYXVsdH0gYXJncy50ZXN0UnVubmVyIC0gT3duaW5nIFZlbG9jaW91cyBydW5uZXIuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7dGVzdFJ1bm5lciwgLi4ucmVzdEFyZ3N9KSB7XG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcbiAgICB0aGlzLnRlc3RSdW5uZXIgPSB0ZXN0UnVubmVyXG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyB0aGUgbGVnYWN5IHRpbWVvdXQgY29udHJhY3QgYXQgdGhlIGZyYW1ld29yayBhZGFwdGVyIGJvdW5kYXJ5LlxuICAgKiBAcGFyYW0ge251bWJlciB8IHVuZGVmaW5lZH0gdGltZW91dE1zIC0gRGVjbGFyZWQgcGFja2FnZSB0aW1lb3V0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgdW5kZWZpbmVkfSAtIFBvc2l0aXZlIGZpbml0ZSB0aW1lb3V0LCBvciBubyB0aW1lb3V0LlxuICAgKi9cbiAgbm9ybWFsaXplVGltZW91dE1zKHRpbWVvdXRNcykge1xuICAgIHJldHVybiB0eXBlb2YgdGltZW91dE1zID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh0aW1lb3V0TXMpICYmIHRpbWVvdXRNcyA+IDAgPyB0aW1lb3V0TXMgOiB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBleGFjdGx5IG9uZSBjb21wbGV0ZSBWZWxvY2lvdXMtb3duZWQgdGVzdCBhdHRlbXB0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIkB2ZWxvY2lvdXMvdGVzdGluZy9ydW5uZXJcIikuQXR0ZW1wdEV4ZWN1dG9ySW5wdXR9IGlucHV0IC0gUGFja2FnZSBhdHRlbXB0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciBvbmUgY29tcGxldGUgZnJhbWV3b3JrIGF0dGVtcHQuXG4gICAqL1xuICBhc3luYyBleGVjdXRlKHthZnRlckVhY2gsIGFyZ3MsIGF0dGVtcHROdW1iZXIsIGJlZm9yZUVhY2gsIGNvbnRleHQsIGRlZmF1bHRFeGVjdXRlLCBmdWxsTmFtZSwgc3VpdGUsIHRlc3QsIHRpbWVvdXRNcywgLi4ucmVzdEFyZ3N9KSB7XG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcbiAgICB2b2lkIGNvbnRleHRcbiAgICB2b2lkIGRlZmF1bHRFeGVjdXRlXG4gICAgdm9pZCBzdWl0ZVxuICAgIGNvbnN0IHRlc3RSdW5uZXIgPSB0aGlzLnRlc3RSdW5uZXJcbiAgICBjb25zdCBlZmZlY3RpdmVUaW1lb3V0TXMgPSB0aGlzLm5vcm1hbGl6ZVRpbWVvdXRNcyh0aW1lb3V0TXMpXG4gICAgY29uc3QgY29tcGF0aWJpbGl0eSA9IGF3YWl0IHRlc3RSdW5uZXIudGVzdENvbXBhdGliaWxpdHkodGVzdClcbiAgICBjb25zdCB7dGVzdEFyZ3MsIHRlc3REYXRhfSA9IGNvbXBhdGliaWxpdHlcbiAgICBjb25zdCBtZXRhZGF0YSA9IHRlc3RSdW5uZXIudGVzdE1ldGFkYXRhKHRlc3QpXG4gICAgY29uc3Qge2Rlc2NyaXB0aW9ucywgdGVzdERlc2NyaXB0aW9ufSA9IG1ldGFkYXRhXG4gICAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gKi9cbiAgICBsZXQgY2F1Z2h0RXJyb3JcbiAgICBsZXQgZmFpbGVkID0gZmFsc2VcbiAgICAvKiogQHR5cGUge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+IHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCB0ZXN0TGlmZWN5Y2xlXG4gICAgLyoqIEB0eXBlIHt7cG9vbDogaW1wb3J0KFwiLi4vZGF0YWJhc2UvcG9vbC9iYXNlLmpzXCIpLmRlZmF1bHQsIHJlZ2lzdHJhdGlvbjogaW1wb3J0KFwiLi4vZGF0YWJhc2UvcG9vbC9iYXNlLmpzXCIpLlRlc3RTaGFyZWRDb25uZWN0aW9uUmVnaXN0cmF0aW9ufVtdfSAqL1xuICAgIGxldCB0ZXN0U2hhcmVkQ29ubmVjdGlvblJlZ2lzdHJhdGlvbnMgPSBbXVxuICAgIGxldCB0ZXN0U2hhcmVkQ29ubmVjdGlvbnNBY3RpdmUgPSBmYWxzZVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5TaGFyZWRUcmFuc2FjdGlvbkJyb2tlclJlZ2lzdHJhdGlvbiB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgc2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJSZWdpc3RyYXRpb25cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuU2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJSZWdpc3RyYXRpb24gfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IHNoYXJlZFRyYW5zYWN0aW9uQnJva2VyUHJlcGFyYXRpb25cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuVHJhbnNhY3Rpb25hbFRlbmFudFJlZ2lzdHJhdGlvbltdfSAqL1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uYWxUZW5hbnRSZWdpc3RyYXRpb25zID0gW11cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuQnJvd3NlckR1bW15Q29ubmVjdGlvblJlZ2lzdHJhdGlvbltdfSAqL1xuICAgIGNvbnN0IGJyb3dzZXJEdW1teUNvbm5lY3Rpb25SZWdpc3RyYXRpb25zID0gW11cbiAgICBjb25zdCB0ZXN0RGF0YWJhc2VBY2Nlc3NTY29wZSA9IHtyZXZva2VkOiBmYWxzZX1cbiAgICAvKiogQHR5cGUge1NldDxFcnJvcj59ICovXG4gICAgY29uc3QgcmVjb3JkZWRUaW1lb3V0Q2xlYW51cEVycm9ycyA9IG5ldyBTZXQoKVxuICAgIGxldCBhYm9ydFJlbWFpbmluZ1Rlc3RzID0gZmFsc2VcbiAgICBsZXQgYXR0ZW1wdFRpbWVkT3V0ID0gZmFsc2VcbiAgICB0ZXN0QXJncy5yZWdpc3RlclRyYW5zYWN0aW9uYWxUZW5hbnQgPSBhc3luYyAoYXJncykgPT4ge1xuICAgICAgYXdhaXQgdGVzdFJ1bm5lci5yZWdpc3RlclRyYW5zYWN0aW9uYWxUZW5hbnQoYXJncywgdHJhbnNhY3Rpb25hbFRlbmFudFJlZ2lzdHJhdGlvbnMpXG4gICAgfVxuICAgIGNvbnN0IHByb2ZpbGVyID0gdGVzdFJ1bm5lci5fcHJvZmlsZXJcbiAgICBjb25zdCBwcm9maWxlQXR0ZW1wdCA9IHByb2ZpbGVyPy5zdGFydEF0dGVtcHQoe1xuICAgICAgZGVzY3JpcHRpb25zLFxuICAgICAgYXR0ZW1wdE51bWJlcixcbiAgICAgIHRlc3REYXRhLFxuICAgICAgdGVzdERlc2NyaXB0aW9uXG4gICAgfSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBydW5MaWZlY3ljbGVDYWxsYmFjayA9IGFzeW5jICgpID0+IGF3YWl0IHRlc3RSdW5uZXIucnVuV2l0aER1bW15SWZOZWVkZWQodGVzdEFyZ3MsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdXNlVHJhbnNhY3Rpb24gPSB0ZXN0QXJncy5kYXRhYmFzZUNsZWFuaW5nPy50cmFuc2FjdGlvbiA9PT0gdHJ1ZVxuICAgICAgICBjb25zdCBzaG91bGRUcnVuY2F0ZSA9IHRlc3RBcmdzLmRhdGFiYXNlQ2xlYW5pbmc/LnRydW5jYXRlID8/ICF1c2VUcmFuc2FjdGlvblxuICAgICAgICBjb25zdCB1c2VTaGFyZWRUZXN0Q29ubmVjdGlvbnMgPSB1c2VUcmFuc2FjdGlvbiB8fCB0ZXN0QXJncy50eXBlID09IFwicmVxdWVzdFwiXG4gICAgICAgIGNvbnN0IHVzZVRlc3RDb25uZWN0aW9ucyA9IHVzZVNoYXJlZFRlc3RDb25uZWN0aW9ucyB8fCBzaG91bGRUcnVuY2F0ZVxuICAgICAgICBjb25zdCBydW5UZXN0QXR0ZW1wdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAodXNlU2hhcmVkVGVzdENvbm5lY3Rpb25zKSB7XG4gICAgICAgICAgICB0ZXN0U2hhcmVkQ29ubmVjdGlvblJlZ2lzdHJhdGlvbnMgPSB0ZXN0UnVubmVyLmFjdGl2YXRlVGVzdFNoYXJlZENvbm5lY3Rpb25zKClcbiAgICAgICAgICAgIHRlc3RTaGFyZWRDb25uZWN0aW9uc0FjdGl2ZSA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgICAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPltdfSAqL1xuICAgICAgICAgIGNvbnN0IGxpZmVjeWNsZUVycm9ycyA9IFtdXG4gICAgICAgICAgbGV0IHJ1bkNsZWFudXBIb29rcyA9IGZhbHNlXG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHVzZVNoYXJlZFRlc3RDb25uZWN0aW9ucykge1xuICAgICAgICAgICAgICBzaGFyZWRUcmFuc2FjdGlvbkJyb2tlclByZXBhcmF0aW9uID0gYXdhaXQgdGVzdFJ1bm5lci5wcmVwYXJlU2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXIoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcnVuQ2xlYW51cEhvb2tzID0gdHJ1ZVxuXG4gICAgICAgICAgICBjbGVhckRlbGl2ZXJpZXMoKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5CZWZvcmVFYWNoZXMoe2JlZm9yZUVhY2hlczogYmVmb3JlRWFjaCwgdGVzdEFyZ3MsIHRlc3REYXRhfSlcblxuICAgICAgICAgICAgaWYgKHVzZVNoYXJlZFRlc3RDb25uZWN0aW9ucykge1xuICAgICAgICAgICAgICBjb25zdCBhY3RpdmVDb25uZWN0aW9ucyA9IHRlc3RSdW5uZXIuc2hhcmVkVHJhbnNhY3Rpb25Db25uZWN0aW9ucyh7dHJhbnNhY3Rpb25zT25seTogdHJ1ZX0pXG4gICAgICAgICAgICAgIGlmIChzaGFyZWRUcmFuc2FjdGlvbkJyb2tlclByZXBhcmF0aW9uICYmICF0ZXN0UnVubmVyLnNoYXJlZFRyYW5zYWN0aW9uQnJva2VyTWF0Y2hlc0Nvbm5lY3Rpb25zKHNoYXJlZFRyYW5zYWN0aW9uQnJva2VyUHJlcGFyYXRpb24sIGFjdGl2ZUNvbm5lY3Rpb25zKSkge1xuICAgICAgICAgICAgICAgIHRlc3RSdW5uZXIuY2xlYXJUZXN0U2hhcmVkQ29ubmVjdGlvbnModGVzdFNoYXJlZENvbm5lY3Rpb25SZWdpc3RyYXRpb25zKVxuICAgICAgICAgICAgICAgIHRlc3RTaGFyZWRDb25uZWN0aW9uUmVnaXN0cmF0aW9ucyA9IFtdXG4gICAgICAgICAgICAgICAgdGVzdFNoYXJlZENvbm5lY3Rpb25zQWN0aXZlID0gZmFsc2VcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNoYXJlZFRyYW5zYWN0aW9uQnJva2VyUmVnaXN0cmF0aW9uID0gYXdhaXQgdGVzdFJ1bm5lci5zdGFydFNoYXJlZFRyYW5zYWN0aW9uQnJva2VyKHNoYXJlZFRyYW5zYWN0aW9uQnJva2VyUHJlcGFyYXRpb24sIGFjdGl2ZUNvbm5lY3Rpb25zKVxuICAgICAgICAgICAgICBzaGFyZWRUcmFuc2FjdGlvbkJyb2tlclByZXBhcmF0aW9uID0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgIGlmIChzaGFyZWRUcmFuc2FjdGlvbkJyb2tlclJlZ2lzdHJhdGlvbiAmJiAhdGVzdFNoYXJlZENvbm5lY3Rpb25zQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgdGVzdFNoYXJlZENvbm5lY3Rpb25SZWdpc3RyYXRpb25zID0gdGVzdFJ1bm5lci5hY3RpdmF0ZVRlc3RTaGFyZWRDb25uZWN0aW9ucygpXG4gICAgICAgICAgICAgICAgdGVzdFNoYXJlZENvbm5lY3Rpb25zQWN0aXZlID0gdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRlc3RSdW5uZXIuX2xhc3RUZXN0Q29udGV4dCA9IHtcbiAgICAgICAgICAgICAgZnVsbERlc2NyaXB0aW9uOiBmdWxsTmFtZSxcbiAgICAgICAgICAgICAgZmlsZVBhdGg6IHRlc3REYXRhLmZpbGVQYXRoID8/IFwiPHVua25vd24+XCIsXG4gICAgICAgICAgICAgIGxpbmU6IHRlc3REYXRhLmxpbmUgPz8gMFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGVzdFJ1bm5lci5ydW5Qcm9maWxlU3Bhbih7cGhhc2U6IFwidGVzdCBib2R5XCIsIGZpbGVQYXRoOiB0ZXN0RGF0YS5vd25lckZpbGVQYXRoID8/IHRlc3REYXRhLmZpbGVQYXRofSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBhd2FpdCB0ZXN0LmNhbGxiYWNrKC4uLmFyZ3MpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBsaWZlY3ljbGVFcnJvcnMucHVzaChlcnJvcilcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocnVuQ2xlYW51cEhvb2tzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB0ZXN0UnVubmVyLmdldENvbmZpZ3VyYXRpb24oKS5hd2FpdFBlbmRpbmdCcm9hZGNhc3RzKClcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGxpZmVjeWNsZUVycm9ycy5wdXNoKGVycm9yKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAodGVzdFNoYXJlZENvbm5lY3Rpb25zQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgdGVzdFJ1bm5lci5jbGVhclRlc3RTaGFyZWRDb25uZWN0aW9ucyh0ZXN0U2hhcmVkQ29ubmVjdGlvblJlZ2lzdHJhdGlvbnMpXG4gICAgICAgICAgICAgICAgdGVzdFNoYXJlZENvbm5lY3Rpb25SZWdpc3RyYXRpb25zID0gW11cbiAgICAgICAgICAgICAgICB0ZXN0U2hhcmVkQ29ubmVjdGlvbnNBY3RpdmUgPSBmYWxzZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBsaWZlY3ljbGVFcnJvcnMucHVzaChlcnJvcilcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgdGVzdFJ1bm5lci5zdG9wU2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXIoc2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJSZWdpc3RyYXRpb24gfHwgc2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJQcmVwYXJhdGlvbilcbiAgICAgICAgICAgICAgc2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJSZWdpc3RyYXRpb24gPSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgc2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJQcmVwYXJhdGlvbiA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgbGlmZWN5Y2xlRXJyb3JzLnB1c2goZXJyb3IpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMucnVuQWZ0ZXJFYWNoZXMoe2FmdGVyRWFjaGVzOiBbLi4uYWZ0ZXJFYWNoXS5yZXZlcnNlKCksIHRlc3RBcmdzLCB0ZXN0RGF0YX0pXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBsaWZlY3ljbGVFcnJvcnMucHVzaChlcnJvcilcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgdGVzdFJ1bm5lci5jbGVhbnVwVHJhbnNhY3Rpb25hbFRlbmFudHModHJhbnNhY3Rpb25hbFRlbmFudFJlZ2lzdHJhdGlvbnMpXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBsaWZlY3ljbGVFcnJvcnMucHVzaChlcnJvcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGVzdFNoYXJlZENvbm5lY3Rpb25zQWN0aXZlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB0ZXN0UnVubmVyLmNsZWFyVGVzdFNoYXJlZENvbm5lY3Rpb25zKHRlc3RTaGFyZWRDb25uZWN0aW9uUmVnaXN0cmF0aW9ucylcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGxpZmVjeWNsZUVycm9ycy5wdXNoKGVycm9yKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGVzdFNoYXJlZENvbm5lY3Rpb25zQWN0aXZlID0gZmFsc2VcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobGlmZWN5Y2xlRXJyb3JzLmxlbmd0aCA9PSAxKSB0aHJvdyBsaWZlY3ljbGVFcnJvcnNbMF1cbiAgICAgICAgICBpZiAobGlmZWN5Y2xlRXJyb3JzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcihsaWZlY3ljbGVFcnJvcnMsIFwiVGVzdCBsaWZlY3ljbGUgYW5kIGNsZWFudXAgZmFpbGVkXCIsIHtjYXVzZTogbGlmZWN5Y2xlRXJyb3JzWzBdfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXNlVGVzdENvbm5lY3Rpb25zKSB7XG4gICAgICAgICAgYXdhaXQgdGVzdFJ1bm5lci5nZXRDb25maWd1cmF0aW9uKCkuZW5zdXJlQ29ubmVjdGlvbnMoe25hbWU6IGBUZXN0OiAke3Rlc3REZXNjcmlwdGlvbn1gfSwgcnVuVGVzdEF0dGVtcHQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgcnVuVGVzdEF0dGVtcHQoKVxuICAgICAgICB9XG4gICAgICB9LCBicm93c2VyRHVtbXlDb25uZWN0aW9uUmVnaXN0cmF0aW9ucylcbiAgICAgIGNvbnN0IGxpZmVjeWNsZUNhbGxiYWNrID0gYXN5bmMgKCkgPT4gYXdhaXQgdGVzdFJ1bm5lci5nZXRDb25maWd1cmF0aW9uKCkucnVuV2l0aFRlc3REYXRhYmFzZUFjY2Vzc1Njb3BlKHRlc3REYXRhYmFzZUFjY2Vzc1Njb3BlLCBydW5MaWZlY3ljbGVDYWxsYmFjaylcbiAgICAgIHRlc3RMaWZlY3ljbGUgPSBwcm9maWxlQXR0ZW1wdCAmJiBwcm9maWxlclxuICAgICAgICA/IHByb2ZpbGVyLnJ1bkF0dGVtcHQocHJvZmlsZUF0dGVtcHQsIGxpZmVjeWNsZUNhbGxiYWNrKVxuICAgICAgICA6IGxpZmVjeWNsZUNhbGxiYWNrKClcblxuICAgICAgaWYgKGVmZmVjdGl2ZVRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhUaW1lb3V0KHRlc3RMaWZlY3ljbGUsIGVmZmVjdGl2ZVRpbWVvdXRNcywgdGVzdERlc2NyaXB0aW9uKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGVzdExpZmVjeWNsZVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBmYWlsZWQgPSB0cnVlXG4gICAgICBjYXVnaHRFcnJvciA9IGVycm9yXG4gICAgICBjb25zdCB0aW1lZE91dCA9IEJvb2xlYW4oLyoqIEB0eXBlIHtUZXN0VGltZW91dEVycm9yfSAqLyAoZXJyb3IpPy52ZWxvY2lvdXNUZXN0VGltZW91dClcbiAgICAgIGF0dGVtcHRUaW1lZE91dCA9IHRpbWVkT3V0XG5cbiAgICAgIGlmICh0aW1lZE91dCAmJiB0ZXN0TGlmZWN5Y2xlKSB7XG4gICAgICAgIGNvbnN0IGVtZXJnZW5jeUNsZWFudXBFcnJvcnMgPSBbXVxuXG4gICAgICAgIGlmIChwcm9maWxlQXR0ZW1wdCAmJiBwcm9maWxlcikgcHJvZmlsZXIuZmluaXNoQXR0ZW1wdChwcm9maWxlQXR0ZW1wdCwgXCJ0aW1lZC1vdXRcIilcbiAgICAgICAgY29uc3QgbGlmZWN5Y2xlT3V0Y29tZSA9IGF3YWl0IGF3YWl0U2V0dGxlZE9yR3JhY2UodGVzdExpZmVjeWNsZSwgZWZmZWN0aXZlVGltZW91dE1zID8/IDYwMDAwKVxuXG4gICAgICAgIGlmIChsaWZlY3ljbGVPdXRjb21lLnNldHRsZWQgJiYgbGlmZWN5Y2xlT3V0Y29tZS5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICAgIGVtZXJnZW5jeUNsZWFudXBFcnJvcnMucHVzaChsaWZlY3ljbGVPdXRjb21lLnJlYXNvbilcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbGlmZWN5Y2xlT3V0Y29tZS5zZXR0bGVkKSB7XG4gICAgICAgICAgdGVzdERhdGFiYXNlQWNjZXNzU2NvcGUucmV2b2tlZCA9IHRydWVcbiAgICAgICAgICB2b2lkIHRlc3RMaWZlY3ljbGUuY2F0Y2goKGNsZWFudXBFcnJvcikgPT4ge1xuICAgICAgICAgICAgaWYgKGlzVGVzdERhdGFiYXNlQWNjZXNzUmV2b2NhdGlvbihjbGVhbnVwRXJyb3IpKSByZXR1cm5cbiAgICAgICAgICAgIHRlc3RSdW5uZXIucmVjb3JkVGltZW91dENsZWFudXBGYWlsdXJlKGNsZWFudXBFcnJvciwgXCJ0ZXN0IGxpZmVjeWNsZVwiLCByZWNvcmRlZFRpbWVvdXRDbGVhbnVwRXJyb3JzKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgY29uc3QgcXVhcmFudGluZSA9IHRlc3RSdW5uZXIucXVhcmFudGluZUJyb3dzZXJEdW1teUNvbm5lY3Rpb25zKGJyb3dzZXJEdW1teUNvbm5lY3Rpb25SZWdpc3RyYXRpb25zKVxuICAgICAgICAgIGNvbnN0IHF1YXJhbnRpbmVPdXRjb21lID0gYXdhaXQgYXdhaXRTZXR0bGVkT3JHcmFjZShxdWFyYW50aW5lLCBlZmZlY3RpdmVUaW1lb3V0TXMgPz8gNjAwMDApXG4gICAgICAgICAgY29uc3QgdXNlc0Jyb3dzZXJUcmFuc2FjdGlvbnMgPSB0ZXN0QXJncy5kYXRhYmFzZUNsZWFuaW5nPy50cmFuc2FjdGlvbiA9PT0gdHJ1ZVxuICAgICAgICAgIGNvbnN0IHVzZXNCcm93c2VyVHJ1bmNhdGlvbiA9IHRlc3RBcmdzLmRhdGFiYXNlQ2xlYW5pbmc/LnRydW5jYXRlID8/ICF1c2VzQnJvd3NlclRyYW5zYWN0aW9uc1xuXG4gICAgICAgICAgYWJvcnRSZW1haW5pbmdUZXN0cyA9IHRlc3RSdW5uZXIuaXNCcm93c2VyVGVzdE1vZGUoKVxuICAgICAgICAgICAgJiYgdGVzdFJ1bm5lci5oYXNUYWcodGVzdEFyZ3MsIFwiZHVtbXlcIilcbiAgICAgICAgICAgICYmICh1c2VzQnJvd3NlclRyYW5zYWN0aW9ucyB8fCB1c2VzQnJvd3NlclRydW5jYXRpb24pXG5cbiAgICAgICAgICBpZiAocXVhcmFudGluZU91dGNvbWUuc2V0dGxlZCAmJiBxdWFyYW50aW5lT3V0Y29tZS5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICAgICAgZW1lcmdlbmN5Q2xlYW51cEVycm9ycy5wdXNoKHF1YXJhbnRpbmVPdXRjb21lLnJlYXNvbilcbiAgICAgICAgICB9IGVsc2UgaWYgKCFxdWFyYW50aW5lT3V0Y29tZS5zZXR0bGVkKSB7XG4gICAgICAgICAgICB2b2lkIHF1YXJhbnRpbmUuY2F0Y2goKGNsZWFudXBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICB0ZXN0UnVubmVyLnJlY29yZFRpbWVvdXRDbGVhbnVwRmFpbHVyZShjbGVhbnVwRXJyb3IsIFwiYnJvd3NlciBkdW1teSBjb25uZWN0aW9uIHF1YXJhbnRpbmVcIiwgcmVjb3JkZWRUaW1lb3V0Q2xlYW51cEVycm9ycylcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAodGVzdFNoYXJlZENvbm5lY3Rpb25zQWN0aXZlKSB7XG4gICAgICAgICAgICB0ZXN0UnVubmVyLmNsZWFyVGVzdFNoYXJlZENvbm5lY3Rpb25zKHRlc3RTaGFyZWRDb25uZWN0aW9uUmVnaXN0cmF0aW9ucylcbiAgICAgICAgICAgIHRlc3RTaGFyZWRDb25uZWN0aW9uUmVnaXN0cmF0aW9ucyA9IFtdXG4gICAgICAgICAgICB0ZXN0U2hhcmVkQ29ubmVjdGlvbnNBY3RpdmUgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoY2xlYW51cEVycm9yKSB7XG4gICAgICAgICAgZW1lcmdlbmN5Q2xlYW51cEVycm9ycy5wdXNoKGNsZWFudXBFcnJvcilcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJyb2tlckNsZWFudXAgPSB0ZXN0UnVubmVyLnN0b3BTaGFyZWRUcmFuc2FjdGlvbkJyb2tlcihzaGFyZWRUcmFuc2FjdGlvbkJyb2tlclJlZ2lzdHJhdGlvbiB8fCBzaGFyZWRUcmFuc2FjdGlvbkJyb2tlclByZXBhcmF0aW9uKVxuICAgICAgICBjb25zdCBicm9rZXJDbGVhbnVwT3V0Y29tZSA9IGF3YWl0IGF3YWl0U2V0dGxlZE9yR3JhY2UoYnJva2VyQ2xlYW51cCwgZWZmZWN0aXZlVGltZW91dE1zID8/IDYwMDAwKVxuXG4gICAgICAgIGlmIChicm9rZXJDbGVhbnVwT3V0Y29tZS5zZXR0bGVkICYmIGJyb2tlckNsZWFudXBPdXRjb21lLnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgICAgZW1lcmdlbmN5Q2xlYW51cEVycm9ycy5wdXNoKGJyb2tlckNsZWFudXBPdXRjb21lLnJlYXNvbilcbiAgICAgICAgfSBlbHNlIGlmICghYnJva2VyQ2xlYW51cE91dGNvbWUuc2V0dGxlZCkge1xuICAgICAgICAgIHZvaWQgYnJva2VyQ2xlYW51cC5jYXRjaCgoY2xlYW51cEVycm9yKSA9PiB7XG4gICAgICAgICAgICB0ZXN0UnVubmVyLnJlY29yZFRpbWVvdXRDbGVhbnVwRmFpbHVyZShjbGVhbnVwRXJyb3IsIFwic2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlclwiLCByZWNvcmRlZFRpbWVvdXRDbGVhbnVwRXJyb3JzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgc2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJSZWdpc3RyYXRpb24gPSB1bmRlZmluZWRcbiAgICAgICAgc2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJQcmVwYXJhdGlvbiA9IHVuZGVmaW5lZFxuICAgICAgICBjb25zdCBlbWVyZ2VuY3lDbGVhbnVwID0gdGVzdFJ1bm5lci5jbGVhbnVwVHJhbnNhY3Rpb25hbFRlbmFudHModHJhbnNhY3Rpb25hbFRlbmFudFJlZ2lzdHJhdGlvbnMsIHtkaXNjYXJkOiB0cnVlfSlcbiAgICAgICAgY29uc3QgZW1lcmdlbmN5Q2xlYW51cE91dGNvbWUgPSBhd2FpdCBhd2FpdFNldHRsZWRPckdyYWNlKGVtZXJnZW5jeUNsZWFudXAsIGVmZmVjdGl2ZVRpbWVvdXRNcyA/PyA2MDAwMClcblxuICAgICAgICBpZiAoZW1lcmdlbmN5Q2xlYW51cE91dGNvbWUuc2V0dGxlZCAmJiBlbWVyZ2VuY3lDbGVhbnVwT3V0Y29tZS5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICAgIGVtZXJnZW5jeUNsZWFudXBFcnJvcnMucHVzaChlbWVyZ2VuY3lDbGVhbnVwT3V0Y29tZS5yZWFzb24pXG4gICAgICAgIH0gZWxzZSBpZiAoIWVtZXJnZW5jeUNsZWFudXBPdXRjb21lLnNldHRsZWQpIHtcbiAgICAgICAgICB2b2lkIGVtZXJnZW5jeUNsZWFudXAuY2F0Y2goKGNsZWFudXBFcnJvcikgPT4ge1xuICAgICAgICAgICAgdGVzdFJ1bm5lci5yZWNvcmRUaW1lb3V0Q2xlYW51cEZhaWx1cmUoY2xlYW51cEVycm9yLCBcInRyYW5zYWN0aW9uYWwgdGVuYW50XCIsIHJlY29yZGVkVGltZW91dENsZWFudXBFcnJvcnMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbWVyZ2VuY3lDbGVhbnVwRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjYXVnaHRFcnJvciA9IG5ldyBBZ2dyZWdhdGVFcnJvcihcbiAgICAgICAgICAgIFtjYXVnaHRFcnJvciwgLi4uZW1lcmdlbmN5Q2xlYW51cEVycm9yc10sXG4gICAgICAgICAgICBcIlRlc3QgdGltZW91dCBhbmQgZW1lcmdlbmN5IGNsZWFudXAgZmFpbGVkXCIsXG4gICAgICAgICAgICB7Y2F1c2U6IGNhdWdodEVycm9yfVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYnJvd3NlckR1bW15Q29ubmVjdGlvblJlZ2lzdHJhdGlvbnMuc29tZSgocmVnaXN0cmF0aW9uKSA9PiByZWdpc3RyYXRpb24ucXVhcmFudGluZWQpKSB7XG4gICAgICAgIHRlc3REYXRhYmFzZUFjY2Vzc1Njb3BlLnJldm9rZWQgPSB0cnVlXG4gICAgICAgIGFib3J0UmVtYWluaW5nVGVzdHMgPSB0cnVlXG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRlc3REYXRhYmFzZUFjY2Vzc1Njb3BlLnJldm9rZWQgPSB0cnVlXG5cbiAgICAgIGlmIChwcm9maWxlQXR0ZW1wdCAmJiBwcm9maWxlcikge1xuICAgICAgICBwcm9maWxlci5maW5pc2hBdHRlbXB0KHByb2ZpbGVBdHRlbXB0LCBmYWlsZWRcbiAgICAgICAgICA/IChhdHRlbXB0VGltZWRPdXQgPyBcInRpbWVkLW91dFwiIDogXCJmYWlsZWRcIilcbiAgICAgICAgICA6IFwicGFzc2VkXCIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGVzdFJ1bm5lci5yZWNvcmRBdHRlbXB0T3V0Y29tZSh0ZXN0LCBhdHRlbXB0TnVtYmVyLCB7XG4gICAgICBhYm9ydFJlbWFpbmluZ1Rlc3RzLFxuICAgICAgZXJyb3I6IGNhdWdodEVycm9yLFxuICAgICAgZmFpbGVkXG4gICAgfSlcblxuICAgIGlmIChmYWlsZWQpIHRocm93IGNhdWdodEVycm9yXG4gIH1cblxuICAvKipcbiAgICogUnVucyBiZWZvcmUtZWFjaCBob29rcyBpbiBpbmhlcml0ZWQgZGVjbGFyYXRpb24gb3JkZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gSG9vayBhcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7UGFja2FnZUhvb2tEZWNsYXJhdGlvbltdfSBhcmdzLmJlZm9yZUVhY2hlcyAtIFNldHVwIGhvb2tzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdmVsb2Npb3VzLXRlc3QtYXJndW1lbnRzLmpzXCIpLlRlc3RBcmdzfSBhcmdzLnRlc3RBcmdzIC0gU3RhYmxlIHRlc3QgYXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdmVsb2Npb3VzLXRlc3QtYXJndW1lbnRzLmpzXCIpLlRlc3REYXRhfSBhcmdzLnRlc3REYXRhIC0gVGVzdCByZWdpc3RyYXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIGFsbCBzZXR1cCBob29rcyBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHJ1bkJlZm9yZUVhY2hlcyh7YmVmb3JlRWFjaGVzLCB0ZXN0QXJncywgdGVzdERhdGF9KSB7XG4gICAgZm9yIChjb25zdCBob29rIG9mIGJlZm9yZUVhY2hlcykge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnRlc3RSdW5uZXIuaG9va01ldGFkYXRhKGhvb2spXG5cbiAgICAgIGF3YWl0IHRoaXMudGVzdFJ1bm5lci5ydW5Qcm9maWxlU3Bhbih7XG4gICAgICAgIHBoYXNlOiBcImJlZm9yZUVhY2hcIixcbiAgICAgICAgZGVjbGFyYXRpb25JbmRleDogbWV0YWRhdGEuZGVjbGFyYXRpb25JbmRleCxcbiAgICAgICAgZGVjbGFyYXRpb25TY29wZUlkOiBtZXRhZGF0YS5kZWNsYXJhdGlvblNjb3BlSWQsXG4gICAgICAgIGZpbGVQYXRoOiBtZXRhZGF0YS5vd25lckZpbGVQYXRoXG4gICAgICB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGhvb2suY2FsbGJhY2soe2NvbmZpZ3VyYXRpb246IHRoaXMudGVzdFJ1bm5lci5nZXRDb25maWd1cmF0aW9uKCksIHRlc3RBcmdzLCB0ZXN0RGF0YX0pXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGV2ZXJ5IGFmdGVyLWVhY2ggaG9vayB3aGlsZSBwcmVzZXJ2aW5nIGFsbCBmYWlsdXJlcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBIb29rIGFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtQYWNrYWdlSG9va0RlY2xhcmF0aW9uW119IGFyZ3MuYWZ0ZXJFYWNoZXMgLSBDbGVhbnVwIGhvb2tzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdmVsb2Npb3VzLXRlc3QtYXJndW1lbnRzLmpzXCIpLlRlc3RBcmdzfSBhcmdzLnRlc3RBcmdzIC0gU3RhYmxlIHRlc3QgYXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdmVsb2Npb3VzLXRlc3QtYXJndW1lbnRzLmpzXCIpLlRlc3REYXRhfSBhcmdzLnRlc3REYXRhIC0gVGVzdCByZWdpc3RyYXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIGV2ZXJ5IGNsZWFudXAgaG9vayBzZXR0bGVzLlxuICAgKi9cbiAgYXN5bmMgcnVuQWZ0ZXJFYWNoZXMoe2FmdGVyRWFjaGVzLCB0ZXN0QXJncywgdGVzdERhdGF9KSB7XG4gICAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPltdfSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGhvb2sgb2YgYWZ0ZXJFYWNoZXMpIHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy50ZXN0UnVubmVyLmhvb2tNZXRhZGF0YShob29rKVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnRlc3RSdW5uZXIucnVuUHJvZmlsZVNwYW4oe1xuICAgICAgICAgIHBoYXNlOiBcImFmdGVyRWFjaFwiLFxuICAgICAgICAgIGRlY2xhcmF0aW9uSW5kZXg6IG1ldGFkYXRhLmRlY2xhcmF0aW9uSW5kZXgsXG4gICAgICAgICAgZGVjbGFyYXRpb25TY29wZUlkOiBtZXRhZGF0YS5kZWNsYXJhdGlvblNjb3BlSWQsXG4gICAgICAgICAgZmlsZVBhdGg6IG1ldGFkYXRhLm93bmVyRmlsZVBhdGhcbiAgICAgICAgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IGhvb2suY2FsbGJhY2soe2NvbmZpZ3VyYXRpb246IHRoaXMudGVzdFJ1bm5lci5nZXRDb25maWd1cmF0aW9uKCksIHRlc3RBcmdzLCB0ZXN0RGF0YX0pXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBlcnJvcnMucHVzaChlcnJvcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PSAxKSB0aHJvdyBlcnJvcnNbMF1cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIFwiTXVsdGlwbGUgYWZ0ZXJFYWNoIGhvb2tzIGZhaWxlZFwiLCB7Y2F1c2U6IGVycm9yc1swXX0pXG4gICAgfVxuICB9XG59XG4iXX0=
414
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVsb2Npb3VzLWF0dGVtcHQtZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy92ZWxvY2lvdXMtYXR0ZW1wdC1leGVjdXRvci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0saUNBQWlDLENBQUE7QUFDaEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUM5QyxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUN2RCxPQUFPLEVBQUMsWUFBWSxJQUFJLGdCQUFnQixFQUFFLFVBQVUsSUFBSSxjQUFjLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFFMUYsdUhBQXVIO0FBRXZIOzs7R0FHRztBQUVIOzs7Ozs7R0FNRztBQUNILFNBQVMsY0FBYyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZTtJQUN6RCxNQUFNLGNBQWMsR0FBRyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUMxRSwrQkFBK0I7SUFDL0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxLQUFLLENBQUMsbUJBQW1CLGNBQWMsTUFBTSxlQUFlLEVBQUUsQ0FBQyxDQUFBO0lBQ3hGLFlBQVksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUE7SUFFeEMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBRXJFLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdkMsZ0JB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LENBQUMsYUFBYTtpQkFDakMsRUFBRSxLQUFLLElBQUksRUFBRTtvQkFDWixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFBO2dCQUM5RixDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDcEIsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQztZQUFFLE1BQU0sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3ZDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxpQ0FBaUMsRUFBRSxFQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFBO1FBQ3pGLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHsgVGVzdERhdGFiYXNlQWNjZXNzUmV2b2tlZEVycm9yIH0gZnJvbSBcIi4uL2Vudmlyb25tZW50LWhhbmRsZXJzL2Jhc2UuanNcIlxuaW1wb3J0IHsgY2xlYXJEZWxpdmVyaWVzIH0gZnJvbSBcIi4uL21haWxlci5qc1wiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcbmltcG9ydCB7Y2xlYXJUaW1lb3V0IGFzIHJlYWxDbGVhclRpbWVvdXQsIHNldFRpbWVvdXQgYXMgcmVhbFNldFRpbWVvdXR9IGZyb20gXCJub2RlOnRpbWVyc1wiXG5cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiQHZlbG9jaW91cy90ZXN0aW5nL3J1bm5lclwiKS5BdHRlbXB0RXhlY3V0b3JJbnB1dFtcImJlZm9yZUVhY2hcIl1bbnVtYmVyXX0gUGFja2FnZUhvb2tEZWNsYXJhdGlvbiAqL1xuXG4vKipcbiAqIE1hcmtzIG9uZSB3aG9sZS1saWZlY3ljbGUgdGltZW91dCB3aGlsZSBpdHMgdW5kZXJseWluZyBwcm9taXNlIGtlZXBzIHJ1bm5pbmcuXG4gKiBAdHlwZWRlZiB7RXJyb3IgJiB7dmVsb2Npb3VzVGVzdFRpbWVvdXQ/OiB0cnVlfX0gVGVzdFRpbWVvdXRFcnJvclxuICovXG5cbi8qKlxuICogUnVucyBvbmUgcHJvbWlzZSB3aXRoIGEgbGlmZWN5Y2xlIHRpbWVvdXQuXG4gKiBAcGFyYW0ge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+IHwgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHByb21pc2UgLSBQcm9taXNlIG9yIHZhbHVlLlxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXRNcyAtIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3REZXNjcmlwdGlvbiAtIFRlc3QgZGVzY3JpcHRpb24uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gTGlmZWN5Y2xlIHJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gcnVuV2l0aFRpbWVvdXQocHJvbWlzZSwgdGltZW91dE1zLCB0ZXN0RGVzY3JpcHRpb24pIHtcbiAgY29uc3QgdGltZW91dFNlY29uZHMgPSAodGltZW91dE1zIC8gMTAwMCkudG9GaXhlZCgzKS5yZXBsYWNlKC9cXC4/MCskLywgXCJcIilcbiAgLyoqIEB0eXBlIHtUZXN0VGltZW91dEVycm9yfSAqL1xuICBjb25zdCB0aW1lb3V0RXJyb3IgPSBuZXcgRXJyb3IoYFRpbWVkIG91dCBhZnRlciAke3RpbWVvdXRTZWNvbmRzfXM6ICR7dGVzdERlc2NyaXB0aW9ufWApXG4gIHRpbWVvdXRFcnJvci52ZWxvY2lvdXNUZXN0VGltZW91dCA9IHRydWVcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHRpbWVvdXQgPSByZWFsU2V0VGltZW91dCgoKSA9PiByZWplY3QodGltZW91dEVycm9yKSwgdGltZW91dE1zKVxuXG4gICAgUHJvbWlzZS5yZXNvbHZlKHByb21pc2UpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgcmVhbENsZWFyVGltZW91dCh0aW1lb3V0KVxuICAgICAgcmVzb2x2ZShyZXN1bHQpXG4gICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICByZWFsQ2xlYXJUaW1lb3V0KHRpbWVvdXQpXG4gICAgICByZWplY3QoZXJyb3IpXG4gICAgfSlcbiAgfSlcbn1cblxuLyoqXG4gKiBXYWl0cyBmb3IgZGV0YWNoZWQgbGlmZWN5Y2xlIGNsZWFudXAgdXAgdG8gdGhlIHRpbWVvdXQgZ3JhY2UgcGVyaW9kLlxuICogQHBhcmFtIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gbGlmZWN5Y2xlIC0gRGV0YWNoZWQgbGlmZWN5Y2xlIHByb21pc2UuXG4gKiBAcGFyYW0ge251bWJlcn0gZ3JhY2VNcyAtIE1heGltdW0gd2FpdC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHtzZXR0bGVkOiBmYWxzZX0gfCB7c2V0dGxlZDogdHJ1ZSwgc3RhdHVzOiBcImZ1bGZpbGxlZFwifSB8IHtzZXR0bGVkOiB0cnVlLCBzdGF0dXM6IFwicmVqZWN0ZWRcIiwgcmVhc29uOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0+fSAtIFNldHRsZW1lbnQgb3V0Y29tZS5cbiAqL1xuZnVuY3Rpb24gYXdhaXRTZXR0bGVkT3JHcmFjZShsaWZlY3ljbGUsIGdyYWNlTXMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgbGV0IHNldHRsZWQgPSBmYWxzZVxuICAgIGNvbnN0IGdyYWNlVGltZXIgPSByZWFsU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuXG5cbiAgICAgIHNldHRsZWQgPSB0cnVlXG4gICAgICByZXNvbHZlKHtzZXR0bGVkOiBmYWxzZX0pXG4gICAgfSwgZ3JhY2VNcylcblxuICAgIFByb21pc2UucmVzb2x2ZShsaWZlY3ljbGUpLnRoZW4oXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm5cblxuICAgICAgICBzZXR0bGVkID0gdHJ1ZVxuICAgICAgICByZWFsQ2xlYXJUaW1lb3V0KGdyYWNlVGltZXIpXG4gICAgICAgIHJlc29sdmUoe3NldHRsZWQ6IHRydWUsIHN0YXR1czogXCJmdWxmaWxsZWRcIn0pXG4gICAgICB9LFxuICAgICAgKHJlYXNvbikgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuXG5cbiAgICAgICAgc2V0dGxlZCA9IHRydWVcbiAgICAgICAgcmVhbENsZWFyVGltZW91dChncmFjZVRpbWVyKVxuICAgICAgICByZXNvbHZlKHtzZXR0bGVkOiB0cnVlLCBzdGF0dXM6IFwicmVqZWN0ZWRcIiwgcmVhc29ufSlcbiAgICAgIH1cbiAgICApXG4gIH0pXG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBsYXRlIGxpZmVjeWNsZSBzdG9wcGVkIG9ubHkgYmVjYXVzZSBpdHMgYXR0ZW1wdCBhY2Nlc3Mgd2FzIHJldm9rZWQuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBlcnJvciAtIExpZmVjeWNsZSByZWplY3Rpb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGV2ZXJ5IGNvbnRhaW5lZCBlcnJvciBpcyBleHBlY3RlZCByZXZvY2F0aW9uLlxuICovXG5mdW5jdGlvbiBpc1Rlc3REYXRhYmFzZUFjY2Vzc1Jldm9jYXRpb24oZXJyb3IpIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGVzdERhdGFiYXNlQWNjZXNzUmV2b2tlZEVycm9yKSByZXR1cm4gdHJ1ZVxuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBZ2dyZWdhdGVFcnJvcikge1xuICAgIHJldHVybiBlcnJvci5lcnJvcnMubGVuZ3RoID4gMCAmJiBlcnJvci5lcnJvcnMuZXZlcnkoKG5lc3RlZEVycm9yKSA9PiBpc1Rlc3REYXRhYmFzZUFjY2Vzc1Jldm9jYXRpb24obmVzdGVkRXJyb3IpKVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0F0dGVtcHRFeGVjdXRvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGV4ZWN1dG9yIGZvciBmcmFtZXdvcmstb3duZWQgYXR0ZW1wdCBsaWZlY3ljbGUgd29yay5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBDb25zdHJ1Y3RvciBhcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5kZWZhdWx0fSBhcmdzLnRlc3RSdW5uZXIgLSBPd25pbmcgVmVsb2Npb3VzIHJ1bm5lci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHt0ZXN0UnVubmVyLCAuLi5yZXN0QXJnc30pIHtcbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuICAgIHRoaXMudGVzdFJ1bm5lciA9IHRlc3RSdW5uZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIHRoZSBsZWdhY3kgdGltZW91dCBjb250cmFjdCBhdCB0aGUgZnJhbWV3b3JrIGFkYXB0ZXIgYm91bmRhcnkuXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgdW5kZWZpbmVkfSB0aW1lb3V0TXMgLSBEZWNsYXJlZCBwYWNrYWdlIHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtudW1iZXIgfCB1bmRlZmluZWR9IC0gUG9zaXRpdmUgZmluaXRlIHRpbWVvdXQsIG9yIG5vIHRpbWVvdXQuXG4gICAqL1xuICBub3JtYWxpemVUaW1lb3V0TXModGltZW91dE1zKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aW1lb3V0TXMgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKHRpbWVvdXRNcykgJiYgdGltZW91dE1zID4gMCA/IHRpbWVvdXRNcyA6IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGV4YWN0bHkgb25lIGNvbXBsZXRlIFZlbG9jaW91cy1vd25lZCB0ZXN0IGF0dGVtcHQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiQHZlbG9jaW91cy90ZXN0aW5nL3J1bm5lclwiKS5BdHRlbXB0RXhlY3V0b3JJbnB1dH0gaW5wdXQgLSBQYWNrYWdlIGF0dGVtcHQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIG9uZSBjb21wbGV0ZSBmcmFtZXdvcmsgYXR0ZW1wdC5cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoe2FmdGVyRWFjaCwgYXJncywgYXR0ZW1wdE51bWJlciwgYmVmb3JlRWFjaCwgY29udGV4dCwgZGVmYXVsdEV4ZWN1dGUsIGZ1bGxOYW1lLCBzdWl0ZSwgdGVzdCwgdGltZW91dE1zLCAuLi5yZXN0QXJnc30pIHtcbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuICAgIHZvaWQgY29udGV4dFxuICAgIHZvaWQgZGVmYXVsdEV4ZWN1dGVcbiAgICB2b2lkIHN1aXRlXG4gICAgY29uc3QgdGVzdFJ1bm5lciA9IHRoaXMudGVzdFJ1bm5lclxuICAgIGNvbnN0IGVmZmVjdGl2ZVRpbWVvdXRNcyA9IHRoaXMubm9ybWFsaXplVGltZW91dE1zKHRpbWVvdXRNcylcbiAgICBjb25zdCBjb21wYXRpYmlsaXR5ID0gYXdhaXQgdGVzdFJ1bm5lci50ZXN0Q29tcGF0aWJpbGl0eSh0ZXN0KVxuICAgIGNvbnN0IHt0ZXN0QXJncywgdGVzdERhdGF9ID0gY29tcGF0aWJpbGl0eVxuICAgIGNvbnN0IG1ldGFkYXRhID0gdGVzdFJ1bm5lci50ZXN0TWV0YWRhdGEodGVzdClcbiAgICBjb25zdCB7ZGVzY3JpcHRpb25zLCB0ZXN0RGVzY3JpcHRpb259ID0gbWV0YWRhdGFcbiAgICAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAqL1xuICAgIGxldCBjYXVnaHRFcnJvclxuICAgIGxldCBmYWlsZWQgPSBmYWxzZVxuICAgIC8qKiBAdHlwZSB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IHRlc3RMaWZlY3ljbGVcbiAgICAvKiogQHR5cGUge3twb29sOiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9wb29sL2Jhc2UuanNcIikuZGVmYXVsdCwgcmVnaXN0cmF0aW9uOiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9wb29sL2Jhc2UuanNcIikuVGVzdFNoYXJlZENvbm5lY3Rpb25SZWdpc3RyYXRpb259W119ICovXG4gICAgbGV0IHRlc3RTaGFyZWRDb25uZWN0aW9uUmVnaXN0cmF0aW9ucyA9IFtdXG4gICAgbGV0IHRlc3RTaGFyZWRDb25uZWN0aW9uc0FjdGl2ZSA9IGZhbHNlXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLlNoYXJlZFRyYW5zYWN0aW9uQnJva2VyUmVnaXN0cmF0aW9uIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBzaGFyZWRUcmFuc2FjdGlvbkJyb2tlclJlZ2lzdHJhdGlvblxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5TaGFyZWRUcmFuc2FjdGlvbkJyb2tlclJlZ2lzdHJhdGlvbiB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgc2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJQcmVwYXJhdGlvblxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5UcmFuc2FjdGlvbmFsVGVuYW50UmVnaXN0cmF0aW9uW119ICovXG4gICAgY29uc3QgdHJhbnNhY3Rpb25hbFRlbmFudFJlZ2lzdHJhdGlvbnMgPSBbXVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5Ccm93c2VyRHVtbXlDb25uZWN0aW9uUmVnaXN0cmF0aW9uW119ICovXG4gICAgY29uc3QgYnJvd3NlckR1bW15Q29ubmVjdGlvblJlZ2lzdHJhdGlvbnMgPSBbXVxuICAgIGNvbnN0IHRlc3REYXRhYmFzZUFjY2Vzc1Njb3BlID0ge3Jldm9rZWQ6IGZhbHNlfVxuICAgIC8qKiBAdHlwZSB7U2V0PEVycm9yPn0gKi9cbiAgICBjb25zdCByZWNvcmRlZFRpbWVvdXRDbGVhbnVwRXJyb3JzID0gbmV3IFNldCgpXG4gICAgbGV0IGFib3J0UmVtYWluaW5nVGVzdHMgPSBmYWxzZVxuICAgIGxldCBhdHRlbXB0VGltZWRPdXQgPSBmYWxzZVxuICAgIHRlc3RBcmdzLnJlZ2lzdGVyVHJhbnNhY3Rpb25hbFRlbmFudCA9IGFzeW5jIChhcmdzKSA9PiB7XG4gICAgICBhd2FpdCB0ZXN0UnVubmVyLnJlZ2lzdGVyVHJhbnNhY3Rpb25hbFRlbmFudChhcmdzLCB0cmFuc2FjdGlvbmFsVGVuYW50UmVnaXN0cmF0aW9ucylcbiAgICB9XG4gICAgY29uc3QgcHJvZmlsZXIgPSB0ZXN0UnVubmVyLl9wcm9maWxlclxuICAgIGNvbnN0IHByb2ZpbGVUZXN0RGF0YSA9IHtcbiAgICAgIC4uLnRlc3QsXG4gICAgICBmaWxlUGF0aDogdGVzdERhdGEuZmlsZVBhdGgsXG4gICAgICBsaW5lOiB0ZXN0RGF0YS5saW5lLFxuICAgICAgb3duZXJGaWxlUGF0aDogdGVzdERhdGEub3duZXJGaWxlUGF0aCA/PyBtZXRhZGF0YS5vd25lckZpbGVQYXRoXG4gICAgfVxuICAgIGNvbnN0IHByb2ZpbGVBdHRlbXB0ID0gcHJvZmlsZXI/LnN0YXJ0QXR0ZW1wdCh7XG4gICAgICBkZXNjcmlwdGlvbnMsXG4gICAgICBhdHRlbXB0TnVtYmVyLFxuICAgICAgdGVzdERhdGE6IHByb2ZpbGVUZXN0RGF0YSxcbiAgICAgIHRlc3REZXNjcmlwdGlvblxuICAgIH0pXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcnVuTGlmZWN5Y2xlQ2FsbGJhY2sgPSBhc3luYyAoKSA9PiBhd2FpdCB0ZXN0UnVubmVyLnJ1bldpdGhEdW1teUlmTmVlZGVkKHRlc3RBcmdzLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHVzZVRyYW5zYWN0aW9uID0gdGVzdEFyZ3MuZGF0YWJhc2VDbGVhbmluZz8udHJhbnNhY3Rpb24gPT09IHRydWVcbiAgICAgICAgY29uc3Qgc2hvdWxkVHJ1bmNhdGUgPSB0ZXN0QXJncy5kYXRhYmFzZUNsZWFuaW5nPy50cnVuY2F0ZSA/PyAhdXNlVHJhbnNhY3Rpb25cbiAgICAgICAgY29uc3QgdXNlU2hhcmVkVGVzdENvbm5lY3Rpb25zID0gdXNlVHJhbnNhY3Rpb24gfHwgdGVzdEFyZ3MudHlwZSA9PSBcInJlcXVlc3RcIlxuICAgICAgICBjb25zdCB1c2VUZXN0Q29ubmVjdGlvbnMgPSB1c2VTaGFyZWRUZXN0Q29ubmVjdGlvbnMgfHwgc2hvdWxkVHJ1bmNhdGVcbiAgICAgICAgY29uc3QgcnVuVGVzdEF0dGVtcHQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKHVzZVNoYXJlZFRlc3RDb25uZWN0aW9ucykge1xuICAgICAgICAgICAgdGVzdFNoYXJlZENvbm5lY3Rpb25SZWdpc3RyYXRpb25zID0gdGVzdFJ1bm5lci5hY3RpdmF0ZVRlc3RTaGFyZWRDb25uZWN0aW9ucygpXG4gICAgICAgICAgICB0ZXN0U2hhcmVkQ29ubmVjdGlvbnNBY3RpdmUgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT5bXX0gKi9cbiAgICAgICAgICBjb25zdCBsaWZlY3ljbGVFcnJvcnMgPSBbXVxuICAgICAgICAgIGxldCBydW5DbGVhbnVwSG9va3MgPSBmYWxzZVxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh1c2VTaGFyZWRUZXN0Q29ubmVjdGlvbnMpIHtcbiAgICAgICAgICAgICAgc2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJQcmVwYXJhdGlvbiA9IGF3YWl0IHRlc3RSdW5uZXIucHJlcGFyZVNoYXJlZFRyYW5zYWN0aW9uQnJva2VyKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJ1bkNsZWFudXBIb29rcyA9IHRydWVcblxuICAgICAgICAgICAgY2xlYXJEZWxpdmVyaWVzKClcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnVuQmVmb3JlRWFjaGVzKHtiZWZvcmVFYWNoZXM6IGJlZm9yZUVhY2gsIHRlc3RBcmdzLCB0ZXN0RGF0YX0pXG5cbiAgICAgICAgICAgIGlmICh1c2VTaGFyZWRUZXN0Q29ubmVjdGlvbnMpIHtcbiAgICAgICAgICAgICAgY29uc3QgYWN0aXZlQ29ubmVjdGlvbnMgPSB0ZXN0UnVubmVyLnNoYXJlZFRyYW5zYWN0aW9uQ29ubmVjdGlvbnMoe3RyYW5zYWN0aW9uc09ubHk6IHRydWV9KVxuICAgICAgICAgICAgICBpZiAoc2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJQcmVwYXJhdGlvbiAmJiAhdGVzdFJ1bm5lci5zaGFyZWRUcmFuc2FjdGlvbkJyb2tlck1hdGNoZXNDb25uZWN0aW9ucyhzaGFyZWRUcmFuc2FjdGlvbkJyb2tlclByZXBhcmF0aW9uLCBhY3RpdmVDb25uZWN0aW9ucykpIHtcbiAgICAgICAgICAgICAgICB0ZXN0UnVubmVyLmNsZWFyVGVzdFNoYXJlZENvbm5lY3Rpb25zKHRlc3RTaGFyZWRDb25uZWN0aW9uUmVnaXN0cmF0aW9ucylcbiAgICAgICAgICAgICAgICB0ZXN0U2hhcmVkQ29ubmVjdGlvblJlZ2lzdHJhdGlvbnMgPSBbXVxuICAgICAgICAgICAgICAgIHRlc3RTaGFyZWRDb25uZWN0aW9uc0FjdGl2ZSA9IGZhbHNlXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzaGFyZWRUcmFuc2FjdGlvbkJyb2tlclJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRlc3RSdW5uZXIuc3RhcnRTaGFyZWRUcmFuc2FjdGlvbkJyb2tlcihzaGFyZWRUcmFuc2FjdGlvbkJyb2tlclByZXBhcmF0aW9uLCBhY3RpdmVDb25uZWN0aW9ucylcbiAgICAgICAgICAgICAgc2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJQcmVwYXJhdGlvbiA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICBpZiAoc2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJSZWdpc3RyYXRpb24gJiYgIXRlc3RTaGFyZWRDb25uZWN0aW9uc0FjdGl2ZSkge1xuICAgICAgICAgICAgICAgIHRlc3RTaGFyZWRDb25uZWN0aW9uUmVnaXN0cmF0aW9ucyA9IHRlc3RSdW5uZXIuYWN0aXZhdGVUZXN0U2hhcmVkQ29ubmVjdGlvbnMoKVxuICAgICAgICAgICAgICAgIHRlc3RTaGFyZWRDb25uZWN0aW9uc0FjdGl2ZSA9IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0ZXN0UnVubmVyLl9sYXN0VGVzdENvbnRleHQgPSB7XG4gICAgICAgICAgICAgIGZ1bGxEZXNjcmlwdGlvbjogZnVsbE5hbWUsXG4gICAgICAgICAgICAgIGZpbGVQYXRoOiB0ZXN0RGF0YS5maWxlUGF0aCA/PyBcIjx1bmtub3duPlwiLFxuICAgICAgICAgICAgICBsaW5lOiB0ZXN0RGF0YS5saW5lID8/IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRlc3RSdW5uZXIucnVuUHJvZmlsZVNwYW4oe3BoYXNlOiBcInRlc3QgYm9keVwiLCBmaWxlUGF0aDogdGVzdERhdGEub3duZXJGaWxlUGF0aCA/PyB0ZXN0RGF0YS5maWxlUGF0aH0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgYXdhaXQgdGVzdC5jYWxsYmFjayguLi5hcmdzKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbGlmZWN5Y2xlRXJyb3JzLnB1c2goZXJyb3IpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJ1bkNsZWFudXBIb29rcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgdGVzdFJ1bm5lci5nZXRDb25maWd1cmF0aW9uKCkuYXdhaXRQZW5kaW5nQnJvYWRjYXN0cygpXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBsaWZlY3ljbGVFcnJvcnMucHVzaChlcnJvcilcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKHRlc3RTaGFyZWRDb25uZWN0aW9uc0FjdGl2ZSkge1xuICAgICAgICAgICAgICAgIHRlc3RSdW5uZXIuY2xlYXJUZXN0U2hhcmVkQ29ubmVjdGlvbnModGVzdFNoYXJlZENvbm5lY3Rpb25SZWdpc3RyYXRpb25zKVxuICAgICAgICAgICAgICAgIHRlc3RTaGFyZWRDb25uZWN0aW9uUmVnaXN0cmF0aW9ucyA9IFtdXG4gICAgICAgICAgICAgICAgdGVzdFNoYXJlZENvbm5lY3Rpb25zQWN0aXZlID0gZmFsc2VcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgbGlmZWN5Y2xlRXJyb3JzLnB1c2goZXJyb3IpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IHRlc3RSdW5uZXIuc3RvcFNoYXJlZFRyYW5zYWN0aW9uQnJva2VyKHNoYXJlZFRyYW5zYWN0aW9uQnJva2VyUmVnaXN0cmF0aW9uIHx8IHNoYXJlZFRyYW5zYWN0aW9uQnJva2VyUHJlcGFyYXRpb24pXG4gICAgICAgICAgICAgIHNoYXJlZFRyYW5zYWN0aW9uQnJva2VyUmVnaXN0cmF0aW9uID0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgIHNoYXJlZFRyYW5zYWN0aW9uQnJva2VyUHJlcGFyYXRpb24gPSB1bmRlZmluZWRcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGxpZmVjeWNsZUVycm9ycy5wdXNoKGVycm9yKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJ1bkFmdGVyRWFjaGVzKHthZnRlckVhY2hlczogWy4uLmFmdGVyRWFjaF0ucmV2ZXJzZSgpLCB0ZXN0QXJncywgdGVzdERhdGF9KVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgbGlmZWN5Y2xlRXJyb3JzLnB1c2goZXJyb3IpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IHRlc3RSdW5uZXIuY2xlYW51cFRyYW5zYWN0aW9uYWxUZW5hbnRzKHRyYW5zYWN0aW9uYWxUZW5hbnRSZWdpc3RyYXRpb25zKVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgbGlmZWN5Y2xlRXJyb3JzLnB1c2goZXJyb3IpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRlc3RTaGFyZWRDb25uZWN0aW9uc0FjdGl2ZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgdGVzdFJ1bm5lci5jbGVhclRlc3RTaGFyZWRDb25uZWN0aW9ucyh0ZXN0U2hhcmVkQ29ubmVjdGlvblJlZ2lzdHJhdGlvbnMpXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBsaWZlY3ljbGVFcnJvcnMucHVzaChlcnJvcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRlc3RTaGFyZWRDb25uZWN0aW9uc0FjdGl2ZSA9IGZhbHNlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGxpZmVjeWNsZUVycm9ycy5sZW5ndGggPT0gMSkgdGhyb3cgbGlmZWN5Y2xlRXJyb3JzWzBdXG4gICAgICAgICAgaWYgKGxpZmVjeWNsZUVycm9ycy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IobGlmZWN5Y2xlRXJyb3JzLCBcIlRlc3QgbGlmZWN5Y2xlIGFuZCBjbGVhbnVwIGZhaWxlZFwiLCB7Y2F1c2U6IGxpZmVjeWNsZUVycm9yc1swXX0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVzZVRlc3RDb25uZWN0aW9ucykge1xuICAgICAgICAgIGF3YWl0IHRlc3RSdW5uZXIuZ2V0Q29uZmlndXJhdGlvbigpLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBgVGVzdDogJHt0ZXN0RGVzY3JpcHRpb259YH0sIHJ1blRlc3RBdHRlbXB0KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHJ1blRlc3RBdHRlbXB0KClcbiAgICAgICAgfVxuICAgICAgfSwgYnJvd3NlckR1bW15Q29ubmVjdGlvblJlZ2lzdHJhdGlvbnMpXG4gICAgICBjb25zdCBsaWZlY3ljbGVDYWxsYmFjayA9IGFzeW5jICgpID0+IGF3YWl0IHRlc3RSdW5uZXIuZ2V0Q29uZmlndXJhdGlvbigpLnJ1bldpdGhUZXN0RGF0YWJhc2VBY2Nlc3NTY29wZSh0ZXN0RGF0YWJhc2VBY2Nlc3NTY29wZSwgcnVuTGlmZWN5Y2xlQ2FsbGJhY2spXG4gICAgICB0ZXN0TGlmZWN5Y2xlID0gcHJvZmlsZUF0dGVtcHQgJiYgcHJvZmlsZXJcbiAgICAgICAgPyBwcm9maWxlci5ydW5BdHRlbXB0KHByb2ZpbGVBdHRlbXB0LCBsaWZlY3ljbGVDYWxsYmFjaylcbiAgICAgICAgOiBsaWZlY3ljbGVDYWxsYmFjaygpXG5cbiAgICAgIGlmIChlZmZlY3RpdmVUaW1lb3V0TXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhd2FpdCBydW5XaXRoVGltZW91dCh0ZXN0TGlmZWN5Y2xlLCBlZmZlY3RpdmVUaW1lb3V0TXMsIHRlc3REZXNjcmlwdGlvbilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRlc3RMaWZlY3ljbGVcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZmFpbGVkID0gdHJ1ZVxuICAgICAgY2F1Z2h0RXJyb3IgPSBlcnJvclxuICAgICAgY29uc3QgdGltZWRPdXQgPSBCb29sZWFuKC8qKiBAdHlwZSB7VGVzdFRpbWVvdXRFcnJvcn0gKi8gKGVycm9yKT8udmVsb2Npb3VzVGVzdFRpbWVvdXQpXG4gICAgICBhdHRlbXB0VGltZWRPdXQgPSB0aW1lZE91dFxuXG4gICAgICBpZiAodGltZWRPdXQgJiYgdGVzdExpZmVjeWNsZSkge1xuICAgICAgICBjb25zdCBlbWVyZ2VuY3lDbGVhbnVwRXJyb3JzID0gW11cblxuICAgICAgICBpZiAocHJvZmlsZUF0dGVtcHQgJiYgcHJvZmlsZXIpIHByb2ZpbGVyLmZpbmlzaEF0dGVtcHQocHJvZmlsZUF0dGVtcHQsIFwidGltZWQtb3V0XCIpXG4gICAgICAgIGNvbnN0IGxpZmVjeWNsZU91dGNvbWUgPSBhd2FpdCBhd2FpdFNldHRsZWRPckdyYWNlKHRlc3RMaWZlY3ljbGUsIGVmZmVjdGl2ZVRpbWVvdXRNcyA/PyA2MDAwMClcblxuICAgICAgICBpZiAobGlmZWN5Y2xlT3V0Y29tZS5zZXR0bGVkICYmIGxpZmVjeWNsZU91dGNvbWUuc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgICBlbWVyZ2VuY3lDbGVhbnVwRXJyb3JzLnB1c2gobGlmZWN5Y2xlT3V0Y29tZS5yZWFzb24pXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWxpZmVjeWNsZU91dGNvbWUuc2V0dGxlZCkge1xuICAgICAgICAgIHRlc3REYXRhYmFzZUFjY2Vzc1Njb3BlLnJldm9rZWQgPSB0cnVlXG4gICAgICAgICAgdm9pZCB0ZXN0TGlmZWN5Y2xlLmNhdGNoKChjbGVhbnVwRXJyb3IpID0+IHtcbiAgICAgICAgICAgIGlmIChpc1Rlc3REYXRhYmFzZUFjY2Vzc1Jldm9jYXRpb24oY2xlYW51cEVycm9yKSkgcmV0dXJuXG4gICAgICAgICAgICB0ZXN0UnVubmVyLnJlY29yZFRpbWVvdXRDbGVhbnVwRmFpbHVyZShjbGVhbnVwRXJyb3IsIFwidGVzdCBsaWZlY3ljbGVcIiwgcmVjb3JkZWRUaW1lb3V0Q2xlYW51cEVycm9ycylcbiAgICAgICAgICB9KVxuICAgICAgICAgIGNvbnN0IHF1YXJhbnRpbmUgPSB0ZXN0UnVubmVyLnF1YXJhbnRpbmVCcm93c2VyRHVtbXlDb25uZWN0aW9ucyhicm93c2VyRHVtbXlDb25uZWN0aW9uUmVnaXN0cmF0aW9ucylcbiAgICAgICAgICBjb25zdCBxdWFyYW50aW5lT3V0Y29tZSA9IGF3YWl0IGF3YWl0U2V0dGxlZE9yR3JhY2UocXVhcmFudGluZSwgZWZmZWN0aXZlVGltZW91dE1zID8/IDYwMDAwKVxuICAgICAgICAgIGNvbnN0IHVzZXNCcm93c2VyVHJhbnNhY3Rpb25zID0gdGVzdEFyZ3MuZGF0YWJhc2VDbGVhbmluZz8udHJhbnNhY3Rpb24gPT09IHRydWVcbiAgICAgICAgICBjb25zdCB1c2VzQnJvd3NlclRydW5jYXRpb24gPSB0ZXN0QXJncy5kYXRhYmFzZUNsZWFuaW5nPy50cnVuY2F0ZSA/PyAhdXNlc0Jyb3dzZXJUcmFuc2FjdGlvbnNcblxuICAgICAgICAgIGFib3J0UmVtYWluaW5nVGVzdHMgPSB0ZXN0UnVubmVyLmlzQnJvd3NlclRlc3RNb2RlKClcbiAgICAgICAgICAgICYmIHRlc3RSdW5uZXIuaGFzVGFnKHRlc3RBcmdzLCBcImR1bW15XCIpXG4gICAgICAgICAgICAmJiAodXNlc0Jyb3dzZXJUcmFuc2FjdGlvbnMgfHwgdXNlc0Jyb3dzZXJUcnVuY2F0aW9uKVxuXG4gICAgICAgICAgaWYgKHF1YXJhbnRpbmVPdXRjb21lLnNldHRsZWQgJiYgcXVhcmFudGluZU91dGNvbWUuc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgICAgIGVtZXJnZW5jeUNsZWFudXBFcnJvcnMucHVzaChxdWFyYW50aW5lT3V0Y29tZS5yZWFzb24pXG4gICAgICAgICAgfSBlbHNlIGlmICghcXVhcmFudGluZU91dGNvbWUuc2V0dGxlZCkge1xuICAgICAgICAgICAgdm9pZCBxdWFyYW50aW5lLmNhdGNoKChjbGVhbnVwRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgdGVzdFJ1bm5lci5yZWNvcmRUaW1lb3V0Q2xlYW51cEZhaWx1cmUoY2xlYW51cEVycm9yLCBcImJyb3dzZXIgZHVtbXkgY29ubmVjdGlvbiBxdWFyYW50aW5lXCIsIHJlY29yZGVkVGltZW91dENsZWFudXBFcnJvcnMpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHRlc3RTaGFyZWRDb25uZWN0aW9uc0FjdGl2ZSkge1xuICAgICAgICAgICAgdGVzdFJ1bm5lci5jbGVhclRlc3RTaGFyZWRDb25uZWN0aW9ucyh0ZXN0U2hhcmVkQ29ubmVjdGlvblJlZ2lzdHJhdGlvbnMpXG4gICAgICAgICAgICB0ZXN0U2hhcmVkQ29ubmVjdGlvblJlZ2lzdHJhdGlvbnMgPSBbXVxuICAgICAgICAgICAgdGVzdFNoYXJlZENvbm5lY3Rpb25zQWN0aXZlID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcikge1xuICAgICAgICAgIGVtZXJnZW5jeUNsZWFudXBFcnJvcnMucHVzaChjbGVhbnVwRXJyb3IpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBicm9rZXJDbGVhbnVwID0gdGVzdFJ1bm5lci5zdG9wU2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXIoc2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJSZWdpc3RyYXRpb24gfHwgc2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJQcmVwYXJhdGlvbilcbiAgICAgICAgY29uc3QgYnJva2VyQ2xlYW51cE91dGNvbWUgPSBhd2FpdCBhd2FpdFNldHRsZWRPckdyYWNlKGJyb2tlckNsZWFudXAsIGVmZmVjdGl2ZVRpbWVvdXRNcyA/PyA2MDAwMClcblxuICAgICAgICBpZiAoYnJva2VyQ2xlYW51cE91dGNvbWUuc2V0dGxlZCAmJiBicm9rZXJDbGVhbnVwT3V0Y29tZS5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICAgIGVtZXJnZW5jeUNsZWFudXBFcnJvcnMucHVzaChicm9rZXJDbGVhbnVwT3V0Y29tZS5yZWFzb24pXG4gICAgICAgIH0gZWxzZSBpZiAoIWJyb2tlckNsZWFudXBPdXRjb21lLnNldHRsZWQpIHtcbiAgICAgICAgICB2b2lkIGJyb2tlckNsZWFudXAuY2F0Y2goKGNsZWFudXBFcnJvcikgPT4ge1xuICAgICAgICAgICAgdGVzdFJ1bm5lci5yZWNvcmRUaW1lb3V0Q2xlYW51cEZhaWx1cmUoY2xlYW51cEVycm9yLCBcInNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXJcIiwgcmVjb3JkZWRUaW1lb3V0Q2xlYW51cEVycm9ycylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHNoYXJlZFRyYW5zYWN0aW9uQnJva2VyUmVnaXN0cmF0aW9uID0gdW5kZWZpbmVkXG4gICAgICAgIHNoYXJlZFRyYW5zYWN0aW9uQnJva2VyUHJlcGFyYXRpb24gPSB1bmRlZmluZWRcbiAgICAgICAgY29uc3QgZW1lcmdlbmN5Q2xlYW51cCA9IHRlc3RSdW5uZXIuY2xlYW51cFRyYW5zYWN0aW9uYWxUZW5hbnRzKHRyYW5zYWN0aW9uYWxUZW5hbnRSZWdpc3RyYXRpb25zLCB7ZGlzY2FyZDogdHJ1ZX0pXG4gICAgICAgIGNvbnN0IGVtZXJnZW5jeUNsZWFudXBPdXRjb21lID0gYXdhaXQgYXdhaXRTZXR0bGVkT3JHcmFjZShlbWVyZ2VuY3lDbGVhbnVwLCBlZmZlY3RpdmVUaW1lb3V0TXMgPz8gNjAwMDApXG5cbiAgICAgICAgaWYgKGVtZXJnZW5jeUNsZWFudXBPdXRjb21lLnNldHRsZWQgJiYgZW1lcmdlbmN5Q2xlYW51cE91dGNvbWUuc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgICBlbWVyZ2VuY3lDbGVhbnVwRXJyb3JzLnB1c2goZW1lcmdlbmN5Q2xlYW51cE91dGNvbWUucmVhc29uKVxuICAgICAgICB9IGVsc2UgaWYgKCFlbWVyZ2VuY3lDbGVhbnVwT3V0Y29tZS5zZXR0bGVkKSB7XG4gICAgICAgICAgdm9pZCBlbWVyZ2VuY3lDbGVhbnVwLmNhdGNoKChjbGVhbnVwRXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRlc3RSdW5uZXIucmVjb3JkVGltZW91dENsZWFudXBGYWlsdXJlKGNsZWFudXBFcnJvciwgXCJ0cmFuc2FjdGlvbmFsIHRlbmFudFwiLCByZWNvcmRlZFRpbWVvdXRDbGVhbnVwRXJyb3JzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW1lcmdlbmN5Q2xlYW51cEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY2F1Z2h0RXJyb3IgPSBuZXcgQWdncmVnYXRlRXJyb3IoXG4gICAgICAgICAgICBbY2F1Z2h0RXJyb3IsIC4uLmVtZXJnZW5jeUNsZWFudXBFcnJvcnNdLFxuICAgICAgICAgICAgXCJUZXN0IHRpbWVvdXQgYW5kIGVtZXJnZW5jeSBjbGVhbnVwIGZhaWxlZFwiLFxuICAgICAgICAgICAge2NhdXNlOiBjYXVnaHRFcnJvcn1cbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGJyb3dzZXJEdW1teUNvbm5lY3Rpb25SZWdpc3RyYXRpb25zLnNvbWUoKHJlZ2lzdHJhdGlvbikgPT4gcmVnaXN0cmF0aW9uLnF1YXJhbnRpbmVkKSkge1xuICAgICAgICB0ZXN0RGF0YWJhc2VBY2Nlc3NTY29wZS5yZXZva2VkID0gdHJ1ZVxuICAgICAgICBhYm9ydFJlbWFpbmluZ1Rlc3RzID0gdHJ1ZVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0ZXN0RGF0YWJhc2VBY2Nlc3NTY29wZS5yZXZva2VkID0gdHJ1ZVxuXG4gICAgICBpZiAocHJvZmlsZUF0dGVtcHQgJiYgcHJvZmlsZXIpIHtcbiAgICAgICAgcHJvZmlsZXIuZmluaXNoQXR0ZW1wdChwcm9maWxlQXR0ZW1wdCwgZmFpbGVkXG4gICAgICAgICAgPyAoYXR0ZW1wdFRpbWVkT3V0ID8gXCJ0aW1lZC1vdXRcIiA6IFwiZmFpbGVkXCIpXG4gICAgICAgICAgOiBcInBhc3NlZFwiKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRlc3RSdW5uZXIucmVjb3JkQXR0ZW1wdE91dGNvbWUodGVzdCwgYXR0ZW1wdE51bWJlciwge1xuICAgICAgYWJvcnRSZW1haW5pbmdUZXN0cyxcbiAgICAgIGVycm9yOiBjYXVnaHRFcnJvcixcbiAgICAgIGZhaWxlZFxuICAgIH0pXG5cbiAgICBpZiAoZmFpbGVkKSB0aHJvdyBjYXVnaHRFcnJvclxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYmVmb3JlLWVhY2ggaG9va3MgaW4gaW5oZXJpdGVkIGRlY2xhcmF0aW9uIG9yZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEhvb2sgYXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge1BhY2thZ2VIb29rRGVjbGFyYXRpb25bXX0gYXJncy5iZWZvcmVFYWNoZXMgLSBTZXR1cCBob29rcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3ZlbG9jaW91cy10ZXN0LWFyZ3VtZW50cy5qc1wiKS5UZXN0QXJnc30gYXJncy50ZXN0QXJncyAtIFN0YWJsZSB0ZXN0IGFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3ZlbG9jaW91cy10ZXN0LWFyZ3VtZW50cy5qc1wiKS5UZXN0RGF0YX0gYXJncy50ZXN0RGF0YSAtIFRlc3QgcmVnaXN0cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciBhbGwgc2V0dXAgaG9va3MgY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBydW5CZWZvcmVFYWNoZXMoe2JlZm9yZUVhY2hlcywgdGVzdEFyZ3MsIHRlc3REYXRhfSkge1xuICAgIGZvciAoY29uc3QgaG9vayBvZiBiZWZvcmVFYWNoZXMpIHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy50ZXN0UnVubmVyLmhvb2tNZXRhZGF0YShob29rKVxuXG4gICAgICBhd2FpdCB0aGlzLnRlc3RSdW5uZXIucnVuUHJvZmlsZVNwYW4oe1xuICAgICAgICBwaGFzZTogXCJiZWZvcmVFYWNoXCIsXG4gICAgICAgIGRlY2xhcmF0aW9uSW5kZXg6IG1ldGFkYXRhLmRlY2xhcmF0aW9uSW5kZXgsXG4gICAgICAgIGRlY2xhcmF0aW9uU2NvcGVJZDogbWV0YWRhdGEuZGVjbGFyYXRpb25TY29wZUlkLFxuICAgICAgICBmaWxlUGF0aDogbWV0YWRhdGEub3duZXJGaWxlUGF0aFxuICAgICAgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBob29rLmNhbGxiYWNrKHtjb25maWd1cmF0aW9uOiB0aGlzLnRlc3RSdW5uZXIuZ2V0Q29uZmlndXJhdGlvbigpLCB0ZXN0QXJncywgdGVzdERhdGF9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBldmVyeSBhZnRlci1lYWNoIGhvb2sgd2hpbGUgcHJlc2VydmluZyBhbGwgZmFpbHVyZXMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gSG9vayBhcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7UGFja2FnZUhvb2tEZWNsYXJhdGlvbltdfSBhcmdzLmFmdGVyRWFjaGVzIC0gQ2xlYW51cCBob29rcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3ZlbG9jaW91cy10ZXN0LWFyZ3VtZW50cy5qc1wiKS5UZXN0QXJnc30gYXJncy50ZXN0QXJncyAtIFN0YWJsZSB0ZXN0IGFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3ZlbG9jaW91cy10ZXN0LWFyZ3VtZW50cy5qc1wiKS5UZXN0RGF0YX0gYXJncy50ZXN0RGF0YSAtIFRlc3QgcmVnaXN0cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciBldmVyeSBjbGVhbnVwIGhvb2sgc2V0dGxlcy5cbiAgICovXG4gIGFzeW5jIHJ1bkFmdGVyRWFjaGVzKHthZnRlckVhY2hlcywgdGVzdEFyZ3MsIHRlc3REYXRhfSkge1xuICAgIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT5bXX0gKi9cbiAgICBjb25zdCBlcnJvcnMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBob29rIG9mIGFmdGVyRWFjaGVzKSB7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMudGVzdFJ1bm5lci5ob29rTWV0YWRhdGEoaG9vaylcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy50ZXN0UnVubmVyLnJ1blByb2ZpbGVTcGFuKHtcbiAgICAgICAgICBwaGFzZTogXCJhZnRlckVhY2hcIixcbiAgICAgICAgICBkZWNsYXJhdGlvbkluZGV4OiBtZXRhZGF0YS5kZWNsYXJhdGlvbkluZGV4LFxuICAgICAgICAgIGRlY2xhcmF0aW9uU2NvcGVJZDogbWV0YWRhdGEuZGVjbGFyYXRpb25TY29wZUlkLFxuICAgICAgICAgIGZpbGVQYXRoOiBtZXRhZGF0YS5vd25lckZpbGVQYXRoXG4gICAgICAgIH0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBob29rLmNhbGxiYWNrKHtjb25maWd1cmF0aW9uOiB0aGlzLnRlc3RSdW5uZXIuZ2V0Q29uZmlndXJhdGlvbigpLCB0ZXN0QXJncywgdGVzdERhdGF9KVxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goZXJyb3IpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPT0gMSkgdGhyb3cgZXJyb3JzWzBdXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBcIk11bHRpcGxlIGFmdGVyRWFjaCBob29rcyBmYWlsZWRcIiwge2NhdXNlOiBlcnJvcnNbMF19KVxuICAgIH1cbiAgfVxufVxuIl19