strict-env-resolver 0.6.6 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -24
- package/lib/index.d.ts +43 -20
- package/lib/index.js +56 -16
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
# Strict Env Resolver
|
|
2
2
|
|
|
3
|
-
[](https://www.npmjs.com/package/strict-env-resolver)
|
|
4
|
+
[](https://www.npmjs.com/package/strict-env-resolver)
|
|
5
|
+
[](https://www.npmjs.com/package/strict-env-resolver)
|
|
6
|
+
[](https://github.com/gammarers-labs/strict-env-resolver/actions/workflows/build.yml)
|
|
6
7
|
|
|
7
8
|
Type-safe environment variable resolver for Node.js. Reads and parses `process.env` with specs (`string`, `number`, `boolean`, `enum`), optional defaults, configurable trimming, and structured validation errors when values are missing or invalid.
|
|
8
9
|
|
|
9
10
|
## Features
|
|
10
11
|
|
|
11
12
|
- **Typed specs**: `string`, `number`, `boolean`, and `enum` with TypeScript inference
|
|
12
|
-
- **Finite numbers**: `StrictEnvType.Number`
|
|
13
|
+
- **Finite numbers**: `StrictEnvType.Number` accepts finite values and rejects `NaN` and `Infinity`
|
|
14
|
+
- **Number presets**: Nested specs such as `Number.Port`, `Number.Integer`, and `Number.PositiveInteger`
|
|
13
15
|
- **Optional defaults**: Fallback when a variable is unset, empty (`""`), or whitespace-only (when trimming is enabled)
|
|
14
16
|
- **Configurable trim**: `trim` defaults to `true` for parsed types and `false` for strings; override per variable
|
|
15
17
|
- **Batch parsing**: `resolveAll()` evaluates every key and throws once with all validation errors
|
|
@@ -17,22 +19,48 @@ Type-safe environment variable resolver for Node.js. Reads and parses `process.e
|
|
|
17
19
|
- **Boolean parsing**: `1`, `true`, `yes`, `on` (case-insensitive, after trim) → `true`; any other non-empty value → `false`
|
|
18
20
|
- **Enum constraint**: Values must match one of the allowed choices (compared after trim)
|
|
19
21
|
|
|
22
|
+
## How it works
|
|
23
|
+
|
|
24
|
+
`resolve` reads one `process.env` key, trims it when the spec says so, parses it, and returns a typed value or throws `StrictEnvValidationError`. `resolveAll` does the same for every key in a schema and throws once with every issue collected.
|
|
25
|
+
|
|
26
|
+
Unset, empty, and (when trimming) whitespace-only values use `options.default` when provided; otherwise they fail with `kind: 'missing'`.
|
|
27
|
+
|
|
20
28
|
## Installation
|
|
21
29
|
|
|
22
|
-
|
|
30
|
+
### npm
|
|
23
31
|
|
|
24
32
|
```bash
|
|
25
33
|
npm install strict-env-resolver
|
|
26
34
|
```
|
|
27
35
|
|
|
28
|
-
|
|
36
|
+
### yarn
|
|
29
37
|
|
|
30
38
|
```bash
|
|
31
39
|
yarn add strict-env-resolver
|
|
32
40
|
```
|
|
33
41
|
|
|
42
|
+
### pnpm
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
pnpm add strict-env-resolver
|
|
46
|
+
```
|
|
47
|
+
|
|
34
48
|
## Usage
|
|
35
49
|
|
|
50
|
+
```ts
|
|
51
|
+
import { StrictEnvResolver, StrictEnvType } from 'strict-env-resolver';
|
|
52
|
+
|
|
53
|
+
const port = StrictEnvResolver.resolve('PORT', StrictEnvType.Number.Port, { default: 3000 });
|
|
54
|
+
|
|
55
|
+
const envs = StrictEnvResolver.resolveAll({
|
|
56
|
+
PORT: [StrictEnvType.Number.Port, { default: 3000 }],
|
|
57
|
+
DEBUG: [StrictEnvType.Boolean, { default: false }],
|
|
58
|
+
MODE: StrictEnvType.Enum(['read', 'write'] as const),
|
|
59
|
+
});
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Strings, custom number bounds, enums, and error handling:
|
|
63
|
+
|
|
36
64
|
```ts
|
|
37
65
|
import {
|
|
38
66
|
StrictEnvResolver,
|
|
@@ -53,15 +81,18 @@ const trimmedLogLevel = StrictEnvResolver.resolve('LOG_LEVEL', StrictEnvType.Str
|
|
|
53
81
|
default: 'info',
|
|
54
82
|
});
|
|
55
83
|
|
|
56
|
-
// Number (e.g.
|
|
57
|
-
const
|
|
84
|
+
// Number (e.g. ratio, timeout)
|
|
85
|
+
const timeoutMs = StrictEnvResolver.resolve('TIMEOUT_MS', StrictEnvType.Number, { default: 5000 });
|
|
58
86
|
// Valid: "42", "-1", "3.14", "1e5", "+42", "0x10", " 42 " (trimmed)
|
|
59
87
|
// Missing: "", " " (whitespace-only, trim default true)
|
|
60
88
|
// Invalid: "Infinity", "NaN", "not-a-number"
|
|
61
89
|
|
|
90
|
+
// Number presets
|
|
91
|
+
const retries = StrictEnvResolver.resolve('RETRIES', StrictEnvType.Number.NonNegativeInteger, { default: 0 });
|
|
92
|
+
// Custom bounds: StrictEnvType.Number({ min: 1, max: 1024, integer: true })
|
|
93
|
+
|
|
62
94
|
// Boolean (1/true/yes/on → true after trim; other non-empty values → false)
|
|
63
95
|
const debug = StrictEnvResolver.resolve('DEBUG', StrictEnvType.Boolean, { default: false });
|
|
64
|
-
// " true " → true
|
|
65
96
|
|
|
66
97
|
// Enum (value must be in choices, compared after trim)
|
|
67
98
|
const mode = StrictEnvResolver.resolve('MODE', StrictEnvType.Enum(['read', 'write'] as const));
|
|
@@ -71,18 +102,9 @@ const modeWithDefault = StrictEnvResolver.resolve(
|
|
|
71
102
|
{ default: 'read' },
|
|
72
103
|
);
|
|
73
104
|
|
|
74
|
-
// Read multiple env vars at once (collects all errors, then throws once)
|
|
75
|
-
const envs = StrictEnvResolver.resolveAll({
|
|
76
|
-
PORT: [StrictEnvType.Number, { default: 3000 }],
|
|
77
|
-
DEBUG: [StrictEnvType.Boolean, { default: false }],
|
|
78
|
-
MODE: StrictEnvType.Enum(['read', 'write'] as const),
|
|
79
|
-
LOG_LEVEL: [StrictEnvType.String, { trim: true, default: 'info' }],
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
// Handle structured validation errors
|
|
83
105
|
try {
|
|
84
106
|
StrictEnvResolver.resolveAll({
|
|
85
|
-
PORT: StrictEnvType.Number,
|
|
107
|
+
PORT: StrictEnvType.Number.Port,
|
|
86
108
|
MODE: StrictEnvType.Enum(['read', 'write'] as const),
|
|
87
109
|
});
|
|
88
110
|
} catch (e) {
|
|
@@ -105,15 +127,15 @@ try {
|
|
|
105
127
|
| Argument | Required | Description |
|
|
106
128
|
|----------|----------|-------------|
|
|
107
129
|
| **key** | Yes | Environment variable name (e.g. `"PORT"`, `"NODE_ENV"`). |
|
|
108
|
-
| **spec** | No | Type spec; defaults to `StrictEnvType.String`. Use `StrictEnvType.String`, `StrictEnvType.Number
|
|
130
|
+
| **spec** | No | Type spec; defaults to `StrictEnvType.String`. Use `StrictEnvType.String`, `StrictEnvType.Number` (or a nested preset such as `Number.Port`), `StrictEnvType.Boolean`, or `StrictEnvType.Enum(choices)`. |
|
|
109
131
|
| **options** | No | See [`StrictEnvOptions`](#strictenvoptions) below. |
|
|
110
132
|
|
|
111
133
|
### `StrictEnvResolver.resolveAll(schema)`
|
|
112
134
|
|
|
113
135
|
`schema` is an object where each key is an env var name and each value is either:
|
|
114
136
|
|
|
115
|
-
- A spec (e.g. `StrictEnvType.Number`)
|
|
116
|
-
- A tuple `[spec, options]` (e.g. `[StrictEnvType.Number, { default: 3000, trim: true }]`)
|
|
137
|
+
- A spec (e.g. `StrictEnvType.Number.Port`)
|
|
138
|
+
- A tuple `[spec, options]` (e.g. `[StrictEnvType.Number.Port, { default: 3000, trim: true }]`)
|
|
117
139
|
|
|
118
140
|
Evaluates every entry in `schema`. If any value is missing, empty without a default, whitespace-only without a default (when trimming is enabled), or invalid, throws a single `StrictEnvValidationError` containing all issues.
|
|
119
141
|
|
|
@@ -129,7 +151,7 @@ Evaluates every entry in `schema`. If any value is missing, empty without a defa
|
|
|
129
151
|
| Spec | Constant | Description |
|
|
130
152
|
|------|----------|-------------|
|
|
131
153
|
| `string` | `StrictEnvType.String` | Raw string value. Not trimmed by default; set `trim: true` to trim and treat whitespace-only as missing. |
|
|
132
|
-
| `number` | `StrictEnvType.Number` | Finite numeric value (see below). Trimmed by default. |
|
|
154
|
+
| `number` | `StrictEnvType.Number` | Finite numeric value (see below). Trimmed by default. Nested presets such as `Number.Port` are still `number` specs. |
|
|
133
155
|
| `boolean` | `StrictEnvType.Boolean` | `1` / `true` / `yes` / `on` (case-insensitive, trimmed) → `true`; otherwise → `false`. Trimmed by default. |
|
|
134
156
|
| `enum` | `StrictEnvType.Enum(choices)` | Value must be in `choices` (compared after trim). Trimmed by default. |
|
|
135
157
|
|
|
@@ -137,10 +159,30 @@ Evaluates every entry in `schema`. If any value is missing, empty without a defa
|
|
|
137
159
|
|
|
138
160
|
- Trims leading/trailing whitespace before validation (default `trim: true`).
|
|
139
161
|
- Parsed with `Number()`; the result must be finite (`NaN` and `Infinity` are rejected).
|
|
162
|
+
- Optional constraints via `StrictEnvType.Number({ min, max, exclusiveMin, exclusiveMax, integer })`.
|
|
140
163
|
- **Accepted examples**: `"3000"`, `"3.14"`, `"1e5"`, `"+42"`, `"0x10"`, `" 42 "`, `"-1"`
|
|
141
164
|
- **Missing examples**: `""`, `" "` (whitespace-only; `kind: 'missing'` unless a default is set)
|
|
142
165
|
- **Rejected examples**: `"Infinity"`, `"NaN"`, `"not-a-number"`
|
|
143
166
|
|
|
167
|
+
Named presets use those constraints (same parse path and `kind: 'invalid_number'`):
|
|
168
|
+
|
|
169
|
+
| Preset | Constraints | Meaning |
|
|
170
|
+
|--------|-------------|---------|
|
|
171
|
+
| `Number.Integer` | `{ integer: true }` | Any integer |
|
|
172
|
+
| `Number.PositiveInteger` | `{ min: 1, integer: true }` | Integer `>= 1` |
|
|
173
|
+
| `Number.NegativeInteger` | `{ max: -1, integer: true }` | Integer `<= -1` |
|
|
174
|
+
| `Number.NonNegativeInteger` | `{ min: 0, integer: true }` | Integer `>= 0` |
|
|
175
|
+
| `Number.Positive` | `{ exclusiveMin: 0 }` | Finite number `> 0` |
|
|
176
|
+
| `Number.Negative` | `{ exclusiveMax: 0 }` | Finite number `< 0` |
|
|
177
|
+
| `Number.NonNegative` | `{ min: 0 }` | Finite number `>= 0` |
|
|
178
|
+
| `Number.Port` | `{ min: 1, max: 65535, integer: true }` | Integer `1`–`65535` |
|
|
179
|
+
|
|
180
|
+
```ts
|
|
181
|
+
StrictEnvResolver.resolve('PORT', StrictEnvType.Number.Port);
|
|
182
|
+
StrictEnvResolver.resolve('RATIO', StrictEnvType.Number.Positive);
|
|
183
|
+
StrictEnvResolver.resolve('WORKERS', StrictEnvType.Number({ min: 1, max: 64, integer: true }));
|
|
184
|
+
```
|
|
185
|
+
|
|
144
186
|
### Whitespace and trim
|
|
145
187
|
|
|
146
188
|
| Spec | `trim` default | `""` | `" "` (whitespace-only) | `" true "` |
|
|
@@ -165,13 +207,15 @@ StrictEnvResolver.resolve('PADDING', StrictEnvType.String, { trim: false });
|
|
|
165
207
|
| `kind` | When |
|
|
166
208
|
|--------|------|
|
|
167
209
|
| `missing` | Variable unset, empty (`""`), or whitespace-only when trimming is enabled, without a default. |
|
|
168
|
-
| `invalid_number` | Value is not a finite number
|
|
210
|
+
| `invalid_number` | Value is not a finite number, not an integer when required, or outside `min` / `max` / `exclusiveMin` / `exclusiveMax`. |
|
|
169
211
|
| `invalid_enum` | Value is not in `choices`. |
|
|
170
212
|
|
|
171
213
|
**Message formats:**
|
|
172
214
|
|
|
173
215
|
- Missing: `Missing required environment variable: <key>`
|
|
174
216
|
- Number: `Env <key>: expected number, got "<raw>"`
|
|
217
|
+
- Integer: `Env <key>: expected integer, got "<raw>"`
|
|
218
|
+
- Bounds: `Env <key>: must be >= <min>, got <n>` (also `<=`, `>`, `<`)
|
|
175
219
|
- Enum: `Env <key>: must be one of [choice1, choice2, ...]`
|
|
176
220
|
|
|
177
221
|
`StrictEnvValidationError` fields:
|
package/lib/index.d.ts
CHANGED
|
@@ -9,21 +9,26 @@ export type StrictEnvTypeString = {
|
|
|
9
9
|
};
|
|
10
10
|
/**
|
|
11
11
|
* Optional constraints for a numeric environment variable spec.
|
|
12
|
-
* Used by {@link StrictEnvType.Number} when called as a factory, and by
|
|
13
|
-
* such as {@link StrictEnvType.
|
|
12
|
+
* Used by {@link StrictEnvType.Number} when called as a factory, and by nested presets
|
|
13
|
+
* such as {@link StrictEnvType.Number.Port} / {@link StrictEnvType.Number.PositiveInteger}.
|
|
14
14
|
*/
|
|
15
15
|
export type StrictEnvNumberConstraints = {
|
|
16
|
-
/** Inclusive lower bound. */
|
|
16
|
+
/** Inclusive lower bound (`n >= min`). */
|
|
17
17
|
min?: number;
|
|
18
|
-
/** Inclusive upper bound. */
|
|
18
|
+
/** Inclusive upper bound (`n <= max`). */
|
|
19
19
|
max?: number;
|
|
20
|
+
/** Exclusive lower bound (`n > exclusiveMin`). */
|
|
21
|
+
exclusiveMin?: number;
|
|
22
|
+
/** Exclusive upper bound (`n < exclusiveMax`). */
|
|
23
|
+
exclusiveMax?: number;
|
|
20
24
|
/** When `true`, the value must be an integer (`Number.isInteger`). */
|
|
21
25
|
integer?: boolean;
|
|
22
26
|
};
|
|
23
27
|
/**
|
|
24
28
|
* Spec for a numeric environment variable.
|
|
25
29
|
* Values are parsed with `Number()`; `NaN`, `Infinity`, and `-Infinity` are rejected.
|
|
26
|
-
* Optional {@link StrictEnvNumberConstraints} (`min`, `max`, `integer`)
|
|
30
|
+
* Optional {@link StrictEnvNumberConstraints} (`min`, `max`, `exclusiveMin`, `exclusiveMax`, `integer`)
|
|
31
|
+
* narrow accepted values.
|
|
27
32
|
* Defaults belong in {@link StrictEnvOptions}, not on this spec.
|
|
28
33
|
*/
|
|
29
34
|
export type StrictEnvTypeNumber = {
|
|
@@ -57,8 +62,8 @@ export type StrictEnvSpec = StrictEnvTypeString | StrictEnvTypeNumber | StrictEn
|
|
|
57
62
|
* Discriminated union of error kinds emitted during environment variable parsing.
|
|
58
63
|
*
|
|
59
64
|
* - `missing` — Variable unset, empty string, or whitespace-only (when trim is enabled) without a default.
|
|
60
|
-
* - `invalid_number` — Value is not a finite number, not an integer when required, or outside
|
|
61
|
-
* (see {@link StrictEnvTypeNumber}).
|
|
65
|
+
* - `invalid_number` — Value is not a finite number, not an integer when required, or outside
|
|
66
|
+
* `min` / `max` / `exclusiveMin` / `exclusiveMax` (see {@link StrictEnvTypeNumber}).
|
|
62
67
|
* - `invalid_enum` — Value is not one of the allowed enum choices.
|
|
63
68
|
*/
|
|
64
69
|
export type StrictEnvErrorKind = 'missing' | 'invalid_number' | 'invalid_enum';
|
|
@@ -130,19 +135,44 @@ export declare class StrictEnvValidationError<K extends string = string> extends
|
|
|
130
135
|
*/
|
|
131
136
|
constructor(errors: readonly StrictEnvValidationEntry<K>[]);
|
|
132
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* Named number presets nested under {@link StrictEnvType.Number}.
|
|
140
|
+
* Each preset is sugar over {@link StrictEnvNumberConstraints}; parsing stays `type: 'number'`.
|
|
141
|
+
*/
|
|
142
|
+
type StrictEnvNumberPresets = {
|
|
143
|
+
/** Any integer. Sugar for `Number({ integer: true })`. */
|
|
144
|
+
Integer: StrictEnvTypeNumber;
|
|
145
|
+
/** Integer `>= 1`. Sugar for `Number({ min: 1, integer: true })`. */
|
|
146
|
+
PositiveInteger: StrictEnvTypeNumber;
|
|
147
|
+
/** Integer `<= -1`. Sugar for `Number({ max: -1, integer: true })`. */
|
|
148
|
+
NegativeInteger: StrictEnvTypeNumber;
|
|
149
|
+
/** Integer `>= 0`. Sugar for `Number({ min: 0, integer: true })`. */
|
|
150
|
+
NonNegativeInteger: StrictEnvTypeNumber;
|
|
151
|
+
/** Finite number `> 0`. Sugar for `Number({ exclusiveMin: 0 })`. */
|
|
152
|
+
Positive: StrictEnvTypeNumber;
|
|
153
|
+
/** Finite number `< 0`. Sugar for `Number({ exclusiveMax: 0 })`. */
|
|
154
|
+
Negative: StrictEnvTypeNumber;
|
|
155
|
+
/** Finite number `>= 0`. Sugar for `Number({ min: 0 })`. */
|
|
156
|
+
NonNegative: StrictEnvTypeNumber;
|
|
157
|
+
/** TCP/UDP port `1`–`65535`. Sugar for `Number({ min: 1, max: 65535, integer: true })`. */
|
|
158
|
+
Port: StrictEnvTypeNumber;
|
|
159
|
+
};
|
|
133
160
|
/**
|
|
134
161
|
* Unconstrained finite-number spec, also callable as a factory for constrained specs.
|
|
162
|
+
* Named presets hang off the same object (`Number.Port`, `Number.PositiveInteger`, …).
|
|
135
163
|
*
|
|
136
164
|
* @example
|
|
137
165
|
* ```ts
|
|
138
166
|
* StrictEnvType.Number
|
|
139
167
|
* StrictEnvType.Number({ min: 0 })
|
|
140
|
-
* StrictEnvType.Number({
|
|
168
|
+
* StrictEnvType.Number({ exclusiveMin: 0 })
|
|
169
|
+
* StrictEnvType.Number.Port
|
|
170
|
+
* StrictEnvType.Number.PositiveInteger
|
|
141
171
|
* ```
|
|
142
172
|
*/
|
|
143
173
|
type StrictEnvNumberSpecFactory = {
|
|
144
174
|
(constraints?: StrictEnvNumberConstraints): StrictEnvTypeNumber;
|
|
145
|
-
} & StrictEnvTypeNumber;
|
|
175
|
+
} & StrictEnvTypeNumber & StrictEnvNumberPresets;
|
|
146
176
|
/**
|
|
147
177
|
* Predefined spec constants for use with `resolve` or as schema values in `resolveAll`.
|
|
148
178
|
* Specs describe type only; provide `default` / `trim` via {@link StrictEnvOptions}
|
|
@@ -155,17 +185,10 @@ export declare const StrictEnvType: {
|
|
|
155
185
|
};
|
|
156
186
|
/**
|
|
157
187
|
* Spec for a finite numeric value (`Number()` parsing; rejects `NaN` and `Infinity`).
|
|
158
|
-
* Use as `StrictEnvType.Number`,
|
|
188
|
+
* Use as `StrictEnvType.Number`, call as `StrictEnvType.Number({ min, max, exclusiveMin, exclusiveMax, integer })`,
|
|
189
|
+
* or use a nested preset such as `StrictEnvType.Number.Port`.
|
|
159
190
|
*/
|
|
160
191
|
readonly Number: StrictEnvNumberSpecFactory;
|
|
161
|
-
/**
|
|
162
|
-
* Spec for a positive integer (`>= 1`). Sugar for `Number({ min: 1, integer: true })`.
|
|
163
|
-
*/
|
|
164
|
-
readonly PositiveInt: StrictEnvTypeNumber;
|
|
165
|
-
/**
|
|
166
|
-
* Spec for a negative integer (`<= -1`). Sugar for `Number({ max: -1, integer: true })`.
|
|
167
|
-
*/
|
|
168
|
-
readonly NegativeInt: StrictEnvTypeNumber;
|
|
169
192
|
/** Spec for a boolean value (`1`/`true`/`yes`/`on` → `true`; other non-empty values → `false`). */
|
|
170
193
|
readonly Boolean: {
|
|
171
194
|
readonly type: "boolean";
|
|
@@ -230,9 +253,9 @@ export type StrictEnvSchemaToType<TSchema extends StrictEnvSchema> = {
|
|
|
230
253
|
*
|
|
231
254
|
* @example
|
|
232
255
|
* ```ts
|
|
233
|
-
* const port = StrictEnvResolver.resolve('PORT', StrictEnvType.
|
|
256
|
+
* const port = StrictEnvResolver.resolve('PORT', StrictEnvType.Number.Port);
|
|
234
257
|
* const envs = StrictEnvResolver.resolveAll({
|
|
235
|
-
* PORT: StrictEnvType.
|
|
258
|
+
* PORT: StrictEnvType.Number.Port,
|
|
236
259
|
* DEBUG: [StrictEnvType.Boolean, { default: false }],
|
|
237
260
|
* });
|
|
238
261
|
* ```
|
package/lib/index.js
CHANGED
|
@@ -85,19 +85,48 @@ class StrictEnvValidationError extends StrictEnvError {
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
exports.StrictEnvValidationError = StrictEnvValidationError;
|
|
88
|
+
/** Inclusive lower bound for positive integers (`>= 1`). */
|
|
89
|
+
const MIN_POSITIVE_INTEGER = 1;
|
|
90
|
+
/** Inclusive upper bound for negative integers (`<= -1`). */
|
|
91
|
+
const MAX_NEGATIVE_INTEGER = -1;
|
|
92
|
+
/**
|
|
93
|
+
* Sign boundary for Positive (`> 0`), Negative (`< 0`), and non-negative (`>= 0`) presets.
|
|
94
|
+
*/
|
|
95
|
+
const ZERO = 0;
|
|
96
|
+
/**
|
|
97
|
+
* Inclusive lower TCP/UDP port (IANA). Port 0 means "any available" and is rejected.
|
|
98
|
+
*/
|
|
99
|
+
const MIN_PORT = MIN_POSITIVE_INTEGER;
|
|
100
|
+
/** Inclusive upper TCP/UDP port (IANA). */
|
|
101
|
+
const MAX_PORT = 65535;
|
|
88
102
|
/**
|
|
89
103
|
* Builds a numeric env spec from optional constraints.
|
|
90
104
|
*
|
|
91
|
-
* @param constraints - Optional `min`, `max`, and/or `integer` bounds.
|
|
105
|
+
* @param constraints - Optional `min`, `max`, `exclusiveMin`, `exclusiveMax`, and/or `integer` bounds.
|
|
92
106
|
* @returns Number spec for use with `resolve` or `resolveAll`.
|
|
93
107
|
*/
|
|
94
108
|
const createNumberSpec = (constraints) => ({
|
|
95
109
|
type: 'number',
|
|
96
110
|
...(constraints?.min !== undefined ? { min: constraints.min } : {}),
|
|
97
111
|
...(constraints?.max !== undefined ? { max: constraints.max } : {}),
|
|
112
|
+
...(constraints?.exclusiveMin !== undefined ? { exclusiveMin: constraints.exclusiveMin } : {}),
|
|
113
|
+
...(constraints?.exclusiveMax !== undefined ? { exclusiveMax: constraints.exclusiveMax } : {}),
|
|
98
114
|
...(constraints?.integer !== undefined ? { integer: constraints.integer } : {}),
|
|
99
115
|
});
|
|
100
|
-
|
|
116
|
+
/**
|
|
117
|
+
* Finite-number spec that is also a constraint factory and a holder of named presets.
|
|
118
|
+
* Use as `Number`, `Number({ min, max, exclusiveMin, exclusiveMax, integer })`, or `Number.Port`.
|
|
119
|
+
*/
|
|
120
|
+
const NumberSpec = Object.assign((constraints) => createNumberSpec(constraints), { type: 'number' }, {
|
|
121
|
+
Integer: createNumberSpec({ integer: true }),
|
|
122
|
+
PositiveInteger: createNumberSpec({ min: MIN_POSITIVE_INTEGER, integer: true }),
|
|
123
|
+
NegativeInteger: createNumberSpec({ max: MAX_NEGATIVE_INTEGER, integer: true }),
|
|
124
|
+
NonNegativeInteger: createNumberSpec({ min: ZERO, integer: true }),
|
|
125
|
+
Positive: createNumberSpec({ exclusiveMin: ZERO }),
|
|
126
|
+
Negative: createNumberSpec({ exclusiveMax: ZERO }),
|
|
127
|
+
NonNegative: createNumberSpec({ min: ZERO }),
|
|
128
|
+
Port: createNumberSpec({ min: MIN_PORT, max: MAX_PORT, integer: true }),
|
|
129
|
+
});
|
|
101
130
|
/**
|
|
102
131
|
* Predefined spec constants for use with `resolve` or as schema values in `resolveAll`.
|
|
103
132
|
* Specs describe type only; provide `default` / `trim` via {@link StrictEnvOptions}
|
|
@@ -108,17 +137,10 @@ exports.StrictEnvType = {
|
|
|
108
137
|
String: { type: 'string' },
|
|
109
138
|
/**
|
|
110
139
|
* Spec for a finite numeric value (`Number()` parsing; rejects `NaN` and `Infinity`).
|
|
111
|
-
* Use as `StrictEnvType.Number`,
|
|
140
|
+
* Use as `StrictEnvType.Number`, call as `StrictEnvType.Number({ min, max, exclusiveMin, exclusiveMax, integer })`,
|
|
141
|
+
* or use a nested preset such as `StrictEnvType.Number.Port`.
|
|
112
142
|
*/
|
|
113
143
|
Number: NumberSpec,
|
|
114
|
-
/**
|
|
115
|
-
* Spec for a positive integer (`>= 1`). Sugar for `Number({ min: 1, integer: true })`.
|
|
116
|
-
*/
|
|
117
|
-
PositiveInt: createNumberSpec({ min: 1, integer: true }),
|
|
118
|
-
/**
|
|
119
|
-
* Spec for a negative integer (`<= -1`). Sugar for `Number({ max: -1, integer: true })`.
|
|
120
|
-
*/
|
|
121
|
-
NegativeInt: createNumberSpec({ max: -1, integer: true }),
|
|
122
144
|
/** Spec for a boolean value (`1`/`true`/`yes`/`on` → `true`; other non-empty values → `false`). */
|
|
123
145
|
Boolean: { type: 'boolean' },
|
|
124
146
|
/**
|
|
@@ -160,10 +182,11 @@ const normalizeEnvRaw = (raw, trim) => {
|
|
|
160
182
|
* @param key - Environment variable name.
|
|
161
183
|
* @param raw - Raw value from `process.env`, if present.
|
|
162
184
|
* @param n - Parsed finite number.
|
|
163
|
-
* @param constraints - Optional `min`, `max`, and/or `integer` constraints.
|
|
185
|
+
* @param constraints - Optional `min`, `max`, `exclusiveMin`, `exclusiveMax`, and/or `integer` constraints.
|
|
164
186
|
* @returns `undefined` when valid; otherwise a structured validation error.
|
|
165
187
|
*/
|
|
166
188
|
const validateNumberConstraints = (key, raw, n, constraints) => {
|
|
189
|
+
// Integer first so e.g. Port `80.5` reports "expected integer", not a range error.
|
|
167
190
|
if (constraints.integer === true && !Number.isInteger(n)) {
|
|
168
191
|
return { key, message: `Env ${key}: expected integer, got "${raw}"`, raw, kind: 'invalid_number' };
|
|
169
192
|
}
|
|
@@ -175,6 +198,14 @@ const validateNumberConstraints = (key, raw, n, constraints) => {
|
|
|
175
198
|
kind: 'invalid_number',
|
|
176
199
|
};
|
|
177
200
|
}
|
|
201
|
+
if (constraints.exclusiveMin !== undefined && n <= constraints.exclusiveMin) {
|
|
202
|
+
return {
|
|
203
|
+
key,
|
|
204
|
+
message: `Env ${key}: must be > ${constraints.exclusiveMin}, got ${n}`,
|
|
205
|
+
raw,
|
|
206
|
+
kind: 'invalid_number',
|
|
207
|
+
};
|
|
208
|
+
}
|
|
178
209
|
if (constraints.max !== undefined && n > constraints.max) {
|
|
179
210
|
return {
|
|
180
211
|
key,
|
|
@@ -183,6 +214,14 @@ const validateNumberConstraints = (key, raw, n, constraints) => {
|
|
|
183
214
|
kind: 'invalid_number',
|
|
184
215
|
};
|
|
185
216
|
}
|
|
217
|
+
if (constraints.exclusiveMax !== undefined && n >= constraints.exclusiveMax) {
|
|
218
|
+
return {
|
|
219
|
+
key,
|
|
220
|
+
message: `Env ${key}: must be < ${constraints.exclusiveMax}, got ${n}`,
|
|
221
|
+
raw,
|
|
222
|
+
kind: 'invalid_number',
|
|
223
|
+
};
|
|
224
|
+
}
|
|
186
225
|
return undefined;
|
|
187
226
|
};
|
|
188
227
|
/**
|
|
@@ -203,7 +242,8 @@ const resolveSchemaEntry = (entry) => ({
|
|
|
203
242
|
*
|
|
204
243
|
* Missing or empty (`""`) values use `defaultValue` when provided. When `trim` is enabled,
|
|
205
244
|
* whitespace-only values are treated as empty. Number specs delegate to `parseNumber`, then
|
|
206
|
-
* optional `min` / `max` / `
|
|
245
|
+
* optional `min` / `max` / `exclusiveMin` / `exclusiveMax` / `integer` constraints
|
|
246
|
+
* (see {@link StrictEnvNumberConstraints}).
|
|
207
247
|
* Boolean specs treat `1`/`true`/`yes`/`on` (case-insensitive, after normalization) as `true`.
|
|
208
248
|
* Enum specs require an exact match in `choices` (after normalization).
|
|
209
249
|
*
|
|
@@ -322,9 +362,9 @@ const resolveAll = (schema) => {
|
|
|
322
362
|
*
|
|
323
363
|
* @example
|
|
324
364
|
* ```ts
|
|
325
|
-
* const port = StrictEnvResolver.resolve('PORT', StrictEnvType.
|
|
365
|
+
* const port = StrictEnvResolver.resolve('PORT', StrictEnvType.Number.Port);
|
|
326
366
|
* const envs = StrictEnvResolver.resolveAll({
|
|
327
|
-
* PORT: StrictEnvType.
|
|
367
|
+
* PORT: StrictEnvType.Number.Port,
|
|
328
368
|
* DEBUG: [StrictEnvType.Boolean, { default: false }],
|
|
329
369
|
* });
|
|
330
370
|
* ```
|
|
@@ -335,4 +375,4 @@ exports.StrictEnvResolver = {
|
|
|
335
375
|
/** Reads and parses multiple environment variables in one pass. See {@link resolveAll}. */
|
|
336
376
|
resolveAll,
|
|
337
377
|
};
|
|
338
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBOEJBOzs7R0FHRztBQUNILE1BQU0sb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7QUFFbEQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQVcsRUFBc0IsRUFBRTtJQUN0RCxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN4QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxhQUFxQixFQUFXLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7QUFzRDFHOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFzQixjQUFlLFNBQVEsS0FBSztJQUNoRDs7T0FFRztJQUNILFlBQXNCLE9BQWU7UUFDbkMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0NBQ0Y7QUFSRCx3Q0FRQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBYSx3QkFBb0QsU0FBUSxjQUFjO0lBQ3JGOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQW1CLE1BQThDO1FBQ25GLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMs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QyxFQUFFLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLFNBQVM7UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFtRCxDQUFDO0lBQ3pFLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE1BQU0sSUFBSSx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRSxPQUFPLElBQXNDLENBQUM7QUFDaEQsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7Ozs7O0dBV0c7QUFDVSxRQUFBLGlCQUFpQixHQUFHO0lBQy9CLDJFQUEyRTtJQUMzRSxPQUFPO0lBQ1AsMkZBQTJGO0lBQzNGLFVBQVU7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTcGVjIGZvciBhIHN0cmluZyBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqIFZhbHVlcyBhcmUgcmV0dXJuZWQgYXMtaXMgdW5sZXNzIGB0cmltOiB0cnVlYCBpcyBzZXQgaW4ge0BsaW5rIFN0cmljdEVudk9wdGlvbnN9XG4gKiAod2hpdGVzcGFjZS1vbmx5IHZhbHVlcyBhcmUgdGhlbiB0cmVhdGVkIGFzIG1pc3NpbmcpLlxuICogRGVmYXVsdHMgYmVsb25nIGluIHtAbGluayBTdHJpY3RFbnZPcHRpb25zfSwgbm90IG9uIHRoaXMgc3BlYy5cbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52VHlwZVN0cmluZyA9IHsgdHlwZTogJ3N0cmluZycgfTtcblxuLyoqXG4gKiBPcHRpb25hbCBjb25zdHJhaW50cyBmb3IgYSBudW1lcmljIGVudmlyb25tZW50IHZhcmlhYmxlIHNwZWMuXG4gKiBVc2VkIGJ5IHtAbGluayBTdHJpY3RFbnZUeXBlLk51bWJlcn0gd2hlbiBjYWxsZWQgYXMgYSBmYWN0b3J5LCBhbmQgYnkgc3VnYXIgc3BlY3NcbiAqIHN1Y2ggYXMge0BsaW5rIFN0cmljdEVudlR5cGUuUG9zaXRpdmVJbnR9IC8ge0BsaW5rIFN0cmljdEVudlR5cGUuTmVnYXRpdmVJbnR9LlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50cyA9IHtcbiAgLyoqIEluY2x1c2l2ZSBsb3dlciBib3VuZC4gKi9cbiAgbWluPzogbnVtYmVyO1xuICAvKiogSW5jbHVzaXZlIHVwcGVyIGJvdW5kLiAqL1xuICBtYXg/OiBudW1iZXI7XG4gIC8qKiBXaGVuIGB0cnVlYCwgdGhlIHZhbHVlIG11c3QgYmUgYW4gaW50ZWdlciAoYE51bWJlci5pc0ludGVnZXJgKS4gKi9cbiAgaW50ZWdlcj86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwZWMgZm9yIGEgbnVtZXJpYyBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqIFZhbHVlcyBhcmUgcGFyc2VkIHdpdGggYE51bWJlcigpYDsgYE5hTmAsIGBJbmZpbml0eWAsIGFuZCBgLUluZmluaXR5YCBhcmUgcmVqZWN0ZWQuXG4gKiBPcHRpb25hbCB7QGxpbmsgU3RyaWN0RW52TnVtYmVyQ29uc3RyYWludHN9IChgbWluYCwgYG1heGAsIGBpbnRlZ2VyYCkgbmFycm93IGFjY2VwdGVkIHZhbHVlcy5cbiAqIERlZmF1bHRzIGJlbG9uZyBpbiB7QGxpbmsgU3RyaWN0RW52T3B0aW9uc30sIG5vdCBvbiB0aGlzIHNwZWMuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlR5cGVOdW1iZXIgPSB7IHR5cGU6ICdudW1iZXInIH0gJiBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50cztcblxuLyoqXG4gKiBQYXR0ZXJuIGZvciBib29sZWFuIGVudiB2YWx1ZXMgdGhhdCBwYXJzZSBhcyBgdHJ1ZWAuXG4gKiBNYXRjaGVzIGAxYCwgYHRydWVgLCBgeWVzYCwgYW5kIGBvbmAgKGNhc2UtaW5zZW5zaXRpdmUpIG9uIHRoZSBmdWxsIHRyaW1tZWQgc3RyaW5nLlxuICovXG5jb25zdCBUUlVFX0JPT0xFQU5fUEFUVEVSTiA9IC9eKDF8dHJ1ZXx5ZXN8b24pJC9pO1xuXG4vKipcbiAqIFBhcnNlcyBhIHN0cmluZyBhcyBhIGZpbml0ZSBudW1iZXIgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiBAcGFyYW0gcmF3IC0gTm9ybWFsaXplZCBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSAodHJpbW1lZCB3aGVuIGB0cmltYCBpcyBlbmFibGVkKS5cbiAqIEByZXR1cm5zIFBhcnNlZCBudW1iZXIsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHZhbHVlIGlzIG5vdCBhIGZpbml0ZSBudW1iZXIuXG4gKi9cbmNvbnN0IHBhcnNlTnVtYmVyID0gKHJhdzogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgbiA9IE51bWJlcihyYXcpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShuKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG47XG59O1xuXG4vKipcbiAqIFBhcnNlcyBhIG5vcm1hbGl6ZWQgc3RyaW5nIGFzIGEgYm9vbGVhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gbm9ybWFsaXplZFJhdyAtIE5vcm1hbGl6ZWQgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWUgKHRyaW1tZWQgd2hlbiBgdHJpbWAgaXMgZW5hYmxlZCkuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgZm9yIGAxYC9gdHJ1ZWAvYHllc2AvYG9uYCAoY2FzZS1pbnNlbnNpdGl2ZSk7IG90aGVyd2lzZSBgZmFsc2VgLlxuICovXG5jb25zdCBwYXJzZUJvb2xlYW5FbnZWYWx1ZSA9IChub3JtYWxpemVkUmF3OiBzdHJpbmcpOiBib29sZWFuID0+IFRSVUVfQk9PTEVBTl9QQVRURVJOLnRlc3Qobm9ybWFsaXplZFJhdyk7XG5cbi8qKlxuICogU3BlYyBmb3IgYSBib29sZWFuIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICogUGFyc2VzIGAxYCwgYHRydWVgLCBgeWVzYCwgYG9uYCAoY2FzZS1pbnNlbnNpdGl2ZSwgYWZ0ZXIgbm9ybWFsaXphdGlvbikgYXMgYHRydWVgO1xuICogYW55IG90aGVyIG5vbi1lbXB0eSB2YWx1ZSBhcyBgZmFsc2VgLlxuICogVHJpbXMgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIGJ5IGRlZmF1bHQgKHNlZSB7QGxpbmsgU3RyaWN0RW52T3B0aW9ucy50cmltfSkuXG4gKiBEZWZhdWx0cyBiZWxvbmcgaW4ge0BsaW5rIFN0cmljdEVudk9wdGlvbnN9LCBub3Qgb24gdGhpcyBzcGVjLlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZUeXBlQm9vbGVhbiA9IHsgdHlwZTogJ2Jvb2xlYW4nIH07XG5cbi8qKlxuICogU3BlYyBmb3IgYW4gZW51bSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIGEgZml4ZWQgc2V0IG9mIGNob2ljZXMuXG4gKiBUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgYGNob2ljZXNgIChjb21wYXJlZCBhZnRlciBub3JtYWxpemF0aW9uKTsgb3RoZXJ3aXNlIHZhbGlkYXRpb24gZmFpbHMuXG4gKiBUcmltcyBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UgYnkgZGVmYXVsdCAoc2VlIHtAbGluayBTdHJpY3RFbnZPcHRpb25zLnRyaW19KS5cbiAqIERlZmF1bHRzIGJlbG9uZyBpbiB7QGxpbmsgU3RyaWN0RW52T3B0aW9uc30sIG5vdCBvbiB0aGlzIHNwZWMuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBMaXRlcmFsIHN0cmluZyB1bmlvbiBvZiBhbGxvd2VkIHZhbHVlcy5cbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52VHlwZUVudW08VCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7IHR5cGU6ICdlbnVtJzsgY2hvaWNlczogcmVhZG9ubHkgVFtdIH07XG5cbi8qKiBVbmlvbiBvZiBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGUgc3BlYyB0eXBlcy4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlNwZWMgPVxuICB8IFN0cmljdEVudlR5cGVTdHJpbmdcbiAgfCBTdHJpY3RFbnZUeXBlTnVtYmVyXG4gIHwgU3RyaWN0RW52VHlwZUJvb2xlYW5cbiAgfCBTdHJpY3RFbnZUeXBlRW51bTtcblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIHVuaW9uIG9mIGVycm9yIGtpbmRzIGVtaXR0ZWQgZHVyaW5nIGVudmlyb25tZW50IHZhcmlhYmxlIHBhcnNpbmcuXG4gKlxuICogLSBgbWlzc2luZ2Ag4oCUIFZhcmlhYmxlIHVuc2V0LCBlbXB0eSBzdHJpbmcsIG9yIHdoaXRlc3BhY2Utb25seSAod2hlbiB0cmltIGlzIGVuYWJsZWQpIHdpdGhvdXQgYSBkZWZhdWx0LlxuICogLSBgaW52YWxpZF9udW1iZXJgIOKAlCBWYWx1ZSBpcyBub3QgYSBmaW5pdGUgbnVtYmVyLCBub3QgYW4gaW50ZWdlciB3aGVuIHJlcXVpcmVkLCBvciBvdXRzaWRlIGBtaW5gL2BtYXhgXG4gKiAgIChzZWUge0BsaW5rIFN0cmljdEVudlR5cGVOdW1iZXJ9KS5cbiAqIC0gYGludmFsaWRfZW51bWAg4oCUIFZhbHVlIGlzIG5vdCBvbmUgb2YgdGhlIGFsbG93ZWQgZW51bSBjaG9pY2VzLlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZFcnJvcktpbmQgPSAnbWlzc2luZycgfCAnaW52YWxpZF9udW1iZXInIHwgJ2ludmFsaWRfZW51bSc7XG5cbi8qKlxuICogQSBzdHJ1Y3R1cmVkIHZhbGlkYXRpb24gZXJyb3IgZW50cnkgZm9yIGEgc2luZ2xlIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICpcbiAqIEB0ZW1wbGF0ZSBLIC0gRW52aXJvbm1lbnQgdmFyaWFibGUga2V5IHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlZhbGlkYXRpb25FbnRyeTxLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9IHtcbiAgLyoqIEVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUuICovXG4gIGtleTogSztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuICovXG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqIFJhdyB2YWx1ZSBmcm9tIGBwcm9jZXNzLmVudmAsIGlmIHByZXNlbnQuICovXG4gIHJhdz86IHN0cmluZztcbiAgLyoqIEVycm9yIGNhdGVnb3J5IGZvciBwcm9ncmFtbWF0aWMgaGFuZGxpbmcuICovXG4gIGtpbmQ6IFN0cmljdEVudkVycm9yS2luZDtcbn07XG5cbi8qKlxuICogQmFzZSBlcnJvciBjbGFzcyBmb3IgdGhpcyBwYWNrYWdlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogdHJ5IHtcbiAqICAgU3RyaWN0RW52UmVzb2x2ZXIucmVzb2x2ZSgnUE9SVCcsIFN0cmljdEVudlR5cGUuTnVtYmVyKTtcbiAqIH0gY2F0Y2ggKGUpIHtcbiAqICAgaWYgKGUgaW5zdGFuY2VvZiBTdHJpY3RFbnZFcnJvcikge1xuICogICAgIC8vIEhhbmRsZSBhbGwgc3RyaWN0LWVudi1yZXNvbHZlciBlcnJvcnNcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTdHJpY3RFbnZFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZS5cbiAgICovXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnU3RyaWN0RW52RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGlvbiBlcnJvciB0aGF0IGNhcnJpZXMgb25lIG9yIG1vcmUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXNzdWVzLlxuICpcbiAqIFRocm93biBieSBgU3RyaWN0RW52UmVzb2x2ZXIucmVzb2x2ZSgpYCAoc2luZ2xlLWVudHJ5IGBlcnJvcnNgKSBhbmRcbiAqIGBTdHJpY3RFbnZSZXNvbHZlci5yZXNvbHZlQWxsKClgIChtdWx0aS1lbnRyeSBgZXJyb3JzYCkuXG4gKiBJbmRpdmlkdWFsIGVudHJpZXMgYXJlIHByb2R1Y2VkIGJ5IHRoZSBpbnRlcm5hbCBgcGFyc2VFbnZWYWx1ZWAgaGVscGVyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLIC0gVW5pb24gb2YgZW52aXJvbm1lbnQgdmFyaWFibGUga2V5cyBpbmNsdWRlZCBpbiBgZXJyb3JzYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmljdEVudlZhbGlkYXRpb25FcnJvcjxLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiBleHRlbmRzIFN0cmljdEVudkVycm9yIHtcbiAgLyoqXG4gICAqIEZvcm1hdHMgdmFsaWRhdGlvbiBlcnJvcnMgaW50byBhIGh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBLIC0gRW52aXJvbm1lbnQgdmFyaWFibGUga2V5IHR5cGUuXG4gICAqIEBwYXJhbSBlcnJvcnMgLSBWYWxpZGF0aW9uIGVycm9yIGVudHJpZXMgdG8gZm9ybWF0LlxuICAgKiBAcmV0dXJucyBNdWx0aS1saW5lIHN1bW1hcnkgbGlzdGluZyBlYWNoIGtleSBhbmQgbWVzc2FnZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZm9ybWF0PEsgZXh0ZW5kcyBzdHJpbmc+KGVycm9yczogcmVhZG9ubHkgU3RyaWN0RW52VmFsaWRhdGlvbkVudHJ5PEs+W10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzID0gZXJyb3JzLm1hcCgoZSkgPT4gYC0gJHtlLmtleX06ICR7ZS5tZXNzYWdlfSR7ZS5yYXcgPT0gbnVsbCA/ICcnIDogYCAocmF3PVwiJHtlLnJhd31cIilgfWApO1xuICAgIHJldHVybiBgSW52YWxpZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKCR7ZXJyb3JzLmxlbmd0aH0pOlxcbiR7bGluZXMuam9pbignXFxuJyl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJ1Y3R1cmVkIGxpc3Qgb2YgdmFsaWRhdGlvbiBlcnJvcnMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXJyb3JzOiByZWFkb25seSBTdHJpY3RFbnZWYWxpZGF0aW9uRW50cnk8Sz5bXTtcbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIGxpc3Qgb2Yga2V5cyBpbmNsdWRlZCBpbiBgZXJyb3JzYC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBrZXlzOiByZWFkb25seSBLW107XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgdmFsaWRhdGlvbiBlcnJvciBmcm9tIG9uZSBvciBtb3JlIGBTdHJpY3RFbnZWYWxpZGF0aW9uRW50cnlgIGVudHJpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBlcnJvcnMgLSBPbmUgb3IgbW9yZSBzdHJ1Y3R1cmVkIHZhbGlkYXRpb24gZXJyb3JzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGVycm9yczogcmVhZG9ubHkgU3RyaWN0RW52VmFsaWRhdGlvbkVudHJ5PEs+W10pIHtcbiAgICBjb25zdCBtc2cgPSBTdHJpY3RFbnZWYWxpZGF0aW9uRXJyb3IuZm9ybWF0KGVycm9ycyk7XG4gICAgc3VwZXIobXNnKTtcbiAgICB0aGlzLm5hbWUgPSAnU3RyaWN0RW52VmFsaWRhdGlvbkVycm9yJztcbiAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICB0aGlzLmtleXMgPSBlcnJvcnMubWFwKChlKSA9PiBlLmtleSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBudW1lcmljIGVudiBzcGVjIGZyb20gb3B0aW9uYWwgY29uc3RyYWludHMuXG4gKlxuICogQHBhcmFtIGNvbnN0cmFpbnRzIC0gT3B0aW9uYWwgYG1pbmAsIGBtYXhgLCBhbmQvb3IgYGludGVnZXJgIGJvdW5kcy5cbiAqIEByZXR1cm5zIE51bWJlciBzcGVjIGZvciB1c2Ugd2l0aCBgcmVzb2x2ZWAgb3IgYHJlc29sdmVBbGxgLlxuICovXG5jb25zdCBjcmVhdGVOdW1iZXJTcGVjID0gKGNvbnN0cmFpbnRzPzogU3RyaWN0RW52TnVtYmVyQ29uc3RyYWludHMpOiBTdHJpY3RFbnZUeXBlTnVtYmVyID0+ICh7XG4gIHR5cGU6ICdudW1iZXInLFxuICAuLi4oY29uc3RyYWludHM/Lm1pbiAhPT0gdW5kZWZpbmVkID8geyBtaW46IGNvbnN0cmFpbnRzLm1pbiB9IDoge30pLFxuICAuLi4oY29uc3RyYWludHM/Lm1heCAhPT0gdW5kZWZpbmVkID8geyBtYXg6IGNvbnN0cmFpbnRzLm1heCB9IDoge30pLFxuICAuLi4oY29uc3RyYWludHM/LmludGVnZXIgIT09IHVuZGVmaW5lZCA/IHsgaW50ZWdlcjogY29uc3RyYWludHMuaW50ZWdlciB9IDoge30pLFxufSk7XG5cbi8qKlxuICogVW5jb25zdHJhaW5lZCBmaW5pdGUtbnVtYmVyIHNwZWMsIGFsc28gY2FsbGFibGUgYXMgYSBmYWN0b3J5IGZvciBjb25zdHJhaW5lZCBzcGVjcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIFN0cmljdEVudlR5cGUuTnVtYmVyXG4gKiBTdHJpY3RFbnZUeXBlLk51bWJlcih7IG1pbjogMCB9KVxuICogU3RyaWN0RW52VHlwZS5OdW1iZXIoeyBtaW46IDEsIG1heDogNjU1MzUsIGludGVnZXI6IHRydWUgfSlcbiAqIGBgYFxuICovXG50eXBlIFN0cmljdEVudk51bWJlclNwZWNGYWN0b3J5ID0ge1xuICAoY29uc3RyYWludHM/OiBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50cyk6IFN0cmljdEVudlR5cGVOdW1iZXI7XG59ICYgU3RyaWN0RW52VHlwZU51bWJlcjtcblxuY29uc3QgTnVtYmVyU3BlYzogU3RyaWN0RW52TnVtYmVyU3BlY0ZhY3RvcnkgPSBPYmplY3QuYXNzaWduKFxuICAoY29uc3RyYWludHM/OiBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50cyk6IFN0cmljdEVudlR5cGVOdW1iZXIgPT4gY3JlYXRlTnVtYmVyU3BlYyhjb25zdHJhaW50cyksXG4gIHsgdHlwZTogJ251bWJlcicgfSBhcyBjb25zdCBzYXRpc2ZpZXMgU3RyaWN0RW52VHlwZU51bWJlcixcbik7XG5cbi8qKlxuICogUHJlZGVmaW5lZCBzcGVjIGNvbnN0YW50cyBmb3IgdXNlIHdpdGggYHJlc29sdmVgIG9yIGFzIHNjaGVtYSB2YWx1ZXMgaW4gYHJlc29sdmVBbGxgLlxuICogU3BlY3MgZGVzY3JpYmUgdHlwZSBvbmx5OyBwcm92aWRlIGBkZWZhdWx0YCAvIGB0cmltYCB2aWEge0BsaW5rIFN0cmljdEVudk9wdGlvbnN9XG4gKiAodGhpcmQgYXJndW1lbnQgb2YgYHJlc29sdmVgLCBvciBhIGBbc3BlYywgb3B0aW9uc11gIHR1cGxlIGluIGByZXNvbHZlQWxsYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBTdHJpY3RFbnZUeXBlID0ge1xuICAvKiogU3BlYyBmb3IgYSBzdHJpbmcgdmFsdWUgKHJldHVybmVkIGFzLWlzIHVubGVzcyBgdHJpbTogdHJ1ZWAgaXMgc2V0IGluIG9wdGlvbnMpLiAqL1xuICBTdHJpbmc6IHsgdHlwZTogJ3N0cmluZycgfSBhcyBjb25zdCBzYXRpc2ZpZXMgU3RyaWN0RW52VHlwZVN0cmluZyxcbiAgLyoqXG4gICAqIFNwZWMgZm9yIGEgZmluaXRlIG51bWVyaWMgdmFsdWUgKGBOdW1iZXIoKWAgcGFyc2luZzsgcmVqZWN0cyBgTmFOYCBhbmQgYEluZmluaXR5YCkuXG4gICAqIFVzZSBhcyBgU3RyaWN0RW52VHlwZS5OdW1iZXJgLCBvciBjYWxsIGFzIGBTdHJpY3RFbnZUeXBlLk51bWJlcih7IG1pbiwgbWF4LCBpbnRlZ2VyIH0pYC5cbiAgICovXG4gIE51bWJlcjogTnVtYmVyU3BlYyxcbiAgLyoqXG4gICAqIFNwZWMgZm9yIGEgcG9zaXRpdmUgaW50ZWdlciAoYD49IDFgKS4gU3VnYXIgZm9yIGBOdW1iZXIoeyBtaW46IDEsIGludGVnZXI6IHRydWUgfSlgLlxuICAgKi9cbiAgUG9zaXRpdmVJbnQ6IGNyZWF0ZU51bWJlclNwZWMoeyBtaW46IDEsIGludGVnZXI6IHRydWUgfSksXG4gIC8qKlxuICAgKiBTcGVjIGZvciBhIG5lZ2F0aXZlIGludGVnZXIgKGA8PSAtMWApLiBTdWdhciBmb3IgYE51bWJlcih7IG1heDogLTEsIGludGVnZXI6IHRydWUgfSlgLlxuICAgKi9cbiAgTmVnYXRpdmVJbnQ6IGNyZWF0ZU51bWJlclNwZWMoeyBtYXg6IC0xLCBpbnRlZ2VyOiB0cnVlIH0pLFxuICAvKiogU3BlYyBmb3IgYSBib29sZWFuIHZhbHVlIChgMWAvYHRydWVgL2B5ZXNgL2BvbmAg4oaSIGB0cnVlYDsgb3RoZXIgbm9uLWVtcHR5IHZhbHVlcyDihpIgYGZhbHNlYCkuICovXG4gIEJvb2xlYW46IHsgdHlwZTogJ2Jvb2xlYW4nIH0gYXMgY29uc3Qgc2F0aXNmaWVzIFN0cmljdEVudlR5cGVCb29sZWFuLFxuICAvKipcbiAgICogUmV0dXJucyBhIHNwZWMgdGhhdCByZXN0cmljdHMgdGhlIHZhbHVlIHRvIG9uZSBvZiB0aGUgZ2l2ZW4gY2hvaWNlcy5cbiAgICpcbiAgICogQHBhcmFtIGNob2ljZXMgLSBBbGxvd2VkIHN0cmluZyBsaXRlcmFscy5cbiAgICogQHJldHVybnMgRW51bSBzcGVjIGZvciB1c2Ugd2l0aCBgcmVzb2x2ZWAgb3IgYHJlc29sdmVBbGxgLlxuICAgKi9cbiAgRW51bTogPFQgZXh0ZW5kcyBzdHJpbmc+KGNob2ljZXM6IHJlYWRvbmx5IFRbXSkgPT4gKHsgdHlwZTogJ2VudW0nLCBjaG9pY2VzIH0pIGFzIFN0cmljdEVudlR5cGVFbnVtPFQ+LFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBJbmZlcnMgdGhlIHJldHVybiB0eXBlIGZyb20gdGhlIGdpdmVuIHNwZWMuXG4gKiBAdGVtcGxhdGUgUyAtIEEgYFN0cmljdEVudlNwZWNgIHZhcmlhbnQuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlNwZWNUb1R5cGU8Uz4gPVxuICBTIGV4dGVuZHMgU3RyaWN0RW52VHlwZVN0cmluZyA/IHN0cmluZ1xuICAgIDogUyBleHRlbmRzIFN0cmljdEVudlR5cGVOdW1iZXIgPyBudW1iZXJcbiAgICAgIDogUyBleHRlbmRzIFN0cmljdEVudlR5cGVCb29sZWFuID8gYm9vbGVhblxuICAgICAgICA6IFMgZXh0ZW5kcyBTdHJpY3RFbnZUeXBlRW51bTxpbmZlciBUPiA/IFRcbiAgICAgICAgICA6IG5ldmVyO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHJlYWRpbmcgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgd2l0aCBhbiBvcHRpb25hbCBkZWZhdWx0LlxuICogVXNlZCBhcyB0aGUgdGhpcmQgYXJndW1lbnQgdG8gYHJlc29sdmVgIG9yIGFzIHRoZSBzZWNvbmQgZWxlbWVudCBvZiBhIGBbc3BlYywgb3B0aW9uc11gIHR1cGxlIGluIGByZXNvbHZlQWxsYC5cbiAqXG4gKiBgdHJpbWAgZGVmYXVsdHMgdG8gYHRydWVgIGZvciBgbnVtYmVyYCwgYGJvb2xlYW5gLCBhbmQgYGVudW1gIHNwZWNzICh3aGl0ZXNwYWNlLW9ubHkgdmFsdWVzIGFyZVxuICogdHJlYXRlZCBhcyBtaXNzaW5nKS4gRm9yIGBzdHJpbmdgIHNwZWNzIGl0IGRlZmF1bHRzIHRvIGBmYWxzZWAgKHZhbHVlcyBhcmUgcmV0dXJuZWQgYXMtaXMpLlxuICpcbiAqIEB0ZW1wbGF0ZSBTIC0gRW52aXJvbm1lbnQgdmFyaWFibGUgc3BlYyB0eXBlLlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZPcHRpb25zPFMgZXh0ZW5kcyBTdHJpY3RFbnZTcGVjPiA9IHtcbiAgLyoqIEZhbGxiYWNrIHdoZW4gdGhlIHZhcmlhYmxlIGlzIHVuc2V0LCBlbXB0eSAoYFwiXCJgKSwgb3Igd2hpdGVzcGFjZS1vbmx5ICh3aGVuIGB0cmltYCBpcyBlbmFibGVkKS4gKi9cbiAgZGVmYXVsdD86IFN0cmljdEVudlNwZWNUb1R5cGU8Uz47XG4gIC8qKiBXaGVuIGB0cnVlYCwgdHJpbXMgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIGJlZm9yZSB2YWxpZGF0aW9uLiAqL1xuICB0cmltPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogU2NoZW1hIGVudHJ5IGZvciBhIHNpbmdsZSBlbnYgdmFyLlxuICpcbiAqIEVpdGhlciBhIHNwZWMgYWxvbmUsIG9yIGEgYFtzcGVjLCBvcHRpb25zXWAgdHVwbGUgdG8gYXR0YWNoIHtAbGluayBTdHJpY3RFbnZPcHRpb25zfVxuICogKGZvciBleGFtcGxlIGBkZWZhdWx0YCBhbmQvb3IgYHRyaW1gKS5cbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52U2NoZW1hRW50cnk8UyBleHRlbmRzIFN0cmljdEVudlNwZWMgPSBTdHJpY3RFbnZTcGVjPiA9IFMgfCByZWFkb25seSBbUywgU3RyaWN0RW52T3B0aW9uczxTPl07XG5cbi8qKlxuICogU2NoZW1hIG9iamVjdCB1c2VkIGJ5IGByZXNvbHZlQWxsKClgLlxuICpcbiAqIEtleXMgYXJlIGVudiB2YXIgbmFtZXM7IHZhbHVlcyBhcmUgc3BlY3Mgb3IgYFtzcGVjLCBvcHRpb25zXWAgdHVwbGVzLlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZTY2hlbWEgPSBSZWNvcmQ8c3RyaW5nLCBTdHJpY3RFbnZTY2hlbWFFbnRyeT47XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIHNwZWMgdHlwZSBmcm9tIGEgc2NoZW1hIGVudHJ5IG9yIGBbc3BlYywgb3B0aW9uc11gIHR1cGxlLlxuICpcbiAqIEB0ZW1wbGF0ZSBFIC0gU2NoZW1hIGVudHJ5IHR5cGUuXG4gKi9cbnR5cGUgU3RyaWN0RW52U2NoZW1hRW50cnlUb1NwZWM8RT4gPSBFIGV4dGVuZHMgcmVhZG9ubHkgW2luZmVyIFMsIHVua25vd25dID8gUyA6IEU7XG5cbi8qKlxuICogTWFwcyBhIHNjaGVtYSBvYmplY3QgdG8gdGhlIHJlc3VsdGluZyBwYXJzZWQgZW52aXJvbm1lbnQgb2JqZWN0IHR5cGUuXG4gKlxuICogQHRlbXBsYXRlIFRTY2hlbWEgLSBTY2hlbWEgb2JqZWN0IHR5cGUgcGFzc2VkIHRvIGByZXNvbHZlQWxsYC5cbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52U2NoZW1hVG9UeXBlPFRTY2hlbWEgZXh0ZW5kcyBTdHJpY3RFbnZTY2hlbWE+ID0ge1xuICBbSyBpbiBrZXlvZiBUU2NoZW1hXTogU3RyaWN0RW52U3BlY1RvVHlwZTxTdHJpY3RFbnZTY2hlbWFFbnRyeVRvU3BlYzxUU2NoZW1hW0tdPiAmIFN0cmljdEVudlNwZWM+O1xufTtcblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIHJlc3VsdCBvZiBwYXJzaW5nIGEgc2luZ2xlIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICpcbiAqIE9uIHN1Y2Nlc3MsIGB2YWx1ZWAgaG9sZHMgdGhlIHBhcnNlZCByZXN1bHQuIE9uIGZhaWx1cmUsIGBlcnJvcmAgaG9sZHMgYSBzdHJ1Y3R1cmVkXG4gKiBgU3RyaWN0RW52VmFsaWRhdGlvbkVudHJ5YCBlbnRyeSAobmV2ZXIgdGhyb3dzKS5cbiAqXG4gKiBAdGVtcGxhdGUgSyAtIEVudmlyb25tZW50IHZhcmlhYmxlIGtleSB0eXBlLlxuICogQHRlbXBsYXRlIFMgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBzcGVjIHR5cGUuXG4gKi9cbnR5cGUgUGFyc2VFbnZWYWx1ZVJlc3VsdDxLIGV4dGVuZHMgc3RyaW5nLCBTIGV4dGVuZHMgU3RyaWN0RW52U3BlYz4gPVxuICB8IHsgb2s6IHRydWU7IHZhbHVlOiBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IH1cbiAgfCB7IG9rOiBmYWxzZTsgZXJyb3I6IFN0cmljdEVudlZhbGlkYXRpb25FbnRyeTxLPiB9O1xuXG4vKipcbiAqIERlZmF1bHQgdHJpbSBiZWhhdmlvciBwZXIgc3BlYyB0eXBlLlxuICogUGFyc2VkIHR5cGVzIHRyaW0gYnkgZGVmYXVsdDsgc3RyaW5ncyBwcmVzZXJ2ZSB0aGUgcmF3IHZhbHVlIHVubGVzcyBvcHRlZCBpbi5cbiAqXG4gKiBAcGFyYW0gc3BlYyAtIEVudmlyb25tZW50IHZhcmlhYmxlIHNwZWMuXG4gKiBAcmV0dXJucyBXaGV0aGVyIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSBzaG91bGQgYmUgdHJpbW1lZCBiZWZvcmUgdmFsaWRhdGlvbi5cbiAqL1xuY29uc3QgZGVmYXVsdFRyaW1Gb3JTcGVjID0gKHNwZWM6IFN0cmljdEVudlNwZWMpOiBib29sZWFuID0+IHNwZWMudHlwZSAhPT0gJ3N0cmluZyc7XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHJhdyBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSBiZWZvcmUgdmFsaWRhdGlvbi5cbiAqXG4gKiBAcGFyYW0gcmF3IC0gUmF3IHZhbHVlIGZyb20gYHByb2Nlc3MuZW52YCwgaWYgcHJlc2VudC5cbiAqIEBwYXJhbSB0cmltIC0gV2hldGhlciB0byB0cmltIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZS5cbiAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgdmFsdWUsIG9yIGB1bmRlZmluZWRgIHdoZW4gdW5zZXQuXG4gKi9cbmNvbnN0IG5vcm1hbGl6ZUVudlJhdyA9IChyYXc6IHN0cmluZyB8IHVuZGVmaW5lZCwgdHJpbTogYm9vbGVhbik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChyYXcgPT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKCF0cmltKSB7XG4gICAgcmV0dXJuIHJhdztcbiAgfVxuICByZXR1cm4gcmF3LnRyaW0oKTtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgcGFyc2VkIG51bWJlciBhZ2FpbnN0IG9wdGlvbmFsIHtAbGluayBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50c30uXG4gKlxuICogQHRlbXBsYXRlIEsgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBrZXkgdHlwZS5cbiAqIEBwYXJhbSBrZXkgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lLlxuICogQHBhcmFtIHJhdyAtIFJhdyB2YWx1ZSBmcm9tIGBwcm9jZXNzLmVudmAsIGlmIHByZXNlbnQuXG4gKiBAcGFyYW0gbiAtIFBhcnNlZCBmaW5pdGUgbnVtYmVyLlxuICogQHBhcmFtIGNvbnN0cmFpbnRzIC0gT3B0aW9uYWwgYG1pbmAsIGBtYXhgLCBhbmQvb3IgYGludGVnZXJgIGNvbnN0cmFpbnRzLlxuICogQHJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB2YWxpZDsgb3RoZXJ3aXNlIGEgc3RydWN0dXJlZCB2YWxpZGF0aW9uIGVycm9yLlxuICovXG5jb25zdCB2YWxpZGF0ZU51bWJlckNvbnN0cmFpbnRzID0gPEsgZXh0ZW5kcyBzdHJpbmc+KFxuICBrZXk6IEssXG4gIHJhdzogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBuOiBudW1iZXIsXG4gIGNvbnN0cmFpbnRzOiBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50cyxcbik6IFN0cmljdEVudlZhbGlkYXRpb25FbnRyeTxLPiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChjb25zdHJhaW50cy5pbnRlZ2VyID09PSB0cnVlICYmICFOdW1iZXIuaXNJbnRlZ2VyKG4pKSB7XG4gICAgcmV0dXJuIHsga2V5LCBtZXNzYWdlOiBgRW52ICR7a2V5fTogZXhwZWN0ZWQgaW50ZWdlciwgZ290IFwiJHtyYXd9XCJgLCByYXcsIGtpbmQ6ICdpbnZhbGlkX251bWJlcicgfTtcbiAgfVxuICBpZiAoY29uc3RyYWludHMubWluICE9PSB1bmRlZmluZWQgJiYgbiA8IGNvbnN0cmFpbnRzLm1pbikge1xuICAgIHJldHVybiB7XG4gICAgICBrZXksXG4gICAgICBtZXNzYWdlOiBgRW52ICR7a2V5fTogbXVzdCBiZSA+PSAke2NvbnN0cmFpbnRzLm1pbn0sIGdvdCAke259YCxcbiAgICAgIHJhdyxcbiAgICAgIGtpbmQ6ICdpbnZhbGlkX251bWJlcicsXG4gICAgfTtcbiAgfVxuICBpZiAoY29uc3RyYWludHMubWF4ICE9PSB1bmRlZmluZWQgJiYgbiA+IGNvbnN0cmFpbnRzLm1heCkge1xuICAgIHJldHVybiB7XG4gICAgICBrZXksXG4gICAgICBtZXNzYWdlOiBgRW52ICR7a2V5fTogbXVzdCBiZSA8PSAke2NvbnN0cmFpbnRzLm1heH0sIGdvdCAke259YCxcbiAgICAgIHJhdyxcbiAgICAgIGtpbmQ6ICdpbnZhbGlkX251bWJlcicsXG4gICAgfTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuLyoqIE9wdGlvbnMgYWNjZXB0ZWQgYnkgYHBhcnNlRW52VmFsdWVgIChzdWJzZXQgb2YgYFN0cmljdEVudk9wdGlvbnNgKS4gKi9cbnR5cGUgUGFyc2VFbnZWYWx1ZU9wdGlvbnM8UyBleHRlbmRzIFN0cmljdEVudlNwZWM+ID0gUGljazxTdHJpY3RFbnZPcHRpb25zPFM+LCAndHJpbSc+O1xuXG4vKipcbiAqIFJlc29sdmVzIGEgc2NoZW1hIGVudHJ5IGludG8gaXRzIHNwZWMgYW5kIG9wdGlvbmFsIHBlci1rZXkgb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gZW50cnkgLSBTY2hlbWEgZW50cnkgb3IgYFtzcGVjLCBvcHRpb25zXWAgdHVwbGUuXG4gKiBAcmV0dXJucyBQYXJzZWQgc3BlYyBhbmQgb3B0aW9ucyBmb3IgYHJlc29sdmVBbGxgLlxuICovXG5jb25zdCByZXNvbHZlU2NoZW1hRW50cnkgPSAoXG4gIGVudHJ5OiBTdHJpY3RFbnZTY2hlbWFFbnRyeSxcbik6IHsgc3BlYzogU3RyaWN0RW52U3BlYzsgb3B0aW9uczogU3RyaWN0RW52T3B0aW9uczxTdHJpY3RFbnZTcGVjPiB8IHVuZGVmaW5lZCB9ID0+ICh7XG4gIHNwZWM6IChBcnJheS5pc0FycmF5KGVudHJ5KSA/IGVudHJ5WzBdIDogZW50cnkpIGFzIFN0cmljdEVudlNwZWMsXG4gIG9wdGlvbnM6IChBcnJheS5pc0FycmF5KGVudHJ5KSA/IGVudHJ5WzFdIDogdW5kZWZpbmVkKSBhcyBTdHJpY3RFbnZPcHRpb25zPFN0cmljdEVudlNwZWM+IHwgdW5kZWZpbmVkLFxufSk7XG5cbi8qKlxuICogUGFyc2VzIGEgc2luZ2xlIGVudmlyb25tZW50IHZhcmlhYmxlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gc3BlYy5cbiAqXG4gKiBDZW50cmFsIHZhbGlkYXRpb24gaGVscGVyIHNoYXJlZCBieSBgcmVzb2x2ZWAgYW5kIGByZXNvbHZlQWxsYC4gRG9lcyBub3QgdGhyb3c7XG4gKiBjYWxsZXJzIGRlY2lkZSB3aGV0aGVyIHRvIHRocm93IGltbWVkaWF0ZWx5IG9yIGNvbGxlY3QgZXJyb3JzLlxuICpcbiAqIE1pc3Npbmcgb3IgZW1wdHkgKGBcIlwiYCkgdmFsdWVzIHVzZSBgZGVmYXVsdFZhbHVlYCB3aGVuIHByb3ZpZGVkLiBXaGVuIGB0cmltYCBpcyBlbmFibGVkLFxuICogd2hpdGVzcGFjZS1vbmx5IHZhbHVlcyBhcmUgdHJlYXRlZCBhcyBlbXB0eS4gTnVtYmVyIHNwZWNzIGRlbGVnYXRlIHRvIGBwYXJzZU51bWJlcmAsIHRoZW5cbiAqIG9wdGlvbmFsIGBtaW5gIC8gYG1heGAgLyBgaW50ZWdlcmAgY29uc3RyYWludHMgKHNlZSB7QGxpbmsgU3RyaWN0RW52TnVtYmVyQ29uc3RyYWludHN9KS5cbiAqIEJvb2xlYW4gc3BlY3MgdHJlYXQgYDFgL2B0cnVlYC9geWVzYC9gb25gIChjYXNlLWluc2Vuc2l0aXZlLCBhZnRlciBub3JtYWxpemF0aW9uKSBhcyBgdHJ1ZWAuXG4gKiBFbnVtIHNwZWNzIHJlcXVpcmUgYW4gZXhhY3QgbWF0Y2ggaW4gYGNob2ljZXNgIChhZnRlciBub3JtYWxpemF0aW9uKS5cbiAqXG4gKiBAdGVtcGxhdGUgSyAtIEVudmlyb25tZW50IHZhcmlhYmxlIGtleSB0eXBlLlxuICogQHRlbXBsYXRlIFMgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBzcGVjIHR5cGUuXG4gKiBAcGFyYW0ga2V5IC0gRW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZS5cbiAqIEBwYXJhbSBzcGVjIC0gVHlwZSBzcGVjIGZvciB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gcmF3IC0gUmF3IHZhbHVlIGZyb20gYHByb2Nlc3MuZW52YCwgaWYgcHJlc2VudC5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgLSBGYWxsYmFjayBmcm9tIHtAbGluayBTdHJpY3RFbnZPcHRpb25zLmRlZmF1bHR9IHdoZW4gYHJhd2AgaXMgbWlzc2luZyBvciBlbXB0eS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgdHJpbSBvdmVycmlkZSAoYHRyaW1gIGRlZmF1bHRzIHBlciBzcGVjIHR5cGUpLlxuICogQHJldHVybnMgUGFyc2VkIHZhbHVlIG9yIGEgc3RydWN0dXJlZCB2YWxpZGF0aW9uIGVycm9yLlxuICovXG5jb25zdCBwYXJzZUVudlZhbHVlID0gPEsgZXh0ZW5kcyBzdHJpbmcsIFMgZXh0ZW5kcyBTdHJpY3RFbnZTcGVjPihcbiAga2V5OiBLLFxuICBzcGVjOiBTLFxuICByYXc6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZGVmYXVsdFZhbHVlOiBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IHwgdW5kZWZpbmVkLFxuICBvcHRpb25zPzogUGFyc2VFbnZWYWx1ZU9wdGlvbnM8Uz4sXG4pOiBQYXJzZUVudlZhbHVlUmVzdWx0PEssIFM+ID0+IHtcbiAgY29uc3QgdHJpbSA9IG9wdGlvbnM/LnRyaW0gPz8gZGVmYXVsdFRyaW1Gb3JTcGVjKHNwZWMpO1xuICBjb25zdCBub3JtYWxpemVkUmF3ID0gbm9ybWFsaXplRW52UmF3KHJhdywgdHJpbSk7XG4gIGNvbnN0IGhhc0RlZmF1bHQgPSBkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZDtcblxuICBpZiAobm9ybWFsaXplZFJhdyA9PSBudWxsIHx8IG5vcm1hbGl6ZWRSYXcgPT09ICcnKSB7XG4gICAgaWYgKGhhc0RlZmF1bHQpIHtcbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogZGVmYXVsdFZhbHVlIGFzIFN0cmljdEVudlNwZWNUb1R5cGU8Uz4gfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG9rOiBmYWxzZSxcbiAgICAgIGVycm9yOiB7IGtleSwgbWVzc2FnZTogYE1pc3NpbmcgcmVxdWlyZWQgZW52aXJvbm1lbnQgdmFyaWFibGU6ICR7a2V5fWAsIHJhdywga2luZDogJ21pc3NpbmcnIH0sXG4gICAgfTtcbiAgfVxuXG4gIHN3aXRjaCAoc3BlYy50eXBlKSB7XG4gICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgY29uc3QgbiA9IHBhcnNlTnVtYmVyKG5vcm1hbGl6ZWRSYXcpO1xuICAgICAgaWYgKG4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogeyBrZXksIG1lc3NhZ2U6IGBFbnYgJHtrZXl9OiBleHBlY3RlZCBudW1iZXIsIGdvdCBcIiR7cmF3fVwiYCwgcmF3LCBraW5kOiAnaW52YWxpZF9udW1iZXInIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBjb25zdHJhaW50RXJyb3IgPSB2YWxpZGF0ZU51bWJlckNvbnN0cmFpbnRzKGtleSwgcmF3LCBuLCBzcGVjKTtcbiAgICAgIGlmIChjb25zdHJhaW50RXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBjb25zdHJhaW50RXJyb3IgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogbiBhcyBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IH07XG4gICAgfVxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIHZhbHVlOiBwYXJzZUJvb2xlYW5FbnZWYWx1ZShub3JtYWxpemVkUmF3KSBhcyBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IH07XG4gICAgY2FzZSAnZW51bSc6XG4gICAgICBpZiAoIXNwZWMuY2hvaWNlcy5pbmNsdWRlcyhub3JtYWxpemVkUmF3KSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgbWVzc2FnZTogYEVudiAke2tleX06IG11c3QgYmUgb25lIG9mIFske3NwZWMuY2hvaWNlcy5qb2luKCcsICcpfV1gLFxuICAgICAgICAgICAgcmF3LFxuICAgICAgICAgICAga2luZDogJ2ludmFsaWRfZW51bScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogbm9ybWFsaXplZFJhdyBhcyBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogbm9ybWFsaXplZFJhdyBhcyBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IH07XG4gIH1cbn07XG5cbi8qKlxuICogUmVhZHMgYW5kIHBhcnNlcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHNwZWMuXG4gKlxuICogRGVsZWdhdGVzIHZhbGlkYXRpb24gdG8gYHBhcnNlRW52VmFsdWVgLiBNaXNzaW5nIG9yIGVtcHR5IChgXCJcImApIHZhbHVlcyB1c2VcbiAqIGBvcHRpb25zLmRlZmF1bHRgIHdoZW4gcHJvdmlkZWQ7IG90aGVyd2lzZSBhIGBTdHJpY3RFbnZWYWxpZGF0aW9uRXJyb3JgIGlzIHRocm93bi5cbiAqIFdoaXRlc3BhY2Utb25seSB2YWx1ZXMgYXJlIHRyZWF0ZWQgYXMgbWlzc2luZyB3aGVuIGB0cmltYCBpcyBlbmFibGVkLlxuICogRm9yIGBTdHJpY3RFbnZUeXBlLk51bWJlcmAsIHZhbHVlcyBhcmUgcGFyc2VkIGFzIGZpbml0ZSBudW1iZXJzIChzZWUge0BsaW5rIFN0cmljdEVudlR5cGVOdW1iZXJ9KS5cbiAqXG4gKiBAdGVtcGxhdGUgSyAtIEVudmlyb25tZW50IHZhcmlhYmxlIGtleSB0eXBlLlxuICogQHRlbXBsYXRlIFMgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBzcGVjIHR5cGUuXG4gKiBAcGFyYW0ga2V5IC0gRW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSAoZS5nLiBgXCJQT1JUXCJgLCBgXCJOT0RFX0VOVlwiYCkuXG4gKiBAcGFyYW0gc3BlYyAtIFR5cGUgc3BlYzsgZGVmYXVsdHMgdG8gYFN0cmljdEVudlR5cGUuU3RyaW5nYCB3aGVuIG9taXR0ZWQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGB7IGRlZmF1bHQsIHRyaW0gfWA7IHNlZSB7QGxpbmsgU3RyaWN0RW52T3B0aW9uc30uXG4gKiBAcmV0dXJucyBQYXJzZWQgdmFsdWUgd2l0aCB0eXBlIGluZmVycmVkIGZyb20gYHNwZWNgLlxuICogQHRocm93cyB7U3RyaWN0RW52VmFsaWRhdGlvbkVycm9yfSBXaGVuIHRoZSB2YXJpYWJsZSBpcyBtaXNzaW5nLCBlbXB0eSB3aXRob3V0IGEgZGVmYXVsdCxcbiAqICAgd2hpdGVzcGFjZS1vbmx5IHdpdGhvdXQgYSBkZWZhdWx0ICh3aGVuIHRyaW1taW5nKSwgb3IgaW52YWxpZCBmb3IgdGhlIHNwZWMuXG4gKi9cbmNvbnN0IHJlc29sdmUgPSA8SyBleHRlbmRzIHN0cmluZywgUyBleHRlbmRzIFN0cmljdEVudlNwZWMgPSBTdHJpY3RFbnZUeXBlU3RyaW5nPihcbiAga2V5OiBLLFxuICBzcGVjOiBTID0gU3RyaWN0RW52VHlwZS5TdHJpbmcgYXMgUyxcbiAgb3B0aW9ucz86IFN0cmljdEVudk9wdGlvbnM8Uz4sXG4pOiBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+ID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gcGFyc2VFbnZWYWx1ZShrZXksIHNwZWMsIHByb2Nlc3MuZW52W2tleV0sIG9wdGlvbnM/LmRlZmF1bHQsIG9wdGlvbnMpO1xuICBpZiAoIXJlc3VsdC5vaykge1xuICAgIHRocm93IG5ldyBTdHJpY3RFbnZWYWxpZGF0aW9uRXJyb3IoW3Jlc3VsdC5lcnJvcl0pO1xuICB9XG4gIHJldHVybiByZXN1bHQudmFsdWU7XG59O1xuXG4vKipcbiAqIFJlYWRzIGFuZCBwYXJzZXMgbXVsdGlwbGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gc2NoZW1hLlxuICpcbiAqIEFsd2F5cyBldmFsdWF0ZXMgZXZlcnkga2V5IGluIGBzY2hlbWFgLiBFYWNoIGVudHJ5IGlzIHZhbGlkYXRlZCB2aWEgYHBhcnNlRW52VmFsdWVgO1xuICogYWxsIGVycm9ycyBhcmUgY29sbGVjdGVkIGFuZCB0aHJvd24gb25jZSBpbiBhIHNpbmdsZSBgU3RyaWN0RW52VmFsaWRhdGlvbkVycm9yYC5cbiAqIE51bWJlciBzcGVjcyB1c2UgdGhlIHNhbWUgZmluaXRlLW51bWJlciBydWxlcyBhcyBgcmVzb2x2ZWAuXG4gKlxuICogQHRlbXBsYXRlIFRTY2hlbWEgLSBTY2hlbWEgb2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gc2NoZW1hIC0gTWFwIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVzIHRvIHNwZWNzIG9yIGBbc3BlYywgb3B0aW9uc11gIHR1cGxlc1xuICogICAoc2VlIHtAbGluayBTdHJpY3RFbnZPcHRpb25zfSBmb3IgcGVyLWtleSBgZGVmYXVsdGAgLyBgdHJpbWApLlxuICogQHJldHVybnMgUGFyc2VkIGVudmlyb25tZW50IG9iamVjdCB3aXRoIHR5cGVzIGluZmVycmVkIGZyb20gdGhlIHNjaGVtYS5cbiAqIEB0aHJvd3Mge1N0cmljdEVudlZhbGlkYXRpb25FcnJvcn0gV2hlbiBvbmUgb3IgbW9yZSB2YXJpYWJsZXMgYXJlIG1pc3NpbmcsIGVtcHR5IHdpdGhvdXQgYSBkZWZhdWx0LFxuICogICB3aGl0ZXNwYWNlLW9ubHkgd2l0aG91dCBhIGRlZmF1bHQgKHdoZW4gdHJpbW1pbmcpLCBvciBpbnZhbGlkLlxuICovXG5jb25zdCByZXNvbHZlQWxsID0gPFRTY2hlbWEgZXh0ZW5kcyBTdHJpY3RFbnZTY2hlbWE+KHNjaGVtYTogVFNjaGVtYSk6IFN0cmljdEVudlNjaGVtYVRvVHlwZTxUU2NoZW1hPiA9PiB7XG4gIGNvbnN0IGVudnM6IFBhcnRpYWw8U3RyaWN0RW52U2NoZW1hVG9UeXBlPFRTY2hlbWE+PiA9IHt9O1xuICBjb25zdCBlcnJvcnM6IFN0cmljdEVudlZhbGlkYXRpb25FbnRyeTxFeHRyYWN0PGtleW9mIFRTY2hlbWEsIHN0cmluZz4+W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzY2hlbWEpIGFzIEFycmF5PEV4dHJhY3Q8a2V5b2YgVFNjaGVtYSwgc3RyaW5nPj4pIHtcbiAgICBjb25zdCB7IHNwZWMsIG9wdGlvbnMgfSA9IHJlc29sdmVTY2hlbWFFbnRyeShzY2hlbWFba2V5XSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBwYXJzZUVudlZhbHVlKGtleSwgc3BlYywgcHJvY2Vzcy5lbnZba2V5XSwgb3B0aW9ucz8uZGVmYXVsdCwgb3B0aW9ucyk7XG4gICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgIGVycm9ycy5wdXNoKHJlc3VsdC5lcnJvcik7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZW52c1trZXldID0gcmVzdWx0LnZhbHVlIGFzIFN0cmljdEVudlNjaGVtYVRvVHlwZTxUU2NoZW1hPlt0eXBlb2Yga2V5XTtcbiAgfVxuXG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkgdGhyb3cgbmV3IFN0cmljdEVudlZhbGlkYXRpb25FcnJvcihlcnJvcnMpO1xuICByZXR1cm4gZW52cyBhcyBTdHJpY3RFbnZTY2hlbWFUb1R5cGU8VFNjaGVtYT47XG59O1xuXG4vKipcbiAqIFR5cGUtc2FmZSBlbnZpcm9ubWVudCB2YXJpYWJsZSByZXNvbHZlciBmb3IgTm9kZS5qcyBgcHJvY2Vzcy5lbnZgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgcG9ydCA9IFN0cmljdEVudlJlc29sdmVyLnJlc29sdmUoJ1BPUlQnLCBTdHJpY3RFbnZUeXBlLlBvc2l0aXZlSW50KTtcbiAqIGNvbnN0IGVudnMgPSBTdHJpY3RFbnZSZXNvbHZlci5yZXNvbHZlQWxsKHtcbiAqICAgUE9SVDogU3RyaWN0RW52VHlwZS5Qb3NpdGl2ZUludCxcbiAqICAgREVCVUc6IFtTdHJpY3RFbnZUeXBlLkJvb2xlYW4sIHsgZGVmYXVsdDogZmFsc2UgfV0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgU3RyaWN0RW52UmVzb2x2ZXIgPSB7XG4gIC8qKiBSZWFkcyBhbmQgcGFyc2VzIGEgc2luZ2xlIGVudmlyb25tZW50IHZhcmlhYmxlLiBTZWUge0BsaW5rIHJlc29sdmV9LiAqL1xuICByZXNvbHZlLFxuICAvKiogUmVhZHMgYW5kIHBhcnNlcyBtdWx0aXBsZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gb25lIHBhc3MuIFNlZSB7QGxpbmsgcmVzb2x2ZUFsbH0uICovXG4gIHJlc29sdmVBbGwsXG59IGFzIGNvbnN0O1xuIl19
|
|
378
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBbUNBOzs7R0FHRztBQUNILE1BQU0sb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7QUFFbEQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQVcsRUFBc0IsRUFBRTtJQUN0RCxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN4QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxhQUFxQixFQUFXLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7QUFzRDFHOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFzQixjQUFlLFNBQVEsS0FBSztJQUNoRDs7T0FFRztJQUNILFlBQXNCLE9BQWU7UUFDbkMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0NBQ0Y7QUFSRCx3Q0FRQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBYSx3QkFBb0QsU0FBUSxjQUFjO0lBQ3JGOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQW1CLE1BQThDO1FBQ25GLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMs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RztBQUNILE1BQU0sVUFBVSxHQUFHLENBQWtDLE1BQWUsRUFBa0MsRUFBRTtJQUN0RyxNQUFNLElBQUksR0FBNEMsRUFBRSxDQUFDO0lBQ3pELE1BQU0sTUFBTSxHQUErRCxFQUFFLENBQUM7SUFFOUUsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBMEMsRUFBRSxDQUFDO1FBQy9FLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFMUQsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JGLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixTQUFTO1FBQ1gsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBbUQsQ0FBQztJQUN6RSxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxNQUFNLElBQUksd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEUsT0FBTyxJQUFzQyxDQUFDO0FBQ2hELENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7OztHQVdHO0FBQ1UsUUFBQSxpQkFBaUIsR0FBRztJQUMvQiwyRUFBMkU7SUFDM0UsT0FBTztJQUNQLDJGQUEyRjtJQUMzRixVQUFVO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3BlYyBmb3IgYSBzdHJpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKiBWYWx1ZXMgYXJlIHJldHVybmVkIGFzLWlzIHVubGVzcyBgdHJpbTogdHJ1ZWAgaXMgc2V0IGluIHtAbGluayBTdHJpY3RFbnZPcHRpb25zfVxuICogKHdoaXRlc3BhY2Utb25seSB2YWx1ZXMgYXJlIHRoZW4gdHJlYXRlZCBhcyBtaXNzaW5nKS5cbiAqIERlZmF1bHRzIGJlbG9uZyBpbiB7QGxpbmsgU3RyaWN0RW52T3B0aW9uc30sIG5vdCBvbiB0aGlzIHNwZWMuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlR5cGVTdHJpbmcgPSB7IHR5cGU6ICdzdHJpbmcnIH07XG5cbi8qKlxuICogT3B0aW9uYWwgY29uc3RyYWludHMgZm9yIGEgbnVtZXJpYyBlbnZpcm9ubWVudCB2YXJpYWJsZSBzcGVjLlxuICogVXNlZCBieSB7QGxpbmsgU3RyaWN0RW52VHlwZS5OdW1iZXJ9IHdoZW4gY2FsbGVkIGFzIGEgZmFjdG9yeSwgYW5kIGJ5IG5lc3RlZCBwcmVzZXRzXG4gKiBzdWNoIGFzIHtAbGluayBTdHJpY3RFbnZUeXBlLk51bWJlci5Qb3J0fSAvIHtAbGluayBTdHJpY3RFbnZUeXBlLk51bWJlci5Qb3NpdGl2ZUludGVnZXJ9LlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50cyA9IHtcbiAgLyoqIEluY2x1c2l2ZSBsb3dlciBib3VuZCAoYG4gPj0gbWluYCkuICovXG4gIG1pbj86IG51bWJlcjtcbiAgLyoqIEluY2x1c2l2ZSB1cHBlciBib3VuZCAoYG4gPD0gbWF4YCkuICovXG4gIG1heD86IG51bWJlcjtcbiAgLyoqIEV4Y2x1c2l2ZSBsb3dlciBib3VuZCAoYG4gPiBleGNsdXNpdmVNaW5gKS4gKi9cbiAgZXhjbHVzaXZlTWluPzogbnVtYmVyO1xuICAvKiogRXhjbHVzaXZlIHVwcGVyIGJvdW5kIChgbiA8IGV4Y2x1c2l2ZU1heGApLiAqL1xuICBleGNsdXNpdmVNYXg/OiBudW1iZXI7XG4gIC8qKiBXaGVuIGB0cnVlYCwgdGhlIHZhbHVlIG11c3QgYmUgYW4gaW50ZWdlciAoYE51bWJlci5pc0ludGVnZXJgKS4gKi9cbiAgaW50ZWdlcj86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwZWMgZm9yIGEgbnVtZXJpYyBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqIFZhbHVlcyBhcmUgcGFyc2VkIHdpdGggYE51bWJlcigpYDsgYE5hTmAsIGBJbmZpbml0eWAsIGFuZCBgLUluZmluaXR5YCBhcmUgcmVqZWN0ZWQuXG4gKiBPcHRpb25hbCB7QGxpbmsgU3RyaWN0RW52TnVtYmVyQ29uc3RyYWludHN9IChgbWluYCwgYG1heGAsIGBleGNsdXNpdmVNaW5gLCBgZXhjbHVzaXZlTWF4YCwgYGludGVnZXJgKVxuICogbmFycm93IGFjY2VwdGVkIHZhbHVlcy5cbiAqIERlZmF1bHRzIGJlbG9uZyBpbiB7QGxpbmsgU3RyaWN0RW52T3B0aW9uc30sIG5vdCBvbiB0aGlzIHNwZWMuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlR5cGVOdW1iZXIgPSB7IHR5cGU6ICdudW1iZXInIH0gJiBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50cztcblxuLyoqXG4gKiBQYXR0ZXJuIGZvciBib29sZWFuIGVudiB2YWx1ZXMgdGhhdCBwYXJzZSBhcyBgdHJ1ZWAuXG4gKiBNYXRjaGVzIGAxYCwgYHRydWVgLCBgeWVzYCwgYW5kIGBvbmAgKGNhc2UtaW5zZW5zaXRpdmUpIG9uIHRoZSBmdWxsIHRyaW1tZWQgc3RyaW5nLlxuICovXG5jb25zdCBUUlVFX0JPT0xFQU5fUEFUVEVSTiA9IC9eKDF8dHJ1ZXx5ZXN8b24pJC9pO1xuXG4vKipcbiAqIFBhcnNlcyBhIHN0cmluZyBhcyBhIGZpbml0ZSBudW1iZXIgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiBAcGFyYW0gcmF3IC0gTm9ybWFsaXplZCBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSAodHJpbW1lZCB3aGVuIGB0cmltYCBpcyBlbmFibGVkKS5cbiAqIEByZXR1cm5zIFBhcnNlZCBudW1iZXIsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHZhbHVlIGlzIG5vdCBhIGZpbml0ZSBudW1iZXIuXG4gKi9cbmNvbnN0IHBhcnNlTnVtYmVyID0gKHJhdzogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgbiA9IE51bWJlcihyYXcpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShuKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG47XG59O1xuXG4vKipcbiAqIFBhcnNlcyBhIG5vcm1hbGl6ZWQgc3RyaW5nIGFzIGEgYm9vbGVhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gbm9ybWFsaXplZFJhdyAtIE5vcm1hbGl6ZWQgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWUgKHRyaW1tZWQgd2hlbiBgdHJpbWAgaXMgZW5hYmxlZCkuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgZm9yIGAxYC9gdHJ1ZWAvYHllc2AvYG9uYCAoY2FzZS1pbnNlbnNpdGl2ZSk7IG90aGVyd2lzZSBgZmFsc2VgLlxuICovXG5jb25zdCBwYXJzZUJvb2xlYW5FbnZWYWx1ZSA9IChub3JtYWxpemVkUmF3OiBzdHJpbmcpOiBib29sZWFuID0+IFRSVUVfQk9PTEVBTl9QQVRURVJOLnRlc3Qobm9ybWFsaXplZFJhdyk7XG5cbi8qKlxuICogU3BlYyBmb3IgYSBib29sZWFuIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICogUGFyc2VzIGAxYCwgYHRydWVgLCBgeWVzYCwgYG9uYCAoY2FzZS1pbnNlbnNpdGl2ZSwgYWZ0ZXIgbm9ybWFsaXphdGlvbikgYXMgYHRydWVgO1xuICogYW55IG90aGVyIG5vbi1lbXB0eSB2YWx1ZSBhcyBgZmFsc2VgLlxuICogVHJpbXMgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIGJ5IGRlZmF1bHQgKHNlZSB7QGxpbmsgU3RyaWN0RW52T3B0aW9ucy50cmltfSkuXG4gKiBEZWZhdWx0cyBiZWxvbmcgaW4ge0BsaW5rIFN0cmljdEVudk9wdGlvbnN9LCBub3Qgb24gdGhpcyBzcGVjLlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZUeXBlQm9vbGVhbiA9IHsgdHlwZTogJ2Jvb2xlYW4nIH07XG5cbi8qKlxuICogU3BlYyBmb3IgYW4gZW51bSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIGEgZml4ZWQgc2V0IG9mIGNob2ljZXMuXG4gKiBUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgYGNob2ljZXNgIChjb21wYXJlZCBhZnRlciBub3JtYWxpemF0aW9uKTsgb3RoZXJ3aXNlIHZhbGlkYXRpb24gZmFpbHMuXG4gKiBUcmltcyBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UgYnkgZGVmYXVsdCAoc2VlIHtAbGluayBTdHJpY3RFbnZPcHRpb25zLnRyaW19KS5cbiAqIERlZmF1bHRzIGJlbG9uZyBpbiB7QGxpbmsgU3RyaWN0RW52T3B0aW9uc30sIG5vdCBvbiB0aGlzIHNwZWMuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBMaXRlcmFsIHN0cmluZyB1bmlvbiBvZiBhbGxvd2VkIHZhbHVlcy5cbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52VHlwZUVudW08VCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7IHR5cGU6ICdlbnVtJzsgY2hvaWNlczogcmVhZG9ubHkgVFtdIH07XG5cbi8qKiBVbmlvbiBvZiBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGUgc3BlYyB0eXBlcy4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlNwZWMgPVxuICB8IFN0cmljdEVudlR5cGVTdHJpbmdcbiAgfCBTdHJpY3RFbnZUeXBlTnVtYmVyXG4gIHwgU3RyaWN0RW52VHlwZUJvb2xlYW5cbiAgfCBTdHJpY3RFbnZUeXBlRW51bTtcblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIHVuaW9uIG9mIGVycm9yIGtpbmRzIGVtaXR0ZWQgZHVyaW5nIGVudmlyb25tZW50IHZhcmlhYmxlIHBhcnNpbmcuXG4gKlxuICogLSBgbWlzc2luZ2Ag4oCUIFZhcmlhYmxlIHVuc2V0LCBlbXB0eSBzdHJpbmcsIG9yIHdoaXRlc3BhY2Utb25seSAod2hlbiB0cmltIGlzIGVuYWJsZWQpIHdpdGhvdXQgYSBkZWZhdWx0LlxuICogLSBgaW52YWxpZF9udW1iZXJgIOKAlCBWYWx1ZSBpcyBub3QgYSBmaW5pdGUgbnVtYmVyLCBub3QgYW4gaW50ZWdlciB3aGVuIHJlcXVpcmVkLCBvciBvdXRzaWRlXG4gKiAgIGBtaW5gIC8gYG1heGAgLyBgZXhjbHVzaXZlTWluYCAvIGBleGNsdXNpdmVNYXhgIChzZWUge0BsaW5rIFN0cmljdEVudlR5cGVOdW1iZXJ9KS5cbiAqIC0gYGludmFsaWRfZW51bWAg4oCUIFZhbHVlIGlzIG5vdCBvbmUgb2YgdGhlIGFsbG93ZWQgZW51bSBjaG9pY2VzLlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZFcnJvcktpbmQgPSAnbWlzc2luZycgfCAnaW52YWxpZF9udW1iZXInIHwgJ2ludmFsaWRfZW51bSc7XG5cbi8qKlxuICogQSBzdHJ1Y3R1cmVkIHZhbGlkYXRpb24gZXJyb3IgZW50cnkgZm9yIGEgc2luZ2xlIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICpcbiAqIEB0ZW1wbGF0ZSBLIC0gRW52aXJvbm1lbnQgdmFyaWFibGUga2V5IHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlZhbGlkYXRpb25FbnRyeTxLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9IHtcbiAgLyoqIEVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUuICovXG4gIGtleTogSztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuICovXG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqIFJhdyB2YWx1ZSBmcm9tIGBwcm9jZXNzLmVudmAsIGlmIHByZXNlbnQuICovXG4gIHJhdz86IHN0cmluZztcbiAgLyoqIEVycm9yIGNhdGVnb3J5IGZvciBwcm9ncmFtbWF0aWMgaGFuZGxpbmcuICovXG4gIGtpbmQ6IFN0cmljdEVudkVycm9yS2luZDtcbn07XG5cbi8qKlxuICogQmFzZSBlcnJvciBjbGFzcyBmb3IgdGhpcyBwYWNrYWdlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogdHJ5IHtcbiAqICAgU3RyaWN0RW52UmVzb2x2ZXIucmVzb2x2ZSgnUE9SVCcsIFN0cmljdEVudlR5cGUuTnVtYmVyKTtcbiAqIH0gY2F0Y2ggKGUpIHtcbiAqICAgaWYgKGUgaW5zdGFuY2VvZiBTdHJpY3RFbnZFcnJvcikge1xuICogICAgIC8vIEhhbmRsZSBhbGwgc3RyaWN0LWVudi1yZXNvbHZlciBlcnJvcnNcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTdHJpY3RFbnZFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZS5cbiAgICovXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnU3RyaWN0RW52RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGlvbiBlcnJvciB0aGF0IGNhcnJpZXMgb25lIG9yIG1vcmUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXNzdWVzLlxuICpcbiAqIFRocm93biBieSBgU3RyaWN0RW52UmVzb2x2ZXIucmVzb2x2ZSgpYCAoc2luZ2xlLWVudHJ5IGBlcnJvcnNgKSBhbmRcbiAqIGBTdHJpY3RFbnZSZXNvbHZlci5yZXNvbHZlQWxsKClgIChtdWx0aS1lbnRyeSBgZXJyb3JzYCkuXG4gKiBJbmRpdmlkdWFsIGVudHJpZXMgYXJlIHByb2R1Y2VkIGJ5IHRoZSBpbnRlcm5hbCBgcGFyc2VFbnZWYWx1ZWAgaGVscGVyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLIC0gVW5pb24gb2YgZW52aXJvbm1lbnQgdmFyaWFibGUga2V5cyBpbmNsdWRlZCBpbiBgZXJyb3JzYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmljdEVudlZhbGlkYXRpb25FcnJvcjxLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiBleHRlbmRzIFN0cmljdEVudkVycm9yIHtcbiAgLyoqXG4gICAqIEZvcm1hdHMgdmFsaWRhdGlvbiBlcnJvcnMgaW50byBhIGh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBLIC0gRW52aXJvbm1lbnQgdmFyaWFibGUga2V5IHR5cGUuXG4gICAqIEBwYXJhbSBlcnJvcnMgLSBWYWxpZGF0aW9uIGVycm9yIGVudHJpZXMgdG8gZm9ybWF0LlxuICAgKiBAcmV0dXJucyBNdWx0aS1saW5lIHN1bW1hcnkgbGlzdGluZyBlYWNoIGtleSBhbmQgbWVzc2FnZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZm9ybWF0PEsgZXh0ZW5kcyBzdHJpbmc+KGVycm9yczogcmVhZG9ubHkgU3RyaWN0RW52VmFsaWRhdGlvbkVudHJ5PEs+W10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzID0gZXJyb3JzLm1hcCgoZSkgPT4gYC0gJHtlLmtleX06ICR7ZS5tZXNzYWdlfSR7ZS5yYXcgPT0gbnVsbCA/ICcnIDogYCAocmF3PVwiJHtlLnJhd31cIilgfWApO1xuICAgIHJldHVybiBgSW52YWxpZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKCR7ZXJyb3JzLmxlbmd0aH0pOlxcbiR7bGluZXMuam9pbignXFxuJyl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJ1Y3R1cmVkIGxpc3Qgb2YgdmFsaWRhdGlvbiBlcnJvcnMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXJyb3JzOiByZWFkb25seSBTdHJpY3RFbnZWYWxpZGF0aW9uRW50cnk8Sz5bXTtcbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIGxpc3Qgb2Yga2V5cyBpbmNsdWRlZCBpbiBgZXJyb3JzYC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBrZXlzOiByZWFkb25seSBLW107XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgdmFsaWRhdGlvbiBlcnJvciBmcm9tIG9uZSBvciBtb3JlIGBTdHJpY3RFbnZWYWxpZGF0aW9uRW50cnlgIGVudHJpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBlcnJvcnMgLSBPbmUgb3IgbW9yZSBzdHJ1Y3R1cmVkIHZhbGlkYXRpb24gZXJyb3JzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGVycm9yczogcmVhZG9ubHkgU3RyaWN0RW52VmFsaWRhdGlvbkVudHJ5PEs+W10pIHtcbiAgICBjb25zdCBtc2cgPSBTdHJpY3RFbnZWYWxpZGF0aW9uRXJyb3IuZm9ybWF0KGVycm9ycyk7XG4gICAgc3VwZXIobXNnKTtcbiAgICB0aGlzLm5hbWUgPSAnU3RyaWN0RW52VmFsaWRhdGlvbkVycm9yJztcbiAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICB0aGlzLmtleXMgPSBlcnJvcnMubWFwKChlKSA9PiBlLmtleSk7XG4gIH1cbn1cblxuLyoqIEluY2x1c2l2ZSBsb3dlciBib3VuZCBmb3IgcG9zaXRpdmUgaW50ZWdlcnMgKGA+PSAxYCkuICovXG5jb25zdCBNSU5fUE9TSVRJVkVfSU5URUdFUiA9IDE7XG5cbi8qKiBJbmNsdXNpdmUgdXBwZXIgYm91bmQgZm9yIG5lZ2F0aXZlIGludGVnZXJzIChgPD0gLTFgKS4gKi9cbmNvbnN0IE1BWF9ORUdBVElWRV9JTlRFR0VSID0gLTE7XG5cbi8qKlxuICogU2lnbiBib3VuZGFyeSBmb3IgUG9zaXRpdmUgKGA+IDBgKSwgTmVnYXRpdmUgKGA8IDBgKSwgYW5kIG5vbi1uZWdhdGl2ZSAoYD49IDBgKSBwcmVzZXRzLlxuICovXG5jb25zdCBaRVJPID0gMDtcblxuLyoqXG4gKiBJbmNsdXNpdmUgbG93ZXIgVENQL1VEUCBwb3J0IChJQU5BKS4gUG9ydCAwIG1lYW5zIFwiYW55IGF2YWlsYWJsZVwiIGFuZCBpcyByZWplY3RlZC5cbiAqL1xuY29uc3QgTUlOX1BPUlQgPSBNSU5fUE9TSVRJVkVfSU5URUdFUjtcblxuLyoqIEluY2x1c2l2ZSB1cHBlciBUQ1AvVURQIHBvcnQgKElBTkEpLiAqL1xuY29uc3QgTUFYX1BPUlQgPSA2NTUzNTtcblxuLyoqXG4gKiBCdWlsZHMgYSBudW1lcmljIGVudiBzcGVjIGZyb20gb3B0aW9uYWwgY29uc3RyYWludHMuXG4gKlxuICogQHBhcmFtIGNvbnN0cmFpbnRzIC0gT3B0aW9uYWwgYG1pbmAsIGBtYXhgLCBgZXhjbHVzaXZlTWluYCwgYGV4Y2x1c2l2ZU1heGAsIGFuZC9vciBgaW50ZWdlcmAgYm91bmRzLlxuICogQHJldHVybnMgTnVtYmVyIHNwZWMgZm9yIHVzZSB3aXRoIGByZXNvbHZlYCBvciBgcmVzb2x2ZUFsbGAuXG4gKi9cbmNvbnN0IGNyZWF0ZU51bWJlclNwZWMgPSAoY29uc3RyYWludHM/OiBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50cyk6IFN0cmljdEVudlR5cGVOdW1iZXIgPT4gKHtcbiAgdHlwZTogJ251bWJlcicsXG4gIC4uLihjb25zdHJhaW50cz8ubWluICE9PSB1bmRlZmluZWQgPyB7IG1pbjogY29uc3RyYWludHMubWluIH0gOiB7fSksXG4gIC4uLihjb25zdHJhaW50cz8ubWF4ICE9PSB1bmRlZmluZWQgPyB7IG1heDogY29uc3RyYWludHMubWF4IH0gOiB7fSksXG4gIC4uLihjb25zdHJhaW50cz8uZXhjbHVzaXZlTWluICE9PSB1bmRlZmluZWQgPyB7IGV4Y2x1c2l2ZU1pbjogY29uc3RyYWludHMuZXhjbHVzaXZlTWluIH0gOiB7fSksXG4gIC4uLihjb25zdHJhaW50cz8uZXhjbHVzaXZlTWF4ICE9PSB1bmRlZmluZWQgPyB7IGV4Y2x1c2l2ZU1heDogY29uc3RyYWludHMuZXhjbHVzaXZlTWF4IH0gOiB7fSksXG4gIC4uLihjb25zdHJhaW50cz8uaW50ZWdlciAhPT0gdW5kZWZpbmVkID8geyBpbnRlZ2VyOiBjb25zdHJhaW50cy5pbnRlZ2VyIH0gOiB7fSksXG59KTtcblxuLyoqXG4gKiBOYW1lZCBudW1iZXIgcHJlc2V0cyBuZXN0ZWQgdW5kZXIge0BsaW5rIFN0cmljdEVudlR5cGUuTnVtYmVyfS5cbiAqIEVhY2ggcHJlc2V0IGlzIHN1Z2FyIG92ZXIge0BsaW5rIFN0cmljdEVudk51bWJlckNvbnN0cmFpbnRzfTsgcGFyc2luZyBzdGF5cyBgdHlwZTogJ251bWJlcidgLlxuICovXG50eXBlIFN0cmljdEVudk51bWJlclByZXNldHMgPSB7XG4gIC8qKiBBbnkgaW50ZWdlci4gU3VnYXIgZm9yIGBOdW1iZXIoeyBpbnRlZ2VyOiB0cnVlIH0pYC4gKi9cbiAgSW50ZWdlcjogU3RyaWN0RW52VHlwZU51bWJlcjtcbiAgLyoqIEludGVnZXIgYD49IDFgLiBTdWdhciBmb3IgYE51bWJlcih7IG1pbjogMSwgaW50ZWdlcjogdHJ1ZSB9KWAuICovXG4gIFBvc2l0aXZlSW50ZWdlcjogU3RyaWN0RW52VHlwZU51bWJlcjtcbiAgLyoqIEludGVnZXIgYDw9IC0xYC4gU3VnYXIgZm9yIGBOdW1iZXIoeyBtYXg6IC0xLCBpbnRlZ2VyOiB0cnVlIH0pYC4gKi9cbiAgTmVnYXRpdmVJbnRlZ2VyOiBTdHJpY3RFbnZUeXBlTnVtYmVyO1xuICAvKiogSW50ZWdlciBgPj0gMGAuIFN1Z2FyIGZvciBgTnVtYmVyKHsgbWluOiAwLCBpbnRlZ2VyOiB0cnVlIH0pYC4gKi9cbiAgTm9uTmVnYXRpdmVJbnRlZ2VyOiBTdHJpY3RFbnZUeXBlTnVtYmVyO1xuICAvKiogRmluaXRlIG51bWJlciBgPiAwYC4gU3VnYXIgZm9yIGBOdW1iZXIoeyBleGNsdXNpdmVNaW46IDAgfSlgLiAqL1xuICBQb3NpdGl2ZTogU3RyaWN0RW52VHlwZU51bWJlcjtcbiAgLyoqIEZpbml0ZSBudW1iZXIgYDwgMGAuIFN1Z2FyIGZvciBgTnVtYmVyKHsgZXhjbHVzaXZlTWF4OiAwIH0pYC4gKi9cbiAgTmVnYXRpdmU6IFN0cmljdEVudlR5cGVOdW1iZXI7XG4gIC8qKiBGaW5pdGUgbnVtYmVyIGA+PSAwYC4gU3VnYXIgZm9yIGBOdW1iZXIoeyBtaW46IDAgfSlgLiAqL1xuICBOb25OZWdhdGl2ZTogU3RyaWN0RW52VHlwZU51bWJlcjtcbiAgLyoqIFRDUC9VRFAgcG9ydCBgMWDigJNgNjU1MzVgLiBTdWdhciBmb3IgYE51bWJlcih7IG1pbjogMSwgbWF4OiA2NTUzNSwgaW50ZWdlcjogdHJ1ZSB9KWAuICovXG4gIFBvcnQ6IFN0cmljdEVudlR5cGVOdW1iZXI7XG59O1xuXG4vKipcbiAqIFVuY29uc3RyYWluZWQgZmluaXRlLW51bWJlciBzcGVjLCBhbHNvIGNhbGxhYmxlIGFzIGEgZmFjdG9yeSBmb3IgY29uc3RyYWluZWQgc3BlY3MuXG4gKiBOYW1lZCBwcmVzZXRzIGhhbmcgb2ZmIHRoZSBzYW1lIG9iamVjdCAoYE51bWJlci5Qb3J0YCwgYE51bWJlci5Qb3NpdGl2ZUludGVnZXJgLCDigKYpLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogU3RyaWN0RW52VHlwZS5OdW1iZXJcbiAqIFN0cmljdEVudlR5cGUuTnVtYmVyKHsgbWluOiAwIH0pXG4gKiBTdHJpY3RFbnZUeXBlLk51bWJlcih7IGV4Y2x1c2l2ZU1pbjogMCB9KVxuICogU3RyaWN0RW52VHlwZS5OdW1iZXIuUG9ydFxuICogU3RyaWN0RW52VHlwZS5OdW1iZXIuUG9zaXRpdmVJbnRlZ2VyXG4gKiBgYGBcbiAqL1xudHlwZSBTdHJpY3RFbnZOdW1iZXJTcGVjRmFjdG9yeSA9IHtcbiAgKGNvbnN0cmFpbnRzPzogU3RyaWN0RW52TnVtYmVyQ29uc3RyYWludHMpOiBTdHJpY3RFbnZUeXBlTnVtYmVyO1xufSAmIFN0cmljdEVudlR5cGVOdW1iZXIgJiBTdHJpY3RFbnZOdW1iZXJQcmVzZXRzO1xuXG4vKipcbiAqIEZpbml0ZS1udW1iZXIgc3BlYyB0aGF0IGlzIGFsc28gYSBjb25zdHJhaW50IGZhY3RvcnkgYW5kIGEgaG9sZGVyIG9mIG5hbWVkIHByZXNldHMuXG4gKiBVc2UgYXMgYE51bWJlcmAsIGBOdW1iZXIoeyBtaW4sIG1heCwgZXhjbHVzaXZlTWluLCBleGNsdXNpdmVNYXgsIGludGVnZXIgfSlgLCBvciBgTnVtYmVyLlBvcnRgLlxuICovXG5jb25zdCBOdW1iZXJTcGVjOiBTdHJpY3RFbnZOdW1iZXJTcGVjRmFjdG9yeSA9IE9iamVjdC5hc3NpZ24oXG4gIChjb25zdHJhaW50cz86IFN0cmljdEVudk51bWJlckNvbnN0cmFpbnRzKTogU3RyaWN0RW52VHlwZU51bWJlciA9PiBjcmVhdGVOdW1iZXJTcGVjKGNvbnN0cmFpbnRzKSxcbiAgeyB0eXBlOiAnbnVtYmVyJyB9IGFzIGNvbnN0IHNhdGlzZmllcyBTdHJpY3RFbnZUeXBlTnVtYmVyLFxuICB7XG4gICAgSW50ZWdlcjogY3JlYXRlTnVtYmVyU3BlYyh7IGludGVnZXI6IHRydWUgfSksXG4gICAgUG9zaXRpdmVJbnRlZ2VyOiBjcmVhdGVOdW1iZXJTcGVjKHsgbWluOiBNSU5fUE9TSVRJVkVfSU5URUdFUiwgaW50ZWdlcjogdHJ1ZSB9KSxcbiAgICBOZWdhdGl2ZUludGVnZXI6IGNyZWF0ZU51bWJlclNwZWMoeyBtYXg6IE1BWF9ORUdBVElWRV9JTlRFR0VSLCBpbnRlZ2VyOiB0cnVlIH0pLFxuICAgIE5vbk5lZ2F0aXZlSW50ZWdlcjogY3JlYXRlTnVtYmVyU3BlYyh7IG1pbjogWkVSTywgaW50ZWdlcjogdHJ1ZSB9KSxcblxuICAgIFBvc2l0aXZlOiBjcmVhdGVOdW1iZXJTcGVjKHsgZXhjbHVzaXZlTWluOiBaRVJPIH0pLFxuICAgIE5lZ2F0aXZlOiBjcmVhdGVOdW1iZXJTcGVjKHsgZXhjbHVzaXZlTWF4OiBaRVJPIH0pLFxuICAgIE5vbk5lZ2F0aXZlOiBjcmVhdGVOdW1iZXJTcGVjKHsgbWluOiBaRVJPIH0pLFxuXG4gICAgUG9ydDogY3JlYXRlTnVtYmVyU3BlYyh7IG1pbjogTUlOX1BPUlQsIG1heDogTUFYX1BPUlQsIGludGVnZXI6IHRydWUgfSksXG4gIH0gYXMgY29uc3Qgc2F0aXNmaWVzIFN0cmljdEVudk51bWJlclByZXNldHMsXG4pO1xuXG4vKipcbiAqIFByZWRlZmluZWQgc3BlYyBjb25zdGFudHMgZm9yIHVzZSB3aXRoIGByZXNvbHZlYCBvciBhcyBzY2hlbWEgdmFsdWVzIGluIGByZXNvbHZlQWxsYC5cbiAqIFNwZWNzIGRlc2NyaWJlIHR5cGUgb25seTsgcHJvdmlkZSBgZGVmYXVsdGAgLyBgdHJpbWAgdmlhIHtAbGluayBTdHJpY3RFbnZPcHRpb25zfVxuICogKHRoaXJkIGFyZ3VtZW50IG9mIGByZXNvbHZlYCwgb3IgYSBgW3NwZWMsIG9wdGlvbnNdYCB0dXBsZSBpbiBgcmVzb2x2ZUFsbGApLlxuICovXG5leHBvcnQgY29uc3QgU3RyaWN0RW52VHlwZSA9IHtcbiAgLyoqIFNwZWMgZm9yIGEgc3RyaW5nIHZhbHVlIChyZXR1cm5lZCBhcy1pcyB1bmxlc3MgYHRyaW06IHRydWVgIGlzIHNldCBpbiBvcHRpb25zKS4gKi9cbiAgU3RyaW5nOiB7IHR5cGU6ICdzdHJpbmcnIH0gYXMgY29uc3Qgc2F0aXNmaWVzIFN0cmljdEVudlR5cGVTdHJpbmcsXG4gIC8qKlxuICAgKiBTcGVjIGZvciBhIGZpbml0ZSBudW1lcmljIHZhbHVlIChgTnVtYmVyKClgIHBhcnNpbmc7IHJlamVjdHMgYE5hTmAgYW5kIGBJbmZpbml0eWApLlxuICAgKiBVc2UgYXMgYFN0cmljdEVudlR5cGUuTnVtYmVyYCwgY2FsbCBhcyBgU3RyaWN0RW52VHlwZS5OdW1iZXIoeyBtaW4sIG1heCwgZXhjbHVzaXZlTWluLCBleGNsdXNpdmVNYXgsIGludGVnZXIgfSlgLFxuICAgKiBvciB1c2UgYSBuZXN0ZWQgcHJlc2V0IHN1Y2ggYXMgYFN0cmljdEVudlR5cGUuTnVtYmVyLlBvcnRgLlxuICAgKi9cbiAgTnVtYmVyOiBOdW1iZXJTcGVjLFxuICAvKiogU3BlYyBmb3IgYSBib29sZWFuIHZhbHVlIChgMWAvYHRydWVgL2B5ZXNgL2BvbmAg4oaSIGB0cnVlYDsgb3RoZXIgbm9uLWVtcHR5IHZhbHVlcyDihpIgYGZhbHNlYCkuICovXG4gIEJvb2xlYW46IHsgdHlwZTogJ2Jvb2xlYW4nIH0gYXMgY29uc3Qgc2F0aXNmaWVzIFN0cmljdEVudlR5cGVCb29sZWFuLFxuICAvKipcbiAgICogUmV0dXJucyBhIHNwZWMgdGhhdCByZXN0cmljdHMgdGhlIHZhbHVlIHRvIG9uZSBvZiB0aGUgZ2l2ZW4gY2hvaWNlcy5cbiAgICpcbiAgICogQHBhcmFtIGNob2ljZXMgLSBBbGxvd2VkIHN0cmluZyBsaXRlcmFscy5cbiAgICogQHJldHVybnMgRW51bSBzcGVjIGZvciB1c2Ugd2l0aCBgcmVzb2x2ZWAgb3IgYHJlc29sdmVBbGxgLlxuICAgKi9cbiAgRW51bTogPFQgZXh0ZW5kcyBzdHJpbmc+KGNob2ljZXM6IHJlYWRvbmx5IFRbXSkgPT4gKHsgdHlwZTogJ2VudW0nLCBjaG9pY2VzIH0pIGFzIFN0cmljdEVudlR5cGVFbnVtPFQ+LFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBJbmZlcnMgdGhlIHJldHVybiB0eXBlIGZyb20gdGhlIGdpdmVuIHNwZWMuXG4gKiBAdGVtcGxhdGUgUyAtIEEgYFN0cmljdEVudlNwZWNgIHZhcmlhbnQuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlNwZWNUb1R5cGU8Uz4gPVxuICBTIGV4dGVuZHMgU3RyaWN0RW52VHlwZVN0cmluZyA/IHN0cmluZ1xuICAgIDogUyBleHRlbmRzIFN0cmljdEVudlR5cGVOdW1iZXIgPyBudW1iZXJcbiAgICAgIDogUyBleHRlbmRzIFN0cmljdEVudlR5cGVCb29sZWFuID8gYm9vbGVhblxuICAgICAgICA6IFMgZXh0ZW5kcyBTdHJpY3RFbnZUeXBlRW51bTxpbmZlciBUPiA/IFRcbiAgICAgICAgICA6IG5ldmVyO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHJlYWRpbmcgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgd2l0aCBhbiBvcHRpb25hbCBkZWZhdWx0LlxuICogVXNlZCBhcyB0aGUgdGhpcmQgYXJndW1lbnQgdG8gYHJlc29sdmVgIG9yIGFzIHRoZSBzZWNvbmQgZWxlbWVudCBvZiBhIGBbc3BlYywgb3B0aW9uc11gIHR1cGxlIGluIGByZXNvbHZlQWxsYC5cbiAqXG4gKiBgdHJpbWAgZGVmYXVsdHMgdG8gYHRydWVgIGZvciBgbnVtYmVyYCwgYGJvb2xlYW5gLCBhbmQgYGVudW1gIHNwZWNzICh3aGl0ZXNwYWNlLW9ubHkgdmFsdWVzIGFyZVxuICogdHJlYXRlZCBhcyBtaXNzaW5nKS4gRm9yIGBzdHJpbmdgIHNwZWNzIGl0IGRlZmF1bHRzIHRvIGBmYWxzZWAgKHZhbHVlcyBhcmUgcmV0dXJuZWQgYXMtaXMpLlxuICpcbiAqIEB0ZW1wbGF0ZSBTIC0gRW52aXJvbm1lbnQgdmFyaWFibGUgc3BlYyB0eXBlLlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZPcHRpb25zPFMgZXh0ZW5kcyBTdHJpY3RFbnZTcGVjPiA9IHtcbiAgLyoqIEZhbGxiYWNrIHdoZW4gdGhlIHZhcmlhYmxlIGlzIHVuc2V0LCBlbXB0eSAoYFwiXCJgKSwgb3Igd2hpdGVzcGFjZS1vbmx5ICh3aGVuIGB0cmltYCBpcyBlbmFibGVkKS4gKi9cbiAgZGVmYXVsdD86IFN0cmljdEVudlNwZWNUb1R5cGU8Uz47XG4gIC8qKiBXaGVuIGB0cnVlYCwgdHJpbXMgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIGJlZm9yZSB2YWxpZGF0aW9uLiAqL1xuICB0cmltPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogU2NoZW1hIGVudHJ5IGZvciBhIHNpbmdsZSBlbnYgdmFyLlxuICpcbiAqIEVpdGhlciBhIHNwZWMgYWxvbmUsIG9yIGEgYFtzcGVjLCBvcHRpb25zXWAgdHVwbGUgdG8gYXR0YWNoIHtAbGluayBTdHJpY3RFbnZPcHRpb25zfVxuICogKGZvciBleGFtcGxlIGBkZWZhdWx0YCBhbmQvb3IgYHRyaW1gKS5cbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52U2NoZW1hRW50cnk8UyBleHRlbmRzIFN0cmljdEVudlNwZWMgPSBTdHJpY3RFbnZTcGVjPiA9IFMgfCByZWFkb25seSBbUywgU3RyaWN0RW52T3B0aW9uczxTPl07XG5cbi8qKlxuICogU2NoZW1hIG9iamVjdCB1c2VkIGJ5IGByZXNvbHZlQWxsKClgLlxuICpcbiAqIEtleXMgYXJlIGVudiB2YXIgbmFtZXM7IHZhbHVlcyBhcmUgc3BlY3Mgb3IgYFtzcGVjLCBvcHRpb25zXWAgdHVwbGVzLlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZTY2hlbWEgPSBSZWNvcmQ8c3RyaW5nLCBTdHJpY3RFbnZTY2hlbWFFbnRyeT47XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIHNwZWMgdHlwZSBmcm9tIGEgc2NoZW1hIGVudHJ5IG9yIGBbc3BlYywgb3B0aW9uc11gIHR1cGxlLlxuICpcbiAqIEB0ZW1wbGF0ZSBFIC0gU2NoZW1hIGVudHJ5IHR5cGUuXG4gKi9cbnR5cGUgU3RyaWN0RW52U2NoZW1hRW50cnlUb1NwZWM8RT4gPSBFIGV4dGVuZHMgcmVhZG9ubHkgW2luZmVyIFMsIHVua25vd25dID8gUyA6IEU7XG5cbi8qKlxuICogTWFwcyBhIHNjaGVtYSBvYmplY3QgdG8gdGhlIHJlc3VsdGluZyBwYXJzZWQgZW52aXJvbm1lbnQgb2JqZWN0IHR5cGUuXG4gKlxuICogQHRlbXBsYXRlIFRTY2hlbWEgLSBTY2hlbWEgb2JqZWN0IHR5cGUgcGFzc2VkIHRvIGByZXNvbHZlQWxsYC5cbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52U2NoZW1hVG9UeXBlPFRTY2hlbWEgZXh0ZW5kcyBTdHJpY3RFbnZTY2hlbWE+ID0ge1xuICBbSyBpbiBrZXlvZiBUU2NoZW1hXTogU3RyaWN0RW52U3BlY1RvVHlwZTxTdHJpY3RFbnZTY2hlbWFFbnRyeVRvU3BlYzxUU2NoZW1hW0tdPiAmIFN0cmljdEVudlNwZWM+O1xufTtcblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIHJlc3VsdCBvZiBwYXJzaW5nIGEgc2luZ2xlIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICpcbiAqIE9uIHN1Y2Nlc3MsIGB2YWx1ZWAgaG9sZHMgdGhlIHBhcnNlZCByZXN1bHQuIE9uIGZhaWx1cmUsIGBlcnJvcmAgaG9sZHMgYSBzdHJ1Y3R1cmVkXG4gKiBgU3RyaWN0RW52VmFsaWRhdGlvbkVudHJ5YCBlbnRyeSAobmV2ZXIgdGhyb3dzKS5cbiAqXG4gKiBAdGVtcGxhdGUgSyAtIEVudmlyb25tZW50IHZhcmlhYmxlIGtleSB0eXBlLlxuICogQHRlbXBsYXRlIFMgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBzcGVjIHR5cGUuXG4gKi9cbnR5cGUgUGFyc2VFbnZWYWx1ZVJlc3VsdDxLIGV4dGVuZHMgc3RyaW5nLCBTIGV4dGVuZHMgU3RyaWN0RW52U3BlYz4gPVxuICB8IHsgb2s6IHRydWU7IHZhbHVlOiBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IH1cbiAgfCB7IG9rOiBmYWxzZTsgZXJyb3I6IFN0cmljdEVudlZhbGlkYXRpb25FbnRyeTxLPiB9O1xuXG4vKipcbiAqIERlZmF1bHQgdHJpbSBiZWhhdmlvciBwZXIgc3BlYyB0eXBlLlxuICogUGFyc2VkIHR5cGVzIHRyaW0gYnkgZGVmYXVsdDsgc3RyaW5ncyBwcmVzZXJ2ZSB0aGUgcmF3IHZhbHVlIHVubGVzcyBvcHRlZCBpbi5cbiAqXG4gKiBAcGFyYW0gc3BlYyAtIEVudmlyb25tZW50IHZhcmlhYmxlIHNwZWMuXG4gKiBAcmV0dXJucyBXaGV0aGVyIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSBzaG91bGQgYmUgdHJpbW1lZCBiZWZvcmUgdmFsaWRhdGlvbi5cbiAqL1xuY29uc3QgZGVmYXVsdFRyaW1Gb3JTcGVjID0gKHNwZWM6IFN0cmljdEVudlNwZWMpOiBib29sZWFuID0+IHNwZWMudHlwZSAhPT0gJ3N0cmluZyc7XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHJhdyBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSBiZWZvcmUgdmFsaWRhdGlvbi5cbiAqXG4gKiBAcGFyYW0gcmF3IC0gUmF3IHZhbHVlIGZyb20gYHByb2Nlc3MuZW52YCwgaWYgcHJlc2VudC5cbiAqIEBwYXJhbSB0cmltIC0gV2hldGhlciB0byB0cmltIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZS5cbiAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgdmFsdWUsIG9yIGB1bmRlZmluZWRgIHdoZW4gdW5zZXQuXG4gKi9cbmNvbnN0IG5vcm1hbGl6ZUVudlJhdyA9IChyYXc6IHN0cmluZyB8IHVuZGVmaW5lZCwgdHJpbTogYm9vbGVhbik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChyYXcgPT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKCF0cmltKSB7XG4gICAgcmV0dXJuIHJhdztcbiAgfVxuICByZXR1cm4gcmF3LnRyaW0oKTtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgcGFyc2VkIG51bWJlciBhZ2FpbnN0IG9wdGlvbmFsIHtAbGluayBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50c30uXG4gKlxuICogQHRlbXBsYXRlIEsgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBrZXkgdHlwZS5cbiAqIEBwYXJhbSBrZXkgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lLlxuICogQHBhcmFtIHJhdyAtIFJhdyB2YWx1ZSBmcm9tIGBwcm9jZXNzLmVudmAsIGlmIHByZXNlbnQuXG4gKiBAcGFyYW0gbiAtIFBhcnNlZCBmaW5pdGUgbnVtYmVyLlxuICogQHBhcmFtIGNvbnN0cmFpbnRzIC0gT3B0aW9uYWwgYG1pbmAsIGBtYXhgLCBgZXhjbHVzaXZlTWluYCwgYGV4Y2x1c2l2ZU1heGAsIGFuZC9vciBgaW50ZWdlcmAgY29uc3RyYWludHMuXG4gKiBAcmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHZhbGlkOyBvdGhlcndpc2UgYSBzdHJ1Y3R1cmVkIHZhbGlkYXRpb24gZXJyb3IuXG4gKi9cbmNvbnN0IHZhbGlkYXRlTnVtYmVyQ29uc3RyYWludHMgPSA8SyBleHRlbmRzIHN0cmluZz4oXG4gIGtleTogSyxcbiAgcmF3OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIG46IG51bWJlcixcbiAgY29uc3RyYWludHM6IFN0cmljdEVudk51bWJlckNvbnN0cmFpbnRzLFxuKTogU3RyaWN0RW52VmFsaWRhdGlvbkVudHJ5PEs+IHwgdW5kZWZpbmVkID0+IHtcbiAgLy8gSW50ZWdlciBmaXJzdCBzbyBlLmcuIFBvcnQgYDgwLjVgIHJlcG9ydHMgXCJleHBlY3RlZCBpbnRlZ2VyXCIsIG5vdCBhIHJhbmdlIGVycm9yLlxuICBpZiAoY29uc3RyYWludHMuaW50ZWdlciA9PT0gdHJ1ZSAmJiAhTnVtYmVyLmlzSW50ZWdlcihuKSkge1xuICAgIHJldHVybiB7IGtleSwgbWVzc2FnZTogYEVudiAke2tleX06IGV4cGVjdGVkIGludGVnZXIsIGdvdCBcIiR7cmF3fVwiYCwgcmF3LCBraW5kOiAnaW52YWxpZF9udW1iZXInIH07XG4gIH1cblxuICBpZiAoY29uc3RyYWludHMubWluICE9PSB1bmRlZmluZWQgJiYgbiA8IGNvbnN0cmFpbnRzLm1pbikge1xuICAgIHJldHVybiB7XG4gICAgICBrZXksXG4gICAgICBtZXNzYWdlOiBgRW52ICR7a2V5fTogbXVzdCBiZSA+PSAke2NvbnN0cmFpbnRzLm1pbn0sIGdvdCAke259YCxcbiAgICAgIHJhdyxcbiAgICAgIGtpbmQ6ICdpbnZhbGlkX251bWJlcicsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChjb25zdHJhaW50cy5leGNsdXNpdmVNaW4gIT09IHVuZGVmaW5lZCAmJiBuIDw9IGNvbnN0cmFpbnRzLmV4Y2x1c2l2ZU1pbikge1xuICAgIHJldHVybiB7XG4gICAgICBrZXksXG4gICAgICBtZXNzYWdlOiBgRW52ICR7a2V5fTogbXVzdCBiZSA+ICR7Y29uc3RyYWludHMuZXhjbHVzaXZlTWlufSwgZ290ICR7bn1gLFxuICAgICAgcmF3LFxuICAgICAga2luZDogJ2ludmFsaWRfbnVtYmVyJyxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGNvbnN0cmFpbnRzLm1heCAhPT0gdW5kZWZpbmVkICYmIG4gPiBjb25zdHJhaW50cy5tYXgpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5LFxuICAgICAgbWVzc2FnZTogYEVudiAke2tleX06IG11c3QgYmUgPD0gJHtjb25zdHJhaW50cy5tYXh9LCBnb3QgJHtufWAsXG4gICAgICByYXcsXG4gICAgICBraW5kOiAnaW52YWxpZF9udW1iZXInLFxuICAgIH07XG4gIH1cblxuICBpZiAoY29uc3RyYWludHMuZXhjbHVzaXZlTWF4ICE9PSB1bmRlZmluZWQgJiYgbiA+PSBjb25zdHJhaW50cy5leGNsdXNpdmVNYXgpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5LFxuICAgICAgbWVzc2FnZTogYEVudiAke2tleX06IG11c3QgYmUgPCAke2NvbnN0cmFpbnRzLmV4Y2x1c2l2ZU1heH0sIGdvdCAke259YCxcbiAgICAgIHJhdyxcbiAgICAgIGtpbmQ6ICdpbnZhbGlkX251bWJlcicsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKiogT3B0aW9ucyBhY2NlcHRlZCBieSBgcGFyc2VFbnZWYWx1ZWAgKHN1YnNldCBvZiBgU3RyaWN0RW52T3B0aW9uc2ApLiAqL1xudHlwZSBQYXJzZUVudlZhbHVlT3B0aW9uczxTIGV4dGVuZHMgU3RyaWN0RW52U3BlYz4gPSBQaWNrPFN0cmljdEVudk9wdGlvbnM8Uz4sICd0cmltJz47XG5cbi8qKlxuICogUmVzb2x2ZXMgYSBzY2hlbWEgZW50cnkgaW50byBpdHMgc3BlYyBhbmQgb3B0aW9uYWwgcGVyLWtleSBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSBlbnRyeSAtIFNjaGVtYSBlbnRyeSBvciBgW3NwZWMsIG9wdGlvbnNdYCB0dXBsZS5cbiAqIEByZXR1cm5zIFBhcnNlZCBzcGVjIGFuZCBvcHRpb25zIGZvciBgcmVzb2x2ZUFsbGAuXG4gKi9cbmNvbnN0IHJlc29sdmVTY2hlbWFFbnRyeSA9IChcbiAgZW50cnk6IFN0cmljdEVudlNjaGVtYUVudHJ5LFxuKTogeyBzcGVjOiBTdHJpY3RFbnZTcGVjOyBvcHRpb25zOiBTdHJpY3RFbnZPcHRpb25zPFN0cmljdEVudlNwZWM+IHwgdW5kZWZpbmVkIH0gPT4gKHtcbiAgc3BlYzogKEFycmF5LmlzQXJyYXkoZW50cnkpID8gZW50cnlbMF0gOiBlbnRyeSkgYXMgU3RyaWN0RW52U3BlYyxcbiAgb3B0aW9uczogKEFycmF5LmlzQXJyYXkoZW50cnkpID8gZW50cnlbMV0gOiB1bmRlZmluZWQpIGFzIFN0cmljdEVudk9wdGlvbnM8U3RyaWN0RW52U3BlYz4gfCB1bmRlZmluZWQsXG59KTtcblxuLyoqXG4gKiBQYXJzZXMgYSBzaW5nbGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBzcGVjLlxuICpcbiAqIENlbnRyYWwgdmFsaWRhdGlvbiBoZWxwZXIgc2hhcmVkIGJ5IGByZXNvbHZlYCBhbmQgYHJlc29sdmVBbGxgLiBEb2VzIG5vdCB0aHJvdztcbiAqIGNhbGxlcnMgZGVjaWRlIHdoZXRoZXIgdG8gdGhyb3cgaW1tZWRpYXRlbHkgb3IgY29sbGVjdCBlcnJvcnMuXG4gKlxuICogTWlzc2luZyBvciBlbXB0eSAoYFwiXCJgKSB2YWx1ZXMgdXNlIGBkZWZhdWx0VmFsdWVgIHdoZW4gcHJvdmlkZWQuIFdoZW4gYHRyaW1gIGlzIGVuYWJsZWQsXG4gKiB3aGl0ZXNwYWNlLW9ubHkgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIGVtcHR5LiBOdW1iZXIgc3BlY3MgZGVsZWdhdGUgdG8gYHBhcnNlTnVtYmVyYCwgdGhlblxuICogb3B0aW9uYWwgYG1pbmAgLyBgbWF4YCAvIGBleGNsdXNpdmVNaW5gIC8gYGV4Y2x1c2l2ZU1heGAgLyBgaW50ZWdlcmAgY29uc3RyYWludHNcbiAqIChzZWUge0BsaW5rIFN0cmljdEVudk51bWJlckNvbnN0cmFpbnRzfSkuXG4gKiBCb29sZWFuIHNwZWNzIHRyZWF0IGAxYC9gdHJ1ZWAvYHllc2AvYG9uYCAoY2FzZS1pbnNlbnNpdGl2ZSwgYWZ0ZXIgbm9ybWFsaXphdGlvbikgYXMgYHRydWVgLlxuICogRW51bSBzcGVjcyByZXF1aXJlIGFuIGV4YWN0IG1hdGNoIGluIGBjaG9pY2VzYCAoYWZ0ZXIgbm9ybWFsaXphdGlvbikuXG4gKlxuICogQHRlbXBsYXRlIEsgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBrZXkgdHlwZS5cbiAqIEB0ZW1wbGF0ZSBTIC0gRW52aXJvbm1lbnQgdmFyaWFibGUgc3BlYyB0eXBlLlxuICogQHBhcmFtIGtleSAtIEVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUuXG4gKiBAcGFyYW0gc3BlYyAtIFR5cGUgc3BlYyBmb3IgdGhlIHZhbHVlLlxuICogQHBhcmFtIHJhdyAtIFJhdyB2YWx1ZSBmcm9tIGBwcm9jZXNzLmVudmAsIGlmIHByZXNlbnQuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIC0gRmFsbGJhY2sgZnJvbSB7QGxpbmsgU3RyaWN0RW52T3B0aW9ucy5kZWZhdWx0fSB3aGVuIGByYXdgIGlzIG1pc3Npbmcgb3IgZW1wdHkuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHRyaW0gb3ZlcnJpZGUgKGB0cmltYCBkZWZhdWx0cyBwZXIgc3BlYyB0eXBlKS5cbiAqIEByZXR1cm5zIFBhcnNlZCB2YWx1ZSBvciBhIHN0cnVjdHVyZWQgdmFsaWRhdGlvbiBlcnJvci5cbiAqL1xuY29uc3QgcGFyc2VFbnZWYWx1ZSA9IDxLIGV4dGVuZHMgc3RyaW5nLCBTIGV4dGVuZHMgU3RyaWN0RW52U3BlYz4oXG4gIGtleTogSyxcbiAgc3BlYzogUyxcbiAgcmF3OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGRlZmF1bHRWYWx1ZTogU3RyaWN0RW52U3BlY1RvVHlwZTxTPiB8IHVuZGVmaW5lZCxcbiAgb3B0aW9ucz86IFBhcnNlRW52VmFsdWVPcHRpb25zPFM+LFxuKTogUGFyc2VFbnZWYWx1ZVJlc3VsdDxLLCBTPiA9PiB7XG4gIGNvbnN0IHRyaW0gPSBvcHRpb25zPy50cmltID8/IGRlZmF1bHRUcmltRm9yU3BlYyhzcGVjKTtcbiAgY29uc3Qgbm9ybWFsaXplZFJhdyA9IG5vcm1hbGl6ZUVudlJhdyhyYXcsIHRyaW0pO1xuICBjb25zdCBoYXNEZWZhdWx0ID0gZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQ7XG5cbiAgaWYgKG5vcm1hbGl6ZWRSYXcgPT0gbnVsbCB8fCBub3JtYWxpemVkUmF3ID09PSAnJykge1xuICAgIGlmIChoYXNEZWZhdWx0KSB7XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgdmFsdWU6IGRlZmF1bHRWYWx1ZSBhcyBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBvazogZmFsc2UsXG4gICAgICBlcnJvcjogeyBrZXksIG1lc3NhZ2U6IGBNaXNzaW5nIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlOiAke2tleX1gLCByYXcsIGtpbmQ6ICdtaXNzaW5nJyB9LFxuICAgIH07XG4gIH1cblxuICBzd2l0Y2ggKHNwZWMudHlwZSkge1xuICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgIGNvbnN0IG4gPSBwYXJzZU51bWJlcihub3JtYWxpemVkUmF3KTtcbiAgICAgIGlmIChuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHsga2V5LCBtZXNzYWdlOiBgRW52ICR7a2V5fTogZXhwZWN0ZWQgbnVtYmVyLCBnb3QgXCIke3Jhd31cImAsIHJhdywga2luZDogJ2ludmFsaWRfbnVtYmVyJyB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3QgY29uc3RyYWludEVycm9yID0gdmFsaWRhdGVOdW1iZXJDb25zdHJhaW50cyhrZXksIHJhdywgbiwgc3BlYyk7XG4gICAgICBpZiAoY29uc3RyYWludEVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogY29uc3RyYWludEVycm9yIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgdmFsdWU6IG4gYXMgU3RyaWN0RW52U3BlY1RvVHlwZTxTPiB9O1xuICAgIH1cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogcGFyc2VCb29sZWFuRW52VmFsdWUobm9ybWFsaXplZFJhdykgYXMgU3RyaWN0RW52U3BlY1RvVHlwZTxTPiB9O1xuICAgIGNhc2UgJ2VudW0nOlxuICAgICAgaWYgKCFzcGVjLmNob2ljZXMuaW5jbHVkZXMobm9ybWFsaXplZFJhdykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBFbnYgJHtrZXl9OiBtdXN0IGJlIG9uZSBvZiBbJHtzcGVjLmNob2ljZXMuam9pbignLCAnKX1dYCxcbiAgICAgICAgICAgIHJhdyxcbiAgICAgICAgICAgIGtpbmQ6ICdpbnZhbGlkX2VudW0nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgdmFsdWU6IG5vcm1hbGl6ZWRSYXcgYXMgU3RyaWN0RW52U3BlY1RvVHlwZTxTPiB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgdmFsdWU6IG5vcm1hbGl6ZWRSYXcgYXMgU3RyaWN0RW52U3BlY1RvVHlwZTxTPiB9O1xuICB9XG59O1xuXG4vKipcbiAqIFJlYWRzIGFuZCBwYXJzZXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBzcGVjLlxuICpcbiAqIERlbGVnYXRlcyB2YWxpZGF0aW9uIHRvIGBwYXJzZUVudlZhbHVlYC4gTWlzc2luZyBvciBlbXB0eSAoYFwiXCJgKSB2YWx1ZXMgdXNlXG4gKiBgb3B0aW9ucy5kZWZhdWx0YCB3aGVuIHByb3ZpZGVkOyBvdGhlcndpc2UgYSBgU3RyaWN0RW52VmFsaWRhdGlvbkVycm9yYCBpcyB0aHJvd24uXG4gKiBXaGl0ZXNwYWNlLW9ubHkgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIG1pc3Npbmcgd2hlbiBgdHJpbWAgaXMgZW5hYmxlZC5cbiAqIEZvciBgU3RyaWN0RW52VHlwZS5OdW1iZXJgLCB2YWx1ZXMgYXJlIHBhcnNlZCBhcyBmaW5pdGUgbnVtYmVycyAoc2VlIHtAbGluayBTdHJpY3RFbnZUeXBlTnVtYmVyfSkuXG4gKlxuICogQHRlbXBsYXRlIEsgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBrZXkgdHlwZS5cbiAqIEB0ZW1wbGF0ZSBTIC0gRW52aXJvbm1lbnQgdmFyaWFibGUgc3BlYyB0eXBlLlxuICogQHBhcmFtIGtleSAtIEVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUgKGUuZy4gYFwiUE9SVFwiYCwgYFwiTk9ERV9FTlZcImApLlxuICogQHBhcmFtIHNwZWMgLSBUeXBlIHNwZWM7IGRlZmF1bHRzIHRvIGBTdHJpY3RFbnZUeXBlLlN0cmluZ2Agd2hlbiBvbWl0dGVkLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBgeyBkZWZhdWx0LCB0cmltIH1gOyBzZWUge0BsaW5rIFN0cmljdEVudk9wdGlvbnN9LlxuICogQHJldHVybnMgUGFyc2VkIHZhbHVlIHdpdGggdHlwZSBpbmZlcnJlZCBmcm9tIGBzcGVjYC5cbiAqIEB0aHJvd3Mge1N0cmljdEVudlZhbGlkYXRpb25FcnJvcn0gV2hlbiB0aGUgdmFyaWFibGUgaXMgbWlzc2luZywgZW1wdHkgd2l0aG91dCBhIGRlZmF1bHQsXG4gKiAgIHdoaXRlc3BhY2Utb25seSB3aXRob3V0IGEgZGVmYXVsdCAod2hlbiB0cmltbWluZyksIG9yIGludmFsaWQgZm9yIHRoZSBzcGVjLlxuICovXG5jb25zdCByZXNvbHZlID0gPEsgZXh0ZW5kcyBzdHJpbmcsIFMgZXh0ZW5kcyBTdHJpY3RFbnZTcGVjID0gU3RyaWN0RW52VHlwZVN0cmluZz4oXG4gIGtleTogSyxcbiAgc3BlYzogUyA9IFN0cmljdEVudlR5cGUuU3RyaW5nIGFzIFMsXG4gIG9wdGlvbnM/OiBTdHJpY3RFbnZPcHRpb25zPFM+LFxuKTogU3RyaWN0RW52U3BlY1RvVHlwZTxTPiA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IHBhcnNlRW52VmFsdWUoa2V5LCBzcGVjLCBwcm9jZXNzLmVudltrZXldLCBvcHRpb25zPy5kZWZhdWx0LCBvcHRpb25zKTtcbiAgaWYgKCFyZXN1bHQub2spIHtcbiAgICB0aHJvdyBuZXcgU3RyaWN0RW52VmFsaWRhdGlvbkVycm9yKFtyZXN1bHQuZXJyb3JdKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0LnZhbHVlO1xufTtcblxuLyoqXG4gKiBSZWFkcyBhbmQgcGFyc2VzIG11bHRpcGxlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHNjaGVtYS5cbiAqXG4gKiBBbHdheXMgZXZhbHVhdGVzIGV2ZXJ5IGtleSBpbiBgc2NoZW1hYC4gRWFjaCBlbnRyeSBpcyB2YWxpZGF0ZWQgdmlhIGBwYXJzZUVudlZhbHVlYDtcbiAqIGFsbCBlcnJvcnMgYXJlIGNvbGxlY3RlZCBhbmQgdGhyb3duIG9uY2UgaW4gYSBzaW5nbGUgYFN0cmljdEVudlZhbGlkYXRpb25FcnJvcmAuXG4gKiBOdW1iZXIgc3BlY3MgdXNlIHRoZSBzYW1lIGZpbml0ZS1udW1iZXIgcnVsZXMgYXMgYHJlc29sdmVgLlxuICpcbiAqIEB0ZW1wbGF0ZSBUU2NoZW1hIC0gU2NoZW1hIG9iamVjdCB0eXBlLlxuICogQHBhcmFtIHNjaGVtYSAtIE1hcCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lcyB0byBzcGVjcyBvciBgW3NwZWMsIG9wdGlvbnNdYCB0dXBsZXNcbiAqICAgKHNlZSB7QGxpbmsgU3RyaWN0RW52T3B0aW9uc30gZm9yIHBlci1rZXkgYGRlZmF1bHRgIC8gYHRyaW1gKS5cbiAqIEByZXR1cm5zIFBhcnNlZCBlbnZpcm9ubWVudCBvYmplY3Qgd2l0aCB0eXBlcyBpbmZlcnJlZCBmcm9tIHRoZSBzY2hlbWEuXG4gKiBAdGhyb3dzIHtTdHJpY3RFbnZWYWxpZGF0aW9uRXJyb3J9IFdoZW4gb25lIG9yIG1vcmUgdmFyaWFibGVzIGFyZSBtaXNzaW5nLCBlbXB0eSB3aXRob3V0IGEgZGVmYXVsdCxcbiAqICAgd2hpdGVzcGFjZS1vbmx5IHdpdGhvdXQgYSBkZWZhdWx0ICh3aGVuIHRyaW1taW5nKSwgb3IgaW52YWxpZC5cbiAqL1xuY29uc3QgcmVzb2x2ZUFsbCA9IDxUU2NoZW1hIGV4dGVuZHMgU3RyaWN0RW52U2NoZW1hPihzY2hlbWE6IFRTY2hlbWEpOiBTdHJpY3RFbnZTY2hlbWFUb1R5cGU8VFNjaGVtYT4gPT4ge1xuICBjb25zdCBlbnZzOiBQYXJ0aWFsPFN0cmljdEVudlNjaGVtYVRvVHlwZTxUU2NoZW1hPj4gPSB7fTtcbiAgY29uc3QgZXJyb3JzOiBTdHJpY3RFbnZWYWxpZGF0aW9uRW50cnk8RXh0cmFjdDxrZXlvZiBUU2NoZW1hLCBzdHJpbmc+PltdID0gW107XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc2NoZW1hKSBhcyBBcnJheTxFeHRyYWN0PGtleW9mIFRTY2hlbWEsIHN0cmluZz4+KSB7XG4gICAgY29uc3QgeyBzcGVjLCBvcHRpb25zIH0gPSByZXNvbHZlU2NoZW1hRW50cnkoc2NoZW1hW2tleV0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gcGFyc2VFbnZWYWx1ZShrZXksIHNwZWMsIHByb2Nlc3MuZW52W2tleV0sIG9wdGlvbnM/LmRlZmF1bHQsIG9wdGlvbnMpO1xuICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICBlcnJvcnMucHVzaChyZXN1bHQuZXJyb3IpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGVudnNba2V5XSA9IHJlc3VsdC52YWx1ZSBhcyBTdHJpY3RFbnZTY2hlbWFUb1R5cGU8VFNjaGVtYT5bdHlwZW9mIGtleV07XG4gIH1cblxuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHRocm93IG5ldyBTdHJpY3RFbnZWYWxpZGF0aW9uRXJyb3IoZXJyb3JzKTtcbiAgcmV0dXJuIGVudnMgYXMgU3RyaWN0RW52U2NoZW1hVG9UeXBlPFRTY2hlbWE+O1xufTtcblxuLyoqXG4gKiBUeXBlLXNhZmUgZW52aXJvbm1lbnQgdmFyaWFibGUgcmVzb2x2ZXIgZm9yIE5vZGUuanMgYHByb2Nlc3MuZW52YC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHBvcnQgPSBTdHJpY3RFbnZSZXNvbHZlci5yZXNvbHZlKCdQT1JUJywgU3RyaWN0RW52VHlwZS5OdW1iZXIuUG9ydCk7XG4gKiBjb25zdCBlbnZzID0gU3RyaWN0RW52UmVzb2x2ZXIucmVzb2x2ZUFsbCh7XG4gKiAgIFBPUlQ6IFN0cmljdEVudlR5cGUuTnVtYmVyLlBvcnQsXG4gKiAgIERFQlVHOiBbU3RyaWN0RW52VHlwZS5Cb29sZWFuLCB7IGRlZmF1bHQ6IGZhbHNlIH1dLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IFN0cmljdEVudlJlc29sdmVyID0ge1xuICAvKiogUmVhZHMgYW5kIHBhcnNlcyBhIHNpbmdsZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gU2VlIHtAbGluayByZXNvbHZlfS4gKi9cbiAgcmVzb2x2ZSxcbiAgLyoqIFJlYWRzIGFuZCBwYXJzZXMgbXVsdGlwbGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIG9uZSBwYXNzLiBTZWUge0BsaW5rIHJlc29sdmVBbGx9LiAqL1xuICByZXNvbHZlQWxsLFxufSBhcyBjb25zdDtcbiJdfQ==
|