@pipeline-builder/pipeline-data 4.1.24 → 4.1.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/alert-destinations.d.ts +17 -0
- package/lib/api/alert-destinations.js +36 -0
- package/lib/api/reporting/analytics-queries.d.ts +274 -0
- package/lib/api/reporting/analytics-queries.js +598 -0
- package/lib/api/reporting/daily-rollup.d.ts +41 -0
- package/lib/api/reporting/daily-rollup.js +173 -0
- package/lib/api/reporting/deploy-rollup.d.ts +78 -0
- package/lib/api/reporting/deploy-rollup.js +203 -0
- package/lib/api/reporting/dora-scoring.d.ts +14 -0
- package/lib/api/reporting/dora-scoring.js +25 -1
- package/lib/api/reporting/dora.js +30 -6
- package/lib/api/reporting/failure-classifier.d.ts +54 -0
- package/lib/api/reporting/failure-classifier.js +179 -0
- package/lib/api/reporting/ingest.d.ts +2 -2
- package/lib/api/reporting/ingest.js +129 -4
- package/lib/api/reporting/last-deploy.d.ts +31 -0
- package/lib/api/reporting/last-deploy.js +93 -0
- package/lib/api/reporting/needs-attention.d.ts +93 -0
- package/lib/api/reporting/needs-attention.js +152 -0
- package/lib/api/reporting/plugin-exposure.d.ts +129 -0
- package/lib/api/reporting/plugin-exposure.js +312 -0
- package/lib/api/reporting/retention-sweep.js +9 -1
- package/lib/api/reporting/sql-helpers.d.ts +35 -2
- package/lib/api/reporting/sql-helpers.js +39 -1
- package/lib/api/reporting/stakeholder/compose.d.ts +115 -0
- package/lib/api/reporting/stakeholder/compose.js +234 -0
- package/lib/api/reporting/stakeholder/index.d.ts +14 -0
- package/lib/api/reporting/stakeholder/index.js +17 -0
- package/lib/api/reporting/stakeholder/period.d.ts +102 -0
- package/lib/api/reporting/stakeholder/period.js +273 -0
- package/lib/api/reporting/stakeholder/report-html.d.ts +93 -0
- package/lib/api/reporting/stakeholder/report-html.js +208 -0
- package/lib/api/reporting/stakeholder/sections.d.ts +117 -0
- package/lib/api/reporting/stakeholder/sections.js +249 -0
- package/lib/api/reporting/stakeholder/store.d.ts +450 -0
- package/lib/api/reporting/stakeholder/store.js +981 -0
- package/lib/api/reporting/stakeholder/templates.d.ts +21 -0
- package/lib/api/reporting/stakeholder/templates.js +104 -0
- package/lib/api/reporting/types.d.ts +73 -0
- package/lib/api/reporting/types.js +1 -1
- package/lib/api/reporting-service.d.ts +94 -5
- package/lib/api/reporting-service.js +169 -10
- package/lib/api/soft-delete-sweep.d.ts +11 -2
- package/lib/api/soft-delete-sweep.js +17 -6
- package/lib/database/drizzle-schema.d.ts +2244 -385
- package/lib/database/drizzle-schema.js +18 -7
- package/lib/database/index.d.ts +1 -1
- package/lib/database/index.js +4 -2
- package/lib/database/schema/compliance.d.ts +0 -682
- package/lib/database/schema/compliance.js +6 -66
- package/lib/database/schema/ecosystem.d.ts +20 -157
- package/lib/database/schema/ecosystem.js +23 -16
- package/lib/database/schema/pipeline.d.ts +200 -0
- package/lib/database/schema/pipeline.js +100 -1
- package/lib/database/schema/plugin.d.ts +20 -1
- package/lib/database/schema/plugin.js +13 -1
- package/lib/database/schema/reporting-analytics.d.ts +1212 -0
- package/lib/database/schema/reporting-analytics.js +250 -0
- package/lib/database/schema/reporting-stakeholder.d.ts +1373 -0
- package/lib/database/schema/reporting-stakeholder.js +251 -0
- package/lib/index.d.ts +10 -1
- package/lib/index.js +15 -1
- package/lib/testing/exports.json +67 -4
- package/package.json +4 -3
|
@@ -118,6 +118,30 @@ export function median(values) {
|
|
|
118
118
|
const mid = Math.floor(s.length / 2);
|
|
119
119
|
return s.length % 2 === 1 ? s[mid] : (s[mid - 1] + s[mid]) / 2;
|
|
120
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* The `p`-th percentile of a sample (0 < p < 100), or `null` when empty.
|
|
123
|
+
*
|
|
124
|
+
* Linear interpolation between order statistics — the same definition as
|
|
125
|
+
* Postgres's `PERCENTILE_CONT`, so a reader comparing this to a hand-written SQL
|
|
126
|
+
* query gets the same number. {@link median} is p50 by this definition too; it
|
|
127
|
+
* stays a separate function because it is the level-scoring input and is read in
|
|
128
|
+
* far more places.
|
|
129
|
+
*
|
|
130
|
+
* Tails matter here: a median lead time of 2 hours with a p95 of 3 weeks is a
|
|
131
|
+
* team with a fast path and a stuck queue, and the median alone hides that
|
|
132
|
+
* entirely. That is why the plan asks for p90/p95 rather than more levels.
|
|
133
|
+
*/
|
|
134
|
+
export function percentile(values, p) {
|
|
135
|
+
if (values.length === 0)
|
|
136
|
+
return null;
|
|
137
|
+
const s = [...values].sort((a, b) => a - b);
|
|
138
|
+
if (s.length === 1)
|
|
139
|
+
return s[0];
|
|
140
|
+
const rank = (p / 100) * (s.length - 1);
|
|
141
|
+
const lo = Math.floor(rank);
|
|
142
|
+
const hi = Math.ceil(rank);
|
|
143
|
+
return lo === hi ? s[lo] : s[lo] + (s[hi] - s[lo]) * (rank - lo);
|
|
144
|
+
}
|
|
121
145
|
/**
|
|
122
146
|
* Roll a group of deploy/stage events (grouped per execution) up to one terminal
|
|
123
147
|
* status: FAILED wins, then SUCCEEDED, else OTHER (still-running / non-terminal).
|
|
@@ -125,4 +149,4 @@ export function median(values) {
|
|
|
125
149
|
* trend, and build health — so the precedence can't drift between them. Assumes the
|
|
126
150
|
* grouped event alias is `e`.
|
|
127
151
|
*/
|
|
128
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9yYS1zY29yaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS9yZXBvcnRpbmcvZG9yYS1zY29yaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFJdEM7Ozs7R0FJRztBQUVIOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDO0FBRXpDOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxHQUFHLEVBQUU7SUFDOUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUMzRCxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDcEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUVMOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsUUFBd0I7SUFDakUsT0FBTyxRQUFRLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQztBQUMvRyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCx3RkFBd0Y7QUFDeEYsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE1BQWMsRUFBRSxXQUFtQjtJQUN2RSxJQUFJLFdBQVcsSUFBSSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDbEMsSUFBSSxNQUFNLElBQUksQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQ2hDLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDbkMsSUFBSSxNQUFNLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUN0QyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFDRCx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLHlCQUF5QixDQUFDLEdBQVcsRUFBRSxLQUFhO0lBQ2xFLElBQUksS0FBSyxJQUFJLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUM1QixJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDN0IsSUFBSSxHQUFHLElBQUksRUFBRTtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQzdCLElBQUksR0FBRyxJQUFJLEVBQUU7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUMvQixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFDRCwwRUFBMEU7QUFDMUUsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFVBQXlCO0lBQzNELElBQUksVUFBVSxJQUFJLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNwQyxJQUFJLFVBQVUsR0FBRyxJQUFJO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDdEMsSUFBSSxVQUFVLEdBQUcsS0FBSztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ3RDLElBQUksVUFBVSxHQUFHLE1BQU07UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUN6QyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFDRCx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLG9CQUFvQixDQUFDLGFBQTRCO0lBQy9ELElBQUksYUFBYSxJQUFJLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN2QyxJQUFJLGFBQWEsR0FBRyxLQUFLO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDMUMsSUFBSSxhQUFhLEdBQUcsTUFBTTtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQzFDLElBQUksYUFBYSxHQUFHLE9BQU87UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUM3QyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBQyxLQUFhLEVBQUUsTUFBYztJQUNqRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FBQyxNQUFnQjtJQUNyQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3JDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVEOzs7Ozs7R0FNRyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IERvcmFMZXZlbCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIERPUkEgcGVyZm9ybWFuY2UgYmFuZGluZyBwbHVzIHRoZSBzbWFsbCBzdGF0aXN0aWNzIGhlbHBlcnMgaXQgbmVlZHMuXG4gKiBQdXJlIGZ1bmN0aW9ucyDigJQgbm8gZGF0YWJhc2UgYWNjZXNzLCBubyBJL08g4oCUIHdoaWNoIGlzIHdoYXQgbGV0cyB0aGVcbiAqIHRocmVzaG9sZHMgYmUgdW5pdC10ZXN0ZWQgaW5kZXBlbmRlbnRseSBvZiB0aGUgcXVlcmllcyB0aGF0IGZlZWQgdGhlbS5cbiAqL1xuXG4vKipcbiAqIFRoZSBET1JBIGhlYWRsaW5lIGVudmlyb25tZW50LiBEZXBsb3ltZW50IHRvIHRoaXMgbGl0ZXJhbCBlbnYgbmFtZSBpcyB0aGVcbiAqIGluZHVzdHJ5LXN0YW5kYXJkIERPUkEgc2lnbmFsOyBNVFRSIGlzIG1lYXN1cmVkIHByb2R1Y3Rpb24tb25seSwgYW5kIHRoaXNcbiAqIGVudmlyb25tZW50J3MgY2FyZCBpcyB0aGUgc3VtbWFyeSBzaG93biBhdCB0aGUgdG9wIG9mIHRoZSBwYW5lbC5cbiAqL1xuZXhwb3J0IGNvbnN0IEhFQURMSU5FX0VOViA9ICdwcm9kdWN0aW9uJztcblxuLyoqXG4gKiBJbmNpZGVudOKGkmRlcGxveSBjb3JyZWxhdGlvbiB3aW5kb3cuIEFuIGluY2lkZW50IGlzIGF0dHJpYnV0ZWQgdG8gdGhlXG4gKiBtb3N0IHJlY2VudCBTVUNDRVNTRlVMIGRlcGxveSB0byBpdHMgZW52aXJvbm1lbnQgd2hvc2UgYGNvbXBsZXRlZF9hdGAgaXMgd2l0aGluXG4gKiB0aGlzIG1hbnkgaG91cnMgYmVmb3JlIHRoZSBpbmNpZGVudCdzIGBvcGVuZWRfYXRgLiBEZWZhdWx0IDI0aDsgb3ZlcnJpZGUgdmlhXG4gKiBgRE9SQV9JTkNJREVOVF9XSU5ET1dfSE9VUlNgLiBHdWFyZGVkIHRvIGEgcG9zaXRpdmUgZmluaXRlIG51bWJlci5cbiAqL1xuZXhwb3J0IGNvbnN0IERPUkFfSU5DSURFTlRfV0lORE9XX0hPVVJTID0gKCgpID0+IHtcbiAgY29uc3QgcmF3ID0gTnVtYmVyKHByb2Nlc3MuZW52LkRPUkFfSU5DSURFTlRfV0lORE9XX0hPVVJTKTtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShyYXcpICYmIHJhdyA+IDAgPyByYXcgOiAyNDtcbn0pKCk7XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZWZmZWN0aXZlIGluY2lkZW504oaSZGVwbG95IGNvcnJlbGF0aW9uIHdpbmRvdy4gQSBwZXItb3JnXG4gKiBvdmVycmlkZSAoZnJvbSBgZG9yYV9zZXR0aW5ncy5pbmNpZGVudF93aW5kb3dfaG91cnNgLCBzdXJmYWNlZCB0aHJvdWdoIHRoZVxuICogc2V0dGluZ3MgZW5kcG9pbnQgYW5kIHRocmVhZGVkIGludG8ge0BsaW5rIERvcmFPcHRpb25zLmluY2lkZW50V2luZG93SG91cnN9KVxuICogd2lucyB3aGVuIGl0IGlzIGEgcG9zaXRpdmUgZmluaXRlIG51bWJlcjsgb3RoZXJ3aXNlIHRoZSBnbG9iYWwgZW52IGRlZmF1bHRcbiAqIGBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSU2AgYXBwbGllcy4gQ2VudHJhbGl6ZWQgc28gdGhlIERPUkEgY29ycmVsYXRpb24sIHRoZVxuICogaW5jaWRlbnRzIGxpc3QsIGFuZCB0aGUgd2lyaW5nLXRlc3QgZHJ5LXJ1biBhbGwgYWdyZWUgb24gdGhlIHNhbWUgcnVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJbmNpZGVudFdpbmRvd0hvdXJzKG92ZXJyaWRlPzogbnVtYmVyIHwgbnVsbCk6IG51bWJlciB7XG4gIHJldHVybiBvdmVycmlkZSAhPSBudWxsICYmIE51bWJlci5pc0Zpbml0ZShvdmVycmlkZSkgJiYgb3ZlcnJpZGUgPiAwID8gb3ZlcnJpZGUgOiBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSUztcbn1cblxuLyoqXG4gKiBSZXBvcnRpbmcgcmV0ZW50aW9uIHdpbmRvd3MuIFJlY29yZHMgaW4gYHBpcGVsaW5lX2V2ZW50c2AsXG4gKiBgZGVwbG95bWVudF9vdXRjb21lc2AsIGFuZCBgaW5jaWRlbnRzYCBncm93IHVuYm91bmRlZCB3aXRob3V0IGEgc3dlZXAsIHNvIGFcbiAqIHNwbGl0LCBwZXItb3JnIHJldGVudGlvbiBwdXJnZSAoc2VlIGBwdXJnZUV4cGlyZWRSZXBvcnRpbmdEYXRhYCBpbiAuL3JldGVudGlvbi1zd2VlcC50cylcbiAqIGhhcmQtZGVsZXRlcyByb3dzIG9sZGVyIHRoYW4gdGhlc2Ugd2luZG93cywgYnkgYGNyZWF0ZWRfYXRgOlxuICogIC0gKipTdGFuZGFyZCBldmVudHMqKiDigJQgYHBpcGVsaW5lX2V2ZW50c2Agd2l0aCBgZW52aXJvbm1lbnQgSVMgTlVMTGAgYW5kIG5vXG4gKiAgICBgY29tbWl0X3RpbWVzdGFtcGAgKG5vbi1kZXBsb3kgU1RBR0UvQUNUSU9OL2J1aWxkKS4gSGlnaCB2b2x1bWUg4oaSIHNob3J0XG4gKiAgICBkZWZhdWx0ICgzMCBkYXlzKS4gQSByb3cgdGhhdCBET0VTIGNhcnJ5IGEgY29tbWl0IHRpbWVzdGFtcCBpcyBET1JBIHNvdXJjZVxuICogICAgZGF0YSDigJQgbGVhZCB0aW1lIGpvaW5zIG9uIGl0IOKAlCBzbyBpdCBmb2xsb3dzIHRoZSBET1JBIHdpbmRvdyBpbnN0ZWFkLlxuICogIC0gKipET1JBIHNvdXJjZSoqIOKAlCBgcGlwZWxpbmVfZXZlbnRzYCB3aXRoIGBlbnZpcm9ubWVudCBJUyBOT1QgTlVMTGAgKGRlcGxveVxuICogICAgc3RhZ2VzKSBwbHVzIGFsbCBvZiBgZGVwbG95bWVudF9vdXRjb21lc2AgYW5kIGBpbmNpZGVudHNgLiBMb3cgdm9sdW1lIOKGklxuICogICAgbG9uZ2VyIGRlZmF1bHQgKDE4MCBkYXlzKS4gRE9SQSBoaXN0b3J5IGlzIHRoZXJlZm9yZSBib3VuZGVkIGJ5IHRoaXMgd2luZG93O1xuICogICAgdGhlIHJlcG9ydCBxdWVyeSBzdGlsbCBoYXJkLWNhcHMgYXQgMzY1IGRheXMgKGEgbG9uZ2VyIHBlci1vcmcgb3ZlcnJpZGUgb25seVxuICogICAgcmV0YWlucyByYXcgc291cmNlIHJvd3MsIG5ldmVyIHdpZGVucyBhIHJlcG9ydCkuXG4gKiBgaW5nZXN0X2hlYWx0aGAgYW5kIGBkb3JhX3NldHRpbmdzYCBhcmUgbmV2ZXIgcHVyZ2VkLiBFbnYtb3ZlcnJpZGFibGUgZ2xvYmFscztcbiAqIGEgcGVyLW9yZyBvdmVycmlkZSBpbiBgZG9yYV9zZXR0aW5nc2Agd2lucyAoc2VlIHtAbGluayByZXNvbHZlRXZlbnRSZXRlbnRpb25EYXlzfSkuXG4gKi9cblxuLyoqIERlcGxveW1lbnQgZnJlcXVlbmN5IGJ5IGRlcGxveXMvZGF5OiBlbGl0ZSDiiaUxL2RheSwgaGlnaCDiiaUxL3dlZWssIG1lZGl1bSDiiaUxL21vbnRoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvcmFMZXZlbEZvckZyZXF1ZW5jeShwZXJEYXk6IG51bWJlciwgZGVwbG95bWVudHM6IG51bWJlcik6IERvcmFMZXZlbCB7XG4gIGlmIChkZXBsb3ltZW50cyA8PSAwKSByZXR1cm4gbnVsbDtcbiAgaWYgKHBlckRheSA+PSAxKSByZXR1cm4gJ2VsaXRlJztcbiAgaWYgKHBlckRheSA+PSAxIC8gNykgcmV0dXJuICdoaWdoJztcbiAgaWYgKHBlckRheSA+PSAxIC8gMzApIHJldHVybiAnbWVkaXVtJztcbiAgcmV0dXJuICdsb3cnO1xufVxuLyoqIENoYW5nZSBmYWlsdXJlIHJhdGUgYnkgcGVyY2VudDogZWxpdGUg4omkNSUsIGhpZ2gg4omkMTAlLCBtZWRpdW0g4omkMTUlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvcmFMZXZlbEZvckNoYW5nZUZhaWx1cmUocGN0OiBudW1iZXIsIHRvdGFsOiBudW1iZXIpOiBEb3JhTGV2ZWwge1xuICBpZiAodG90YWwgPD0gMCkgcmV0dXJuIG51bGw7XG4gIGlmIChwY3QgPD0gNSkgcmV0dXJuICdlbGl0ZSc7XG4gIGlmIChwY3QgPD0gMTApIHJldHVybiAnaGlnaCc7XG4gIGlmIChwY3QgPD0gMTUpIHJldHVybiAnbWVkaXVtJztcbiAgcmV0dXJuICdsb3cnO1xufVxuLyoqIFRpbWUgdG8gcmVzdG9yZSBieSBzZWNvbmRzOiBlbGl0ZSA8MWgsIGhpZ2ggPDEgZGF5LCBtZWRpdW0gPDEgd2Vlay4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb3JhTGV2ZWxGb3JSZXN0b3JlKGF2Z1NlY29uZHM6IG51bWJlciB8IG51bGwpOiBEb3JhTGV2ZWwge1xuICBpZiAoYXZnU2Vjb25kcyA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgaWYgKGF2Z1NlY29uZHMgPCAzNjAwKSByZXR1cm4gJ2VsaXRlJztcbiAgaWYgKGF2Z1NlY29uZHMgPCA4NjQwMCkgcmV0dXJuICdoaWdoJztcbiAgaWYgKGF2Z1NlY29uZHMgPCA2MDQ4MDApIHJldHVybiAnbWVkaXVtJztcbiAgcmV0dXJuICdsb3cnO1xufVxuLyoqIExlYWQgdGltZSBieSBzZWNvbmRzOiBlbGl0ZSA8MSBkYXksIGhpZ2ggPDEgd2VlaywgbWVkaXVtIDwxIG1vbnRoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvcmFMZXZlbEZvckxlYWRUaW1lKG1lZGlhblNlY29uZHM6IG51bWJlciB8IG51bGwpOiBEb3JhTGV2ZWwge1xuICBpZiAobWVkaWFuU2Vjb25kcyA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgaWYgKG1lZGlhblNlY29uZHMgPCA4NjQwMCkgcmV0dXJuICdlbGl0ZSc7XG4gIGlmIChtZWRpYW5TZWNvbmRzIDwgNjA0ODAwKSByZXR1cm4gJ2hpZ2gnO1xuICBpZiAobWVkaWFuU2Vjb25kcyA8IDI1OTIwMDApIHJldHVybiAnbWVkaXVtJztcbiAgcmV0dXJuICdsb3cnO1xufVxuXG4vKipcbiAqIFJvdW5kIGB2YWx1ZWAgdG8gYGRpZ2l0c2AgZGVjaW1hbCBwbGFjZXMsIHJldHVybmluZyBhIHJlYWwgbnVtYmVyLiBTbWFsbFxuICogbW9kdWxlLXByaXZhdGUgaGVscGVyIHNvIHRoZSBET1JBIHNoYXBpbmcgZG9lc24ndCByZXBlYXQgdGhlXG4gKiBgTnVtYmVyKE51bWJlcih4KS50b0ZpeGVkKG4pKWAgcGF0dGVybiAodG9GaXhlZCBhbG9uZSB5aWVsZHMgYSBzdHJpbmcpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcm91bmQodmFsdWU6IG51bWJlciwgZGlnaXRzOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTnVtYmVyKHZhbHVlLnRvRml4ZWQoZGlnaXRzKSk7XG59XG5cbi8qKlxuICogTWVkaWFuIG9mIGEgbnVtZXJpYyBzYW1wbGUsIG9yIGBudWxsYCB3aGVuIGVtcHR5LiBVc2VkIGZvciBtZWFzdXJlZCBsZWFkIHRpbWVcbiAqIGFuZCBNVFRSIOKAlCBib3RoIGFyZSBjcm9zcy1zb3VyY2UgZ2FwcyBjb21wdXRlZCBpbiBKUyBmcm9tIGNsYW1wZWQgZGVsdGFzLCBzb1xuICogdGhlIG1lZGlhbiBsaXZlcyBoZXJlIHJhdGhlciB0aGFuIGluIFNRTCBQRVJDRU5USUxFX0NPTlQgKGtlZXBzIHRoZSBnb2xkZW5cbiAqIGZpeHR1cmUgdGVzdHMgYWJsZSB0byBwcm92ZSB0aGUgbWV0cmljIG1hdGggd2l0aG91dCBhIGxpdmUgUG9zdGdyZXMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVkaWFuKHZhbHVlczogbnVtYmVyW10pOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICBjb25zdCBzID0gWy4uLnZhbHVlc10uc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICBjb25zdCBtaWQgPSBNYXRoLmZsb29yKHMubGVuZ3RoIC8gMik7XG4gIHJldHVybiBzLmxlbmd0aCAlIDIgPT09IDEgPyBzW21pZF0gOiAoc1ttaWQgLSAxXSArIHNbbWlkXSkgLyAyO1xufVxuXG4vKipcbiAqIFJvbGwgYSBncm91cCBvZiBkZXBsb3kvc3RhZ2UgZXZlbnRzIChncm91cGVkIHBlciBleGVjdXRpb24pIHVwIHRvIG9uZSB0ZXJtaW5hbFxuICogc3RhdHVzOiBGQUlMRUQgd2lucywgdGhlbiBTVUNDRUVERUQsIGVsc2UgT1RIRVIgKHN0aWxsLXJ1bm5pbmcgLyBub24tdGVybWluYWwpLlxuICogU2hhcmVkIGJ5IHRoZSB0aHJlZSBwZXItKGVudnxzdGFnZSwgZXhlY3V0aW9uKSByb2xsdXAgQ1RFcyDigJQgRE9SQSBtZXRyaWNzLCBET1JBXG4gKiB0cmVuZCwgYW5kIGJ1aWxkIGhlYWx0aCDigJQgc28gdGhlIHByZWNlZGVuY2UgY2FuJ3QgZHJpZnQgYmV0d2VlbiB0aGVtLiBBc3N1bWVzIHRoZVxuICogZ3JvdXBlZCBldmVudCBhbGlhcyBpcyBgZWAuXG4gKi9cbiJdfQ==
|
|
152
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9yYS1zY29yaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS9yZXBvcnRpbmcvZG9yYS1zY29yaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFJdEM7Ozs7R0FJRztBQUVIOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDO0FBRXpDOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxHQUFHLEVBQUU7SUFDOUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUMzRCxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDcEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUVMOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsUUFBd0I7SUFDakUsT0FBTyxRQUFRLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQztBQUMvRyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCx3RkFBd0Y7QUFDeEYsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE1BQWMsRUFBRSxXQUFtQjtJQUN2RSxJQUFJLFdBQVcsSUFBSSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDbEMsSUFBSSxNQUFNLElBQUksQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQ2hDLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxNQUFN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LE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN4QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRUQ7Ozs7OztHQU1HIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB0eXBlIHsgRG9yYUxldmVsIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogRE9SQSBwZXJmb3JtYW5jZSBiYW5kaW5nIHBsdXMgdGhlIHNtYWxsIHN0YXRpc3RpY3MgaGVscGVycyBpdCBuZWVkcy5cbiAqIFB1cmUgZnVuY3Rpb25zIOKAlCBubyBkYXRhYmFzZSBhY2Nlc3MsIG5vIEkvTyDigJQgd2hpY2ggaXMgd2hhdCBsZXRzIHRoZVxuICogdGhyZXNob2xkcyBiZSB1bml0LXRlc3RlZCBpbmRlcGVuZGVudGx5IG9mIHRoZSBxdWVyaWVzIHRoYXQgZmVlZCB0aGVtLlxuICovXG5cbi8qKlxuICogVGhlIERPUkEgaGVhZGxpbmUgZW52aXJvbm1lbnQuIERlcGxveW1lbnQgdG8gdGhpcyBsaXRlcmFsIGVudiBuYW1lIGlzIHRoZVxuICogaW5kdXN0cnktc3RhbmRhcmQgRE9SQSBzaWduYWw7IE1UVFIgaXMgbWVhc3VyZWQgcHJvZHVjdGlvbi1vbmx5LCBhbmQgdGhpc1xuICogZW52aXJvbm1lbnQncyBjYXJkIGlzIHRoZSBzdW1tYXJ5IHNob3duIGF0IHRoZSB0b3Agb2YgdGhlIHBhbmVsLlxuICovXG5leHBvcnQgY29uc3QgSEVBRExJTkVfRU5WID0gJ3Byb2R1Y3Rpb24nO1xuXG4vKipcbiAqIEluY2lkZW504oaSZGVwbG95IGNvcnJlbGF0aW9uIHdpbmRvdy4gQW4gaW5jaWRlbnQgaXMgYXR0cmlidXRlZCB0byB0aGVcbiAqIG1vc3QgcmVjZW50IFNVQ0NFU1NGVUwgZGVwbG95IHRvIGl0cyBlbnZpcm9ubWVudCB3aG9zZSBgY29tcGxldGVkX2F0YCBpcyB3aXRoaW5cbiAqIHRoaXMgbWFueSBob3VycyBiZWZvcmUgdGhlIGluY2lkZW50J3MgYG9wZW5lZF9hdGAuIERlZmF1bHQgMjRoOyBvdmVycmlkZSB2aWFcbiAqIGBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSU2AuIEd1YXJkZWQgdG8gYSBwb3NpdGl2ZSBmaW5pdGUgbnVtYmVyLlxuICovXG5leHBvcnQgY29uc3QgRE9SQV9JTkNJREVOVF9XSU5ET1dfSE9VUlMgPSAoKCkgPT4ge1xuICBjb25zdCByYXcgPSBOdW1iZXIocHJvY2Vzcy5lbnYuRE9SQV9JTkNJREVOVF9XSU5ET1dfSE9VUlMpO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHJhdykgJiYgcmF3ID4gMCA/IHJhdyA6IDI0O1xufSkoKTtcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBlZmZlY3RpdmUgaW5jaWRlbnTihpJkZXBsb3kgY29ycmVsYXRpb24gd2luZG93LiBBIHBlci1vcmdcbiAqIG92ZXJyaWRlIChmcm9tIGBkb3JhX3NldHRpbmdzLmluY2lkZW50X3dpbmRvd19ob3Vyc2AsIHN1cmZhY2VkIHRocm91Z2ggdGhlXG4gKiBzZXR0aW5ncyBlbmRwb2ludCBhbmQgdGhyZWFkZWQgaW50byB7QGxpbmsgRG9yYU9wdGlvbnMuaW5jaWRlbnRXaW5kb3dIb3Vyc30pXG4gKiB3aW5zIHdoZW4gaXQgaXMgYSBwb3NpdGl2ZSBmaW5pdGUgbnVtYmVyOyBvdGhlcndpc2UgdGhlIGdsb2JhbCBlbnYgZGVmYXVsdFxuICogYERPUkFfSU5DSURFTlRfV0lORE9XX0hPVVJTYCBhcHBsaWVzLiBDZW50cmFsaXplZCBzbyB0aGUgRE9SQSBjb3JyZWxhdGlvbiwgdGhlXG4gKiBpbmNpZGVudHMgbGlzdCwgYW5kIHRoZSB3aXJpbmctdGVzdCBkcnktcnVuIGFsbCBhZ3JlZSBvbiB0aGUgc2FtZSBydWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUluY2lkZW50V2luZG93SG91cnMob3ZlcnJpZGU/OiBudW1iZXIgfCBudWxsKTogbnVtYmVyIHtcbiAgcmV0dXJuIG92ZXJyaWRlICE9IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKG92ZXJyaWRlKSAmJiBvdmVycmlkZSA+IDAgPyBvdmVycmlkZSA6IERPUkFfSU5DSURFTlRfV0lORE9XX0hPVVJTO1xufVxuXG4vKipcbiAqIFJlcG9ydGluZyByZXRlbnRpb24gd2luZG93cy4gUmVjb3JkcyBpbiBgcGlwZWxpbmVfZXZlbnRzYCxcbiAqIGBkZXBsb3ltZW50X291dGNvbWVzYCwgYW5kIGBpbmNpZGVudHNgIGdyb3cgdW5ib3VuZGVkIHdpdGhvdXQgYSBzd2VlcCwgc28gYVxuICogc3BsaXQsIHBlci1vcmcgcmV0ZW50aW9uIHB1cmdlIChzZWUgYHB1cmdlRXhwaXJlZFJlcG9ydGluZ0RhdGFgIGluIC4vcmV0ZW50aW9uLXN3ZWVwLnRzKVxuICogaGFyZC1kZWxldGVzIHJvd3Mgb2xkZXIgdGhhbiB0aGVzZSB3aW5kb3dzLCBieSBgY3JlYXRlZF9hdGA6XG4gKiAgLSAqKlN0YW5kYXJkIGV2ZW50cyoqIOKAlCBgcGlwZWxpbmVfZXZlbnRzYCB3aXRoIGBlbnZpcm9ubWVudCBJUyBOVUxMYCBhbmQgbm9cbiAqICAgIGBjb21taXRfdGltZXN0YW1wYCAobm9uLWRlcGxveSBTVEFHRS9BQ1RJT04vYnVpbGQpLiBIaWdoIHZvbHVtZSDihpIgc2hvcnRcbiAqICAgIGRlZmF1bHQgKDMwIGRheXMpLiBBIHJvdyB0aGF0IERPRVMgY2FycnkgYSBjb21taXQgdGltZXN0YW1wIGlzIERPUkEgc291cmNlXG4gKiAgICBkYXRhIOKAlCBsZWFkIHRpbWUgam9pbnMgb24gaXQg4oCUIHNvIGl0IGZvbGxvd3MgdGhlIERPUkEgd2luZG93IGluc3RlYWQuXG4gKiAgLSAqKkRPUkEgc291cmNlKiog4oCUIGBwaXBlbGluZV9ldmVudHNgIHdpdGggYGVudmlyb25tZW50IElTIE5PVCBOVUxMYCAoZGVwbG95XG4gKiAgICBzdGFnZXMpIHBsdXMgYWxsIG9mIGBkZXBsb3ltZW50X291dGNvbWVzYCBhbmQgYGluY2lkZW50c2AuIExvdyB2b2x1bWUg4oaSXG4gKiAgICBsb25nZXIgZGVmYXVsdCAoMTgwIGRheXMpLiBET1JBIGhpc3RvcnkgaXMgdGhlcmVmb3JlIGJvdW5kZWQgYnkgdGhpcyB3aW5kb3c7XG4gKiAgICB0aGUgcmVwb3J0IHF1ZXJ5IHN0aWxsIGhhcmQtY2FwcyBhdCAzNjUgZGF5cyAoYSBsb25nZXIgcGVyLW9yZyBvdmVycmlkZSBvbmx5XG4gKiAgICByZXRhaW5zIHJhdyBzb3VyY2Ugcm93cywgbmV2ZXIgd2lkZW5zIGEgcmVwb3J0KS5cbiAqIGBpbmdlc3RfaGVhbHRoYCBhbmQgYGRvcmFfc2V0dGluZ3NgIGFyZSBuZXZlciBwdXJnZWQuIEVudi1vdmVycmlkYWJsZSBnbG9iYWxzO1xuICogYSBwZXItb3JnIG92ZXJyaWRlIGluIGBkb3JhX3NldHRpbmdzYCB3aW5zIChzZWUge0BsaW5rIHJlc29sdmVFdmVudFJldGVudGlvbkRheXN9KS5cbiAqL1xuXG4vKiogRGVwbG95bWVudCBmcmVxdWVuY3kgYnkgZGVwbG95cy9kYXk6IGVsaXRlIOKJpTEvZGF5LCBoaWdoIOKJpTEvd2VlaywgbWVkaXVtIOKJpTEvbW9udGguICovXG5leHBvcnQgZnVuY3Rpb24gZG9yYUxldmVsRm9yRnJlcXVlbmN5KHBlckRheTogbnVtYmVyLCBkZXBsb3ltZW50czogbnVtYmVyKTogRG9yYUxldmVsIHtcbiAgaWYgKGRlcGxveW1lbnRzIDw9IDApIHJldHVybiBudWxsO1xuICBpZiAocGVyRGF5ID49IDEpIHJldHVybiAnZWxpdGUnO1xuICBpZiAocGVyRGF5ID49IDEgLyA3KSByZXR1cm4gJ2hpZ2gnO1xuICBpZiAocGVyRGF5ID49IDEgLyAzMCkgcmV0dXJuICdtZWRpdW0nO1xuICByZXR1cm4gJ2xvdyc7XG59XG4vKiogQ2hhbmdlIGZhaWx1cmUgcmF0ZSBieSBwZXJjZW50OiBlbGl0ZSDiiaQ1JSwgaGlnaCDiiaQxMCUsIG1lZGl1bSDiiaQxNSUuICovXG5leHBvcnQgZnVuY3Rpb24gZG9yYUxldmVsRm9yQ2hhbmdlRmFpbHVyZShwY3Q6IG51bWJlciwgdG90YWw6IG51bWJlcik6IERvcmFMZXZlbCB7XG4gIGlmICh0b3RhbCA8PSAwKSByZXR1cm4gbnVsbDtcbiAgaWYgKHBjdCA8PSA1KSByZXR1cm4gJ2VsaXRlJztcbiAgaWYgKHBjdCA8PSAxMCkgcmV0dXJuICdoaWdoJztcbiAgaWYgKHBjdCA8PSAxNSkgcmV0dXJuICdtZWRpdW0nO1xuICByZXR1cm4gJ2xvdyc7XG59XG4vKiogVGltZSB0byByZXN0b3JlIGJ5IHNlY29uZHM6IGVsaXRlIDwxaCwgaGlnaCA8MSBkYXksIG1lZGl1bSA8MSB3ZWVrLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvcmFMZXZlbEZvclJlc3RvcmUoYXZnU2Vjb25kczogbnVtYmVyIHwgbnVsbCk6IERvcmFMZXZlbCB7XG4gIGlmIChhdmdTZWNvbmRzID09IG51bGwpIHJldHVybiBudWxsO1xuICBpZiAoYXZnU2Vjb25kcyA8IDM2MDApIHJldHVybiAnZWxpdGUnO1xuICBpZiAoYXZnU2Vjb25kcyA8IDg2NDAwKSByZXR1cm4gJ2hpZ2gnO1xuICBpZiAoYXZnU2Vjb25kcyA8IDYwNDgwMCkgcmV0dXJuICdtZWRpdW0nO1xuICByZXR1cm4gJ2xvdyc7XG59XG4vKiogTGVhZCB0aW1lIGJ5IHNlY29uZHM6IGVsaXRlIDwxIGRheSwgaGlnaCA8MSB3ZWVrLCBtZWRpdW0gPDEgbW9udGguICovXG5leHBvcnQgZnVuY3Rpb24gZG9yYUxldmVsRm9yTGVhZFRpbWUobWVkaWFuU2Vjb25kczogbnVtYmVyIHwgbnVsbCk6IERvcmFMZXZlbCB7XG4gIGlmIChtZWRpYW5TZWNvbmRzID09IG51bGwpIHJldHVybiBudWxsO1xuICBpZiAobWVkaWFuU2Vjb25kcyA8IDg2NDAwKSByZXR1cm4gJ2VsaXRlJztcbiAgaWYgKG1lZGlhblNlY29uZHMgPCA2MDQ4MDApIHJldHVybiAnaGlnaCc7XG4gIGlmIChtZWRpYW5TZWNvbmRzIDwgMjU5MjAwMCkgcmV0dXJuICdtZWRpdW0nO1xuICByZXR1cm4gJ2xvdyc7XG59XG5cbi8qKlxuICogUm91bmQgYHZhbHVlYCB0byBgZGlnaXRzYCBkZWNpbWFsIHBsYWNlcywgcmV0dXJuaW5nIGEgcmVhbCBudW1iZXIuIFNtYWxsXG4gKiBtb2R1bGUtcHJpdmF0ZSBoZWxwZXIgc28gdGhlIERPUkEgc2hhcGluZyBkb2Vzbid0IHJlcGVhdCB0aGVcbiAqIGBOdW1iZXIoTnVtYmVyKHgpLnRvRml4ZWQobikpYCBwYXR0ZXJuICh0b0ZpeGVkIGFsb25lIHlpZWxkcyBhIHN0cmluZykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb3VuZCh2YWx1ZTogbnVtYmVyLCBkaWdpdHM6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBOdW1iZXIodmFsdWUudG9GaXhlZChkaWdpdHMpKTtcbn1cblxuLyoqXG4gKiBNZWRpYW4gb2YgYSBudW1lcmljIHNhbXBsZSwgb3IgYG51bGxgIHdoZW4gZW1wdHkuIFVzZWQgZm9yIG1lYXN1cmVkIGxlYWQgdGltZVxuICogYW5kIE1UVFIg4oCUIGJvdGggYXJlIGNyb3NzLXNvdXJjZSBnYXBzIGNvbXB1dGVkIGluIEpTIGZyb20gY2xhbXBlZCBkZWx0YXMsIHNvXG4gKiB0aGUgbWVkaWFuIGxpdmVzIGhlcmUgcmF0aGVyIHRoYW4gaW4gU1FMIFBFUkNFTlRJTEVfQ09OVCAoa2VlcHMgdGhlIGdvbGRlblxuICogZml4dHVyZSB0ZXN0cyBhYmxlIHRvIHByb3ZlIHRoZSBtZXRyaWMgbWF0aCB3aXRob3V0IGEgbGl2ZSBQb3N0Z3JlcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZWRpYW4odmFsdWVzOiBudW1iZXJbXSk6IG51bWJlciB8IG51bGwge1xuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHMgPSBbLi4udmFsdWVzXS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIGNvbnN0IG1pZCA9IE1hdGguZmxvb3Iocy5sZW5ndGggLyAyKTtcbiAgcmV0dXJuIHMubGVuZ3RoICUgMiA9PT0gMSA/IHNbbWlkXSA6IChzW21pZCAtIDFdICsgc1ttaWRdKSAvIDI7XG59XG5cbi8qKlxuICogVGhlIGBwYC10aCBwZXJjZW50aWxlIG9mIGEgc2FtcGxlICgwIDwgcCA8IDEwMCksIG9yIGBudWxsYCB3aGVuIGVtcHR5LlxuICpcbiAqIExpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gb3JkZXIgc3RhdGlzdGljcyDigJQgdGhlIHNhbWUgZGVmaW5pdGlvbiBhc1xuICogUG9zdGdyZXMncyBgUEVSQ0VOVElMRV9DT05UYCwgc28gYSByZWFkZXIgY29tcGFyaW5nIHRoaXMgdG8gYSBoYW5kLXdyaXR0ZW4gU1FMXG4gKiBxdWVyeSBnZXRzIHRoZSBzYW1lIG51bWJlci4ge0BsaW5rIG1lZGlhbn0gaXMgcDUwIGJ5IHRoaXMgZGVmaW5pdGlvbiB0b287IGl0XG4gKiBzdGF5cyBhIHNlcGFyYXRlIGZ1bmN0aW9uIGJlY2F1c2UgaXQgaXMgdGhlIGxldmVsLXNjb3JpbmcgaW5wdXQgYW5kIGlzIHJlYWQgaW5cbiAqIGZhciBtb3JlIHBsYWNlcy5cbiAqXG4gKiBUYWlscyBtYXR0ZXIgaGVyZTogYSBtZWRpYW4gbGVhZCB0aW1lIG9mIDIgaG91cnMgd2l0aCBhIHA5NSBvZiAzIHdlZWtzIGlzIGFcbiAqIHRlYW0gd2l0aCBhIGZhc3QgcGF0aCBhbmQgYSBzdHVjayBxdWV1ZSwgYW5kIHRoZSBtZWRpYW4gYWxvbmUgaGlkZXMgdGhhdFxuICogZW50aXJlbHkuIFRoYXQgaXMgd2h5IHRoZSBwbGFuIGFza3MgZm9yIHA5MC9wOTUgcmF0aGVyIHRoYW4gbW9yZSBsZXZlbHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwZXJjZW50aWxlKHZhbHVlczogbnVtYmVyW10sIHA6IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHMgPSBbLi4udmFsdWVzXS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIGlmIChzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHNbMF07XG4gIGNvbnN0IHJhbmsgPSAocCAvIDEwMCkgKiAocy5sZW5ndGggLSAxKTtcbiAgY29uc3QgbG8gPSBNYXRoLmZsb29yKHJhbmspO1xuICBjb25zdCBoaSA9IE1hdGguY2VpbChyYW5rKTtcbiAgcmV0dXJuIGxvID09PSBoaSA/IHNbbG9dIDogc1tsb10gKyAoc1toaV0gLSBzW2xvXSkgKiAocmFuayAtIGxvKTtcbn1cblxuLyoqXG4gKiBSb2xsIGEgZ3JvdXAgb2YgZGVwbG95L3N0YWdlIGV2ZW50cyAoZ3JvdXBlZCBwZXIgZXhlY3V0aW9uKSB1cCB0byBvbmUgdGVybWluYWxcbiAqIHN0YXR1czogRkFJTEVEIHdpbnMsIHRoZW4gU1VDQ0VFREVELCBlbHNlIE9USEVSIChzdGlsbC1ydW5uaW5nIC8gbm9uLXRlcm1pbmFsKS5cbiAqIFNoYXJlZCBieSB0aGUgdGhyZWUgcGVyLShlbnZ8c3RhZ2UsIGV4ZWN1dGlvbikgcm9sbHVwIENURXMg4oCUIERPUkEgbWV0cmljcywgRE9SQVxuICogdHJlbmQsIGFuZCBidWlsZCBoZWFsdGgg4oCUIHNvIHRoZSBwcmVjZWRlbmNlIGNhbid0IGRyaWZ0IGJldHdlZW4gdGhlbS4gQXNzdW1lcyB0aGVcbiAqIGdyb3VwZWQgZXZlbnQgYWxpYXMgaXMgYGVgLlxuICovXG4iXX0=
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
* ./dora-scoring.ts, deliberately separate so they can be tested without a DB.
|
|
11
11
|
*/
|
|
12
12
|
import { sql } from 'drizzle-orm';
|
|
13
|
-
import { HEADLINE_ENV, DORA_INCIDENT_WINDOW_HOURS, resolveIncidentWindowHours, doraLevelForFrequency, doraLevelForChangeFailure, doraLevelForRestore, doraLevelForLeadTime, round, median, } from './dora-scoring.js';
|
|
13
|
+
import { HEADLINE_ENV, DORA_INCIDENT_WINDOW_HOURS, resolveIncidentWindowHours, doraLevelForFrequency, doraLevelForChangeFailure, doraLevelForRestore, doraLevelForLeadTime, round, median, percentile, } from './dora-scoring.js';
|
|
14
14
|
import { orgScope, runReport } from './query-scope.js';
|
|
15
|
-
import { assertReportInterval, terminalStatusRollup } from './sql-helpers.js';
|
|
15
|
+
import { assertReportInterval, bucketKey, periodBucket, terminalStatusRollup } from './sql-helpers.js';
|
|
16
16
|
import { schema } from '../../database/drizzle-schema.js';
|
|
17
17
|
import { withTenantTx } from '../../database/tenancy.js';
|
|
18
18
|
import { drizzleRows } from '../crud-service.js';
|
|
@@ -215,6 +215,13 @@ function accumulateDeploys(deployRows) {
|
|
|
215
215
|
a.deployments++;
|
|
216
216
|
a.attempts++;
|
|
217
217
|
// Measured lead time: deploy completion − execution's earliest commit time.
|
|
218
|
+
//
|
|
219
|
+
// Still clamped ≥0, unlike the single-event timestamp checks that now run at
|
|
220
|
+
// INGEST. The two instants come from DIFFERENT rows — `commit_timestamp` off
|
|
221
|
+
// the PIPELINE/source event, `completed_at` off the deploy STAGE event —
|
|
222
|
+
// joined only here by execution_id, so no ingest-time check can see the
|
|
223
|
+
// pair. A commit dated after its own deploy means a rewritten history or a
|
|
224
|
+
// skewed SCM clock, and 0 is the honest floor for "shipped immediately".
|
|
218
225
|
if (row.commit_ts != null && row.completed_at != null) {
|
|
219
226
|
const gap = (Date.parse(row.completed_at) - Date.parse(row.commit_ts)) / 1000;
|
|
220
227
|
if (Number.isFinite(gap))
|
|
@@ -355,6 +362,8 @@ function buildEnvMetrics(envs, postDeployByEnv, days, requestedEnv) {
|
|
|
355
362
|
leadTime: {
|
|
356
363
|
deployments: a.leadGaps.length,
|
|
357
364
|
medianSeconds: ltMedian != null ? round(ltMedian, 1) : null,
|
|
365
|
+
...tails(a.leadGaps),
|
|
366
|
+
// Scored off the MEDIAN only — the tails are reported, not banded.
|
|
358
367
|
level: doraLevelForLeadTime(ltMedian),
|
|
359
368
|
},
|
|
360
369
|
};
|
|
@@ -367,6 +376,18 @@ function buildEnvMetrics(envs, postDeployByEnv, days, requestedEnv) {
|
|
|
367
376
|
return x.environment.localeCompare(y.environment);
|
|
368
377
|
});
|
|
369
378
|
}
|
|
379
|
+
/**
|
|
380
|
+
* p90/p95 of a gap sample, rounded like the median beside them. One helper so
|
|
381
|
+
* lead time and MTTR cannot drift in how they report their tails.
|
|
382
|
+
*/
|
|
383
|
+
function tails(gaps) {
|
|
384
|
+
const p90 = percentile(gaps, 90);
|
|
385
|
+
const p95 = percentile(gaps, 95);
|
|
386
|
+
return {
|
|
387
|
+
p90Seconds: p90 != null ? round(p90, 1) : null,
|
|
388
|
+
p95Seconds: p95 != null ? round(p95, 1) : null,
|
|
389
|
+
};
|
|
390
|
+
}
|
|
370
391
|
/**
|
|
371
392
|
* MTTR — PRODUCTION-ONLY, from BOTH sources. Incidents take precedence: a
|
|
372
393
|
* production incident correlated to a deploy contributes the real recovery
|
|
@@ -411,6 +432,7 @@ function computeMttr(correlated, mttrRows) {
|
|
|
411
432
|
incidents,
|
|
412
433
|
restored,
|
|
413
434
|
medianSeconds: mttrMedian != null ? round(mttrMedian, 1) : null,
|
|
435
|
+
...tails(mttrGaps),
|
|
414
436
|
level: doraLevelForRestore(mttrMedian),
|
|
415
437
|
};
|
|
416
438
|
}
|
|
@@ -457,7 +479,7 @@ function shapeDora(deployRows, outcomeRows, mttrRows, coverageRow, incidentRows,
|
|
|
457
479
|
export async function getDoraTrend(orgId, interval, from, to, orgIds, opts = {}) {
|
|
458
480
|
assertReportInterval(interval);
|
|
459
481
|
const { pred, multi } = orgScope(orgId, orgIds);
|
|
460
|
-
const { pipelineId, environment } = opts;
|
|
482
|
+
const { pipelineId, environment, tz = 'UTC', weekStart = 'monday' } = opts;
|
|
461
483
|
const pipelineClause = pipelineId ? sql `AND e.pipeline_id = ${pipelineId}` : sql ``;
|
|
462
484
|
const envClause = environment ? sql `AND e.environment = ${environment}` : sql ``;
|
|
463
485
|
const exec = () => withTenantTx((tx) => tx.execute(sql `
|
|
@@ -476,7 +498,7 @@ export async function getDoraTrend(orgId, interval, from, to, orgIds, opts = {})
|
|
|
476
498
|
GROUP BY e.environment, e.execution_id
|
|
477
499
|
)
|
|
478
500
|
SELECT
|
|
479
|
-
|
|
501
|
+
${periodBucket(interval, sql `completed_at`, tz, weekStart)}::text AS period,
|
|
480
502
|
COUNT(*) FILTER (WHERE status = 'SUCCEEDED')::int AS deployments,
|
|
481
503
|
COUNT(*) FILTER (WHERE status = 'FAILED')::int AS failed,
|
|
482
504
|
COUNT(*) FILTER (WHERE status IN ('SUCCEEDED', 'FAILED'))::int AS total,
|
|
@@ -486,7 +508,9 @@ export async function getDoraTrend(orgId, interval, from, to, orgIds, opts = {})
|
|
|
486
508
|
FROM deploys
|
|
487
509
|
GROUP BY period ORDER BY period
|
|
488
510
|
`).then(r => drizzleRows(r.rows)));
|
|
489
|
-
|
|
511
|
+
// The bucketing settings belong in the key: they change which days land in which
|
|
512
|
+
// period, so a Chicago answer must never be served to a UTC request.
|
|
513
|
+
const key = `${orgId}:dora-trend:${interval}:${from}:${to}:${pipelineId ?? ''}:${environment ?? ''}:${bucketKey(tz, weekStart)}`;
|
|
490
514
|
return runReport(key, multi, exec);
|
|
491
515
|
}
|
|
492
516
|
/**
|
|
@@ -546,4 +570,4 @@ export async function getBuildHealth(orgId, pipelineId, from, to, orgIds) {
|
|
|
546
570
|
* INTENTIONALLY SINGLE-ORG (no rollup): plugin inventory is an org-owned
|
|
547
571
|
* asset count, not an execution/build activity report, so a parent's view is
|
|
548
572
|
* its own plugins — teams manage their own inventory. Single `= $org` scope. */
|
|
549
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9yYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcmVwb3J0aW5nL2RvcmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxFQUNMLFlBQVksRUFBRSwwQkFBMEIsRUFBRSwwQkFBMEIsRUFDcEUscUJBQXFCLEVBQUUseUJBQXlCLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQzNGLEtBQUssRUFBRSxNQUFNLEdBQ2QsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSzlFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWpEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWMsQ0FDbEMsS0FBYSxFQUNiLElBQVksRUFDWixFQUFVLEVBQ1YsTUFBaUIsRUFDakIsSUFBSSxHQUFnQixFQUFFO0lBRXRCLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNoRCxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQztJQUN6QyxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSx1QkFBdUIsVUFBVSxFQUFFLENB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Q0FBQztJQUNILE9BQU8sU0FBUyxDQUFDLEdBQUcsS0FBSyxpQkFBaUIsVUFBVSxJQUFJLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDckYsQ0FBQztBQUVELDhDQUE4QztBQUU5Qzs7O2lGQUdpRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIERPUkEgbWV0cmljczogdGhlIGZvdXIgaGVhZGxpbmUgbWVhc3VyZXMsIHRoZWlyIHBlci1lbnZpcm9ubWVudCBicmVha2Rvd24sXG4gKiB0aGUgdHJlbmQgc2VyaWVzLCBhbmQgcGVyLXBpcGVsaW5lIGJ1aWxkIGhlYWx0aC5cbiAqXG4gKiBCeSBmYXIgdGhlIGxhcmdlc3QgZG9tYWluIGluIHRoZSByZXBvcnRpbmcgc2VydmljZSAofjQ5MCBsaW5lcyBvZiBxdWVyeSArXG4gKiBzaGFwaW5nIGFnYWluc3Qgc2l4IHJvdyBzaGFwZXMpLCB3aGljaCBpcyB3aHkgaXQgbGl2ZXMgaW4gaXRzIG93biBtb2R1bGUuXG4gKiBSZXBvcnRpbmdTZXJ2aWNlIGRlbGVnYXRlcyB0byB0aGVzZTsgdGhlIGJhbmRpbmcgdGhyZXNob2xkcyB0aGV5IGFwcGx5IGFyZSBpblxuICogLi9kb3JhLXNjb3JpbmcudHMsIGRlbGliZXJhdGVseSBzZXBhcmF0ZSBzbyB0aGV5IGNhbiBiZSB0ZXN0ZWQgd2l0aG91dCBhIERCLlxuICovXG5cbmltcG9ydCB7IHNxbCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7XG4gIEhFQURMSU5FX0VOViwgRE9SQV9JTkNJREVOVF9XSU5ET1dfSE9VUlMsIHJlc29sdmVJbmNpZGVudFdpbmRvd0hvdXJzLFxuICBkb3JhTGV2ZWxGb3JGcmVxdWVuY3ksIGRvcmFMZXZlbEZvckNoYW5nZUZhaWx1cmUsIGRvcmFMZXZlbEZvclJlc3RvcmUsIGRvcmFMZXZlbEZvckxlYWRUaW1lLFxuICByb3VuZCwgbWVkaWFuLFxufSBmcm9tICcuL2RvcmEtc2NvcmluZy5qcyc7XG5pbXBvcnQgeyBvcmdTY29wZSwgcnVuUmVwb3J0IH0gZnJvbSAnLi9xdWVyeS1zY29wZS5qcyc7XG5pbXBvcnQgeyBhc3NlcnRSZXBvcnRJbnRlcnZhbCwgdGVybWluYWxTdGF0dXNSb2xsdXAgfSBmcm9tICcuL3NxbC1oZWxwZXJzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgRG9yYU9wdGlvbnMsIERvcmFNZXRyaWNzLCBEb3JhRW52TWV0cmljcywgRG9yYVRyZW5kUG9pbnQsIEJ1aWxkSGVhbHRoLCBCdWlsZEhlYWx0aFN0YWdlLFxuICBEZXBsb3lSb3csIE91dGNvbWVSb3csIE10dHJQYWlyUm93LCBJbmNpZGVudFJvdywgQ292ZXJhZ2VSb3csXG59IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi4vLi4vZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEuanMnO1xuaW1wb3J0IHsgd2l0aFRlbmFudFR4IH0gZnJvbSAnLi4vLi4vZGF0YWJhc2UvdGVuYW5jeS5qcyc7XG5pbXBvcnQgeyBkcml6emxlUm93cyB9IGZyb20gJy4uL2NydWQtc2VydmljZS5qcyc7XG5cbi8qKlxuICogRE9SQSBtZXRyaWNzIG92ZXIgYSBbZnJvbSx0b10gZGVwbG95LWNvbXBsZXRpb24gd2luZG93LCBvcmctc2NvcGVkICtcbiAqIHJvbGx1cC1hd2FyZS4gREVQTE9ZLUJBU0lTIE9OTFkg4oCUIGV2ZXJ5IG1ldHJpYyBkZXJpdmVzIGZyb20gcmVhbCBkZXBsb3ktc3RhZ2VcbiAqIGV4ZWN1dGlvbnMgKGBldmVudF90eXBlPSdTVEFHRSdgIHdpdGggYSBub24tbnVsbCBgZW52aXJvbm1lbnRgLCBzZXQgYnkgdGhlXG4gKiBmb3J3YXJkZXIgZm9yIHRoZSBzdGFnZXMgYSB1c2VyIGRlY2xhcmVkIGluIGBwYi5kZXBsb3lzYCkuIE5vIHJ1bi1iYXNlZFxuICogZmFsbGJhY2s6IGEgcGlwZWxpbmUgd2l0aCBubyBkZXBsb3kgc3RhZ2UgcHJvZHVjZXMgbm8gRE9SQSBkYXRhLlxuICpcbiAqIEZvdXIgc2NvcGVkIFNRTCBzY2FucyBydW4gaW5zaWRlIG9uZSB0eCAoZWFjaCBvcmctZ2F0ZWQgYnkgYHAub3JnX2lkICR7cHJlZH1gXG4gKiAvIGBvLm9yZ19pZCAke3ByZWR9YCBzbyBhIHJvbGx1cCBwYXNzZXMgdGhlIG9yZ+KGknRlYW0gc3VidHJlZSBhbmQgYSBmb3JlaWduXG4gKiBvcmcncyByb3dzIG5ldmVyIGVudGVyKTogKDEpIHRlcm1pbmFsIGRlcGxveSByb3dzIFBFUiAoZXhlY3V0aW9uLCBlbnYpIOKAlCBvbmVcbiAqIFwiZGVwbG95bWVudFwiID0gb25lIGV4ZWN1dGlvbiByZWFjaGluZyBhbiBlbnYg4oCUIOKGkiBERiAvIGRlcGxveS10aW1lIENGUiAvXG4gKiBtZWFzdXJlZCBsZWFkIHRpbWUgKGxlYWQgdGltZSBqb2lucyB0aGUgZXhlY3V0aW9uJ3MgZWFybGllc3QgY29tbWl0KTtcbiAqIHRoZSBzY2FuIGFsc28gcmVhY2hlcyBiYWNrIGB3aW5kb3dIb3Vyc2AgYmVmb3JlIGBmcm9tYCBzbyBpbmNpZGVudHMgb3BlbmVkXG4gKiBuZWFyIHRoZSB3aW5kb3cgc3RhcnQgY2FuIGNvcnJlbGF0ZSB0byBhIGp1c3QtcHJpb3IgZGVwbG95OyAoMikgYGRlcGxveW1lbnRfb3V0Y29tZXNgXG4gKiBpbi13aW5kb3cg4oaSIHBvc3QtZGVwbG95IENGUiBjb21wb25lbnQ7ICgzKSBwcm9kdWN0aW9uIHJlc3RvcmVkL2ZhaWxlZFxuICogb3V0Y29tZXMgam9pbmVkIHRvIHRoZWlyIGRlcGxveSDihpIgTVRUUjsgKDQpIHJlZ2lzdHJ5IHZzIGRlcGxveWluZyDihpIgY292ZXJhZ2UuXG4gKiBUaGUgY3Jvc3Mtc291cmNlIG1lZGlhbnMgKGxlYWQgdGltZSwgTVRUUikgYXJlIGNvbXB1dGVkIGluIEpTIGZyb20gY2xhbXBlZFxuICogKOKJpTApIGRlbHRhcy5cbiAqXG4gKiBAcGFyYW0gb3B0cy5waXBlbGluZUlkICAgIHJlc3RyaWN0IHRvIG9uZSBwaXBlbGluZSAocGVyLXBpcGVsaW5lIERPUkEpXG4gKiBAcGFyYW0gb3B0cy5lbnZpcm9ubWVudCAgIHJlc3RyaWN0IHRvIG9uZSBkZXBsb3kgZW52aXJvbm1lbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldERvcmFNZXRyaWNzKFxuICBvcmdJZDogc3RyaW5nLFxuICBmcm9tOiBzdHJpbmcsXG4gIHRvOiBzdHJpbmcsXG4gIG9yZ0lkcz86IHN0cmluZ1tdLFxuICBvcHRzOiBEb3JhT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxEb3JhTWV0cmljcz4ge1xuICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSBvcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgY29uc3QgeyBwaXBlbGluZUlkLCBlbnZpcm9ubWVudCB9ID0gb3B0cztcbiAgY29uc3QgcGlwZWxpbmVDbGF1c2UgPSBwaXBlbGluZUlkID8gc3FsYEFORCBlLnBpcGVsaW5lX2lkID0gJHtwaXBlbGluZUlkfWAgOiBzcWxgYDtcbiAgY29uc3QgcGlwZWxpbmVDbGF1c2VSID0gcGlwZWxpbmVJZCA/IHNxbGBBTkQgci5waXBlbGluZV9pZCA9ICR7cGlwZWxpbmVJZH1gIDogc3FsYGA7XG4gIC8vIFBvc3QtZGVwbG95IG91dGNvbWVzIGNhcnJ5IG5vIHBpcGVsaW5lIGlkLCBvbmx5IHRoZSBleGVjdXRpb24gdGhhdFxuICAvLyBwcm9kdWNlZCB0aGVtLCBzbyBhIHBlci1waXBlbGluZSB2aWV3IGhhcyB0byBzY29wZSB0aGVtIFRIUk9VR0ggdGhlXG4gIC8vIGV4ZWN1dGlvbi4gV2l0aG91dCBpdCB0aGUgb3V0Y29tZSBhbmQgTVRUUiBzY2FucyByZWFkIGV2ZXJ5IHBpcGVsaW5lIGluIHRoZVxuICAvLyBvcmc6IGFub3RoZXIgcGlwZWxpbmUncyBgZmFpbGVkYCBtYXJrZXIgY291bnRlZCBhZ2FpbnN0IHRoaXMgb25lJ3MgY2hhbmdlXG4gIC8vIGZhaWx1cmUgcmF0ZSAodGVuIGNsZWFuIGRlcGxveXMgY291bGQgZHJvcCBmcm9tIGVsaXRlIHRvIGhpZ2gpIGFuZCBpdHNcbiAgLy8gcmVjb3ZlcmllcyBmZWQgdGhpcyBvbmUncyBNVFRSLlxuICBjb25zdCBvdXRjb21lUGlwZWxpbmVDbGF1c2UgPSBwaXBlbGluZUlkXG4gICAgPyBzcWxgQU5EIG8uZXhlY3V0aW9uX2lkIElOIChTRUxFQ1QgcGUuZXhlY3V0aW9uX2lkIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gcGUgV0hFUkUgcGUucGlwZWxpbmVfaWQgPSAke3BpcGVsaW5lSWR9KWBcbiAgICA6IHNxbGBgO1xuICAvLyBgZW52Q2xhdXNlYCBpcyB0aGUgU1RSSUNUIGZpbHRlciAoY292ZXJhZ2UsIGFuZCB0aGUgb3V0cHV0KS4gVGhlIGRlcGxveSBhbmRcbiAgLy8gaW5jaWRlbnQgU0NBTlMgdXNlIHRoZSB3aWRlbmVkIGBzY2FuRW52Q2xhdXNlYC9gc2NhbkluY2lkZW50RW52Q2xhdXNlYFxuICAvLyBpbnN0ZWFkLCB3aGljaCBhbHdheXMgYWRtaXQgcHJvZHVjdGlvbjogTVRUUiBpcyBwcm9kdWN0aW9uLW9ubHkgYW5kXG4gIC8vIGRvY3VtZW50ZWQgYXMgaW5kZXBlbmRlbnQgb2YgdGhlIGVudmlyb25tZW50IGZpbHRlciwgYnV0IGluY2lkZW50LXNvdXJjZWRcbiAgLy8gTVRUUiBjb3JyZWxhdGVzIGVhY2ggcHJvZHVjdGlvbiBpbmNpZGVudCBhZ2FpbnN0IHByb2R1Y3Rpb24gREVQTE9ZIHJvd3MuXG4gIC8vIEZpbHRlcmluZyBib3RoIHNjYW5zIHRvIGA/ZW52aXJvbm1lbnQ9c3RhZ2luZ2AgcmVtb3ZlZCBldmVyeSBwcm9kdWN0aW9uXG4gIC8vIGluY2lkZW50IGFuZCBldmVyeSBwcm9kdWN0aW9uIGRlcGxveSwgc28gaW5jaWRlbnQgcmVjb3Zlcnkgc2lsZW50bHkgZHJvcHBlZFxuICAvLyBvdXQgb2YgTVRUUiB0aGUgbW9tZW50IGFueW9uZSBsb29rZWQgYXQgYSBub24tcHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgLy8gYHNoYXBlRG9yYWAgbmFycm93cyB0aGUgcmVwb3J0ZWQgZW52aXJvbm1lbnRzIGJhY2sgdG8gdGhlIHJlcXVlc3RlZCBvbmUuXG4gIGNvbnN0IGVudkNsYXVzZSA9IGVudmlyb25tZW50ID8gc3FsYEFORCBlLmVudmlyb25tZW50ID0gJHtlbnZpcm9ubWVudH1gIDogc3FsYGA7XG4gIGNvbnN0IHNjYW5FbnZDbGF1c2UgPSBlbnZpcm9ubWVudCA/IHNxbGBBTkQgZS5lbnZpcm9ubWVudCBJTiAoJHtlbnZpcm9ubWVudH0sICR7SEVBRExJTkVfRU5WfSlgIDogc3FsYGA7XG4gIGNvbnN0IG91dGNvbWVFbnZDbGF1c2UgPSBlbnZpcm9ubWVudCA/IHNxbGBBTkQgby5lbnZpcm9ubWVudCA9ICR7ZW52aXJvbm1lbnR9YCA6IHNxbGBgO1xuICBjb25zdCBzY2FuSW5jaWRlbnRFbnZDbGF1c2UgPSBlbnZpcm9ubWVudCA/IHNxbGBBTkQgaS5lbnZpcm9ubWVudCBJTiAoJHtlbnZpcm9ubWVudH0sICR7SEVBRExJTkVfRU5WfSlgIDogc3FsYGA7XG5cbiAgLy8gRWZmZWN0aXZlIGluY2lkZW50LWNvcnJlbGF0aW9uIHdpbmRvdyAocGVyLW9yZyBvdmVycmlkZSBvciB0aGUgZ2xvYmFsXG4gIC8vIGRlZmF1bHQpLiBDb21wdXRlZCBoZXJlIChub3QganVzdCBpbiBzaGFwZURvcmEpIGJlY2F1c2UgdGhlIGRlcGxveSBzY2FuXG4gIC8vIG5lZWRzIGl0IGZvciBCT1RIIHRoZSBjb3JyZWxhdGlvbiBsb29rLWJhY2sgbG93ZXIgYm91bmQgQU5EIHRoZSBjYWNoZSBrZXkuXG4gIGNvbnN0IGVmZmVjdGl2ZVdpbmRvd0hvdXJzID0gcmVzb2x2ZUluY2lkZW50V2luZG93SG91cnMob3B0cy5pbmNpZGVudFdpbmRvd0hvdXJzKTtcbiAgLy8gQ29ycmVsYXRpb24gbG9vay1iYWNrOiBpbmNpZGVudHMgb3BlbmVkIGp1c3QgaW5zaWRlIGBmcm9tYCBjYW4gYXR0cmlidXRlIHRvXG4gIC8vIGEgZGVwbG95IHRoYXQgY29tcGxldGVkIHVwIHRvIGB3aW5kb3dIb3Vyc2AgQkVGT1JFIGBmcm9tYCAobWlycm9ycyB0aGVcbiAgLy8gTEFURVJBTCBsb29rLWJhY2sgaW4gbGlzdEluY2lkZW50cykuIFdpZGVuIHRoZSBkZXBsb3kgc2NhbidzIGxvd2VyIGJvdW5kIHRvXG4gIC8vIGBmcm9tIOKIkiB3aW5kb3dIb3Vyc2A7IERGL0NGUi9sZWFkIHN0aWxsIGNvdW50IG9ubHkgdGhlIGluLWBmcm9tYC4uYHRvYFxuICAvLyBzdWJzZXQgKGZsYWdnZWQgYnkgYGluX3dpbmRvd2ApLCB3aGlsZSBjb3JyZWxhdGlvbiBzZWVzIHRoZSB3aWRlciBzZXQuXG4gIGNvbnN0IGZyb21NcyA9IERhdGUucGFyc2UoZnJvbSk7XG4gIGNvbnN0IGxvb2tiYWNrRnJvbSA9IE51bWJlci5pc0Zpbml0ZShmcm9tTXMpXG4gICAgPyBuZXcgRGF0ZShmcm9tTXMgLSBlZmZlY3RpdmVXaW5kb3dIb3VycyAqIDM2MDAgKiAxMDAwKS50b0lTT1N0cmluZygpXG4gICAgOiBmcm9tO1xuXG4gIC8vICgxKSBUZXJtaW5hbCBkZXBsb3kgcm93czogUEVSLUVYRUNVVElPTiwgb25lIHJvdyBwZXIgKGVudmlyb25tZW50LFxuICAvLyBleGVjdXRpb24pIOKAlCBldmVyeSBkZXBsb3kgU1RBR0UgdGFyZ2V0aW5nIHRoYXQgZW52IHdpdGhpbiB0aGUgZXhlY3V0aW9uIGlzXG4gIC8vIHJvbGxlZCB1cCB0byBhIHRlcm1pbmFsIHN0YXR1cyAoRkFJTEVEIHdpbnMsIHRoZW4gU1VDQ0VFREVEKS4gQSBzaW5nbGVcbiAgLy8gZXhlY3V0aW9uIHdpdGggdHdvIGRlcGxveSBzdGFnZXMgdG8gdGhlIHNhbWUgZW52IGlzIE9ORSBkZXBsb3ltZW50LCBub3QgdHdvLlxuICAvLyBjb21wbGV0ZWRfYXQgPSB0aGUgZGVwbG95J3MgY29tcGxldGlvbiAoTUFYIG92ZXIgaXRzIHN0YWdlcykuIGBjb21taXRfdHNgXG4gIC8vIGlzIHRoZSBleGVjdXRpb24ncyBFQVJMSUVTVCBjb21taXQgdGltZSBhY3Jvc3MgQUxMIGl0cyBldmVudHMgKGNvbW1pdFxuICAvLyBlbnJpY2htZW50IHJpZGVzIHRoZSBQSVBFTElORS9zb3VyY2UgZXZlbnQgd2hlcmUgZW52aXJvbm1lbnQgSVMgTlVMTCwgbmV2ZXJcbiAgLy8gdGhlIGRlcGxveSBTVEFHRSByb3cpLCBqb2luZWQgYnkgZXhlY3V0aW9uX2lkLiBgaW5fd2luZG93YCBtYXJrcyB3aGV0aGVyIHRoZVxuICAvLyBkZXBsb3kgY29tcGxldGVkIGluc2lkZSBbZnJvbSx0b10gKHZzLiBhIGxvb2stYmFjay1vbmx5IHJvdyBrZXB0IHNvbGVseSBmb3JcbiAgLy8gaW5jaWRlbnQgY29ycmVsYXRpb24pLiBleGVjdXRpb25faWQgaXMgcHJvamVjdGVkIHNvIHBvc3QtZGVwbG95IGZhaWx1cmVzXG4gIC8vIChtYW51YWwgb3V0Y29tZXMgKyBjb3JyZWxhdGVkIGluY2lkZW50cykgY2FuIGRlZHVwIGFnYWluc3QgdGhlaXIgZGVwbG95LlxuICBjb25zdCBkZXBsb3lTcWwgPSBzcWxgXG4gICAgICBXSVRIIGRlcGxveV9zdGFnZXMgQVMgKFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmVudmlyb25tZW50IEFTIGVudmlyb25tZW50LFxuICAgICAgICAgIGUuZXhlY3V0aW9uX2lkIEFTIGV4ZWN1dGlvbl9pZCxcbiAgICAgICAgICAke3Rlcm1pbmFsU3RhdHVzUm9sbHVwfSBBUyBzdGF0dXMsXG4gICAgICAgICAgTUFYKGUuY29tcGxldGVkX2F0KSBBUyBjb21wbGV0ZWRfYXRcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZS5lbnZpcm9ubWVudCBJUyBOT1QgTlVMTFxuICAgICAgICAgICR7cGlwZWxpbmVDbGF1c2V9ICR7c2NhbkVudkNsYXVzZX1cbiAgICAgICAgICBBTkQgZS5jb21wbGV0ZWRfYXQgPj0gJHtsb29rYmFja0Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5jb21wbGV0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIGUuZW52aXJvbm1lbnQsIGUuZXhlY3V0aW9uX2lkXG4gICAgICApLFxuICAgICAgZXhlY19jb21taXRzIEFTIChcbiAgICAgICAgU0VMRUNUIGMuZXhlY3V0aW9uX2lkIEFTIGV4ZWN1dGlvbl9pZCwgTUlOKGMuY29tbWl0X3RpbWVzdGFtcCkgQVMgY29tbWl0X3RzXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gY1xuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBjLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGMuY29tbWl0X3RpbWVzdGFtcCBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBjLmV4ZWN1dGlvbl9pZCBJTiAoU0VMRUNUIGV4ZWN1dGlvbl9pZCBGUk9NIGRlcGxveV9zdGFnZXMpXG4gICAgICAgIEdST1VQIEJZIGMuZXhlY3V0aW9uX2lkXG4gICAgICApXG4gICAgICBTRUxFQ1RcbiAgICAgICAgZHMuZW52aXJvbm1lbnQgQVMgZW52aXJvbm1lbnQsXG4gICAgICAgIGRzLmV4ZWN1dGlvbl9pZCBBUyBleGVjdXRpb25faWQsXG4gICAgICAgIGRzLnN0YXR1cyBBUyBzdGF0dXMsXG4gICAgICAgIGRzLmNvbXBsZXRlZF9hdDo6dGV4dCBBUyBjb21wbGV0ZWRfYXQsXG4gICAgICAgIChkcy5jb21wbGV0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHopIEFTIGluX3dpbmRvdyxcbiAgICAgICAgZWMuY29tbWl0X3RzOjp0ZXh0IEFTIGNvbW1pdF90c1xuICAgICAgRlJPTSBkZXBsb3lfc3RhZ2VzIGRzXG4gICAgICBMRUZUIEpPSU4gZXhlY19jb21taXRzIGVjIE9OIGVjLmV4ZWN1dGlvbl9pZCA9IGRzLmV4ZWN1dGlvbl9pZGA7XG5cbiAgLy8gKDIpIFBvc3QtZGVwbG95IG91dGNvbWUgbWFya2VycyBpbi13aW5kb3cgKHBlciBlbnYpLiBQb3N0LWRlcGxveSBmYWlsdXJlc1xuICAvLyAob3V0Y29tZT0nZmFpbGVkJykgYWRkIHRvIHRoZSBDRlIgbnVtZXJhdG9yIHdpdGhvdXQgY2hhbmdpbmcgYXR0ZW1wdHMuXG4gIC8vIGV4ZWN1dGlvbl9pZCBsZXRzIHRoZSBDRlIgZGVkdXAgYSBtYW51YWwgZmFpbHVyZSBhZ2FpbnN0IGFuIGluY2lkZW50IHRoYXRcbiAgLy8gY29ycmVsYXRlcyB0byB0aGUgc2FtZSBkZXBsb3kgKG5vIGRvdWJsZS1jb3VudCkuXG4gIGNvbnN0IG91dGNvbWVTcWwgPSBzcWxgXG4gICAgICBTRUxFQ1Qgby5lbnZpcm9ubWVudCBBUyBlbnZpcm9ubWVudCwgby5vdXRjb21lIEFTIG91dGNvbWUsIG8uZXhlY3V0aW9uX2lkIEFTIGV4ZWN1dGlvbl9pZFxuICAgICAgRlJPTSAke3NjaGVtYS5kZXBsb3ltZW50T3V0Y29tZX0gb1xuICAgICAgV0hFUkUgby5vcmdfaWQgJHtwcmVkfSAke291dGNvbWVFbnZDbGF1c2V9ICR7b3V0Y29tZVBpcGVsaW5lQ2xhdXNlfVxuICAgICAgICBBTkQgby5hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgby5hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpgO1xuXG4gIC8vICgzKSBNVFRSIOKAlCBQUk9EVUNUSU9OLU9OTFksIGluZGVwZW5kZW50IG9mIHRoZSBlbnYgZmlsdGVyLiBFdmVyeSBwcm9kdWN0aW9uXG4gIC8vIG91dGNvbWUgaW4td2luZG93OyBmb3IgYSAncmVzdG9yZWQnIG9uZSwgY29ycmVsYXRlIHRvIGl0cyBkZXBsb3knc1xuICAvLyBjb21wbGV0aW9uIHZpYSBleGVjdXRpb25faWQgdG8gbWVhc3VyZSByZXN0b3JlZC5hdCDiiJIgZGVwbG95ZWQuY29tcGxldGVkX2F0LlxuICAvLyBleGVjdXRpb25faWQgaXMgcHJvamVjdGVkIHNvIGFuIGluY2lkZW50LXNvdXJjZWQgcmVjb3ZlcnkgZm9yIHRoZSBzYW1lXG4gIC8vIGRlcGxveSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIG1hbnVhbCByZXN0b3JlZCBnYXAuXG4gIGNvbnN0IG10dHJTcWwgPSBzcWxgXG4gICAgICBTRUxFQ1RcbiAgICAgICAgby5vdXRjb21lIEFTIG91dGNvbWUsXG4gICAgICAgIG8uZXhlY3V0aW9uX2lkIEFTIGV4ZWN1dGlvbl9pZCxcbiAgICAgICAgby5hdDo6dGV4dCBBUyByZXN0b3JlZF9hdCxcbiAgICAgICAgKFNFTEVDVCBNQVgoZC5jb21wbGV0ZWRfYXQpIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZFxuICAgICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwMiBPTiBwMi5pZCA9IGQucGlwZWxpbmVfaWRcbiAgICAgICAgICAgV0hFUkUgcDIub3JnX2lkICR7cHJlZH0gQU5EIGQuZXhlY3V0aW9uX2lkID0gby5leGVjdXRpb25faWRcbiAgICAgICAgICAgICBBTkQgZC5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZC5lbnZpcm9ubWVudCA9ICR7SEVBRExJTkVfRU5WfSk6OnRleHQgQVMgZGVwbG95ZWRfYXRcbiAgICAgIEZST00gJHtzY2hlbWEuZGVwbG95bWVudE91dGNvbWV9IG9cbiAgICAgIFdIRVJFIG8ub3JnX2lkICR7cHJlZH0gQU5EIG8uZW52aXJvbm1lbnQgPSAke0hFQURMSU5FX0VOVn0gJHtvdXRjb21lUGlwZWxpbmVDbGF1c2V9XG4gICAgICAgIEFORCBvLmF0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBvLmF0IDw9ICR7dG99Ojp0aW1lc3RhbXB0emA7XG5cbiAgLy8gKDUpIEluY2lkZW50cyBvcGVuZWQgaW4td2luZG93IChwZXIgZW52KS4gQ29ycmVsYXRlZCBpbiBKUyB0byB0aGUgbW9zdFxuICAvLyByZWNlbnQgc3VjY2Vzc2Z1bCBkZXBsb3kg4oaSIGF1dG9tYXRlZCBwb3N0LWRlcGxveSBmYWlsdXJlIChDRlIpICsgcmVhbFxuICAvLyByZWNvdmVyeSB0aW1lIChyZXNvbHZlZF9hdCDiiJIgb3BlbmVkX2F0KSBmb3IgTVRUUiAocHJvZHVjdGlvbikuXG4gIGNvbnN0IGluY2lkZW50U3FsID0gc3FsYFxuICAgICAgU0VMRUNUIGkuZW52aXJvbm1lbnQgQVMgZW52aXJvbm1lbnQsIGkub3BlbmVkX2F0Ojp0ZXh0IEFTIG9wZW5lZF9hdCwgaS5yZXNvbHZlZF9hdDo6dGV4dCBBUyByZXNvbHZlZF9hdFxuICAgICAgRlJPTSAke3NjaGVtYS5pbmNpZGVudH0gaVxuICAgICAgV0hFUkUgaS5vcmdfaWQgJHtwcmVkfSAke3NjYW5JbmNpZGVudEVudkNsYXVzZX1cbiAgICAgICAgQU5EIGkub3BlbmVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBpLm9wZW5lZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpgO1xuXG4gIC8vICg0KSBDb3ZlcmFnZTogcmVnaXN0ZXJlZCBwaXBlbGluZXMgdnMgdGhvc2UgdGhhdCBhY3R1YWxseSBkZXBsb3llZCBpbi13aW5kb3cuXG4gIGNvbnN0IGNvdmVyYWdlU3FsID0gc3FsYFxuICAgICAgU0VMRUNUXG4gICAgICAgIChTRUxFQ1QgQ09VTlQoKik6OmludCBGUk9NICR7c2NoZW1hLnBpcGVsaW5lUmVnaXN0cnl9IHJcbiAgICAgICAgICAgV0hFUkUgci5vcmdfaWQgJHtwcmVkfSAke3BpcGVsaW5lQ2xhdXNlUn0pIEFTIHJlZ2lzdGVyZWQsXG4gICAgICAgIChTRUxFQ1QgQ09VTlQoRElTVElOQ1QgZS5waXBlbGluZV9pZCk6OmludCBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLmVudmlyb25tZW50IElTIE5PVCBOVUxMXG4gICAgICAgICAgICAgJHtwaXBlbGluZUNsYXVzZX0gJHtlbnZDbGF1c2V9XG4gICAgICAgICAgICAgQU5EIGUuY29tcGxldGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLmNvbXBsZXRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHopIEFTIGRlcGxveWluZ2A7XG5cbiAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICAvLyBTY2FuIG9yZGVyIGlzIGxvYWQtYmVhcmluZyBmb3IgdGhlIGdlbmVyYXRlZC1TUUwgdGVzdHM6IDA9ZGVwbG95LFxuICAgIC8vIDE9b3V0Y29tZXMsIDI9bXR0ciwgMz1jb3ZlcmFnZSwgND1pbmNpZGVudHMgKGFwcGVuZGVkIGxhc3Qgc28gdGhlXG4gICAgLy8gZWFybGllciBpbmRpY2VzIHN0YXkgc3RhYmxlKS5cbiAgICBjb25zdCBkZXBsb3lSb3dzID0gZHJpenpsZVJvd3M8RGVwbG95Um93PigoYXdhaXQgdHguZXhlY3V0ZShkZXBsb3lTcWwpKS5yb3dzKTtcbiAgICBjb25zdCBvdXRjb21lUm93cyA9IGRyaXp6bGVSb3dzPE91dGNvbWVSb3c+KChhd2FpdCB0eC5leGVjdXRlKG91dGNvbWVTcWwpKS5yb3dzKTtcbiAgICBjb25zdCBtdHRyUm93cyA9IGRyaXp6bGVSb3dzPE10dHJQYWlyUm93ICYgeyBvdXRjb21lOiBzdHJpbmcgfT4oKGF3YWl0IHR4LmV4ZWN1dGUobXR0clNxbCkpLnJvd3MpO1xuICAgIGNvbnN0IGNvdmVyYWdlUm93ID0gZHJpenpsZVJvd3M8Q292ZXJhZ2VSb3c+KChhd2FpdCB0eC5leGVjdXRlKGNvdmVyYWdlU3FsKSkucm93cylbMF07XG4gICAgY29uc3QgaW5jaWRlbnRSb3dzID0gZHJpenpsZVJvd3M8SW5jaWRlbnRSb3c+KChhd2FpdCB0eC5leGVjdXRlKGluY2lkZW50U3FsKSkucm93cyk7XG4gICAgcmV0dXJuIHNoYXBlRG9yYShkZXBsb3lSb3dzLCBvdXRjb21lUm93cywgbXR0clJvd3MsIGNvdmVyYWdlUm93LCBpbmNpZGVudFJvd3MsIGZyb20sIHRvLCB7XG4gICAgICBwaXBlbGluZUlkLCBlbnZpcm9ubWVudCxcbiAgICB9LCBlZmZlY3RpdmVXaW5kb3dIb3Vycyk7XG4gIH0pO1xuICAvLyBDYWNoZSBrZXkgTVVTVCBpbmNsdWRlIHRoZSBlZmZlY3RpdmUgaW5jaWRlbnQgd2luZG93OiB0aGUgc2NvcmVjYXJkIHJlYWRzXG4gIC8vIC9kb3JhIHdpdGggdGhlIG9yZydzIGRlZmF1bHQgd2luZG93IHdoaWxlIGFuIGV4cGxpY2l0IC9kb3JhIGNhbGwgbWF5IHBhc3MgYW5cbiAgLy8gb3ZlcnJpZGUg4oCUIGRpZmZlcmVudCB3aW5kb3dzIHlpZWxkIGRpZmZlcmVudCBDRlIvTVRUUiwgc28gdGhleSBtdXN0IG5vdFxuICAvLyBjb2xsaWRlIG9uIHRoZSBzYW1lIGtleS5cbiAgY29uc3Qga2V5ID0gYCR7b3JnSWR9OmRvcmE6JHtmcm9tfToke3RvfToke3BpcGVsaW5lSWQgPz8gJyd9OiR7ZW52aXJvbm1lbnQgPz8gJyd9OiR7ZWZmZWN0aXZlV2luZG93SG91cnN9YDtcbiAgcmV0dXJuIHJ1blJlcG9ydChrZXksIG11bHRpLCBleGVjKTtcbn1cblxuLyoqIFBlci1lbnZpcm9ubWVudCBkZXBsb3kgYWNjdW11bGF0b3IuICovXG5pbnRlcmZhY2UgRW52QWNjIHtcbiAgZGVwbG95bWVudHM6IG51bWJlcjtcbiAgZGVwbG95VGltZUZhaWx1cmVzOiBudW1iZXI7XG4gIGF0dGVtcHRzOiBudW1iZXI7XG4gIGxlYWRHYXBzOiBudW1iZXJbXTtcbn1cblxuLyoqIEEgcHJvZHVjdGlvbi1vci1vdGhlciBpbmNpZGVudCBhdHRyaWJ1dGVkIHRvIHRoZSBkZXBsb3kgZXhlY3V0aW9uIGl0IGZvbGxvd2VkLiAqL1xuaW50ZXJmYWNlIENvcnJlbGF0ZWRJbmNpZGVudCB7IGVudmlyb25tZW50OiBzdHJpbmc7IGV4ZWM6IHN0cmluZzsgcmVzb2x2ZWRHYXA6IG51bWJlciB8IG51bGwgfVxuXG4vKiogR2V0LW9yLWNyZWF0ZSB0aGUgYWNjdW11bGF0b3IgZm9yIGBlbnZgLiAqL1xuZnVuY3Rpb24gYWNjRm9yKGVudnM6IE1hcDxzdHJpbmcsIEVudkFjYz4sIGVudjogc3RyaW5nKTogRW52QWNjIHtcbiAgbGV0IGEgPSBlbnZzLmdldChlbnYpO1xuICBpZiAoIWEpIHsgYSA9IHsgZGVwbG95bWVudHM6IDAsIGRlcGxveVRpbWVGYWlsdXJlczogMCwgYXR0ZW1wdHM6IDAsIGxlYWRHYXBzOiBbXSB9OyBlbnZzLnNldChlbnYsIGEpOyB9XG4gIHJldHVybiBhO1xufVxuXG4vKipcbiAqIEEgZGVwbG95IHJvdyBjb3VudHMgdG93YXJkIERGL0NGUi9sZWFkIG9ubHkgaWYgaXQgY29tcGxldGVkIGluc2lkZSBbZnJvbSx0b10uXG4gKiBMb29rLWJhY2stb25seSByb3dzIChpbl93aW5kb3c9ZmFsc2UsIGtlcHQgZm9yIGluY2lkZW50IGNvcnJlbGF0aW9uKSBhcmVcbiAqIHNraXBwZWQuIEFic2VudCBpbiBhIGZpeHR1cmUg4oeSIGluLXdpbmRvdyAodW5pdCB0ZXN0cyBvbWl0IHRoZSBmbGFnKS5cbiAqL1xuZnVuY3Rpb24gaXNJbldpbmRvdyhyb3c6IERlcGxveVJvdyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcm93LmluX3dpbmRvdyA9PSBudWxsID8gdHJ1ZSA6IChyb3cuaW5fd2luZG93ID09PSB0cnVlIHx8IHJvdy5pbl93aW5kb3cgPT09ICd0Jyk7XG59XG5cbi8qKiBCdWNrZXQgdGhlIGluLXdpbmRvdyB0ZXJtaW5hbCBkZXBsb3kgcm93cyBieSBlbnZpcm9ubWVudCAoREYgLyBkZXBsb3ktdGltZSBDRlIgLyBtZWFzdXJlZCBsZWFkKS4gKi9cbmZ1bmN0aW9uIGFjY3VtdWxhdGVEZXBsb3lzKGRlcGxveVJvd3M6IERlcGxveVJvd1tdKTogTWFwPHN0cmluZywgRW52QWNjPiB7XG4gIGNvbnN0IGVudnMgPSBuZXcgTWFwPHN0cmluZywgRW52QWNjPigpO1xuICBmb3IgKGNvbnN0IHJvdyBvZiBkZXBsb3lSb3dzKSB7XG4gICAgY29uc3QgZW52ID0gcm93LmVudmlyb25tZW50O1xuICAgIGlmICghZW52KSBjb250aW51ZTtcbiAgICBpZiAoIWlzSW5XaW5kb3cocm93KSkgY29udGludWU7IC8vIGxvb2stYmFjay1vbmx5IHJvdyDihpIgY29ycmVsYXRpb24sIG5vdCBERi9DRlJcbiAgICBjb25zdCBhID0gYWNjRm9yKGVudnMsIGVudik7XG4gICAgaWYgKHJvdy5zdGF0dXMgPT09ICdTVUNDRUVERUQnKSB7XG4gICAgICBhLmRlcGxveW1lbnRzKys7XG4gICAgICBhLmF0dGVtcHRzKys7XG4gICAgICAvLyBNZWFzdXJlZCBsZWFkIHRpbWU6IGRlcGxveSBjb21wbGV0aW9uIOKIkiBleGVjdXRpb24ncyBlYXJsaWVzdCBjb21taXQgdGltZS5cbiAgICAgIGlmIChyb3cuY29tbWl0X3RzICE9IG51bGwgJiYgcm93LmNvbXBsZXRlZF9hdCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGdhcCA9IChEYXRlLnBhcnNlKHJvdy5jb21wbGV0ZWRfYXQpIC0gRGF0ZS5wYXJzZShyb3cuY29tbWl0X3RzKSkgLyAxMDAwO1xuICAgICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKGdhcCkpIGEubGVhZEdhcHMucHVzaChNYXRoLm1heChnYXAsIDApKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJvdy5zdGF0dXMgPT09ICdGQUlMRUQnKSB7XG4gICAgICBhLmRlcGxveVRpbWVGYWlsdXJlcysrO1xuICAgICAgYS5hdHRlbXB0cysrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW52cztcbn1cblxuLyoqXG4gKiBJbmNpZGVudOKGkmRlcGxveSBjb3JyZWxhdGlvbi4gRWFjaCBpbmNpZGVudCBpcyBhdHRyaWJ1dGVkIHRvIHRoZSBtb3N0IHJlY2VudFxuICogU1VDQ0VTU0ZVTCBkZXBsb3kgdG8gaXRzIGVudmlyb25tZW50IHdpdGggYGNvbXBsZXRlZF9hdCDiiaQgb3BlbmVkX2F0YCB3aXRoaW5cbiAqIGB3aW5kb3dIb3Vyc2A7IGFuIHVuY29ycmVsYXRlZCBpbmNpZGVudCBpcyBkcm9wcGVkLiBBIHJlc29sdXRpb24gYWZ0ZXIgdGhlXG4gKiB3aW5kb3cgZW5kIChgdG9Nc2ApIGlzIHJpZ2h0LWNlbnNvcmVkOiB0aGUgaW5jaWRlbnQgc3RpbGwgY291bnRzLCB1bnJlc29sdmVkLlxuICovXG5mdW5jdGlvbiBjb3JyZWxhdGVJbmNpZGVudHMoXG4gIGRlcGxveVJvd3M6IERlcGxveVJvd1tdLFxuICBpbmNpZGVudFJvd3M6IEluY2lkZW50Um93W10sXG4gIHdpbmRvd0hvdXJzOiBudW1iZXIsXG4gIHRvTXM6IG51bWJlcixcbik6IENvcnJlbGF0ZWRJbmNpZGVudFtdIHtcbiAgLy8gSW5kZXggdGhlIFNVQ0NFU1NGVUwgZGVwbG95cyBwZXIgZW52IChleGVjdXRpb24gaWQgKyBjb21wbGV0aW9uIGluc3RhbnQpLFxuICAvLyBuZXdlc3QgZmlyc3QuXG4gIGNvbnN0IHdpbmRvd01zID0gd2luZG93SG91cnMgKiAzNjAwICogMTAwMDtcbiAgY29uc3Qgc3VjY2Vzc2Z1bEJ5RW52ID0gbmV3IE1hcDxzdHJpbmcsIEFycmF5PHsgZXhlYzogc3RyaW5nOyBjb21wbGV0ZWRNczogbnVtYmVyIH0+PigpO1xuICBmb3IgKGNvbnN0IHJvdyBvZiBkZXBsb3lSb3dzKSB7XG4gICAgaWYgKHJvdy5zdGF0dXMgIT09ICdTVUNDRUVERUQnIHx8ICFyb3cuZW52aXJvbm1lbnQgfHwgcm93LmV4ZWN1dGlvbl9pZCA9PSBudWxsIHx8IHJvdy5jb21wbGV0ZWRfYXQgPT0gbnVsbCkgY29udGludWU7XG4gICAgY29uc3QgbXMgPSBEYXRlLnBhcnNlKHJvdy5jb21wbGV0ZWRfYXQpO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKG1zKSkgY29udGludWU7XG4gICAgY29uc3QgbGlzdCA9IHN1Y2Nlc3NmdWxCeUVudi5nZXQocm93LmVudmlyb25tZW50KSA/PyBbXTtcbiAgICBsaXN0LnB1c2goeyBleGVjOiByb3cuZXhlY3V0aW9uX2lkLCBjb21wbGV0ZWRNczogbXMgfSk7XG4gICAgc3VjY2Vzc2Z1bEJ5RW52LnNldChyb3cuZW52aXJvbm1lbnQsIGxpc3QpO1xuICB9XG4gIGZvciAoY29uc3QgbGlzdCBvZiBzdWNjZXNzZnVsQnlFbnYudmFsdWVzKCkpIGxpc3Quc29ydCgoYSwgYikgPT4gYi5jb21wbGV0ZWRNcyAtIGEuY29tcGxldGVkTXMpO1xuXG4gIGNvbnN0IGNvcnJlbGF0ZSA9IChlbnY6IHN0cmluZywgb3BlbmVkTXM6IG51bWJlcik6IHN0cmluZyB8IG51bGwgPT4ge1xuICAgIGNvbnN0IGxpc3QgPSBzdWNjZXNzZnVsQnlFbnYuZ2V0KGVudik7XG4gICAgaWYgKCFsaXN0KSByZXR1cm4gbnVsbDtcbiAgICBmb3IgKGNvbnN0IGQgb2YgbGlzdCkge1xuICAgICAgaWYgKGQuY29tcGxldGVkTXMgPD0gb3BlbmVkTXMgJiYgb3BlbmVkTXMgLSBkLmNvbXBsZXRlZE1zIDw9IHdpbmRvd01zKSByZXR1cm4gZC5leGVjO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBjb25zdCBjb3JyZWxhdGVkOiBDb3JyZWxhdGVkSW5jaWRlbnRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGluYyBvZiBpbmNpZGVudFJvd3MpIHtcbiAgICBpZiAoIWluYy5lbnZpcm9ubWVudCB8fCBpbmMub3BlbmVkX2F0ID09IG51bGwpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG9wZW5lZE1zID0gRGF0ZS5wYXJzZShpbmMub3BlbmVkX2F0KTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShvcGVuZWRNcykpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGV4ZWMgPSBjb3JyZWxhdGUoaW5jLmVudmlyb25tZW50LCBvcGVuZWRNcyk7XG4gICAgaWYgKGV4ZWMgPT0gbnVsbCkgY29udGludWU7IC8vIHVuY29ycmVsYXRlZCDihpIgbm90IGF0dHJpYnV0YWJsZSB0byBhIGRlcGxveVxuICAgIGxldCByZXNvbHZlZEdhcDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGluYy5yZXNvbHZlZF9hdCAhPSBudWxsKSB7XG4gICAgICBjb25zdCByZXNvbHZlZE1zID0gRGF0ZS5wYXJzZShpbmMucmVzb2x2ZWRfYXQpO1xuICAgICAgLy8gUmlnaHQtY2Vuc29yaW5nOiBhIHJlc29sdXRpb24gQUZURVIgdGhlIHdpbmRvdyBlbmQgKGB0b2ApIGlzIG5vdCBvYnNlcnZlZFxuICAgICAgLy8gd2l0aGluIHRoZSB3aW5kb3cg4oCUIHRyZWF0IHRoZSBpbmNpZGVudCBhcyBzdGlsbCBvcGVuIChnYXAgc3RheXMgbnVsbCkgc29cbiAgICAgIC8vIE1UVFIgbmV2ZXIgcmVhZHMgdW5ib3VuZGVkIHBhc3QgYHRvYC4gVGhlIGluY2lkZW50IHN0aWxsIGNvdW50cyB0b3dhcmQgdGhlXG4gICAgICAvLyBpbmNpZGVudCB0b3RhbCAodW5yZXNvbHZlZCksIGl0IGp1c3QgY29udHJpYnV0ZXMgbm8gcmVjb3ZlcnkgdGltZS5cbiAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUocmVzb2x2ZWRNcykgJiYgcmVzb2x2ZWRNcyA8PSB0b01zKSB7XG4gICAgICAgIGNvbnN0IGcgPSAocmVzb2x2ZWRNcyAtIG9wZW5lZE1zKSAvIDEwMDA7XG4gICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoZykpIHJlc29sdmVkR2FwID0gTWF0aC5tYXgoZywgMCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvcnJlbGF0ZWQucHVzaCh7IGVudmlyb25tZW50OiBpbmMuZW52aXJvbm1lbnQsIGV4ZWMsIHJlc29sdmVkR2FwIH0pO1xuICB9XG4gIHJldHVybiBjb3JyZWxhdGVkO1xufVxuXG4vKipcbiAqIFBvc3QtZGVwbG95IGZhaWx1cmVzIHBlciBlbnYg4oCUIHRoZSBESVNUSU5DVCBzZXQgb2YgZGVwbG95IGV4ZWN1dGlvbnMgZmxhZ2dlZFxuICogYnkgYSBtYW51YWwgYGZhaWxlZGAgb3V0Y29tZSBPUiBhIGNvcnJlbGF0ZWQgaW5jaWRlbnQgKGRlZHVwZWQgYnkgZXhlY3V0aW9uLFxuICogc28gYSBkZXBsb3kgZmxhZ2dlZCBieSBib3RoIGNvdW50cyBvbmNlKS4gQSBtYW51YWwgb3V0Y29tZSB3aXRob3V0IGFuXG4gKiBleGVjdXRpb24gaWQgc3RpbGwgY291bnRzIHZpYSBhIHBlci1yb3cgc2VudGluZWwuIEV2ZXJ5IGZsYWdnZWQgZW52IGlzIGFkZGVkXG4gKiB0byBgZW52c2Agc28gaXQgYXBwZWFycyBldmVuIHdpdGggbm8gaW4td2luZG93IGRlcGxveSBldmVudHMuXG4gKi9cbmZ1bmN0aW9uIGNvdW50UG9zdERlcGxveUZhaWx1cmVzKFxuICBlbnZzOiBNYXA8c3RyaW5nLCBFbnZBY2M+LFxuICBvdXRjb21lUm93czogT3V0Y29tZVJvd1tdLFxuICBjb3JyZWxhdGVkOiBDb3JyZWxhdGVkSW5jaWRlbnRbXSxcbik6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICBjb25zdCBwb3N0RGVwbG95RXhlY3NCeUVudiA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcbiAgbGV0IHNlbnRpbmVsID0gMDtcbiAgY29uc3QgZmxhZ0ZvciA9IChlbnY6IHN0cmluZyk6IFNldDxzdHJpbmc+ID0+IHtcbiAgICBsZXQgcyA9IHBvc3REZXBsb3lFeGVjc0J5RW52LmdldChlbnYpO1xuICAgIGlmICghcykgeyBzID0gbmV3IFNldDxzdHJpbmc+KCk7IHBvc3REZXBsb3lFeGVjc0J5RW52LnNldChlbnYsIHMpOyB9XG4gICAgcmV0dXJuIHM7XG4gIH07XG4gIGZvciAoY29uc3QgbyBvZiBvdXRjb21lUm93cykge1xuICAgIGlmIChvLm91dGNvbWUgIT09ICdmYWlsZWQnIHx8ICFvLmVudmlyb25tZW50KSBjb250aW51ZTtcbiAgICBmbGFnRm9yKG8uZW52aXJvbm1lbnQpLmFkZChvLmV4ZWN1dGlvbl9pZCA/PyBgbWFudWFsLSR7c2VudGluZWwrK31gKTtcbiAgICBhY2NGb3IoZW52cywgby5lbnZpcm9ubWVudCk7XG4gIH1cbiAgZm9yIChjb25zdCBjaSBvZiBjb3JyZWxhdGVkKSB7XG4gICAgZmxhZ0ZvcihjaS5lbnZpcm9ubWVudCkuYWRkKGNpLmV4ZWMpO1xuICAgIGFjY0ZvcihlbnZzLCBjaS5lbnZpcm9ubWVudCk7XG4gIH1cbiAgY29uc3QgcG9zdERlcGxveUJ5RW52ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBbZW52LCBzZXRdIG9mIHBvc3REZXBsb3lFeGVjc0J5RW52KSBwb3N0RGVwbG95QnlFbnYuc2V0KGVudiwgc2V0LnNpemUpO1xuICByZXR1cm4gcG9zdERlcGxveUJ5RW52O1xufVxuXG4vKiogUGVyLWVudmlyb25tZW50IERGIC8gQ0ZSIC8gbGVhZC10aW1lIHJvd3MsIHByb2R1Y3Rpb24gZmlyc3QuICovXG5mdW5jdGlvbiBidWlsZEVudk1ldHJpY3MoXG4gIGVudnM6IE1hcDxzdHJpbmcsIEVudkFjYz4sXG4gIHBvc3REZXBsb3lCeUVudjogTWFwPHN0cmluZywgbnVtYmVyPixcbiAgZGF5czogbnVtYmVyLFxuICByZXF1ZXN0ZWRFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCxcbik6IERvcmFFbnZNZXRyaWNzW10ge1xuICByZXR1cm4gWy4uLmVudnMuZW50cmllcygpXVxuICAgIC8vIFRoZSBkZXBsb3kgYW5kIGluY2lkZW50IHNjYW5zIGFkbWl0IFBST0RVQ1RJT04gYWxvbmdzaWRlIGEgcmVxdWVzdGVkXG4gICAgLy8gZW52aXJvbm1lbnQgc28gTVRUUiBjYW4gY29ycmVsYXRlIHByb2R1Y3Rpb24gaW5jaWRlbnRzIChzZWVcbiAgICAvLyBgc2NhbkVudkNsYXVzZWApLiBUaGF0IHByb2R1Y3Rpb24gcm93IGlzIHBsdW1iaW5nIGZvciBNVFRSLCBub3Qgc29tZXRoaW5nXG4gICAgLy8gdGhlIGNhbGxlciBhc2tlZCB0byBzZWUg4oCUIHJlcG9ydCBvbmx5IHRoZSBlbnZpcm9ubWVudCB0aGF0IHdhcyByZXF1ZXN0ZWQuXG4gICAgLmZpbHRlcigoW2Vudmlyb25tZW50XSkgPT4gIXJlcXVlc3RlZEVudiB8fCBlbnZpcm9ubWVudCA9PT0gcmVxdWVzdGVkRW52KVxuICAgIC5tYXAoKFtlbnZpcm9ubWVudCwgYV0pID0+IHtcbiAgICAgIGNvbnN0IHBvc3REZXBsb3lGYWlsdXJlcyA9IHBvc3REZXBsb3lCeUVudi5nZXQoZW52aXJvbm1lbnQpID8/IDA7XG4gICAgICBjb25zdCByYXdQZXJEYXkgPSBhLmRlcGxveW1lbnRzIC8gZGF5cztcbiAgICAgIGNvbnN0IG51bWVyYXRvciA9IGEuZGVwbG95VGltZUZhaWx1cmVzICsgcG9zdERlcGxveUZhaWx1cmVzO1xuICAgICAgLy8gQ2xhbXAgdG8gWzAsMTAwXTogcG9zdC1kZXBsb3kgZmFpbHVyZXMgY2FuIGNvcnJlbGF0ZSB0byBhIGRlcGxveSB0aGF0XG4gICAgICAvLyBjb21wbGV0ZWQganVzdCBiZWZvcmUgdGhlIHdpbmRvdyAoa2VwdCBmb3IgY29ycmVsYXRpb24pLCBzbyB0aGUgbnVtZXJhdG9yXG4gICAgICAvLyBjYW4gdHJhbnNpZW50bHkgZXhjZWVkIGluLXdpbmRvdyBhdHRlbXB0cyDigJQgYSBDRlIgPiAxMDAlIGlzIG5ldmVyIHZhbGlkLlxuICAgICAgY29uc3QgcmF3UmF0ZSA9IGEuYXR0ZW1wdHMgPiAwID8gTWF0aC5taW4oMTAwLCAobnVtZXJhdG9yIC8gYS5hdHRlbXB0cykgKiAxMDApIDogMDtcbiAgICAgIGNvbnN0IGx0TWVkaWFuID0gbWVkaWFuKGEubGVhZEdhcHMpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZW52aXJvbm1lbnQsXG4gICAgICAgIGRlcGxveW1lbnRGcmVxdWVuY3k6IHtcbiAgICAgICAgICBkZXBsb3ltZW50czogYS5kZXBsb3ltZW50cyxcbiAgICAgICAgICBwZXJEYXk6IHJvdW5kKHJhd1BlckRheSwgMiksXG4gICAgICAgICAgbGV2ZWw6IGRvcmFMZXZlbEZvckZyZXF1ZW5jeShyYXdQZXJEYXksIGEuZGVwbG95bWVudHMpLFxuICAgICAgICB9LFxuICAgICAgICBjaGFuZ2VGYWlsdXJlUmF0ZToge1xuICAgICAgICAgIHJhdGU6IHJvdW5kKHJhd1JhdGUsIDEpLFxuICAgICAgICAgIGRlcGxveVRpbWVGYWlsdXJlczogYS5kZXBsb3lUaW1lRmFpbHVyZXMsXG4gICAgICAgICAgcG9zdERlcGxveUZhaWx1cmVzLFxuICAgICAgICAgIGF0dGVtcHRzOiBhLmF0dGVtcHRzLFxuICAgICAgICAgIGxldmVsOiBkb3JhTGV2ZWxGb3JDaGFuZ2VGYWlsdXJlKHJhd1JhdGUsIGEuYXR0ZW1wdHMpLFxuICAgICAgICB9LFxuICAgICAgICBsZWFkVGltZToge1xuICAgICAgICAgIGRlcGxveW1lbnRzOiBhLmxlYWRHYXBzLmxlbmd0aCxcbiAgICAgICAgICBtZWRpYW5TZWNvbmRzOiBsdE1lZGlhbiAhPSBudWxsID8gcm91bmQobHRNZWRpYW4sIDEpIDogbnVsbCxcbiAgICAgICAgICBsZXZlbDogZG9yYUxldmVsRm9yTGVhZFRpbWUobHRNZWRpYW4pLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9KVxuICAgIC5zb3J0KCh4LCB5KSA9PiB7XG4gICAgICBpZiAoeC5lbnZpcm9ubWVudCA9PT0gSEVBRExJTkVfRU5WKSByZXR1cm4gLTE7XG4gICAgICBpZiAoeS5lbnZpcm9ubWVudCA9PT0gSEVBRExJTkVfRU5WKSByZXR1cm4gMTtcbiAgICAgIHJldHVybiB4LmVudmlyb25tZW50LmxvY2FsZUNvbXBhcmUoeS5lbnZpcm9ubWVudCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogTVRUUiDigJQgUFJPRFVDVElPTi1PTkxZLCBmcm9tIEJPVEggc291cmNlcy4gSW5jaWRlbnRzIHRha2UgcHJlY2VkZW5jZTogYVxuICogcHJvZHVjdGlvbiBpbmNpZGVudCBjb3JyZWxhdGVkIHRvIGEgZGVwbG95IGNvbnRyaWJ1dGVzIHRoZSByZWFsIHJlY292ZXJ5XG4gKiAoYHJlc29sdmVkX2F0IOKIkiBvcGVuZWRfYXRgKSwgYW5kIGFueSBtYW51YWwgb3V0Y29tZSBvbiB0aGUgU0FNRSBkZXBsb3kgaXNcbiAqIHNraXBwZWQuIE1hbnVhbCBvdXRjb21lcyBvbiBvdGhlciBkZXBsb3lzIGNvdW50IGFzIHJlY29yZGVkIChgZmFpbGVkYCDihpIgYW5cbiAqIGluY2lkZW50OyBgcmVzdG9yZWRgIOKGkiBhIHJlY292ZXJ5IGdhcCBvZiBgcmVzdG9yZWQg4oiSIGRlcGxveWVkYCkuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVNdHRyKFxuICBjb3JyZWxhdGVkOiBDb3JyZWxhdGVkSW5jaWRlbnRbXSxcbiAgbXR0clJvd3M6IEFycmF5PE10dHJQYWlyUm93ICYgeyBvdXRjb21lOiBzdHJpbmcgfT4sXG4pOiBEb3JhTWV0cmljc1snbWVhblRpbWVUb1Jlc3RvcmUnXSB7XG4gIGxldCBpbmNpZGVudHMgPSAwLCByZXN0b3JlZCA9IDA7XG4gIGNvbnN0IG10dHJHYXBzOiBudW1iZXJbXSA9IFtdO1xuICAvLyBFeGVjdXRpb25zIGFscmVhZHkgYXR0cmlidXRlZCB0byBhIHByb2R1Y3Rpb24gaW5jaWRlbnQgKHByZWNlZGVuY2UgZ3VhcmQpLlxuICBjb25zdCBpbmNpZGVudEV4ZWNzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgY2kgb2YgY29ycmVsYXRlZCkge1xuICAgIGlmIChjaS5lbnZpcm9ubWVudCAhPT0gSEVBRExJTkVfRU5WKSBjb250aW51ZTsgLy8gTVRUUiBpcyBwcm9kdWN0aW9uLW9ubHlcbiAgICBpbmNpZGVudHMrKztcbiAgICBpbmNpZGVudEV4ZWNzLmFkZChjaS5leGVjKTtcbiAgICBpZiAoY2kucmVzb2x2ZWRHYXAgIT0gbnVsbCkgeyByZXN0b3JlZCsrOyBtdHRyR2Fwcy5wdXNoKGNpLnJlc29sdmVkR2FwKTsgfVxuICB9XG4gIGZvciAoY29uc3QgbSBvZiBtdHRyUm93cykge1xuICAgIC8vIEluY2lkZW50IHByZWNlZGVuY2U6IGRvbid0IGRvdWJsZS1jb3VudCBhIGRlcGxveSBhbHJlYWR5IGZsYWdnZWQgYnkgYW4gaW5jaWRlbnQuXG4gICAgaWYgKG0uZXhlY3V0aW9uX2lkICE9IG51bGwgJiYgaW5jaWRlbnRFeGVjcy5oYXMobS5leGVjdXRpb25faWQpKSBjb250aW51ZTtcbiAgICBpZiAobS5vdXRjb21lID09PSAnZmFpbGVkJykgeyBpbmNpZGVudHMrKzsgY29udGludWU7IH1cbiAgICBpZiAobS5vdXRjb21lID09PSAncmVzdG9yZWQnKSB7XG4gICAgICByZXN0b3JlZCsrO1xuICAgICAgaWYgKG0ucmVzdG9yZWRfYXQgIT0gbnVsbCAmJiBtLmRlcGxveWVkX2F0ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgZ2FwID0gKERhdGUucGFyc2UobS5yZXN0b3JlZF9hdCkgLSBEYXRlLnBhcnNlKG0uZGVwbG95ZWRfYXQpKSAvIDEwMDA7XG4gICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoZ2FwKSkgbXR0ckdhcHMucHVzaChNYXRoLm1heChnYXAsIDApKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgbXR0ck1lZGlhbiA9IG1lZGlhbihtdHRyR2Fwcyk7XG4gIHJldHVybiB7XG4gICAgaW5jaWRlbnRzLFxuICAgIHJlc3RvcmVkLFxuICAgIG1lZGlhblNlY29uZHM6IG10dHJNZWRpYW4gIT0gbnVsbCA/IHJvdW5kKG10dHJNZWRpYW4sIDEpIDogbnVsbCxcbiAgICBsZXZlbDogZG9yYUxldmVsRm9yUmVzdG9yZShtdHRyTWVkaWFuKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaGFwZSB0aGUgcmF3IERPUkEgc2NhbiByb3dzIGludG8gdGhlIHB1YmxpYyB7QGxpbmsgRG9yYU1ldHJpY3N9OiBwZXItZW52XG4gKiBERiAvIENGUiAvIGxlYWQgdGltZSAocG9zdC1kZXBsb3kgZmFpbHVyZXMgZm9sZGVkIGluKSwgcHJvZHVjdGlvbiBNVFRSIGZyb21cbiAqIGluY2lkZW50cyArIG1hbnVhbCBvdXRjb21lcywgYW5kIGRlcGxveSBjb3ZlcmFnZSDigJQgYWxsIGNyb3NzLXNvdXJjZSBtZWRpYW5zXG4gKiBvdmVyIGRlbHRhcyBjbGFtcGVkIOKJpTAuXG4gKi9cbmZ1bmN0aW9uIHNoYXBlRG9yYShcbiAgZGVwbG95Um93czogRGVwbG95Um93W10sXG4gIG91dGNvbWVSb3dzOiBPdXRjb21lUm93W10sXG4gIG10dHJSb3dzOiBBcnJheTxNdHRyUGFpclJvdyAmIHsgb3V0Y29tZTogc3RyaW5nIH0+LFxuICBjb3ZlcmFnZVJvdzogQ292ZXJhZ2VSb3cgfCB1bmRlZmluZWQsXG4gIGluY2lkZW50Um93czogSW5jaWRlbnRSb3dbXSxcbiAgZnJvbTogc3RyaW5nLFxuICB0bzogc3RyaW5nLFxuICBmaWx0ZXJzOiB7IHBpcGVsaW5lSWQ/OiBzdHJpbmc7IGVudmlyb25tZW50Pzogc3RyaW5nIH0sXG4gIHdpbmRvd0hvdXJzOiBudW1iZXIgPSBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSUyxcbik6IERvcmFNZXRyaWNzIHtcbiAgLy8gV2luZG93IGxlbmd0aCBpbiBkYXlzIChmbG9vcmVkIGF0IDEgc28gYSBzdWItZGF5IHdpbmRvdyB5aWVsZHMgdGhlIGNvdW50IGFzXG4gIC8vIHRoZSByYXRlLCBuZXZlciAvMCBvciBhbiBleHRyYXBvbGF0aW9uKS4gR3VhcmQgdW5wYXJzZWFibGUgZGF0ZXMg4oaSIDEgZGF5LlxuICBjb25zdCBzcGFuRGF5cyA9IChEYXRlLnBhcnNlKHRvKSAtIERhdGUucGFyc2UoZnJvbSkpIC8gODY0MDAwMDA7XG4gIGNvbnN0IGRheXMgPSBOdW1iZXIuaXNGaW5pdGUoc3BhbkRheXMpID8gTWF0aC5tYXgoc3BhbkRheXMsIDEpIDogMTtcbiAgLy8gV2luZG93IGVuZCBpbnN0YW50IGZvciBNVFRSIHJpZ2h0LWNlbnNvcmluZyAoYSByZXNvbHV0aW9uIGFmdGVyIGB0b2AgaXNcbiAgLy8gdW5vYnNlcnZlZCkuICtJbmZpbml0eSB3aGVuIGB0b2AgaXMgdW5wYXJzZWFibGUg4oeSIG5vIGNlbnNvcmluZyAoZmFpbC1vcGVuKS5cbiAgY29uc3QgdG9QYXJzZWQgPSBEYXRlLnBhcnNlKHRvKTtcbiAgY29uc3QgdG9NcyA9IE51bWJlci5pc0Zpbml0ZSh0b1BhcnNlZCkgPyB0b1BhcnNlZCA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcblxuICBjb25zdCBlbnZzID0gYWNjdW11bGF0ZURlcGxveXMoZGVwbG95Um93cyk7XG4gIGNvbnN0IGNvcnJlbGF0ZWQgPSBjb3JyZWxhdGVJbmNpZGVudHMoZGVwbG95Um93cywgaW5jaWRlbnRSb3dzLCB3aW5kb3dIb3VycywgdG9Ncyk7XG4gIGNvbnN0IHBvc3REZXBsb3lCeUVudiA9IGNvdW50UG9zdERlcGxveUZhaWx1cmVzKGVudnMsIG91dGNvbWVSb3dzLCBjb3JyZWxhdGVkKTtcblxuICBjb25zdCByZWdpc3RlcmVkID0gTnVtYmVyKGNvdmVyYWdlUm93Py5yZWdpc3RlcmVkKSB8fCAwO1xuICBjb25zdCBkZXBsb3lpbmcgPSBOdW1iZXIoY292ZXJhZ2VSb3c/LmRlcGxveWluZykgfHwgMDtcblxuICByZXR1cm4ge1xuICAgIHdpbmRvdzogeyBmcm9tLCB0byB9LFxuICAgIGZpbHRlcnM6IHsgcGlwZWxpbmVJZDogZmlsdGVycy5waXBlbGluZUlkID8/IG51bGwsIGVudmlyb25tZW50OiBmaWx0ZXJzLmVudmlyb25tZW50ID8/IG51bGwgfSxcbiAgICBoZWFkbGluZTogSEVBRExJTkVfRU5WLFxuICAgIGVudmlyb25tZW50czogYnVpbGRFbnZNZXRyaWNzKGVudnMsIHBvc3REZXBsb3lCeUVudiwgZGF5cywgZmlsdGVycy5lbnZpcm9ubWVudCksXG4gICAgbWVhblRpbWVUb1Jlc3RvcmU6IGNvbXB1dGVNdHRyKGNvcnJlbGF0ZWQsIG10dHJSb3dzKSxcbiAgICBjb3ZlcmFnZToge1xuICAgICAgcmVnaXN0ZXJlZCxcbiAgICAgIGRlcGxveWluZyxcbiAgICAgIHdpdGhvdXREZXBsb3lzOiBNYXRoLm1heChyZWdpc3RlcmVkIC0gZGVwbG95aW5nLCAwKSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIERPUkEgdHJlbmQg4oCUIGRlcGxveW1lbnQgZnJlcXVlbmN5ICsgZGVwbG95LXRpbWUgY2hhbmdlLWZhaWx1cmUgcmF0ZVxuICogYnVja2V0ZWQgYnkgYGludGVydmFsYCAoZGF5L3dlZWsvbW9udGgpIGZvciBhIHNwYXJrbGluZS4gRGVwbG95LWJhc2lzIGxpa2VcbiAqIGdldERvcmFNZXRyaWNzOiBidWNrZXRzIHRlcm1pbmFsIGRlcGxveS1zdGFnZSBleGVjdXRpb25zIG9uIHRoZWlyXG4gKiBgY29tcGxldGVkX2F0YC4gU2hhcmVzIHRoZSBvcmcvcm9sbHVwICsgcGlwZWxpbmVJZC9lbnZpcm9ubWVudCBzY29waW5nLiBNVFRSLFxuICogbGVhZCB0aW1lLCBhbmQgcG9zdC1kZXBsb3kgQ0ZSIGFyZSBpbnRlbnRpb25hbGx5IG9taXR0ZWQgKHRvbyBoZWF2eSB0byBidWNrZXQpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RG9yYVRyZW5kKFxuICBvcmdJZDogc3RyaW5nLFxuICBpbnRlcnZhbDogc3RyaW5nLFxuICBmcm9tOiBzdHJpbmcsXG4gIHRvOiBzdHJpbmcsXG4gIG9yZ0lkcz86IHN0cmluZ1tdLFxuICBvcHRzOiBEb3JhT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxEb3JhVHJlbmRQb2ludFtdPiB7XG4gIGFzc2VydFJlcG9ydEludGVydmFsKGludGVydmFsKTtcbiAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gb3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gIGNvbnN0IHsgcGlwZWxpbmVJZCwgZW52aXJvbm1lbnQgfSA9IG9wdHM7XG4gIGNvbnN0IHBpcGVsaW5lQ2xhdXNlID0gcGlwZWxpbmVJZCA/IHNxbGBBTkQgZS5waXBlbGluZV9pZCA9ICR7cGlwZWxpbmVJZH1gIDogc3FsYGA7XG4gIGNvbnN0IGVudkNsYXVzZSA9IGVudmlyb25tZW50ID8gc3FsYEFORCBlLmVudmlyb25tZW50ID0gJHtlbnZpcm9ubWVudH1gIDogc3FsYGA7XG4gIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgIFdJVEggZGVwbG95cyBBUyAoXG4gICAgICAgIC0tIFBFUi1FWEVDVVRJT04gZGVwbG95IHVuaXQ6IG9uZSByb3cgcGVyIChlbnZpcm9ubWVudCwgZXhlY3V0aW9uKSxcbiAgICAgICAgLS0gZXZlcnkgZGVwbG95IFNUQUdFIHRvIHRoYXQgZW52IHdpdGhpbiB0aGUgZXhlY3V0aW9uIHJvbGxlZCB1cCB0byBhXG4gICAgICAgIC0tIHNpbmdsZSB0ZXJtaW5hbCBzdGF0dXMg4oCUIE5PVCBvbmUgcm93IHBlciBzdGFnZS5cbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgJHt0ZXJtaW5hbFN0YXR1c1JvbGx1cH0gQVMgc3RhdHVzLFxuICAgICAgICAgIE1BWChlLmNvbXBsZXRlZF9hdCkgQVMgY29tcGxldGVkX2F0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuZW52aXJvbm1lbnQgSVMgTk9UIE5VTExcbiAgICAgICAgICAke3BpcGVsaW5lQ2xhdXNlfSAke2VudkNsYXVzZX1cbiAgICAgICAgICBBTkQgZS5jb21wbGV0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuY29tcGxldGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBlLmVudmlyb25tZW50LCBlLmV4ZWN1dGlvbl9pZFxuICAgICAgKVxuICAgICAgU0VMRUNUXG4gICAgICAgIERBVEVfVFJVTkMoJHtpbnRlcnZhbH0sIGNvbXBsZXRlZF9hdCk6OnRleHQgQVMgcGVyaW9kLFxuICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIGRlcGxveW1lbnRzLFxuICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWxlZCxcbiAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJykpOjppbnQgQVMgdG90YWwsXG4gICAgICAgIC0tIHF1b3RlZCBhbGlhcyBzbyB0aGUgcmF3IHJvdyBrZXkgaXMgZXhhY3RseSB0aGUgRG9yYVRyZW5kUG9pbnQgZmllbGRcbiAgICAgICAgQ09BTEVTQ0UoUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyBJTiAoJ1NVQ0NFRURFRCcsICdGQUlMRUQnKSksIDApICogMTAwLCAxKSwgMCk6OmZsb2F0IEFTIFwiY2hhbmdlRmFpbHVyZVBjdFwiXG4gICAgICBGUk9NIGRlcGxveXNcbiAgICAgIEdST1VQIEJZIHBlcmlvZCBPUkRFUiBCWSBwZXJpb2RcbiAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8RG9yYVRyZW5kUG9pbnQ+KHIucm93cykpKTtcbiAgY29uc3Qga2V5ID0gYCR7b3JnSWR9OmRvcmEtdHJlbmQ6JHtpbnRlcnZhbH06JHtmcm9tfToke3RvfToke3BpcGVsaW5lSWQgPz8gJyd9OiR7ZW52aXJvbm1lbnQgPz8gJyd9YDtcbiAgcmV0dXJuIHJ1blJlcG9ydChrZXksIG11bHRpLCBleGVjKTtcbn1cblxuLyoqXG4gKiBQZXItcGlwZWxpbmUgQlVJTEQgSEVBTFRIIOKAlCBhIHN0YW5kYXJkIChOT1QgYGFkdmFuY2VkX3JlcG9ydGluZ2ApXG4gKiBwZXItc3RhZ2UgYnJlYWtkb3duIGZvciBvbmUgcGlwZWxpbmUgb3ZlciBhIFtmcm9tLHRvXSB3aW5kb3cuIEFnZ3JlZ2F0ZXMgdGhlXG4gKiBleGlzdGluZyBgcGlwZWxpbmVfZXZlbnRzYCBTVEFHRSByb3dzOiBlYWNoIHN0YWdlIGlzIHJvbGxlZCB1cCBwZXIgZXhlY3V0aW9uXG4gKiB0byBhIHRlcm1pbmFsIHN0YXR1cyAoRkFJTEVEIHdpbnMsIHRoZW4gU1VDQ0VFREVEKSArIGl0cyBtYXggZHVyYXRpb24sIHRoZW5cbiAqIGdyb3VwZWQgcGVyIHN0YWdlIGludG8gcnVuL3N1Y2Nlc3MvZmFpbHVyZSBjb3VudHMsIGEgc3VjY2VzcyByYXRlLCBhbmRcbiAqIGR1cmF0aW9uIHBlcmNlbnRpbGVzIChwNTAvcDkwL3A5OSkuIFRvdGFscyBzdW0gYWNyb3NzIHN0YWdlcy4gT3JnLXNjb3BlZCB2aWFcbiAqIHRoZSBwaXBlbGluZSBqb2luIChgcC5vcmdfaWQgJHtwcmVkfWApICsgcm9sbHVwLWF3YXJlIGxpa2UgdGhlIHNpYmxpbmcgcmVwb3J0cztcbiAqIGEgcGlwZWxpbmVJZCBvd25lZCBieSBhbm90aGVyIG9yZyByZXR1cm5zIGFuIGVtcHR5IGJyZWFrZG93bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ1aWxkSGVhbHRoKFxuICBvcmdJZDogc3RyaW5nLFxuICBwaXBlbGluZUlkOiBzdHJpbmcsXG4gIGZyb206IHN0cmluZyxcbiAgdG86IHN0cmluZyxcbiAgb3JnSWRzPzogc3RyaW5nW10sXG4pOiBQcm9taXNlPEJ1aWxkSGVhbHRoPiB7XG4gIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IG9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgIGNvbnN0IHJvd3MgPSBkcml6emxlUm93czxCdWlsZEhlYWx0aFN0YWdlPigoYXdhaXQgdHguZXhlY3V0ZShzcWxgXG4gICAgICBXSVRIIHN0YWdlX3J1bnMgQVMgKFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLnN0YWdlX25hbWUgQVMgc3RhZ2UsXG4gICAgICAgICAgJHt0ZXJtaW5hbFN0YXR1c1JvbGx1cH0gQVMgc3RhdHVzLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKSBBUyBkdXJhdGlvbl9tc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLnBpcGVsaW5lX2lkID0gJHtwaXBlbGluZUlkfVxuICAgICAgICAgIEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLnN0YWdlX25hbWUgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIGUuc3RhZ2VfbmFtZSwgZS5leGVjdXRpb25faWRcbiAgICAgIClcbiAgICAgIFNFTEVDVFxuICAgICAgICBzdGFnZSxcbiAgICAgICAgQ09VTlQoKik6OmludCBBUyBydW5zLFxuICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIHN1Y2Nlc3NlcyxcbiAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgQ09BTEVTQ0UoUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgPSAnU1VDQ0VFREVEJyk6Om51bWVyaWNcbiAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSwgMCkgKiAxMDAsIDEpLCAwKTo6ZmxvYXQgQVMgXCJzdWNjZXNzUmF0ZVwiLFxuICAgICAgICBQRVJDRU5USUxFX0NPTlQoMC41KSBXSVRISU4gR1JPVVAgKE9SREVSIEJZIGR1cmF0aW9uX21zKTo6aW50IEFTIFwicDUwTXNcIixcbiAgICAgICAgUEVSQ0VOVElMRV9DT05UKDAuOSkgV0lUSElOIEdST1VQIChPUkRFUiBCWSBkdXJhdGlvbl9tcyk6OmludCBBUyBcInA5ME1zXCIsXG4gICAgICAgIFBFUkNFTlRJTEVfQ09OVCgwLjk5KSBXSVRISU4gR1JPVVAgKE9SREVSIEJZIGR1cmF0aW9uX21zKTo6aW50IEFTIFwicDk5TXNcIlxuICAgICAgRlJPTSBzdGFnZV9ydW5zXG4gICAgICBXSEVSRSBzdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJylcbiAgICAgIEdST1VQIEJZIHN0YWdlXG4gICAgICBPUkRFUiBCWSBydW5zIERFU0MsIHN0YWdlXG4gICAgYCkpLnJvd3MpO1xuXG4gICAgLy8gVG90YWxzIHN1bSBhY3Jvc3Mgc3RhZ2VzICh0b3RhbCBzdGFnZS1ydW5zIC8gc3RhZ2UtZmFpbHVyZXMgaW4gdGhlIHdpbmRvdykuXG4gICAgbGV0IHJ1bnMgPSAwLCBmYWlsdXJlcyA9IDA7XG4gICAgZm9yIChjb25zdCBzIG9mIHJvd3MpIHsgcnVucyArPSBzLnJ1bnM7IGZhaWx1cmVzICs9IHMuZmFpbHVyZXM7IH1cbiAgICBjb25zdCBmYWlsdXJlUmF0ZSA9IHJ1bnMgPiAwID8gcm91bmQoKGZhaWx1cmVzIC8gcnVucykgKiAxMDAsIDEpIDogMDtcbiAgICByZXR1cm4geyBzdGFnZXM6IHJvd3MsIHRvdGFsczogeyBydW5zLCBmYWlsdXJlcywgZmFpbHVyZVJhdGUgfSB9O1xuICB9KTtcbiAgcmV0dXJuIHJ1blJlcG9ydChgJHtvcmdJZH06YnVpbGQtaGVhbHRoOiR7cGlwZWxpbmVJZH06JHtmcm9tfToke3RvfWAsIG11bHRpLCBleGVjKTtcbn1cblxuLy8g4pSA4pSAIENhdGVnb3J5IDI6IFBsdWdpbiBJbnZlbnRvcnkgJiBCdWlsZHMg4pSA4pSAXG5cbi8qKiBQbHVnaW4gc3VtbWFyeSDigJQgY291bnRzIGFuZCBicmVha2Rvd25zLlxuICogIElOVEVOVElPTkFMTFkgU0lOR0xFLU9SRyAobm8gcm9sbHVwKTogcGx1Z2luIGludmVudG9yeSBpcyBhbiBvcmctb3duZWRcbiAqICBhc3NldCBjb3VudCwgbm90IGFuIGV4ZWN1dGlvbi9idWlsZCBhY3Rpdml0eSByZXBvcnQsIHNvIGEgcGFyZW50J3MgdmlldyBpc1xuICogIGl0cyBvd24gcGx1Z2lucyDigJQgdGVhbXMgbWFuYWdlIHRoZWlyIG93biBpbnZlbnRvcnkuIFNpbmdsZSBgPSAkb3JnYCBzY29wZS4gKi9cbiJdfQ==
|
|
573
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9yYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcmVwb3J0aW5nL2RvcmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxFQUNMLFlBQVksRUFBRSwwQkFBMEIsRUFBRSwwQkFBMEIsRUFDcEUscUJBQXFCLEVBQUUseUJBQXlCLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQzNGLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxHQUMxQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUt2RyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVqRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQ2xDLEtBQWEsRUFDYixJQUFZLEVBQ1osRUFBVSxFQUNWLE1BQWlCLEVBQ2pCLElBQUksR0FBZ0IsRUFBRTtJQUV0QixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEQsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDekMsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FB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cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBET1JBIG1ldHJpY3M6IHRoZSBmb3VyIGhlYWRsaW5lIG1lYXN1cmVzLCB0aGVpciBwZXItZW52aXJvbm1lbnQgYnJlYWtkb3duLFxuICogdGhlIHRyZW5kIHNlcmllcywgYW5kIHBlci1waXBlbGluZSBidWlsZCBoZWFsdGguXG4gKlxuICogQnkgZmFyIHRoZSBsYXJnZXN0IGRvbWFpbiBpbiB0aGUgcmVwb3J0aW5nIHNlcnZpY2UgKH40OTAgbGluZXMgb2YgcXVlcnkgK1xuICogc2hhcGluZyBhZ2FpbnN0IHNpeCByb3cgc2hhcGVzKSwgd2hpY2ggaXMgd2h5IGl0IGxpdmVzIGluIGl0cyBvd24gbW9kdWxlLlxuICogUmVwb3J0aW5nU2VydmljZSBkZWxlZ2F0ZXMgdG8gdGhlc2U7IHRoZSBiYW5kaW5nIHRocmVzaG9sZHMgdGhleSBhcHBseSBhcmUgaW5cbiAqIC4vZG9yYS1zY29yaW5nLnRzLCBkZWxpYmVyYXRlbHkgc2VwYXJhdGUgc28gdGhleSBjYW4gYmUgdGVzdGVkIHdpdGhvdXQgYSBEQi5cbiAqL1xuXG5pbXBvcnQgeyBzcWwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQge1xuICBIRUFETElORV9FTlYsIERPUkFfSU5DSURFTlRfV0lORE9XX0hPVVJTLCByZXNvbHZlSW5jaWRlbnRXaW5kb3dIb3VycyxcbiAgZG9yYUxldmVsRm9yRnJlcXVlbmN5LCBkb3JhTGV2ZWxGb3JDaGFuZ2VGYWlsdXJlLCBkb3JhTGV2ZWxGb3JSZXN0b3JlLCBkb3JhTGV2ZWxGb3JMZWFkVGltZSxcbiAgcm91bmQsIG1lZGlhbiwgcGVyY2VudGlsZSxcbn0gZnJvbSAnLi9kb3JhLXNjb3JpbmcuanMnO1xuaW1wb3J0IHsgb3JnU2NvcGUsIHJ1blJlcG9ydCB9IGZyb20gJy4vcXVlcnktc2NvcGUuanMnO1xuaW1wb3J0IHsgYXNzZXJ0UmVwb3J0SW50ZXJ2YWwsIGJ1Y2tldEtleSwgcGVyaW9kQnVja2V0LCB0ZXJtaW5hbFN0YXR1c1JvbGx1cCB9IGZyb20gJy4vc3FsLWhlbHBlcnMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBEb3JhT3B0aW9ucywgRG9yYU1ldHJpY3MsIERvcmFFbnZNZXRyaWNzLCBEb3JhVHJlbmRQb2ludCwgQnVpbGRIZWFsdGgsIEJ1aWxkSGVhbHRoU3RhZ2UsXG4gIERlcGxveVJvdywgT3V0Y29tZVJvdywgTXR0clBhaXJSb3csIEluY2lkZW50Um93LCBDb3ZlcmFnZVJvdyxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuLi8uLi9kYXRhYmFzZS9kcml6emxlLXNjaGVtYS5qcyc7XG5pbXBvcnQgeyB3aXRoVGVuYW50VHggfSBmcm9tICcuLi8uLi9kYXRhYmFzZS90ZW5hbmN5LmpzJztcbmltcG9ydCB7IGRyaXp6bGVSb3dzIH0gZnJvbSAnLi4vY3J1ZC1zZXJ2aWNlLmpzJztcblxuLyoqXG4gKiBET1JBIG1ldHJpY3Mgb3ZlciBhIFtmcm9tLHRvXSBkZXBsb3ktY29tcGxldGlvbiB3aW5kb3csIG9yZy1zY29wZWQgK1xuICogcm9sbHVwLWF3YXJlLiBERVBMT1ktQkFTSVMgT05MWSDigJQgZXZlcnkgbWV0cmljIGRlcml2ZXMgZnJvbSByZWFsIGRlcGxveS1zdGFnZVxuICogZXhlY3V0aW9ucyAoYGV2ZW50X3R5cGU9J1NUQUdFJ2Agd2l0aCBhIG5vbi1udWxsIGBlbnZpcm9ubWVudGAsIHNldCBieSB0aGVcbiAqIGZvcndhcmRlciBmb3IgdGhlIHN0YWdlcyBhIHVzZXIgZGVjbGFyZWQgaW4gYHBiLmRlcGxveXNgKS4gTm8gcnVuLWJhc2VkXG4gKiBmYWxsYmFjazogYSBwaXBlbGluZSB3aXRoIG5vIGRlcGxveSBzdGFnZSBwcm9kdWNlcyBubyBET1JBIGRhdGEuXG4gKlxuICogRm91ciBzY29wZWQgU1FMIHNjYW5zIHJ1biBpbnNpZGUgb25lIHR4IChlYWNoIG9yZy1nYXRlZCBieSBgcC5vcmdfaWQgJHtwcmVkfWBcbiAqIC8gYG8ub3JnX2lkICR7cHJlZH1gIHNvIGEgcm9sbHVwIHBhc3NlcyB0aGUgb3Jn4oaSdGVhbSBzdWJ0cmVlIGFuZCBhIGZvcmVpZ25cbiAqIG9yZydzIHJvd3MgbmV2ZXIgZW50ZXIpOiAoMSkgdGVybWluYWwgZGVwbG95IHJvd3MgUEVSIChleGVjdXRpb24sIGVudikg4oCUIG9uZVxuICogXCJkZXBsb3ltZW50XCIgPSBvbmUgZXhlY3V0aW9uIHJlYWNoaW5nIGFuIGVudiDigJQg4oaSIERGIC8gZGVwbG95LXRpbWUgQ0ZSIC9cbiAqIG1lYXN1cmVkIGxlYWQgdGltZSAobGVhZCB0aW1lIGpvaW5zIHRoZSBleGVjdXRpb24ncyBlYXJsaWVzdCBjb21taXQpO1xuICogdGhlIHNjYW4gYWxzbyByZWFjaGVzIGJhY2sgYHdpbmRvd0hvdXJzYCBiZWZvcmUgYGZyb21gIHNvIGluY2lkZW50cyBvcGVuZWRcbiAqIG5lYXIgdGhlIHdpbmRvdyBzdGFydCBjYW4gY29ycmVsYXRlIHRvIGEganVzdC1wcmlvciBkZXBsb3k7ICgyKSBgZGVwbG95bWVudF9vdXRjb21lc2BcbiAqIGluLXdpbmRvdyDihpIgcG9zdC1kZXBsb3kgQ0ZSIGNvbXBvbmVudDsgKDMpIHByb2R1Y3Rpb24gcmVzdG9yZWQvZmFpbGVkXG4gKiBvdXRjb21lcyBqb2luZWQgdG8gdGhlaXIgZGVwbG95IOKGkiBNVFRSOyAoNCkgcmVnaXN0cnkgdnMgZGVwbG95aW5nIOKGkiBjb3ZlcmFnZS5cbiAqIFRoZSBjcm9zcy1zb3VyY2UgbWVkaWFucyAobGVhZCB0aW1lLCBNVFRSKSBhcmUgY29tcHV0ZWQgaW4gSlMgZnJvbSBjbGFtcGVkXG4gKiAo4omlMCkgZGVsdGFzLlxuICpcbiAqIEBwYXJhbSBvcHRzLnBpcGVsaW5lSWQgICAgcmVzdHJpY3QgdG8gb25lIHBpcGVsaW5lIChwZXItcGlwZWxpbmUgRE9SQSlcbiAqIEBwYXJhbSBvcHRzLmVudmlyb25tZW50ICAgcmVzdHJpY3QgdG8gb25lIGRlcGxveSBlbnZpcm9ubWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RG9yYU1ldHJpY3MoXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIGZyb206IHN0cmluZyxcbiAgdG86IHN0cmluZyxcbiAgb3JnSWRzPzogc3RyaW5nW10sXG4gIG9wdHM6IERvcmFPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPERvcmFNZXRyaWNzPiB7XG4gIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IG9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICBjb25zdCB7IHBpcGVsaW5lSWQsIGVudmlyb25tZW50IH0gPSBvcHRzO1xuICBjb25zdCBwaXBlbGluZUNsYXVzZSA9IHBpcGVsaW5lSWQgPyBzcWxgQU5EIGUucGlwZWxpbmVfaWQgPSAke3BpcGVsaW5lSWR9YCA6IHNxbGBgO1xuICBjb25zdCBwaXBlbGluZUNsYXVzZVIgPSBwaXBlbGluZUlkID8gc3FsYEFORCByLnBpcGVsaW5lX2lkID0gJHtwaXBlbGluZUlkfWAgOiBzcWxgYDtcbiAgLy8gUG9zdC1kZXBsb3kgb3V0Y29tZXMgY2Fycnkgbm8gcGlwZWxpbmUgaWQsIG9ubHkgdGhlIGV4ZWN1dGlvbiB0aGF0XG4gIC8vIHByb2R1Y2VkIHRoZW0sIHNvIGEgcGVyLXBpcGVsaW5lIHZpZXcgaGFzIHRvIHNjb3BlIHRoZW0gVEhST1VHSCB0aGVcbiAgLy8gZXhlY3V0aW9uLiBXaXRob3V0IGl0IHRoZSBvdXRjb21lIGFuZCBNVFRSIHNjYW5zIHJlYWQgZXZlcnkgcGlwZWxpbmUgaW4gdGhlXG4gIC8vIG9yZzogYW5vdGhlciBwaXBlbGluZSdzIGBmYWlsZWRgIG1hcmtlciBjb3VudGVkIGFnYWluc3QgdGhpcyBvbmUncyBjaGFuZ2VcbiAgLy8gZmFpbHVyZSByYXRlICh0ZW4gY2xlYW4gZGVwbG95cyBjb3VsZCBkcm9wIGZyb20gZWxpdGUgdG8gaGlnaCkgYW5kIGl0c1xuICAvLyByZWNvdmVyaWVzIGZlZCB0aGlzIG9uZSdzIE1UVFIuXG4gIGNvbnN0IG91dGNvbWVQaXBlbGluZUNsYXVzZSA9IHBpcGVsaW5lSWRcbiAgICA/IHNxbGBBTkQgby5leGVjdXRpb25faWQgSU4gKFNFTEVDVCBwZS5leGVjdXRpb25faWQgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBwZSBXSEVSRSBwZS5waXBlbGluZV9pZCA9ICR7cGlwZWxpbmVJZH0pYFxuICAgIDogc3FsYGA7XG4gIC8vIGBlbnZDbGF1c2VgIGlzIHRoZSBTVFJJQ1QgZmlsdGVyIChjb3ZlcmFnZSwgYW5kIHRoZSBvdXRwdXQpLiBUaGUgZGVwbG95IGFuZFxuICAvLyBpbmNpZGVudCBTQ0FOUyB1c2UgdGhlIHdpZGVuZWQgYHNjYW5FbnZDbGF1c2VgL2BzY2FuSW5jaWRlbnRFbnZDbGF1c2VgXG4gIC8vIGluc3RlYWQsIHdoaWNoIGFsd2F5cyBhZG1pdCBwcm9kdWN0aW9uOiBNVFRSIGlzIHByb2R1Y3Rpb24tb25seSBhbmRcbiAgLy8gZG9jdW1lbnRlZCBhcyBpbmRlcGVuZGVudCBvZiB0aGUgZW52aXJvbm1lbnQgZmlsdGVyLCBidXQgaW5jaWRlbnQtc291cmNlZFxuICAvLyBNVFRSIGNvcnJlbGF0ZXMgZWFjaCBwcm9kdWN0aW9uIGluY2lkZW50IGFnYWluc3QgcHJvZHVjdGlvbiBERVBMT1kgcm93cy5cbiAgLy8gRmlsdGVyaW5nIGJvdGggc2NhbnMgdG8gYD9lbnZpcm9ubWVudD1zdGFnaW5nYCByZW1vdmVkIGV2ZXJ5IHByb2R1Y3Rpb25cbiAgLy8gaW5jaWRlbnQgYW5kIGV2ZXJ5IHByb2R1Y3Rpb24gZGVwbG95LCBzbyBpbmNpZGVudCByZWNvdmVyeSBzaWxlbnRseSBkcm9wcGVkXG4gIC8vIG91dCBvZiBNVFRSIHRoZSBtb21lbnQgYW55b25lIGxvb2tlZCBhdCBhIG5vbi1wcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAvLyBgc2hhcGVEb3JhYCBuYXJyb3dzIHRoZSByZXBvcnRlZCBlbnZpcm9ubWVudHMgYmFjayB0byB0aGUgcmVxdWVzdGVkIG9uZS5cbiAgY29uc3QgZW52Q2xhdXNlID0gZW52aXJvbm1lbnQgPyBzcWxgQU5EIGUuZW52aXJvbm1lbnQgPSAke2Vudmlyb25tZW50fWAgOiBzcWxgYDtcbiAgY29uc3Qgc2NhbkVudkNsYXVzZSA9IGVudmlyb25tZW50ID8gc3FsYEFORCBlLmVudmlyb25tZW50IElOICgke2Vudmlyb25tZW50fSwgJHtIRUFETElORV9FTlZ9KWAgOiBzcWxgYDtcbiAgY29uc3Qgb3V0Y29tZUVudkNsYXVzZSA9IGVudmlyb25tZW50ID8gc3FsYEFORCBvLmVudmlyb25tZW50ID0gJHtlbnZpcm9ubWVudH1gIDogc3FsYGA7XG4gIGNvbnN0IHNjYW5JbmNpZGVudEVudkNsYXVzZSA9IGVudmlyb25tZW50ID8gc3FsYEFORCBpLmVudmlyb25tZW50IElOICgke2Vudmlyb25tZW50fSwgJHtIRUFETElORV9FTlZ9KWAgOiBzcWxgYDtcblxuICAvLyBFZmZlY3RpdmUgaW5jaWRlbnQtY29ycmVsYXRpb24gd2luZG93IChwZXItb3JnIG92ZXJyaWRlIG9yIHRoZSBnbG9iYWxcbiAgLy8gZGVmYXVsdCkuIENvbXB1dGVkIGhlcmUgKG5vdCBqdXN0IGluIHNoYXBlRG9yYSkgYmVjYXVzZSB0aGUgZGVwbG95IHNjYW5cbiAgLy8gbmVlZHMgaXQgZm9yIEJPVEggdGhlIGNvcnJlbGF0aW9uIGxvb2stYmFjayBsb3dlciBib3VuZCBBTkQgdGhlIGNhY2hlIGtleS5cbiAgY29uc3QgZWZmZWN0aXZlV2luZG93SG91cnMgPSByZXNvbHZlSW5jaWRlbnRXaW5kb3dIb3VycyhvcHRzLmluY2lkZW50V2luZG93SG91cnMpO1xuICAvLyBDb3JyZWxhdGlvbiBsb29rLWJhY2s6IGluY2lkZW50cyBvcGVuZWQganVzdCBpbnNpZGUgYGZyb21gIGNhbiBhdHRyaWJ1dGUgdG9cbiAgLy8gYSBkZXBsb3kgdGhhdCBjb21wbGV0ZWQgdXAgdG8gYHdpbmRvd0hvdXJzYCBCRUZPUkUgYGZyb21gIChtaXJyb3JzIHRoZVxuICAvLyBMQVRFUkFMIGxvb2stYmFjayBpbiBsaXN0SW5jaWRlbnRzKS4gV2lkZW4gdGhlIGRlcGxveSBzY2FuJ3MgbG93ZXIgYm91bmQgdG9cbiAgLy8gYGZyb20g4oiSIHdpbmRvd0hvdXJzYDsgREYvQ0ZSL2xlYWQgc3RpbGwgY291bnQgb25seSB0aGUgaW4tYGZyb21gLi5gdG9gXG4gIC8vIHN1YnNldCAoZmxhZ2dlZCBieSBgaW5fd2luZG93YCksIHdoaWxlIGNvcnJlbGF0aW9uIHNlZXMgdGhlIHdpZGVyIHNldC5cbiAgY29uc3QgZnJvbU1zID0gRGF0ZS5wYXJzZShmcm9tKTtcbiAgY29uc3QgbG9va2JhY2tGcm9tID0gTnVtYmVyLmlzRmluaXRlKGZyb21NcylcbiAgICA/IG5ldyBEYXRlKGZyb21NcyAtIGVmZmVjdGl2ZVdpbmRvd0hvdXJzICogMzYwMCAqIDEwMDApLnRvSVNPU3RyaW5nKClcbiAgICA6IGZyb207XG5cbiAgLy8gKDEpIFRlcm1pbmFsIGRlcGxveSByb3dzOiBQRVItRVhFQ1VUSU9OLCBvbmUgcm93IHBlciAoZW52aXJvbm1lbnQsXG4gIC8vIGV4ZWN1dGlvbikg4oCUIGV2ZXJ5IGRlcGxveSBTVEFHRSB0YXJnZXRpbmcgdGhhdCBlbnYgd2l0aGluIHRoZSBleGVjdXRpb24gaXNcbiAgLy8gcm9sbGVkIHVwIHRvIGEgdGVybWluYWwgc3RhdHVzIChGQUlMRUQgd2lucywgdGhlbiBTVUNDRUVERUQpLiBBIHNpbmdsZVxuICAvLyBleGVjdXRpb24gd2l0aCB0d28gZGVwbG95IHN0YWdlcyB0byB0aGUgc2FtZSBlbnYgaXMgT05FIGRlcGxveW1lbnQsIG5vdCB0d28uXG4gIC8vIGNvbXBsZXRlZF9hdCA9IHRoZSBkZXBsb3kncyBjb21wbGV0aW9uIChNQVggb3ZlciBpdHMgc3RhZ2VzKS4gYGNvbW1pdF90c2BcbiAgLy8gaXMgdGhlIGV4ZWN1dGlvbidzIEVBUkxJRVNUIGNvbW1pdCB0aW1lIGFjcm9zcyBBTEwgaXRzIGV2ZW50cyAoY29tbWl0XG4gIC8vIGVucmljaG1lbnQgcmlkZXMgdGhlIFBJUEVMSU5FL3NvdXJjZSBldmVudCB3aGVyZSBlbnZpcm9ubWVudCBJUyBOVUxMLCBuZXZlclxuICAvLyB0aGUgZGVwbG95IFNUQUdFIHJvdyksIGpvaW5lZCBieSBleGVjdXRpb25faWQuIGBpbl93aW5kb3dgIG1hcmtzIHdoZXRoZXIgdGhlXG4gIC8vIGRlcGxveSBjb21wbGV0ZWQgaW5zaWRlIFtmcm9tLHRvXSAodnMuIGEgbG9vay1iYWNrLW9ubHkgcm93IGtlcHQgc29sZWx5IGZvclxuICAvLyBpbmNpZGVudCBjb3JyZWxhdGlvbikuIGV4ZWN1dGlvbl9pZCBpcyBwcm9qZWN0ZWQgc28gcG9zdC1kZXBsb3kgZmFpbHVyZXNcbiAgLy8gKG1hbnVhbCBvdXRjb21lcyArIGNvcnJlbGF0ZWQgaW5jaWRlbnRzKSBjYW4gZGVkdXAgYWdhaW5zdCB0aGVpciBkZXBsb3kuXG4gIGNvbnN0IGRlcGxveVNxbCA9IHNxbGBcbiAgICAgIFdJVEggZGVwbG95X3N0YWdlcyBBUyAoXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZW52aXJvbm1lbnQgQVMgZW52aXJvbm1lbnQsXG4gICAgICAgICAgZS5leGVjdXRpb25faWQgQVMgZXhlY3V0aW9uX2lkLFxuICAgICAgICAgICR7dGVybWluYWxTdGF0dXNSb2xsdXB9IEFTIHN0YXR1cyxcbiAgICAgICAgICBNQVgoZS5jb21wbGV0ZWRfYXQpIEFTIGNvbXBsZXRlZF9hdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLmVudmlyb25tZW50IElTIE5PVCBOVUxMXG4gICAgICAgICAgJHtwaXBlbGluZUNsYXVzZX0gJHtzY2FuRW52Q2xhdXNlfVxuICAgICAgICAgIEFORCBlLmNvbXBsZXRlZF9hdCA+PSAke2xvb2tiYWNrRnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLmNvbXBsZXRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgZS5lbnZpcm9ubWVudCwgZS5leGVjdXRpb25faWRcbiAgICAgICksXG4gICAgICBleGVjX2NvbW1pdHMgQVMgKFxuICAgICAgICBTRUxFQ1QgYy5leGVjdXRpb25faWQgQVMgZXhlY3V0aW9uX2lkLCBNSU4oYy5jb21taXRfdGltZXN0YW1wKSBBUyBjb21taXRfdHNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBjXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGMucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgYy5jb21taXRfdGltZXN0YW1wIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGMuZXhlY3V0aW9uX2lkIElOIChTRUxFQ1QgZXhlY3V0aW9uX2lkIEZST00gZGVwbG95X3N0YWdlcylcbiAgICAgICAgR1JPVVAgQlkgYy5leGVjdXRpb25faWRcbiAgICAgIClcbiAgICAgIFNFTEVDVFxuICAgICAgICBkcy5lbnZpcm9ubWVudCBBUyBlbnZpcm9ubWVudCxcbiAgICAgICAgZHMuZXhlY3V0aW9uX2lkIEFTIGV4ZWN1dGlvbl9pZCxcbiAgICAgICAgZHMuc3RhdHVzIEFTIHN0YXR1cyxcbiAgICAgICAgZHMuY29tcGxldGVkX2F0Ojp0ZXh0IEFTIGNvbXBsZXRlZF9hdCxcbiAgICAgICAgKGRzLmNvbXBsZXRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eikgQVMgaW5fd2luZG93LFxuICAgICAgICBlYy5jb21taXRfdHM6OnRleHQgQVMgY29tbWl0X3RzXG4gICAgICBGUk9NIGRlcGxveV9zdGFnZXMgZHNcbiAgICAgIExFRlQgSk9JTiBleGVjX2NvbW1pdHMgZWMgT04gZWMuZXhlY3V0aW9uX2lkID0gZHMuZXhlY3V0aW9uX2lkYDtcblxuICAvLyAoMikgUG9zdC1kZXBsb3kgb3V0Y29tZSBtYXJrZXJzIGluLXdpbmRvdyAocGVyIGVudikuIFBvc3QtZGVwbG95IGZhaWx1cmVzXG4gIC8vIChvdXRjb21lPSdmYWlsZWQnKSBhZGQgdG8gdGhlIENGUiBudW1lcmF0b3Igd2l0aG91dCBjaGFuZ2luZyBhdHRlbXB0cy5cbiAgLy8gZXhlY3V0aW9uX2lkIGxldHMgdGhlIENGUiBkZWR1cCBhIG1hbnVhbCBmYWlsdXJlIGFnYWluc3QgYW4gaW5jaWRlbnQgdGhhdFxuICAvLyBjb3JyZWxhdGVzIHRvIHRoZSBzYW1lIGRlcGxveSAobm8gZG91YmxlLWNvdW50KS5cbiAgY29uc3Qgb3V0Y29tZVNxbCA9IHNxbGBcbiAgICAgIFNFTEVDVCBvLmVudmlyb25tZW50IEFTIGVudmlyb25tZW50LCBvLm91dGNvbWUgQVMgb3V0Y29tZSwgby5leGVjdXRpb25faWQgQVMgZXhlY3V0aW9uX2lkXG4gICAgICBGUk9NICR7c2NoZW1hLmRlcGxveW1lbnRPdXRjb21lfSBvXG4gICAgICBXSEVSRSBvLm9yZ19pZCAke3ByZWR9ICR7b3V0Y29tZUVudkNsYXVzZX0gJHtvdXRjb21lUGlwZWxpbmVDbGF1c2V9XG4gICAgICAgIEFORCBvLmF0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBvLmF0IDw9ICR7dG99Ojp0aW1lc3RhbXB0emA7XG5cbiAgLy8gKDMpIE1UVFIg4oCUIFBST0RVQ1RJT04tT05MWSwgaW5kZXBlbmRlbnQgb2YgdGhlIGVudiBmaWx0ZXIuIEV2ZXJ5IHByb2R1Y3Rpb25cbiAgLy8gb3V0Y29tZSBpbi13aW5kb3c7IGZvciBhICdyZXN0b3JlZCcgb25lLCBjb3JyZWxhdGUgdG8gaXRzIGRlcGxveSdzXG4gIC8vIGNvbXBsZXRpb24gdmlhIGV4ZWN1dGlvbl9pZCB0byBtZWFzdXJlIHJlc3RvcmVkLmF0IOKIkiBkZXBsb3llZC5jb21wbGV0ZWRfYXQuXG4gIC8vIGV4ZWN1dGlvbl9pZCBpcyBwcm9qZWN0ZWQgc28gYW4gaW5jaWRlbnQtc291cmNlZCByZWNvdmVyeSBmb3IgdGhlIHNhbWVcbiAgLy8gZGVwbG95IHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgbWFudWFsIHJlc3RvcmVkIGdhcC5cbiAgY29uc3QgbXR0clNxbCA9IHNxbGBcbiAgICAgIFNFTEVDVFxuICAgICAgICBvLm91dGNvbWUgQVMgb3V0Y29tZSxcbiAgICAgICAgby5leGVjdXRpb25faWQgQVMgZXhlY3V0aW9uX2lkLFxuICAgICAgICBvLmF0Ojp0ZXh0IEFTIHJlc3RvcmVkX2F0LFxuICAgICAgICAoU0VMRUNUIE1BWChkLmNvbXBsZXRlZF9hdCkgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBkXG4gICAgICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAyIE9OIHAyLmlkID0gZC5waXBlbGluZV9pZFxuICAgICAgICAgICBXSEVSRSBwMi5vcmdfaWQgJHtwcmVkfSBBTkQgZC5leGVjdXRpb25faWQgPSBvLmV4ZWN1dGlvbl9pZFxuICAgICAgICAgICAgIEFORCBkLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBkLmVudmlyb25tZW50ID0gJHtIRUFETElORV9FTlZ9KTo6dGV4dCBBUyBkZXBsb3llZF9hdFxuICAgICAgRlJPTSAke3NjaGVtYS5kZXBsb3ltZW50T3V0Y29tZX0gb1xuICAgICAgV0hFUkUgby5vcmdfaWQgJHtwcmVkfSBBTkQgby5lbnZpcm9ubWVudCA9ICR7SEVBRExJTkVfRU5WfSAke291dGNvbWVQaXBlbGluZUNsYXVzZX1cbiAgICAgICAgQU5EIG8uYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIG8uYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6YDtcblxuICAvLyAoNSkgSW5jaWRlbnRzIG9wZW5lZCBpbi13aW5kb3cgKHBlciBlbnYpLiBDb3JyZWxhdGVkIGluIEpTIHRvIHRoZSBtb3N0XG4gIC8vIHJlY2VudCBzdWNjZXNzZnVsIGRlcGxveSDihpIgYXV0b21hdGVkIHBvc3QtZGVwbG95IGZhaWx1cmUgKENGUikgKyByZWFsXG4gIC8vIHJlY292ZXJ5IHRpbWUgKHJlc29sdmVkX2F0IOKIkiBvcGVuZWRfYXQpIGZvciBNVFRSIChwcm9kdWN0aW9uKS5cbiAgY29uc3QgaW5jaWRlbnRTcWwgPSBzcWxgXG4gICAgICBTRUxFQ1QgaS5lbnZpcm9ubWVudCBBUyBlbnZpcm9ubWVudCwgaS5vcGVuZWRfYXQ6OnRleHQgQVMgb3BlbmVkX2F0LCBpLnJlc29sdmVkX2F0Ojp0ZXh0IEFTIHJlc29sdmVkX2F0XG4gICAgICBGUk9NICR7c2NoZW1hLmluY2lkZW50fSBpXG4gICAgICBXSEVSRSBpLm9yZ19pZCAke3ByZWR9ICR7c2NhbkluY2lkZW50RW52Q2xhdXNlfVxuICAgICAgICBBTkQgaS5vcGVuZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGkub3BlbmVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0emA7XG5cbiAgLy8gKDQpIENvdmVyYWdlOiByZWdpc3RlcmVkIHBpcGVsaW5lcyB2cyB0aG9zZSB0aGF0IGFjdHVhbGx5IGRlcGxveWVkIGluLXdpbmRvdy5cbiAgY29uc3QgY292ZXJhZ2VTcWwgPSBzcWxgXG4gICAgICBTRUxFQ1RcbiAgICAgICAgKFNFTEVDVCBDT1VOVCgqKTo6aW50IEZST00gJHtzY2hlbWEucGlwZWxpbmVSZWdpc3RyeX0gclxuICAgICAgICAgICBXSEVSRSByLm9yZ19pZCAke3ByZWR9ICR7cGlwZWxpbmVDbGF1c2VSfSkgQVMgcmVnaXN0ZXJlZCxcbiAgICAgICAgKFNFTEVDVCBDT1VOVChESVNUSU5DVCBlLnBpcGVsaW5lX2lkKTo6aW50IEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuZW52aXJvbm1lbnQgSVMgTk9UIE5VTExcbiAgICAgICAgICAgICAke3BpcGVsaW5lQ2xhdXNlfSAke2VudkNsYXVzZX1cbiAgICAgICAgICAgICBBTkQgZS5jb21wbGV0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuY29tcGxldGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0eikgQVMgZGVwbG95aW5nYDtcblxuICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgIC8vIFNjYW4gb3JkZXIgaXMgbG9hZC1iZWFyaW5nIGZvciB0aGUgZ2VuZXJhdGVkLVNRTCB0ZXN0czogMD1kZXBsb3ksXG4gICAgLy8gMT1vdXRjb21lcywgMj1tdHRyLCAzPWNvdmVyYWdlLCA0PWluY2lkZW50cyAoYXBwZW5kZWQgbGFzdCBzbyB0aGVcbiAgICAvLyBlYXJsaWVyIGluZGljZXMgc3RheSBzdGFibGUpLlxuICAgIGNvbnN0IGRlcGxveVJvd3MgPSBkcml6emxlUm93czxEZXBsb3lSb3c+KChhd2FpdCB0eC5leGVjdXRlKGRlcGxveVNxbCkpLnJvd3MpO1xuICAgIGNvbnN0IG91dGNvbWVSb3dzID0gZHJpenpsZVJvd3M8T3V0Y29tZVJvdz4oKGF3YWl0IHR4LmV4ZWN1dGUob3V0Y29tZVNxbCkpLnJvd3MpO1xuICAgIGNvbnN0IG10dHJSb3dzID0gZHJpenpsZVJvd3M8TXR0clBhaXJSb3cgJiB7IG91dGNvbWU6IHN0cmluZyB9PigoYXdhaXQgdHguZXhlY3V0ZShtdHRyU3FsKSkucm93cyk7XG4gICAgY29uc3QgY292ZXJhZ2VSb3cgPSBkcml6emxlUm93czxDb3ZlcmFnZVJvdz4oKGF3YWl0IHR4LmV4ZWN1dGUoY292ZXJhZ2VTcWwpKS5yb3dzKVswXTtcbiAgICBjb25zdCBpbmNpZGVudFJvd3MgPSBkcml6emxlUm93czxJbmNpZGVudFJvdz4oKGF3YWl0IHR4LmV4ZWN1dGUoaW5jaWRlbnRTcWwpKS5yb3dzKTtcbiAgICByZXR1cm4gc2hhcGVEb3JhKGRlcGxveVJvd3MsIG91dGNvbWVSb3dzLCBtdHRyUm93cywgY292ZXJhZ2VSb3csIGluY2lkZW50Um93cywgZnJvbSwgdG8sIHtcbiAgICAgIHBpcGVsaW5lSWQsIGVudmlyb25tZW50LFxuICAgIH0sIGVmZmVjdGl2ZVdpbmRvd0hvdXJzKTtcbiAgfSk7XG4gIC8vIENhY2hlIGtleSBNVVNUIGluY2x1ZGUgdGhlIGVmZmVjdGl2ZSBpbmNpZGVudCB3aW5kb3c6IHRoZSBzY29yZWNhcmQgcmVhZHNcbiAgLy8gL2RvcmEgd2l0aCB0aGUgb3JnJ3MgZGVmYXVsdCB3aW5kb3cgd2hpbGUgYW4gZXhwbGljaXQgL2RvcmEgY2FsbCBtYXkgcGFzcyBhblxuICAvLyBvdmVycmlkZSDigJQgZGlmZmVyZW50IHdpbmRvd3MgeWllbGQgZGlmZmVyZW50IENGUi9NVFRSLCBzbyB0aGV5IG11c3Qgbm90XG4gIC8vIGNvbGxpZGUgb24gdGhlIHNhbWUga2V5LlxuICBjb25zdCBrZXkgPSBgJHtvcmdJZH06ZG9yYToke2Zyb219OiR7dG99OiR7cGlwZWxpbmVJZCA/PyAnJ306JHtlbnZpcm9ubWVudCA/PyAnJ306JHtlZmZlY3RpdmVXaW5kb3dIb3Vyc31gO1xuICByZXR1cm4gcnVuUmVwb3J0KGtleSwgbXVsdGksIGV4ZWMpO1xufVxuXG4vKiogUGVyLWVudmlyb25tZW50IGRlcGxveSBhY2N1bXVsYXRvci4gKi9cbmludGVyZmFjZSBFbnZBY2Mge1xuICBkZXBsb3ltZW50czogbnVtYmVyO1xuICBkZXBsb3lUaW1lRmFpbHVyZXM6IG51bWJlcjtcbiAgYXR0ZW1wdHM6IG51bWJlcjtcbiAgbGVhZEdhcHM6IG51bWJlcltdO1xufVxuXG4vKiogQSBwcm9kdWN0aW9uLW9yLW90aGVyIGluY2lkZW50IGF0dHJpYnV0ZWQgdG8gdGhlIGRlcGxveSBleGVjdXRpb24gaXQgZm9sbG93ZWQuICovXG5pbnRlcmZhY2UgQ29ycmVsYXRlZEluY2lkZW50IHsgZW52aXJvbm1lbnQ6IHN0cmluZzsgZXhlYzogc3RyaW5nOyByZXNvbHZlZEdhcDogbnVtYmVyIHwgbnVsbCB9XG5cbi8qKiBHZXQtb3ItY3JlYXRlIHRoZSBhY2N1bXVsYXRvciBmb3IgYGVudmAuICovXG5mdW5jdGlvbiBhY2NGb3IoZW52czogTWFwPHN0cmluZywgRW52QWNjPiwgZW52OiBzdHJpbmcpOiBFbnZBY2Mge1xuICBsZXQgYSA9IGVudnMuZ2V0KGVudik7XG4gIGlmICghYSkgeyBhID0geyBkZXBsb3ltZW50czogMCwgZGVwbG95VGltZUZhaWx1cmVzOiAwLCBhdHRlbXB0czogMCwgbGVhZEdhcHM6IFtdIH07IGVudnMuc2V0KGVudiwgYSk7IH1cbiAgcmV0dXJuIGE7XG59XG5cbi8qKlxuICogQSBkZXBsb3kgcm93IGNvdW50cyB0b3dhcmQgREYvQ0ZSL2xlYWQgb25seSBpZiBpdCBjb21wbGV0ZWQgaW5zaWRlIFtmcm9tLHRvXS5cbiAqIExvb2stYmFjay1vbmx5IHJvd3MgKGluX3dpbmRvdz1mYWxzZSwga2VwdCBmb3IgaW5jaWRlbnQgY29ycmVsYXRpb24pIGFyZVxuICogc2tpcHBlZC4gQWJzZW50IGluIGEgZml4dHVyZSDih5IgaW4td2luZG93ICh1bml0IHRlc3RzIG9taXQgdGhlIGZsYWcpLlxuICovXG5mdW5jdGlvbiBpc0luV2luZG93KHJvdzogRGVwbG95Um93KTogYm9vbGVhbiB7XG4gIHJldHVybiByb3cuaW5fd2luZG93ID09IG51bGwgPyB0cnVlIDogKHJvdy5pbl93aW5kb3cgPT09IHRydWUgfHwgcm93LmluX3dpbmRvdyA9PT0gJ3QnKTtcbn1cblxuLyoqIEJ1Y2tldCB0aGUgaW4td2luZG93IHRlcm1pbmFsIGRlcGxveSByb3dzIGJ5IGVudmlyb25tZW50IChERiAvIGRlcGxveS10aW1lIENGUiAvIG1lYXN1cmVkIGxlYWQpLiAqL1xuZnVuY3Rpb24gYWNjdW11bGF0ZURlcGxveXMoZGVwbG95Um93czogRGVwbG95Um93W10pOiBNYXA8c3RyaW5nLCBFbnZBY2M+IHtcbiAgY29uc3QgZW52cyA9IG5ldyBNYXA8c3RyaW5nLCBFbnZBY2M+KCk7XG4gIGZvciAoY29uc3Qgcm93IG9mIGRlcGxveVJvd3MpIHtcbiAgICBjb25zdCBlbnYgPSByb3cuZW52aXJvbm1lbnQ7XG4gICAgaWYgKCFlbnYpIGNvbnRpbnVlO1xuICAgIGlmICghaXNJbldpbmRvdyhyb3cpKSBjb250aW51ZTsgLy8gbG9vay1iYWNrLW9ubHkgcm93IOKGkiBjb3JyZWxhdGlvbiwgbm90IERGL0NGUlxuICAgIGNvbnN0IGEgPSBhY2NGb3IoZW52cywgZW52KTtcbiAgICBpZiAocm93LnN0YXR1cyA9PT0gJ1NVQ0NFRURFRCcpIHtcbiAgICAgIGEuZGVwbG95bWVudHMrKztcbiAgICAgIGEuYXR0ZW1wdHMrKztcbiAgICAgIC8vIE1lYXN1cmVkIGxlYWQgdGltZTogZGVwbG95IGNvbXBsZXRpb24g4oiSIGV4ZWN1dGlvbidzIGVhcmxpZXN0IGNvbW1pdCB0aW1lLlxuICAgICAgLy9cbiAgICAgIC8vIFN0aWxsIGNsYW1wZWQg4omlMCwgdW5saWtlIHRoZSBzaW5nbGUtZXZlbnQgdGltZXN0YW1wIGNoZWNrcyB0aGF0IG5vdyBydW4gYXRcbiAgICAgIC8vIElOR0VTVC4gVGhlIHR3byBpbnN0YW50cyBjb21lIGZyb20gRElGRkVSRU5UIHJvd3Mg4oCUIGBjb21taXRfdGltZXN0YW1wYCBvZmZcbiAgICAgIC8vIHRoZSBQSVBFTElORS9zb3VyY2UgZXZlbnQsIGBjb21wbGV0ZWRfYXRgIG9mZiB0aGUgZGVwbG95IFNUQUdFIGV2ZW50IOKAlFxuICAgICAgLy8gam9pbmVkIG9ubHkgaGVyZSBieSBleGVjdXRpb25faWQsIHNvIG5vIGluZ2VzdC10aW1lIGNoZWNrIGNhbiBzZWUgdGhlXG4gICAgICAvLyBwYWlyLiBBIGNvbW1pdCBkYXRlZCBhZnRlciBpdHMgb3duIGRlcGxveSBtZWFucyBhIHJld3JpdHRlbiBoaXN0b3J5IG9yIGFcbiAgICAgIC8vIHNrZXdlZCBTQ00gY2xvY2ssIGFuZCAwIGlzIHRoZSBob25lc3QgZmxvb3IgZm9yIFwic2hpcHBlZCBpbW1lZGlhdGVseVwiLlxuICAgICAgaWYgKHJvdy5jb21taXRfdHMgIT0gbnVsbCAmJiByb3cuY29tcGxldGVkX2F0ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgZ2FwID0gKERhdGUucGFyc2Uocm93LmNvbXBsZXRlZF9hdCkgLSBEYXRlLnBhcnNlKHJvdy5jb21taXRfdHMpKSAvIDEwMDA7XG4gICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoZ2FwKSkgYS5sZWFkR2Fwcy5wdXNoKE1hdGgubWF4KGdhcCwgMCkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocm93LnN0YXR1cyA9PT0gJ0ZBSUxFRCcpIHtcbiAgICAgIGEuZGVwbG95VGltZUZhaWx1cmVzKys7XG4gICAgICBhLmF0dGVtcHRzKys7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnZzO1xufVxuXG4vKipcbiAqIEluY2lkZW504oaSZGVwbG95IGNvcnJlbGF0aW9uLiBFYWNoIGluY2lkZW50IGlzIGF0dHJpYnV0ZWQgdG8gdGhlIG1vc3QgcmVjZW50XG4gKiBTVUNDRVNTRlVMIGRlcGxveSB0byBpdHMgZW52aXJvbm1lbnQgd2l0aCBgY29tcGxldGVkX2F0IOKJpCBvcGVuZWRfYXRgIHdpdGhpblxuICogYHdpbmRvd0hvdXJzYDsgYW4gdW5jb3JyZWxhdGVkIGluY2lkZW50IGlzIGRyb3BwZWQuIEEgcmVzb2x1dGlvbiBhZnRlciB0aGVcbiAqIHdpbmRvdyBlbmQgKGB0b01zYCkgaXMgcmlnaHQtY2Vuc29yZWQ6IHRoZSBpbmNpZGVudCBzdGlsbCBjb3VudHMsIHVucmVzb2x2ZWQuXG4gKi9cbmZ1bmN0aW9uIGNvcnJlbGF0ZUluY2lkZW50cyhcbiAgZGVwbG95Um93czogRGVwbG95Um93W10sXG4gIGluY2lkZW50Um93czogSW5jaWRlbnRSb3dbXSxcbiAgd2luZG93SG91cnM6IG51bWJlcixcbiAgdG9NczogbnVtYmVyLFxuKTogQ29ycmVsYXRlZEluY2lkZW50W10ge1xuICAvLyBJbmRleCB0aGUgU1VDQ0VTU0ZVTCBkZXBsb3lzIHBlciBlbnYgKGV4ZWN1dGlvbiBpZCArIGNvbXBsZXRpb24gaW5zdGFudCksXG4gIC8vIG5ld2VzdCBmaXJzdC5cbiAgY29uc3Qgd2luZG93TXMgPSB3aW5kb3dIb3VycyAqIDM2MDAgKiAxMDAwO1xuICBjb25zdCBzdWNjZXNzZnVsQnlFbnYgPSBuZXcgTWFwPHN0cmluZywgQXJyYXk8eyBleGVjOiBzdHJpbmc7IGNvbXBsZXRlZE1zOiBudW1iZXIgfT4+KCk7XG4gIGZvciAoY29uc3Qgcm93IG9mIGRlcGxveVJvd3MpIHtcbiAgICBpZiAocm93LnN0YXR1cyAhPT0gJ1NVQ0NFRURFRCcgfHwgIXJvdy5lbnZpcm9ubWVudCB8fCByb3cuZXhlY3V0aW9uX2lkID09IG51bGwgfHwgcm93LmNvbXBsZXRlZF9hdCA9PSBudWxsKSBjb250aW51ZTtcbiAgICBjb25zdCBtcyA9IERhdGUucGFyc2Uocm93LmNvbXBsZXRlZF9hdCk7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobXMpKSBjb250aW51ZTtcbiAgICBjb25zdCBsaXN0ID0gc3VjY2Vzc2Z1bEJ5RW52LmdldChyb3cuZW52aXJvbm1lbnQpID8/IFtdO1xuICAgIGxpc3QucHVzaCh7IGV4ZWM6IHJvdy5leGVjdXRpb25faWQsIGNvbXBsZXRlZE1zOiBtcyB9KTtcbiAgICBzdWNjZXNzZnVsQnlFbnYuc2V0KHJvdy5lbnZpcm9ubWVudCwgbGlzdCk7XG4gIH1cbiAgZm9yIChjb25zdCBsaXN0IG9mIHN1Y2Nlc3NmdWxCeUVudi52YWx1ZXMoKSkgbGlzdC5zb3J0KChhLCBiKSA9PiBiLmNvbXBsZXRlZE1zIC0gYS5jb21wbGV0ZWRNcyk7XG5cbiAgY29uc3QgY29ycmVsYXRlID0gKGVudjogc3RyaW5nLCBvcGVuZWRNczogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gICAgY29uc3QgbGlzdCA9IHN1Y2Nlc3NmdWxCeUVudi5nZXQoZW52KTtcbiAgICBpZiAoIWxpc3QpIHJldHVybiBudWxsO1xuICAgIGZvciAoY29uc3QgZCBvZiBsaXN0KSB7XG4gICAgICBpZiAoZC5jb21wbGV0ZWRNcyA8PSBvcGVuZWRNcyAmJiBvcGVuZWRNcyAtIGQuY29tcGxldGVkTXMgPD0gd2luZG93TXMpIHJldHVybiBkLmV4ZWM7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIGNvbnN0IGNvcnJlbGF0ZWQ6IENvcnJlbGF0ZWRJbmNpZGVudFtdID0gW107XG4gIGZvciAoY29uc3QgaW5jIG9mIGluY2lkZW50Um93cykge1xuICAgIGlmICghaW5jLmVudmlyb25tZW50IHx8IGluYy5vcGVuZWRfYXQgPT0gbnVsbCkgY29udGludWU7XG4gICAgY29uc3Qgb3BlbmVkTXMgPSBEYXRlLnBhcnNlKGluYy5vcGVuZWRfYXQpO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKG9wZW5lZE1zKSkgY29udGludWU7XG4gICAgY29uc3QgZXhlYyA9IGNvcnJlbGF0ZShpbmMuZW52aXJvbm1lbnQsIG9wZW5lZE1zKTtcbiAgICBpZiAoZXhlYyA9PSBudWxsKSBjb250aW51ZTsgLy8gdW5jb3JyZWxhdGVkIOKGkiBub3QgYXR0cmlidXRhYmxlIHRvIGEgZGVwbG95XG4gICAgbGV0IHJlc29sdmVkR2FwOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoaW5jLnJlc29sdmVkX2F0ICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkTXMgPSBEYXRlLnBhcnNlKGluYy5yZXNvbHZlZF9hdCk7XG4gICAgICAvLyBSaWdodC1jZW5zb3Jpbmc6IGEgcmVzb2x1dGlvbiBBRlRFUiB0aGUgd2luZG93IGVuZCAoYHRvYCkgaXMgbm90IG9ic2VydmVkXG4gICAgICAvLyB3aXRoaW4gdGhlIHdpbmRvdyDigJQgdHJlYXQgdGhlIGluY2lkZW50IGFzIHN0aWxsIG9wZW4gKGdhcCBzdGF5cyBudWxsKSBzb1xuICAgICAgLy8gTVRUUiBuZXZlciByZWFkcyB1bmJvdW5kZWQgcGFzdCBgdG9gLiBUaGUgaW5jaWRlbnQgc3RpbGwgY291bnRzIHRvd2FyZCB0aGVcbiAgICAgIC8vIGluY2lkZW50IHRvdGFsICh1bnJlc29sdmVkKSwgaXQganVzdCBjb250cmlidXRlcyBubyByZWNvdmVyeSB0aW1lLlxuICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShyZXNvbHZlZE1zKSAmJiByZXNvbHZlZE1zIDw9IHRvTXMpIHtcbiAgICAgICAgY29uc3QgZyA9IChyZXNvbHZlZE1zIC0gb3BlbmVkTXMpIC8gMTAwMDtcbiAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShnKSkgcmVzb2x2ZWRHYXAgPSBNYXRoLm1heChnLCAwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29ycmVsYXRlZC5wdXNoKHsgZW52aXJvbm1lbnQ6IGluYy5lbnZpcm9ubWVudCwgZXhlYywgcmVzb2x2ZWRHYXAgfSk7XG4gIH1cbiAgcmV0dXJuIGNvcnJlbGF0ZWQ7XG59XG5cbi8qKlxuICogUG9zdC1kZXBsb3kgZmFpbHVyZXMgcGVyIGVudiDigJQgdGhlIERJU1RJTkNUIHNldCBvZiBkZXBsb3kgZXhlY3V0aW9ucyBmbGFnZ2VkXG4gKiBieSBhIG1hbnVhbCBgZmFpbGVkYCBvdXRjb21lIE9SIGEgY29ycmVsYXRlZCBpbmNpZGVudCAoZGVkdXBlZCBieSBleGVjdXRpb24sXG4gKiBzbyBhIGRlcGxveSBmbGFnZ2VkIGJ5IGJvdGggY291bnRzIG9uY2UpLiBBIG1hbnVhbCBvdXRjb21lIHdpdGhvdXQgYW5cbiAqIGV4ZWN1dGlvbiBpZCBzdGlsbCBjb3VudHMgdmlhIGEgcGVyLXJvdyBzZW50aW5lbC4gRXZlcnkgZmxhZ2dlZCBlbnYgaXMgYWRkZWRcbiAqIHRvIGBlbnZzYCBzbyBpdCBhcHBlYXJzIGV2ZW4gd2l0aCBubyBpbi13aW5kb3cgZGVwbG95IGV2ZW50cy5cbiAqL1xuZnVuY3Rpb24gY291bnRQb3N0RGVwbG95RmFpbHVyZXMoXG4gIGVudnM6IE1hcDxzdHJpbmcsIEVudkFjYz4sXG4gIG91dGNvbWVSb3dzOiBPdXRjb21lUm93W10sXG4gIGNvcnJlbGF0ZWQ6IENvcnJlbGF0ZWRJbmNpZGVudFtdLFxuKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gIGNvbnN0IHBvc3REZXBsb3lFeGVjc0J5RW52ID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICBsZXQgc2VudGluZWwgPSAwO1xuICBjb25zdCBmbGFnRm9yID0gKGVudjogc3RyaW5nKTogU2V0PHN0cmluZz4gPT4ge1xuICAgIGxldCBzID0gcG9zdERlcGxveUV4ZWNzQnlFbnYuZ2V0KGVudik7XG4gICAgaWYgKCFzKSB7IHMgPSBuZXcgU2V0PHN0cmluZz4oKTsgcG9zdERlcGxveUV4ZWNzQnlFbnYuc2V0KGVudiwgcyk7IH1cbiAgICByZXR1cm4gcztcbiAgfTtcbiAgZm9yIChjb25zdCBvIG9mIG91dGNvbWVSb3dzKSB7XG4gICAgaWYgKG8ub3V0Y29tZSAhPT0gJ2ZhaWxlZCcgfHwgIW8uZW52aXJvbm1lbnQpIGNvbnRpbnVlO1xuICAgIGZsYWdGb3Ioby5lbnZpcm9ubWVudCkuYWRkKG8uZXhlY3V0aW9uX2lkID8/IGBtYW51YWwtJHtzZW50aW5lbCsrfWApO1xuICAgIGFjY0ZvcihlbnZzLCBvLmVudmlyb25tZW50KTtcbiAgfVxuICBmb3IgKGNvbnN0IGNpIG9mIGNvcnJlbGF0ZWQpIHtcbiAgICBmbGFnRm9yKGNpLmVudmlyb25tZW50KS5hZGQoY2kuZXhlYyk7XG4gICAgYWNjRm9yKGVudnMsIGNpLmVudmlyb25tZW50KTtcbiAgfVxuICBjb25zdCBwb3N0RGVwbG95QnlFbnYgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IFtlbnYsIHNldF0gb2YgcG9zdERlcGxveUV4ZWNzQnlFbnYpIHBvc3REZXBsb3lCeUVudi5zZXQoZW52LCBzZXQuc2l6ZSk7XG4gIHJldHVybiBwb3N0RGVwbG95QnlFbnY7XG59XG5cbi8qKiBQZXItZW52aXJvbm1lbnQgREYgLyBDRlIgLyBsZWFkLXRpbWUgcm93cywgcHJvZHVjdGlvbiBmaXJzdC4gKi9cbmZ1bmN0aW9uIGJ1aWxkRW52TWV0cmljcyhcbiAgZW52czogTWFwPHN0cmluZywgRW52QWNjPixcbiAgcG9zdERlcGxveUJ5RW52OiBNYXA8c3RyaW5nLCBudW1iZXI+LFxuICBkYXlzOiBudW1iZXIsXG4gIHJlcXVlc3RlZEVudjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogRG9yYUVudk1ldHJpY3NbXSB7XG4gIHJldHVybiBbLi4uZW52cy5lbnRyaWVzKCldXG4gICAgLy8gVGhlIGRlcGxveSBhbmQgaW5jaWRlbnQgc2NhbnMgYWRtaXQgUFJPRFVDVElPTiBhbG9uZ3NpZGUgYSByZXF1ZXN0ZWRcbiAgICAvLyBlbnZpcm9ubWVudCBzbyBNVFRSIGNhbiBjb3JyZWxhdGUgcHJvZHVjdGlvbiBpbmNpZGVudHMgKHNlZVxuICAgIC8vIGBzY2FuRW52Q2xhdXNlYCkuIFRoYXQgcHJvZHVjdGlvbiByb3cgaXMgcGx1bWJpbmcgZm9yIE1UVFIsIG5vdCBzb21ldGhpbmdcbiAgICAvLyB0aGUgY2FsbGVyIGFza2VkIHRvIHNlZSDigJQgcmVwb3J0IG9ubHkgdGhlIGVudmlyb25tZW50IHRoYXQgd2FzIHJlcXVlc3RlZC5cbiAgICAuZmlsdGVyKChbZW52aXJvbm1lbnRdKSA9PiAhcmVxdWVzdGVkRW52IHx8IGVudmlyb25tZW50ID09PSByZXF1ZXN0ZWRFbnYpXG4gICAgLm1hcCgoW2Vudmlyb25tZW50LCBhXSkgPT4ge1xuICAgICAgY29uc3QgcG9zdERlcGxveUZhaWx1cmVzID0gcG9zdERlcGxveUJ5RW52LmdldChlbnZpcm9ubWVudCkgPz8gMDtcbiAgICAgIGNvbnN0IHJhd1BlckRheSA9IGEuZGVwbG95bWVudHMgLyBkYXlzO1xuICAgICAgY29uc3QgbnVtZXJhdG9yID0gYS5kZXBsb3lUaW1lRmFpbHVyZXMgKyBwb3N0RGVwbG95RmFpbHVyZXM7XG4gICAgICAvLyBDbGFtcCB0byBbMCwxMDBdOiBwb3N0LWRlcGxveSBmYWlsdXJlcyBjYW4gY29ycmVsYXRlIHRvIGEgZGVwbG95IHRoYXRcbiAgICAgIC8vIGNvbXBsZXRlZCBqdXN0IGJlZm9yZSB0aGUgd2luZG93IChrZXB0IGZvciBjb3JyZWxhdGlvbiksIHNvIHRoZSBudW1lcmF0b3JcbiAgICAgIC8vIGNhbiB0cmFuc2llbnRseSBleGNlZWQgaW4td2luZG93IGF0dGVtcHRzIOKAlCBhIENGUiA+IDEwMCUgaXMgbmV2ZXIgdmFsaWQuXG4gICAgICBjb25zdCByYXdSYXRlID0gYS5hdHRlbXB0cyA+IDAgPyBNYXRoLm1pbigxMDAsIChudW1lcmF0b3IgLyBhLmF0dGVtcHRzKSAqIDEwMCkgOiAwO1xuICAgICAgY29uc3QgbHRNZWRpYW4gPSBtZWRpYW4oYS5sZWFkR2Fwcyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgZGVwbG95bWVudEZyZXF1ZW5jeToge1xuICAgICAgICAgIGRlcGxveW1lbnRzOiBhLmRlcGxveW1lbnRzLFxuICAgICAgICAgIHBlckRheTogcm91bmQocmF3UGVyRGF5LCAyKSxcbiAgICAgICAgICBsZXZlbDogZG9yYUxldmVsRm9yRnJlcXVlbmN5KHJhd1BlckRheSwgYS5kZXBsb3ltZW50cyksXG4gICAgICAgIH0sXG4gICAgICAgIGNoYW5nZUZhaWx1cmVSYXRlOiB7XG4gICAgICAgICAgcmF0ZTogcm91bmQocmF3UmF0ZSwgMSksXG4gICAgICAgICAgZGVwbG95VGltZUZhaWx1cmVzOiBhLmRlcGxveVRpbWVGYWlsdXJlcyxcbiAgICAgICAgICBwb3N0RGVwbG95RmFpbHVyZXMsXG4gICAgICAgICAgYXR0ZW1wdHM6IGEuYXR0ZW1wdHMsXG4gICAgICAgICAgbGV2ZWw6IGRvcmFMZXZlbEZvckNoYW5nZUZhaWx1cmUocmF3UmF0ZSwgYS5hdHRlbXB0cyksXG4gICAgICAgIH0sXG4gICAgICAgIGxlYWRUaW1lOiB7XG4gICAgICAgICAgZGVwbG95bWVudHM6IGEubGVhZEdhcHMubGVuZ3RoLFxuICAgICAgICAgIG1lZGlhblNlY29uZHM6IGx0TWVkaWFuICE9IG51bGwgPyByb3VuZChsdE1lZGlhbiwgMSkgOiBudWxsLFxuICAgICAgICAgIC4uLnRhaWxzKGEubGVhZEdhcHMpLFxuICAgICAgICAgIC8vIFNjb3JlZCBvZmYgdGhlIE1FRElBTiBvbmx5IOKAlCB0aGUgdGFpbHMgYXJlIHJlcG9ydGVkLCBub3QgYmFuZGVkLlxuICAgICAgICAgIGxldmVsOiBkb3JhTGV2ZWxGb3JMZWFkVGltZShsdE1lZGlhbiksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0pXG4gICAgLnNvcnQoKHgsIHkpID0+IHtcbiAgICAgIGlmICh4LmVudmlyb25tZW50ID09PSBIRUFETElORV9FTlYpIHJldHVybiAtMTtcbiAgICAgIGlmICh5LmVudmlyb25tZW50ID09PSBIRUFETElORV9FTlYpIHJldHVybiAxO1xuICAgICAgcmV0dXJuIHguZW52aXJvbm1lbnQubG9jYWxlQ29tcGFyZSh5LmVudmlyb25tZW50KTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBwOTAvcDk1IG9mIGEgZ2FwIHNhbXBsZSwgcm91bmRlZCBsaWtlIHRoZSBtZWRpYW4gYmVzaWRlIHRoZW0uIE9uZSBoZWxwZXIgc29cbiAqIGxlYWQgdGltZSBhbmQgTVRUUiBjYW5ub3QgZHJpZnQgaW4gaG93IHRoZXkgcmVwb3J0IHRoZWlyIHRhaWxzLlxuICovXG5mdW5jdGlvbiB0YWlscyhnYXBzOiBudW1iZXJbXSk6IHsgcDkwU2Vjb25kczogbnVtYmVyIHwgbnVsbDsgcDk1U2Vjb25kczogbnVtYmVyIHwgbnVsbCB9IHtcbiAgY29uc3QgcDkwID0gcGVyY2VudGlsZShnYXBzLCA5MCk7XG4gIGNvbnN0IHA5NSA9IHBlcmNlbnRpbGUoZ2FwcywgOTUpO1xuICByZXR1cm4ge1xuICAgIHA5MFNlY29uZHM6IHA5MCAhPSBudWxsID8gcm91bmQocDkwLCAxKSA6IG51bGwsXG4gICAgcDk1U2Vjb25kczogcDk1ICE9IG51bGwgPyByb3VuZChwOTUsIDEpIDogbnVsbCxcbiAgfTtcbn1cblxuLyoqXG4gKiBNVFRSIOKAlCBQUk9EVUNUSU9OLU9OTFksIGZyb20gQk9USCBzb3VyY2VzLiBJbmNpZGVudHMgdGFrZSBwcmVjZWRlbmNlOiBhXG4gKiBwcm9kdWN0aW9uIGluY2lkZW50IGNvcnJlbGF0ZWQgdG8gYSBkZXBsb3kgY29udHJpYnV0ZXMgdGhlIHJlYWwgcmVjb3ZlcnlcbiAqIChgcmVzb2x2ZWRfYXQg4oiSIG9wZW5lZF9hdGApLCBhbmQgYW55IG1hbnVhbCBvdXRjb21lIG9uIHRoZSBTQU1FIGRlcGxveSBpc1xuICogc2tpcHBlZC4gTWFudWFsIG91dGNvbWVzIG9uIG90aGVyIGRlcGxveXMgY291bnQgYXMgcmVjb3JkZWQgKGBmYWlsZWRgIOKGkiBhblxuICogaW5jaWRlbnQ7IGByZXN0b3JlZGAg4oaSIGEgcmVjb3ZlcnkgZ2FwIG9mIGByZXN0b3JlZCDiiJIgZGVwbG95ZWRgKS5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZU10dHIoXG4gIGNvcnJlbGF0ZWQ6IENvcnJlbGF0ZWRJbmNpZGVudFtdLFxuICBtdHRyUm93czogQXJyYXk8TXR0clBhaXJSb3cgJiB7IG91dGNvbWU6IHN0cmluZyB9Pixcbik6IERvcmFNZXRyaWNzWydtZWFuVGltZVRvUmVzdG9yZSddIHtcbiAgbGV0IGluY2lkZW50cyA9IDAsIHJlc3RvcmVkID0gMDtcbiAgY29uc3QgbXR0ckdhcHM6IG51bWJlcltdID0gW107XG4gIC8vIEV4ZWN1dGlvbnMgYWxyZWFkeSBhdHRyaWJ1dGVkIHRvIGEgcHJvZHVjdGlvbiBpbmNpZGVudCAocHJlY2VkZW5jZSBndWFyZCkuXG4gIGNvbnN0IGluY2lkZW50RXhlY3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBjaSBvZiBjb3JyZWxhdGVkKSB7XG4gICAgaWYgKGNpLmVudmlyb25tZW50ICE9PSBIRUFETElORV9FTlYpIGNvbnRpbnVlOyAvLyBNVFRSIGlzIHByb2R1Y3Rpb24tb25seVxuICAgIGluY2lkZW50cysrO1xuICAgIGluY2lkZW50RXhlY3MuYWRkKGNpLmV4ZWMpO1xuICAgIGlmIChjaS5yZXNvbHZlZEdhcCAhPSBudWxsKSB7IHJlc3RvcmVkKys7IG10dHJHYXBzLnB1c2goY2kucmVzb2x2ZWRHYXApOyB9XG4gIH1cbiAgZm9yIChjb25zdCBtIG9mIG10dHJSb3dzKSB7XG4gICAgLy8gSW5jaWRlbnQgcHJlY2VkZW5jZTogZG9uJ3QgZG91YmxlLWNvdW50IGEgZGVwbG95IGFscmVhZHkgZmxhZ2dlZCBieSBhbiBpbmNpZGVudC5cbiAgICBpZiAobS5leGVjdXRpb25faWQgIT0gbnVsbCAmJiBpbmNpZGVudEV4ZWNzLmhhcyhtLmV4ZWN1dGlvbl9pZCkpIGNvbnRpbnVlO1xuICAgIGlmIChtLm91dGNvbWUgPT09ICdmYWlsZWQnKSB7IGluY2lkZW50cysrOyBjb250aW51ZTsgfVxuICAgIGlmIChtLm91dGNvbWUgPT09ICdyZXN0b3JlZCcpIHtcbiAgICAgIHJlc3RvcmVkKys7XG4gICAgICBpZiAobS5yZXN0b3JlZF9hdCAhPSBudWxsICYmIG0uZGVwbG95ZWRfYXQgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBnYXAgPSAoRGF0ZS5wYXJzZShtLnJlc3RvcmVkX2F0KSAtIERhdGUucGFyc2UobS5kZXBsb3llZF9hdCkpIC8gMTAwMDtcbiAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShnYXApKSBtdHRyR2Fwcy5wdXNoKE1hdGgubWF4KGdhcCwgMCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBtdHRyTWVkaWFuID0gbWVkaWFuKG10dHJHYXBzKTtcbiAgcmV0dXJuIHtcbiAgICBpbmNpZGVudHMsXG4gICAgcmVzdG9yZWQsXG4gICAgbWVkaWFuU2Vjb25kczogbXR0ck1lZGlhbiAhPSBudWxsID8gcm91bmQobXR0ck1lZGlhbiwgMSkgOiBudWxsLFxuICAgIC4uLnRhaWxzKG10dHJHYXBzKSxcbiAgICBsZXZlbDogZG9yYUxldmVsRm9yUmVzdG9yZShtdHRyTWVkaWFuKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaGFwZSB0aGUgcmF3IERPUkEgc2NhbiByb3dzIGludG8gdGhlIHB1YmxpYyB7QGxpbmsgRG9yYU1ldHJpY3N9OiBwZXItZW52XG4gKiBERiAvIENGUiAvIGxlYWQgdGltZSAocG9zdC1kZXBsb3kgZmFpbHVyZXMgZm9sZGVkIGluKSwgcHJvZHVjdGlvbiBNVFRSIGZyb21cbiAqIGluY2lkZW50cyArIG1hbnVhbCBvdXRjb21lcywgYW5kIGRlcGxveSBjb3ZlcmFnZSDigJQgYWxsIGNyb3NzLXNvdXJjZSBtZWRpYW5zXG4gKiBvdmVyIGRlbHRhcyBjbGFtcGVkIOKJpTAuXG4gKi9cbmZ1bmN0aW9uIHNoYXBlRG9yYShcbiAgZGVwbG95Um93czogRGVwbG95Um93W10sXG4gIG91dGNvbWVSb3dzOiBPdXRjb21lUm93W10sXG4gIG10dHJSb3dzOiBBcnJheTxNdHRyUGFpclJvdyAmIHsgb3V0Y29tZTogc3RyaW5nIH0+LFxuICBjb3ZlcmFnZVJvdzogQ292ZXJhZ2VSb3cgfCB1bmRlZmluZWQsXG4gIGluY2lkZW50Um93czogSW5jaWRlbnRSb3dbXSxcbiAgZnJvbTogc3RyaW5nLFxuICB0bzogc3RyaW5nLFxuICBmaWx0ZXJzOiB7IHBpcGVsaW5lSWQ/OiBzdHJpbmc7IGVudmlyb25tZW50Pzogc3RyaW5nIH0sXG4gIHdpbmRvd0hvdXJzOiBudW1iZXIgPSBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSUyxcbik6IERvcmFNZXRyaWNzIHtcbiAgLy8gV2luZG93IGxlbmd0aCBpbiBkYXlzIChmbG9vcmVkIGF0IDEgc28gYSBzdWItZGF5IHdpbmRvdyB5aWVsZHMgdGhlIGNvdW50IGFzXG4gIC8vIHRoZSByYXRlLCBuZXZlciAvMCBvciBhbiBleHRyYXBvbGF0aW9uKS4gR3VhcmQgdW5wYXJzZWFibGUgZGF0ZXMg4oaSIDEgZGF5LlxuICBjb25zdCBzcGFuRGF5cyA9IChEYXRlLnBhcnNlKHRvKSAtIERhdGUucGFyc2UoZnJvbSkpIC8gODY0MDAwMDA7XG4gIGNvbnN0IGRheXMgPSBOdW1iZXIuaXNGaW5pdGUoc3BhbkRheXMpID8gTWF0aC5tYXgoc3BhbkRheXMsIDEpIDogMTtcbiAgLy8gV2luZG93IGVuZCBpbnN0YW50IGZvciBNVFRSIHJpZ2h0LWNlbnNvcmluZyAoYSByZXNvbHV0aW9uIGFmdGVyIGB0b2AgaXNcbiAgLy8gdW5vYnNlcnZlZCkuICtJbmZpbml0eSB3aGVuIGB0b2AgaXMgdW5wYXJzZWFibGUg4oeSIG5vIGNlbnNvcmluZyAoZmFpbC1vcGVuKS5cbiAgY29uc3QgdG9QYXJzZWQgPSBEYXRlLnBhcnNlKHRvKTtcbiAgY29uc3QgdG9NcyA9IE51bWJlci5pc0Zpbml0ZSh0b1BhcnNlZCkgPyB0b1BhcnNlZCA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcblxuICBjb25zdCBlbnZzID0gYWNjdW11bGF0ZURlcGxveXMoZGVwbG95Um93cyk7XG4gIGNvbnN0IGNvcnJlbGF0ZWQgPSBjb3JyZWxhdGVJbmNpZGVudHMoZGVwbG95Um93cywgaW5jaWRlbnRSb3dzLCB3aW5kb3dIb3VycywgdG9Ncyk7XG4gIGNvbnN0IHBvc3REZXBsb3lCeUVudiA9IGNvdW50UG9zdERlcGxveUZhaWx1cmVzKGVudnMsIG91dGNvbWVSb3dzLCBjb3JyZWxhdGVkKTtcblxuICBjb25zdCByZWdpc3RlcmVkID0gTnVtYmVyKGNvdmVyYWdlUm93Py5yZWdpc3RlcmVkKSB8fCAwO1xuICBjb25zdCBkZXBsb3lpbmcgPSBOdW1iZXIoY292ZXJhZ2VSb3c/LmRlcGxveWluZykgfHwgMDtcblxuICByZXR1cm4ge1xuICAgIHdpbmRvdzogeyBmcm9tLCB0byB9LFxuICAgIGZpbHRlcnM6IHsgcGlwZWxpbmVJZDogZmlsdGVycy5waXBlbGluZUlkID8/IG51bGwsIGVudmlyb25tZW50OiBmaWx0ZXJzLmVudmlyb25tZW50ID8/IG51bGwgfSxcbiAgICBoZWFkbGluZTogSEVBRExJTkVfRU5WLFxuICAgIGVudmlyb25tZW50czogYnVpbGRFbnZNZXRyaWNzKGVudnMsIHBvc3REZXBsb3lCeUVudiwgZGF5cywgZmlsdGVycy5lbnZpcm9ubWVudCksXG4gICAgbWVhblRpbWVUb1Jlc3RvcmU6IGNvbXB1dGVNdHRyKGNvcnJlbGF0ZWQsIG10dHJSb3dzKSxcbiAgICBjb3ZlcmFnZToge1xuICAgICAgcmVnaXN0ZXJlZCxcbiAgICAgIGRlcGxveWluZyxcbiAgICAgIHdpdGhvdXREZXBsb3lzOiBNYXRoLm1heChyZWdpc3RlcmVkIC0gZGVwbG95aW5nLCAwKSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIERPUkEgdHJlbmQg4oCUIGRlcGxveW1lbnQgZnJlcXVlbmN5ICsgZGVwbG95LXRpbWUgY2hhbmdlLWZhaWx1cmUgcmF0ZVxuICogYnVja2V0ZWQgYnkgYGludGVydmFsYCAoZGF5L3dlZWsvbW9udGgpIGZvciBhIHNwYXJrbGluZS4gRGVwbG95LWJhc2lzIGxpa2VcbiAqIGdldERvcmFNZXRyaWNzOiBidWNrZXRzIHRlcm1pbmFsIGRlcGxveS1zdGFnZSBleGVjdXRpb25zIG9uIHRoZWlyXG4gKiBgY29tcGxldGVkX2F0YC4gU2hhcmVzIHRoZSBvcmcvcm9sbHVwICsgcGlwZWxpbmVJZC9lbnZpcm9ubWVudCBzY29waW5nLiBNVFRSLFxuICogbGVhZCB0aW1lLCBhbmQgcG9zdC1kZXBsb3kgQ0ZSIGFyZSBpbnRlbnRpb25hbGx5IG9taXR0ZWQgKHRvbyBoZWF2eSB0byBidWNrZXQpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RG9yYVRyZW5kKFxuICBvcmdJZDogc3RyaW5nLFxuICBpbnRlcnZhbDogc3RyaW5nLFxuICBmcm9tOiBzdHJpbmcsXG4gIHRvOiBzdHJpbmcsXG4gIG9yZ0lkcz86IHN0cmluZ1tdLFxuICBvcHRzOiBEb3JhT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxEb3JhVHJlbmRQb2ludFtdPiB7XG4gIGFzc2VydFJlcG9ydEludGVydmFsKGludGVydmFsKTtcbiAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gb3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gIGNvbnN0IHsgcGlwZWxpbmVJZCwgZW52aXJvbm1lbnQsIHR6ID0gJ1VUQycsIHdlZWtTdGFydCA9ICdtb25kYXknIH0gPSBvcHRzO1xuICBjb25zdCBwaXBlbGluZUNsYXVzZSA9IHBpcGVsaW5lSWQgPyBzcWxgQU5EIGUucGlwZWxpbmVfaWQgPSAke3BpcGVsaW5lSWR9YCA6IHNxbGBgO1xuICBjb25zdCBlbnZDbGF1c2UgPSBlbnZpcm9ubWVudCA/IHNxbGBBTkQgZS5lbnZpcm9ubWVudCA9ICR7ZW52aXJvbm1lbnR9YCA6IHNxbGBgO1xuICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICBXSVRIIGRlcGxveXMgQVMgKFxuICAgICAgICAtLSBQRVItRVhFQ1VUSU9OIGRlcGxveSB1bml0OiBvbmUgcm93IHBlciAoZW52aXJvbm1lbnQsIGV4ZWN1dGlvbiksXG4gICAgICAgIC0tIGV2ZXJ5IGRlcGxveSBTVEFHRSB0byB0aGF0IGVudiB3aXRoaW4gdGhlIGV4ZWN1dGlvbiByb2xsZWQgdXAgdG8gYVxuICAgICAgICAtLSBzaW5nbGUgdGVybWluYWwgc3RhdHVzIOKAlCBOT1Qgb25lIHJvdyBwZXIgc3RhZ2UuXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICR7dGVybWluYWxTdGF0dXNSb2xsdXB9IEFTIHN0YXR1cyxcbiAgICAgICAgICBNQVgoZS5jb21wbGV0ZWRfYXQpIEFTIGNvbXBsZXRlZF9hdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLmVudmlyb25tZW50IElTIE5PVCBOVUxMXG4gICAgICAgICAgJHtwaXBlbGluZUNsYXVzZX0gJHtlbnZDbGF1c2V9XG4gICAgICAgICAgQU5EIGUuY29tcGxldGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLmNvbXBsZXRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgZS5lbnZpcm9ubWVudCwgZS5leGVjdXRpb25faWRcbiAgICAgIClcbiAgICAgIFNFTEVDVFxuICAgICAgICAke3BlcmlvZEJ1Y2tldChpbnRlcnZhbCwgc3FsYGNvbXBsZXRlZF9hdGAsIHR6LCB3ZWVrU3RhcnQpfTo6dGV4dCBBUyBwZXJpb2QsXG4gICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzID0gJ1NVQ0NFRURFRCcpOjppbnQgQVMgZGVwbG95bWVudHMsXG4gICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyBJTiAoJ1NVQ0NFRURFRCcsICdGQUlMRUQnKSk6OmludCBBUyB0b3RhbCxcbiAgICAgICAgLS0gcXVvdGVkIGFsaWFzIHNvIHRoZSByYXcgcm93IGtleSBpcyBleGFjdGx5IHRoZSBEb3JhVHJlbmRQb2ludCBmaWVsZFxuICAgICAgICBDT0FMRVNDRShST1VORChDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdGQUlMRUQnKTo6bnVtZXJpY1xuICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcpKSwgMCkgKiAxMDAsIDEpLCAwKTo6ZmxvYXQgQVMgXCJjaGFuZ2VGYWlsdXJlUGN0XCJcbiAgICAgIEZST00gZGVwbG95c1xuICAgICAgR1JPVVAgQlkgcGVyaW9kIE9SREVSIEJZIHBlcmlvZFxuICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxEb3JhVHJlbmRQb2ludD4oci5yb3dzKSkpO1xuICAvLyBUaGUgYnVja2V0aW5nIHNldHRpbmdzIGJlbG9uZyBpbiB0aGUga2V5OiB0aGV5IGNoYW5nZSB3aGljaCBkYXlzIGxhbmQgaW4gd2hpY2hcbiAgLy8gcGVyaW9kLCBzbyBhIENoaWNhZ28gYW5zd2VyIG11c3QgbmV2ZXIgYmUgc2VydmVkIHRvIGEgVVRDIHJlcXVlc3QuXG4gIGNvbnN0IGtleSA9IGAke29yZ0lkfTpkb3JhLXRyZW5kOiR7aW50ZXJ2YWx9OiR7ZnJvbX06JHt0b306JHtwaXBlbGluZUlkID8/ICcnfToke2Vudmlyb25tZW50ID8/ICcnfToke2J1Y2tldEtleSh0eiwgd2Vla1N0YXJ0KX1gO1xuICByZXR1cm4gcnVuUmVwb3J0KGtleSwgbXVsdGksIGV4ZWMpO1xufVxuXG4vKipcbiAqIFBlci1waXBlbGluZSBCVUlMRCBIRUFMVEgg4oCUIGEgc3RhbmRhcmQgKE5PVCBgYWR2YW5jZWRfcmVwb3J0aW5nYClcbiAqIHBlci1zdGFnZSBicmVha2Rvd24gZm9yIG9uZSBwaXBlbGluZSBvdmVyIGEgW2Zyb20sdG9dIHdpbmRvdy4gQWdncmVnYXRlcyB0aGVcbiAqIGV4aXN0aW5nIGBwaXBlbGluZV9ldmVudHNgIFNUQUdFIHJvd3M6IGVhY2ggc3RhZ2UgaXMgcm9sbGVkIHVwIHBlciBleGVjdXRpb25cbiAqIHRvIGEgdGVybWluYWwgc3RhdHVzIChGQUlMRUQgd2lucywgdGhlbiBTVUNDRUVERUQpICsgaXRzIG1heCBkdXJhdGlvbiwgdGhlblxuICogZ3JvdXBlZCBwZXIgc3RhZ2UgaW50byBydW4vc3VjY2Vzcy9mYWlsdXJlIGNvdW50cywgYSBzdWNjZXNzIHJhdGUsIGFuZFxuICogZHVyYXRpb24gcGVyY2VudGlsZXMgKHA1MC9wOTAvcDk5KS4gVG90YWxzIHN1bSBhY3Jvc3Mgc3RhZ2VzLiBPcmctc2NvcGVkIHZpYVxuICogdGhlIHBpcGVsaW5lIGpvaW4gKGBwLm9yZ19pZCAke3ByZWR9YCkgKyByb2xsdXAtYXdhcmUgbGlrZSB0aGUgc2libGluZyByZXBvcnRzO1xuICogYSBwaXBlbGluZUlkIG93bmVkIGJ5IGFub3RoZXIgb3JnIHJldHVybnMgYW4gZW1wdHkgYnJlYWtkb3duLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QnVpbGRIZWFsdGgoXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHBpcGVsaW5lSWQ6IHN0cmluZyxcbiAgZnJvbTogc3RyaW5nLFxuICB0bzogc3RyaW5nLFxuICBvcmdJZHM/OiBzdHJpbmdbXSxcbik6IFByb21pc2U8QnVpbGRIZWFsdGg+IHtcbiAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gb3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgY29uc3Qgcm93cyA9IGRyaXp6bGVSb3dzPEJ1aWxkSGVhbHRoU3RhZ2U+KChhd2FpdCB0eC5leGVjdXRlKHNxbGBcbiAgICAgIFdJVEggc3RhZ2VfcnVucyBBUyAoXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuc3RhZ2VfbmFtZSBBUyBzdGFnZSxcbiAgICAgICAgICAke3Rlcm1pbmFsU3RhdHVzUm9sbHVwfSBBUyBzdGF0dXMsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpIEFTIGR1cmF0aW9uX21zXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUucGlwZWxpbmVfaWQgPSAke3BpcGVsaW5lSWR9XG4gICAgICAgICAgQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuc3RhZ2VfbmFtZSBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgZS5zdGFnZV9uYW1lLCBlLmV4ZWN1dGlvbl9pZFxuICAgICAgKVxuICAgICAgU0VMRUNUXG4gICAgICAgIHN0YWdlLFxuICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHJ1bnMsXG4gICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzID0gJ1NVQ0NFRURFRCcpOjppbnQgQVMgc3VjY2Vzc2VzLFxuICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWx1cmVzLFxuICAgICAgICBDT0FMRVNDRShST1VORChDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdTVUNDRUVERUQnKTo6bnVtZXJpY1xuICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSksIDApOjpmbG9hdCBBUyBcInN1Y2Nlc3NSYXRlXCIsXG4gICAgICAgIFBFUkNFTlRJTEVfQ09OVCgwLjUpIFdJVEhJTiBHUk9VUCAoT1JERVIgQlkgZHVyYXRpb25fbXMpOjppbnQgQVMgXCJwNTBNc1wiLFxuICAgICAgICBQRVJDRU5USUxFX0NPTlQoMC45KSBXSVRISU4gR1JPVVAgKE9SREVSIEJZIGR1cmF0aW9uX21zKTo6aW50IEFTIFwicDkwTXNcIixcbiAgICAgICAgUEVSQ0VOVElMRV9DT05UKDAuOTkpIFdJVEhJTiBHUk9VUCAoT1JERVIgQlkgZHVyYXRpb25fbXMpOjppbnQgQVMgXCJwOTlNc1wiXG4gICAgICBGUk9NIHN0YWdlX3J1bnNcbiAgICAgIFdIRVJFIHN0YXR1cyBJTiAoJ1NVQ0NFRURFRCcsICdGQUlMRUQnKVxuICAgICAgR1JPVVAgQlkgc3RhZ2VcbiAgICAgIE9SREVSIEJZIHJ1bnMgREVTQywgc3RhZ2VcbiAgICBgKSkucm93cyk7XG5cbiAgICAvLyBUb3RhbHMgc3VtIGFjcm9zcyBzdGFnZXMgKHRvdGFsIHN0YWdlLXJ1bnMgLyBzdGFnZS1mYWlsdXJlcyBpbiB0aGUgd2luZG93KS5cbiAgICBsZXQgcnVucyA9IDAsIGZhaWx1cmVzID0gMDtcbiAgICBmb3IgKGNvbnN0IHMgb2Ygcm93cykgeyBydW5zICs9IHMucnVuczsgZmFpbHVyZXMgKz0gcy5mYWlsdXJlczsgfVxuICAgIGNvbnN0IGZhaWx1cmVSYXRlID0gcnVucyA+IDAgPyByb3VuZCgoZmFpbHVyZXMgLyBydW5zKSAqIDEwMCwgMSkgOiAwO1xuICAgIHJldHVybiB7IHN0YWdlczogcm93cywgdG90YWxzOiB7IHJ1bnMsIGZhaWx1cmVzLCBmYWlsdXJlUmF0ZSB9IH07XG4gIH0pO1xuICByZXR1cm4gcnVuUmVwb3J0KGAke29yZ0lkfTpidWlsZC1oZWFsdGg6JHtwaXBlbGluZUlkfToke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xufVxuXG4vLyDilIDilIAgQ2F0ZWdvcnkgMjogUGx1Z2luIEludmVudG9yeSAmIEJ1aWxkcyDilIDilIBcblxuLyoqIFBsdWdpbiBzdW1tYXJ5IOKAlCBjb3VudHMgYW5kIGJyZWFrZG93bnMuXG4gKiAgSU5URU5USU9OQUxMWSBTSU5HTEUtT1JHIChubyByb2xsdXApOiBwbHVnaW4gaW52ZW50b3J5IGlzIGFuIG9yZy1vd25lZFxuICogIGFzc2V0IGNvdW50LCBub3QgYW4gZXhlY3V0aW9uL2J1aWxkIGFjdGl2aXR5IHJlcG9ydCwgc28gYSBwYXJlbnQncyB2aWV3IGlzXG4gKiAgaXRzIG93biBwbHVnaW5zIOKAlCB0ZWFtcyBtYW5hZ2UgdGhlaXIgb3duIGludmVudG9yeS4gU2luZ2xlIGA9ICRvcmdgIHNjb3BlLiAqL1xuIl19
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What KIND of thing broke.
|
|
3
|
+
*
|
|
4
|
+
* "34 failures this week" is not actionable. "18 of them were dependency
|
|
5
|
+
* resolution, and they are all in one pipeline" is. That is the whole reason this
|
|
6
|
+
* exists — and it is also why the classification happens at INGEST rather than at
|
|
7
|
+
* read time: error text is scrubbed of AWS identifiers at the persistence boundary
|
|
8
|
+
* and eventually swept by retention, so a category derived later would have
|
|
9
|
+
* nothing left to read.
|
|
10
|
+
*
|
|
11
|
+
* THE RULES ARE DATA. A category is a provider/action match plus an ordered list
|
|
12
|
+
* of patterns over the error text, in one table below, so the taxonomy can grow
|
|
13
|
+
* from real misses without touching the classifier. Anything unmatched lands in
|
|
14
|
+
* `other` and is counted, so the size of `other` is the measure of how good the
|
|
15
|
+
* rules are.
|
|
16
|
+
*
|
|
17
|
+
* THE CATEGORIES OVERLAP THE PLUGIN-BUILD TAXONOMY ON PURPOSE. A dependency
|
|
18
|
+
* failure is a dependency failure whether it happened building a plugin or running
|
|
19
|
+
* one; two vocabularies for the same thing would make the report and the build
|
|
20
|
+
* queue disagree about the same incident.
|
|
21
|
+
*
|
|
22
|
+
* WHAT THE AI EVER SEES is the category, never the raw error. Error text from a
|
|
23
|
+
* customer's build is the last thing that should reach a model.
|
|
24
|
+
*/
|
|
25
|
+
import type { FailureCategory } from '../../database/schema/reporting-analytics.js';
|
|
26
|
+
/**
|
|
27
|
+
* The category for a failed action.
|
|
28
|
+
*
|
|
29
|
+
* `null` for anything that is not a failure — the caller stores nothing rather
|
|
30
|
+
* than labelling a success, so a category's presence always means "this broke".
|
|
31
|
+
*/
|
|
32
|
+
export declare function classifyFailure(input: {
|
|
33
|
+
status: string;
|
|
34
|
+
errorMessage?: string | null;
|
|
35
|
+
actionName?: string | null;
|
|
36
|
+
stageName?: string | null;
|
|
37
|
+
}): FailureCategory | null;
|
|
38
|
+
/**
|
|
39
|
+
* A human label for a category, for the report and the UI.
|
|
40
|
+
*
|
|
41
|
+
* Phrased as what broke rather than as an enum: a manager reading
|
|
42
|
+
* "Dependency resolution" understands it, and `integration_test` does not.
|
|
43
|
+
*/
|
|
44
|
+
export declare const FAILURE_CATEGORY_LABELS: Record<FailureCategory, string>;
|
|
45
|
+
/**
|
|
46
|
+
* Whether a category is something the TEAM can act on, as opposed to something
|
|
47
|
+
* that happened to them.
|
|
48
|
+
*
|
|
49
|
+
* Used by the failure-analysis section to separate the two, because a week whose
|
|
50
|
+
* failures were all cloud throttling is a different conversation from one whose
|
|
51
|
+
* failures were all broken tests — and presenting them in one ranked list invites
|
|
52
|
+
* exactly the wrong conclusion.
|
|
53
|
+
*/
|
|
54
|
+
export declare function isTeamActionable(category: FailureCategory): boolean;
|