athena-query-result-pager 0.4.6 → 0.5.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 CHANGED
@@ -7,6 +7,23 @@ Paginate [AWS Athena](https://docs.aws.amazon.com/athena/latest/ug/v3-sdk.html)
7
7
 
8
8
  Page-level and row-level APIs are symmetric: use the base method for raw **`ParsedRow`** values, or the `*With` / `rowParser` variant for custom types.
9
9
 
10
+ ## Compared to the AWS SDK paginator
11
+
12
+ `@aws-sdk/client-athena` already ships [`paginateGetQueryResults`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-athena/Function/paginateGetQueryResults/). It walks **`NextToken`** and yields raw **`GetQueryResultsCommandOutput`** pages — fine if you only need SDK-shaped pages and will parse rows yourself.
13
+
14
+ **This package is the easier path when you want rows, not raw Athena pages:** header skipping, dictionary / typed rows, and page- or row-level async iteration are built in, so you skip the usual glue code around the official paginator.
15
+
16
+ | | SDK `paginateGetQueryResults` | This package |
17
+ | --- | --- | --- |
18
+ | Page walking (`NextToken`) | Yes | Yes |
19
+ | Output | Raw Athena / SDK page objects | Parsed **`ParsedRow`** (or custom `T` via **`RowParser`**) |
20
+ | Header-row handling & parse options | You implement | Via [athena-query-result-parser](https://www.npmjs.com/package/athena-query-result-parser) (`skipHeaderRow`, mismatch behavior, …) |
21
+ | Row-level async iteration | You flatten pages | **`iterateRows`** (one page buffered at a time) |
22
+ | Defaults for **`MaxResults`** / **`QueryResultType`** | Per request input | Constructor **`PagerOptions`**, applied every fetch |
23
+ | Input checks | SDK only | Fail-fast for empty **`queryExecutionId`** and invalid **`maxResults`** |
24
+
25
+ Both still require a finished query execution and rely on your **`AthenaClient`** for retries — see **[Caller responsibilities](#caller-responsibilities)**.
26
+
10
27
  ## Features
11
28
 
12
29
  - Sends paginated Athena **`GetQueryResults`** requests (`NextToken` / **`MaxResults`**).
@@ -18,7 +35,8 @@ Page-level and row-level APIs are symmetric: use the base method for raw **`Pars
18
35
  - Async generators iterate **page-by-page** or **row-by-row** without holding full result sets in memory (only one page of rows is buffered at a time for row iterators).
19
36
  - Fail-fast validation: **`maxResults`** must be an integer in **`1..1000`**; **`queryExecutionId`** must be non-empty (**`fetchPage`**, **`fetchPageWith`**).
20
37
  - Re-exports **`QueryResultType`**, parser types (**`ParseResultSetOptions`**, **`ParsedRow`**, **`RowParser<T>`**, …), and parser utilities (**`rowToTypedObject`**, **`EXTRA_COLUMNS_KEY`**, …) from the package entry point.
21
- - Helpers: **`AthenaQueryResultPager.hasNextPage`**, **`getLastHeaderRowDecision()`**, **`reset()`** when reusing one pager across different executions.
38
+ - Helpers: **`AthenaQueryResultPager.hasNextPage`**, **`getLastHeaderRowDecision()`**, and **`reset()`** (usually optional — parser state resets automatically when **`queryExecutionId`** changes).
39
+ - Does **not** wait for query completion or add Athena-specific retry beyond the AWS SDK client — see **[Caller responsibilities](#caller-responsibilities)**.
22
40
 
23
41
  ## Installation
24
42
 
@@ -134,14 +152,24 @@ const decision = pager.getLastHeaderRowDecision();
134
152
  console.log(decision?.skipped, decision?.reason);
135
153
  ```
136
154
 
137
- ### Reset before another execution
155
+ ### Reusing a pager across executions
138
156
 
139
- Reuse the same pager for a **new** **`queryExecutionId`** after clearing the bundled parser state:
157
+ Switching to a different **`queryExecutionId`** on **`fetchPage`** / **`fetchPageWith`** (and iterators that call them) **automatically resets** the bundled parser so header-row handling does not leak between queries. Call **`reset()`** only when you need to clear parser state without starting a new fetch:
140
158
 
141
159
  ```ts
142
160
  pager.reset();
143
161
  ```
144
162
 
163
+ ## Caller responsibilities
164
+
165
+ This library only paginates and parses **`GetQueryResults`**. It does **not** start queries, wait for execution to finish, or wrap Athena errors with custom retry policies. Failures surface as thrown AWS SDK errors (or parser errors) from **`fetchPage`** / **`fetchPageWith`**.
166
+
167
+ Handle the following in the calling application (or via **`AthenaClient`** configuration):
168
+
169
+ - **Query not finished yet** — Before paging, wait until **`GetQueryExecution`** reports a terminal state such as **`SUCCEEDED`**. Calling this pager while the query is still **`QUEUED`** / **`RUNNING`** will fail with the usual Athena / SDK error for that situation.
170
+ - **Throttling and transient API errors** — Configure retry on the **`AthenaClient`** (AWS SDK v3 retry middleware / client `maxAttempts`, etc.) or retry at the call site around **`fetchPage`** / iterators. This package does not implement Athena-specific backoff for **`ThrottlingException`** or similar.
171
+ - **Failed / cancelled queries** — Check execution state (and Athena’s error reason) before or when catching failures; the pager assumes a completed execution that can return result pages.
172
+
145
173
  ## Options
146
174
 
147
175
  ### `PagerOptions`
@@ -180,7 +208,7 @@ Both throw if **`queryExecutionId`** is empty or whitespace-only (before invokin
180
208
  - **`iterateRows(queryExecutionId)`** → **`AsyncGenerator<ParsedRow>`**
181
209
  - **`iterateRows<T>(queryExecutionId, rowParser)`** → **`AsyncGenerator<T>`**
182
210
  - **`getLastHeaderRowDecision()`** → **`HeaderRowDecision | null`**
183
- - **`reset()`** — clears bundled parser state (**header row bookkeeping** resets).
211
+ - **`reset()`** — clears bundled parser state (**header row bookkeeping**). Usually unnecessary: **`fetchPage`** / **`fetchPageWith`** reset automatically when **`queryExecutionId`** changes.
184
212
  - **`static hasNextPage<T>(pageResult: PageResult<T>)`** → **`boolean`**
185
213
 
186
214
  ### Types and re-exports
package/lib/index.d.ts CHANGED
@@ -48,6 +48,11 @@ export interface PagerOptions {
48
48
  *
49
49
  * Constructor `maxResults`, `queryResultType`, and optional `parseResultSetOptions` are applied on every
50
50
  * `GetQueryResults` request and {@link AthenaQueryResultParser} invocation respectively.
51
+ * When `queryExecutionId` changes between fetches, the bundled parser is reset automatically.
52
+ *
53
+ * Does not wait for query completion or add Athena-specific retry: callers should wait until the execution
54
+ * succeeds (for example via `GetQueryExecution`) and configure SDK / application-level retry for throttling.
55
+ * AWS SDK errors from `GetQueryResults` are propagated as thrown.
51
56
  *
52
57
  * @see {@link https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/athena/command/GetQueryResultsCommand/ | GetQueryResultsCommand (AWS SDK)}
53
58
  */
@@ -66,8 +71,10 @@ export declare class AthenaQueryResultPager {
66
71
  private readonly options;
67
72
  /** Parser options applied on every page parse (undefined uses parser defaults). */
68
73
  private readonly parseResultSetOptions?;
69
- /** Stateful parser reused across calls; recreated by {@link AthenaQueryResultPager.reset}. */
74
+ /** Stateful parser reused across pages of the same execution; reset on execution change or {@link AthenaQueryResultPager.reset}. */
70
75
  private parser;
76
+ /** Last `queryExecutionId` passed to `fetchPage` / `fetchPageWith`; used to auto-reset the parser. */
77
+ private activeQueryExecutionId;
71
78
  /**
72
79
  * Creates a pager bound to `client` with optional per-request defaults.
73
80
  *
@@ -76,10 +83,19 @@ export declare class AthenaQueryResultPager {
76
83
  * @throws {RangeError} When `maxResults` is not an integer in `1..1000` inclusive.
77
84
  */
78
85
  constructor(client: AthenaClient, options?: PagerOptions);
86
+ /**
87
+ * Resets the bundled parser when `queryExecutionId` differs from the previous fetch sequence.
88
+ *
89
+ * Same-execution pagination (with `nextToken`) keeps parser state so header-row handling stays correct.
90
+ *
91
+ * @param queryExecutionId - Athena query execution identifier for the upcoming fetch.
92
+ */
93
+ private readonly ensureParserForExecution;
79
94
  /**
80
95
  * Retrieves a single results page as dictionary-shaped {@link ParsedRow} values.
81
96
  *
82
97
  * Uses {@link AthenaQueryResultParser.parseResultSet} on the AWS response.
98
+ * When `queryExecutionId` differs from the previous fetch sequence, the bundled parser is reset first.
83
99
  *
84
100
  * @param queryExecutionId - Athena query execution identifier.
85
101
  * @param nextToken - Pass `undefined` first; subsequent calls use {@link PageResult.nextToken}.
@@ -91,6 +107,7 @@ export declare class AthenaQueryResultPager {
91
107
  * Retrieves one page and maps each {@link ParsedRow} through `rowParser`.
92
108
  *
93
109
  * Uses {@link AthenaQueryResultParser.parseResultSetWith} on the AWS response.
110
+ * When `queryExecutionId` differs from the previous fetch sequence, the bundled parser is reset first.
94
111
  *
95
112
  * @typeParam T - Output type produced by `rowParser`.
96
113
  * @param queryExecutionId - Athena query execution identifier.
@@ -141,13 +158,15 @@ export declare class AthenaQueryResultPager {
141
158
  *
142
159
  * Useful when {@link PagerOptions.parseResultSetOptions} uses `skipHeaderRow: 'auto'`.
143
160
  *
144
- * @returns The last {@link HeaderRowDecision}, or `null` before any parse on this pager.
161
+ * @returns The last {@link HeaderRowDecision}, or `null` before any parse / after {@link AthenaQueryResultPager.reset}.
145
162
  */
146
163
  getLastHeaderRowDecision(): HeaderRowDecision | null;
147
164
  /**
148
- * Clears the bundled {@link AthenaQueryResultParser} state so header-row handling does not leak between queries.
165
+ * Clears the bundled {@link AthenaQueryResultParser} state and the tracked active execution id.
149
166
  *
150
- * Call when reusing this pager for a different `queryExecutionId` than the previous parse sequence.
167
+ * Usually unnecessary: {@link AthenaQueryResultPager.fetchPage} and {@link AthenaQueryResultPager.fetchPageWith}
168
+ * reset automatically when `queryExecutionId` changes. Call explicitly to clear state without starting a new fetch
169
+ * (for example so {@link AthenaQueryResultPager.getLastHeaderRowDecision} returns `null`).
151
170
  */
152
171
  reset(): void;
153
172
  }
package/lib/index.js CHANGED
@@ -21,6 +21,11 @@ const DEFAULT_QUERY_RESULT_TYPE = client_athena_1.QueryResultType.DATA_ROWS;
21
21
  *
22
22
  * Constructor `maxResults`, `queryResultType`, and optional `parseResultSetOptions` are applied on every
23
23
  * `GetQueryResults` request and {@link AthenaQueryResultParser} invocation respectively.
24
+ * When `queryExecutionId` changes between fetches, the bundled parser is reset automatically.
25
+ *
26
+ * Does not wait for query completion or add Athena-specific retry: callers should wait until the execution
27
+ * succeeds (for example via `GetQueryExecution`) and configure SDK / application-level retry for throttling.
28
+ * AWS SDK errors from `GetQueryResults` are propagated as thrown.
24
29
  *
25
30
  * @see {@link https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/athena/command/GetQueryResultsCommand/ | GetQueryResultsCommand (AWS SDK)}
26
31
  */
@@ -43,6 +48,19 @@ class AthenaQueryResultPager {
43
48
  * @throws {RangeError} When `maxResults` is not an integer in `1..1000` inclusive.
44
49
  */
45
50
  constructor(client, options = {}) {
51
+ /**
52
+ * Resets the bundled parser when `queryExecutionId` differs from the previous fetch sequence.
53
+ *
54
+ * Same-execution pagination (with `nextToken`) keeps parser state so header-row handling stays correct.
55
+ *
56
+ * @param queryExecutionId - Athena query execution identifier for the upcoming fetch.
57
+ */
58
+ this.ensureParserForExecution = (queryExecutionId) => {
59
+ if (this.activeQueryExecutionId !== undefined && this.activeQueryExecutionId !== queryExecutionId) {
60
+ this.parser.reset();
61
+ }
62
+ this.activeQueryExecutionId = queryExecutionId;
63
+ };
46
64
  const maxResults = options.maxResults ?? DEFAULT_MAX_RESULTS;
47
65
  if (!Number.isInteger(maxResults) || maxResults < MIN_MAX_RESULTS || maxResults > MAX_MAX_RESULTS) {
48
66
  throw new RangeError(`options.maxResults must be an integer between ${MIN_MAX_RESULTS} and ${MAX_MAX_RESULTS}, got ${String(maxResults)}`);
@@ -59,6 +77,7 @@ class AthenaQueryResultPager {
59
77
  * Retrieves a single results page as dictionary-shaped {@link ParsedRow} values.
60
78
  *
61
79
  * Uses {@link AthenaQueryResultParser.parseResultSet} on the AWS response.
80
+ * When `queryExecutionId` differs from the previous fetch sequence, the bundled parser is reset first.
62
81
  *
63
82
  * @param queryExecutionId - Athena query execution identifier.
64
83
  * @param nextToken - Pass `undefined` first; subsequent calls use {@link PageResult.nextToken}.
@@ -69,6 +88,7 @@ class AthenaQueryResultPager {
69
88
  if (queryExecutionId.trim() === '') {
70
89
  throw new Error('queryExecutionId must be a non-empty string');
71
90
  }
91
+ this.ensureParserForExecution(queryExecutionId);
72
92
  const input = {
73
93
  QueryExecutionId: queryExecutionId,
74
94
  NextToken: nextToken,
@@ -87,6 +107,7 @@ class AthenaQueryResultPager {
87
107
  * Retrieves one page and maps each {@link ParsedRow} through `rowParser`.
88
108
  *
89
109
  * Uses {@link AthenaQueryResultParser.parseResultSetWith} on the AWS response.
110
+ * When `queryExecutionId` differs from the previous fetch sequence, the bundled parser is reset first.
90
111
  *
91
112
  * @typeParam T - Output type produced by `rowParser`.
92
113
  * @param queryExecutionId - Athena query execution identifier.
@@ -99,6 +120,7 @@ class AthenaQueryResultPager {
99
120
  if (queryExecutionId.trim() === '') {
100
121
  throw new Error('queryExecutionId must be a non-empty string');
101
122
  }
123
+ this.ensureParserForExecution(queryExecutionId);
102
124
  const input = {
103
125
  QueryExecutionId: queryExecutionId,
104
126
  NextToken: nextToken,
@@ -164,18 +186,21 @@ class AthenaQueryResultPager {
164
186
  *
165
187
  * Useful when {@link PagerOptions.parseResultSetOptions} uses `skipHeaderRow: 'auto'`.
166
188
  *
167
- * @returns The last {@link HeaderRowDecision}, or `null` before any parse on this pager.
189
+ * @returns The last {@link HeaderRowDecision}, or `null` before any parse / after {@link AthenaQueryResultPager.reset}.
168
190
  */
169
191
  getLastHeaderRowDecision() {
170
192
  return this.parser.getLastHeaderRowDecision();
171
193
  }
172
194
  /**
173
- * Clears the bundled {@link AthenaQueryResultParser} state so header-row handling does not leak between queries.
195
+ * Clears the bundled {@link AthenaQueryResultParser} state and the tracked active execution id.
174
196
  *
175
- * Call when reusing this pager for a different `queryExecutionId` than the previous parse sequence.
197
+ * Usually unnecessary: {@link AthenaQueryResultPager.fetchPage} and {@link AthenaQueryResultPager.fetchPageWith}
198
+ * reset automatically when `queryExecutionId` changes. Call explicitly to clear state without starting a new fetch
199
+ * (for example so {@link AthenaQueryResultPager.getLastHeaderRowDecision} returns `null`).
176
200
  */
177
201
  reset() {
178
202
  this.parser.reset();
203
+ this.activeQueryExecutionId = undefined;
179
204
  }
180
205
  }
181
206
  exports.AthenaQueryResultPager = AthenaQueryResultPager;
@@ -191,4 +216,4 @@ Object.defineProperty(exports, "rowToTypedObject", { enumerable: true, get: func
191
216
  Object.defineProperty(exports, "toBoolean", { enumerable: true, get: function () { return athena_query_result_parser_2.toBoolean; } });
192
217
  Object.defineProperty(exports, "toDate", { enumerable: true, get: function () { return athena_query_result_parser_2.toDate; } });
193
218
  Object.defineProperty(exports, "toNumber", { enumerable: true, get: function () { return athena_query_result_parser_2.toNumber; } });
194
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMERBQWlJO0FBQ2pJLDJFQU1vQztBQUVwQyxrSEFBa0g7QUFDbEgsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFDakMsc0VBQXNFO0FBQ3RFLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUMxQixzRUFBc0U7QUFDdEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDO0FBRTdCLHVFQUF1RTtBQUN2RSxNQUFNLHlCQUF5QixHQUFHLCtCQUFlLENBQUMsU0FBUyxDQUFDO0FBMEM1RDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFhLHNCQUFzQjtJQUVqQzs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsV0FBVyxDQUFJLFVBQXlCO1FBQzdDLE9BQU8sVUFBVSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUM7SUFDNUMsQ0FBQztJQVdEOzs7Ozs7T0FNRztJQUNILFlBQVksTUFBb0IsRUFBRSxVQUF3QixFQUFFO1FBQzFELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksbUJBQW1CLENBQUM7UUFDN0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksVUFBVSxHQUFHLGVBQWUsSUFBSSxVQUFVLEdBQUcsZUFBZSxFQUFFLENBQUM7WUFDbEcsTUFBTSxJQUFJLFVBQVUsQ0FDbEIsaURBQWlELGVBQWUsUUFBUSxlQUFlLFNBQVMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQ3JILENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLFVBQVU7WUFDVixlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWUsSUFBSSx5QkFBeUI7U0FDdEUsQ0FBQztRQUNGLElBQUksQ0FBQyxxQkFBcUIs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YUNsaWVudCwgR2V0UXVlcnlSZXN1bHRzQ29tbWFuZCwgUXVlcnlSZXN1bHRUeXBlLCB0eXBlIEdldFF1ZXJ5UmVzdWx0c0NvbW1hbmRJbnB1dCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1hdGhlbmEnO1xuaW1wb3J0IHtcbiAgQXRoZW5hUXVlcnlSZXN1bHRQYXJzZXIsXG4gIHR5cGUgSGVhZGVyUm93RGVjaXNpb24sXG4gIHR5cGUgUGFyc2VSZXN1bHRTZXRPcHRpb25zLFxuICB0eXBlIFBhcnNlZFJvdyxcbiAgdHlwZSBSb3dQYXJzZXIsXG59IGZyb20gJ2F0aGVuYS1xdWVyeS1yZXN1bHQtcGFyc2VyJztcblxuLyoqIERlZmF1bHQgbWF4aW11bSBudW1iZXIgb2YgcmVzdWx0IHJvd3MgcmVxdWVzdGVkIHBlciB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlcn0gQVBJIGNhbGwgKGBNYXhSZXN1bHRzYCkuICovXG5jb25zdCBERUZBVUxUX01BWF9SRVNVTFRTID0gMTAwMDtcbi8qKiBNaW5pbXVtIGBNYXhSZXN1bHRzYCB2YWx1ZSBhbGxvd2VkIGJ5IEF0aGVuYSBgR2V0UXVlcnlSZXN1bHRzYC4gKi9cbmNvbnN0IE1JTl9NQVhfUkVTVUxUUyA9IDE7XG4vKiogTWF4aW11bSBgTWF4UmVzdWx0c2AgdmFsdWUgYWxsb3dlZCBieSBBdGhlbmEgYEdldFF1ZXJ5UmVzdWx0c2AuICovXG5jb25zdCBNQVhfTUFYX1JFU1VMVFMgPSAxMDAwO1xuXG4vKiogRGVmYXVsdCBgUXVlcnlSZXN1bHRUeXBlYCBmb3J3YXJkZWQgdG8gQXRoZW5hIGBHZXRRdWVyeVJlc3VsdHNgLiAqL1xuY29uc3QgREVGQVVMVF9RVUVSWV9SRVNVTFRfVFlQRSA9IFF1ZXJ5UmVzdWx0VHlwZS5EQVRBX1JPV1M7XG5cbi8qKlxuICogT25lIHBhZ2Ugb2YgQXRoZW5hIHF1ZXJ5IHJlc3VsdHMgcmV0dXJuZWQgYnkge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXJ9IGFmdGVyIGEgZmV0Y2ggb3IgZ2VuZXJhdG9yIHN0ZXAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gUm93IHJlcHJlc2VudGF0aW9uOyB1c2Uge0BsaW5rIFBhcnNlZFJvd30gb3IgYSB0eXBlIHByb2R1Y2VkIGJ5IHtAbGluayBSb3dQYXJzZXJ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VSZXN1bHQ8VD4ge1xuICAvKiogUGFyc2VkIHJvd3MgZm9yIHRoaXMgcGFnZSBvbmx5LiAqL1xuICByb3dzOiBUW107XG4gIC8qKiBDb250aW51YXRpb24gdG9rZW4gZm9yIHRoZSBmb2xsb3dpbmcgcGFnZSAoYHVuZGVmaW5lZGAgd2hlbiB0aGlzIGlzIHRoZSBsYXN0IHBhZ2UpLiAqL1xuICBuZXh0VG9rZW4/OiBzdHJpbmc7XG4gIC8qKiBTYW1lIGFzIGByb3dzLmxlbmd0aGAgZm9yIGNvbnZlbmllbmNlLiAqL1xuICByb3dDb3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFNldHRpbmdzIGFwcGxpZWQgdG8gZXZlcnkgYEdldFF1ZXJ5UmVzdWx0c2AgaW52b2NhdGlvbiBtYWRlIGJ5IHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlck9wdGlvbnMge1xuICAvKipcbiAgICogYE1heFJlc3VsdHNgIHBlciByZXF1ZXN0IOKAlCBtdXN0IGJlIGFuIGludGVnZXIgZnJvbSAxIHRocm91Z2ggMTAwMCAoQXRoZW5hIGxpbWl0cykuXG4gICAqIEBkZWZhdWx0VmFsdWUgMTAwMFxuICAgKi9cbiAgbWF4UmVzdWx0cz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEF0aGVuYSBgR2V0UXVlcnlSZXN1bHRzYCB7QGxpbmsgUXVlcnlSZXN1bHRUeXBlfSDigJQgYW55IG1lbWJlciBvZiB0aGUgQVdTIFNESyBlbnVtXG4gICAqIChmb3IgZXhhbXBsZSB7QGxpbmsgUXVlcnlSZXN1bHRUeXBlLkRBVEFfUk9XU30gZm9yIHRhYnVsYXIgcm93cyBvciB7QGxpbmsgUXVlcnlSZXN1bHRUeXBlLkRBVEFfTUFOSUZFU1R9XG4gICAqIGZvciBDVEFTIC8gVU5MT0FEIC8gSU5TRVJUIG1hbmlmZXN0IG91dHB1dHMgd2hlbiBBdGhlbmEgc3VwcG9ydHMgdGhlbSkuXG4gICAqIEBkZWZhdWx0VmFsdWUge0BsaW5rIFF1ZXJ5UmVzdWx0VHlwZS5EQVRBX1JPV1N9XG4gICAqL1xuICBxdWVyeVJlc3VsdFR5cGU/OiBRdWVyeVJlc3VsdFR5cGU7XG4gIC8qKlxuICAgKiBPcHRpb25zIGZvcndhcmRlZCB0byBldmVyeSB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYXJzZXIucGFyc2VSZXN1bHRTZXR9IC9cbiAgICoge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyLnBhcnNlUmVzdWx0U2V0V2l0aH0gY2FsbCAoZm9yIGV4YW1wbGVcbiAgICogYGNvbHVtbkNvdW50TWlzbWF0Y2hCZWhhdmlvcmAsIGBza2lwSGVhZGVyUm93YCwgYGhlYWRlclJvd0RldGVjdGlvblN0cmF0ZWd5YCkuXG4gICAqXG4gICAqIEBzZWUgUGFyc2VSZXN1bHRTZXRPcHRpb25zXG4gICAqL1xuICBwYXJzZVJlc3VsdFNldE9wdGlvbnM/OiBQYXJzZVJlc3VsdFNldE9wdGlvbnM7XG59XG5cbi8qKlxuICogUGFnaW5hdGVzIEF0aGVuYSBgR2V0UXVlcnlSZXN1bHRzYCAoQVdTIFNESyBmb3IgSmF2YVNjcmlwdCB2Myk6IHdhbGtzIGBOZXh0VG9rZW5gIGFuZCBwYXJzZXMgdGFidWxhciByb3dzIHdpdGhcbiAqIGBhdGhlbmEtcXVlcnktcmVzdWx0LXBhcnNlcmAgd2hlbiBuZWVkZWQuXG4gKlxuICogUHJvdmlkZXMgcGFpcmVkIEFQSXMgZm9yIHJhdyB7QGxpbmsgUGFyc2VkUm93fSBhY2Nlc3MgdmVyc3VzIGN1c3RvbSB7QGxpbmsgUm93UGFyc2VyfSBtYXBwaW5nIGF0IHRoZSBwYWdlIGxldmVsXG4gKiAoYGZldGNoUGFnZWAgLyBgZmV0Y2hQYWdlV2l0aGAsIGBpdGVyYXRlUGFnZXNgIC8gYGl0ZXJhdGVQYWdlc1dpdGhgKSBhbmQgYXQgdGhlIHJvdyBsZXZlbFxuICogKGBpdGVyYXRlUm93c2Agd2l0aCBvciB3aXRob3V0IGByb3dQYXJzZXJgKS5cbiAqXG4gKiBDb25zdHJ1Y3RvciBgbWF4UmVzdWx0c2AsIGBxdWVyeVJlc3VsdFR5cGVgLCBhbmQgb3B0aW9uYWwgYHBhcnNlUmVzdWx0U2V0T3B0aW9uc2AgYXJlIGFwcGxpZWQgb24gZXZlcnlcbiAqIGBHZXRRdWVyeVJlc3VsdHNgIHJlcXVlc3QgYW5kIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlcn0gaW52b2NhdGlvbiByZXNwZWN0aXZlbHkuXG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0phdmFTY3JpcHRTREsvdjMvbGF0ZXN0L2NsaWVudC9hdGhlbmEvY29tbWFuZC9HZXRRdWVyeVJlc3VsdHNDb21tYW5kLyB8IEdldFF1ZXJ5UmVzdWx0c0NvbW1hbmQgKEFXUyBTREspfVxuICovXG5leHBvcnQgY2xhc3MgQXRoZW5hUXVlcnlSZXN1bHRQYWdlciB7XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgd2hldGhlciBhbm90aGVyIHJlc3VsdHMgcGFnZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBzYW1lIHF1ZXJ5IGV4ZWN1dGlvbi5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gUm93IHR5cGUgaGVsZCBpbiB7QGxpbmsgUGFnZVJlc3VsdC5yb3dzfS5cbiAgICogQHBhcmFtIHBhZ2VSZXN1bHQgLSBUaGUgbW9zdCByZWNlbnRseSByZXRyaWV2ZWQgcGFnZSBmcm9tIGBmZXRjaFBhZ2VgLCBgZmV0Y2hQYWdlV2l0aGAsIG9yIGEgcGFnZSBpdGVyYXRvci5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4ge0BsaW5rIFBhZ2VSZXN1bHQubmV4dFRva2VufSBpcyBkZWZpbmVkIGFuZCBhbm90aGVyIHBhZ2Ugc2hvdWxkIGJlIGZldGNoZWQuXG4gICAqL1xuICBzdGF0aWMgaGFzTmV4dFBhZ2U8VD4ocGFnZVJlc3VsdDogUGFnZVJlc3VsdDxUPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwYWdlUmVzdWx0Lm5leHRUb2tlbiAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFNESyB2MyBjbGllbnQgdXNlZCBmb3IgZXZlcnkgYEdldFF1ZXJ5UmVzdWx0c2AgY2FsbC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IEF0aGVuYUNsaWVudDtcbiAgLyoqIE5vcm1hbGl6ZWQgcGFnZXIgc2V0dGluZ3MgKGV2ZXJ5IGZpZWxkIHNldCBhZnRlciBtZXJnaW5nIGRlZmF1bHRzKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBSZXF1aXJlZDxQaWNrPFBhZ2VyT3B0aW9ucywgJ21heFJlc3VsdHMnIHwgJ3F1ZXJ5UmVzdWx0VHlwZSc+PjtcbiAgLyoqIFBhcnNlciBvcHRpb25zIGFwcGxpZWQgb24gZXZlcnkgcGFnZSBwYXJzZSAodW5kZWZpbmVkIHVzZXMgcGFyc2VyIGRlZmF1bHRzKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwYXJzZVJlc3VsdFNldE9wdGlvbnM/OiBQYXJzZVJlc3VsdFNldE9wdGlvbnM7XG4gIC8qKiBTdGF0ZWZ1bCBwYXJzZXIgcmV1c2VkIGFjcm9zcyBjYWxsczsgcmVjcmVhdGVkIGJ5IHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLnJlc2V0fS4gKi9cbiAgcHJpdmF0ZSBwYXJzZXI6IEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcGFnZXIgYm91bmQgdG8gYGNsaWVudGAgd2l0aCBvcHRpb25hbCBwZXItcmVxdWVzdCBkZWZhdWx0cy5cbiAgICpcbiAgICogQHBhcmFtIGNsaWVudCAtIFNESyB2MyBgQXRoZW5hQ2xpZW50YCB1c2VkIHRvIGNhbGwgYEdldFF1ZXJ5UmVzdWx0c2AuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgYE1heFJlc3VsdHNgLCBgUXVlcnlSZXN1bHRUeXBlYCwgYW5kIGBQYXJzZVJlc3VsdFNldE9wdGlvbnNgOyBkZWZhdWx0cyBhcHBseSB3aGVuIG9taXR0ZWQuXG4gICAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IFdoZW4gYG1heFJlc3VsdHNgIGlzIG5vdCBhbiBpbnRlZ2VyIGluIGAxLi4xMDAwYCBpbmNsdXNpdmUuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjbGllbnQ6IEF0aGVuYUNsaWVudCwgb3B0aW9uczogUGFnZXJPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBtYXhSZXN1bHRzID0gb3B0aW9ucy5tYXhSZXN1bHRzID8/IERFRkFVTFRfTUFYX1JFU1VMVFM7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heFJlc3VsdHMpIHx8IG1heFJlc3VsdHMgPCBNSU5fTUFYX1JFU1VMVFMgfHwgbWF4UmVzdWx0cyA+IE1BWF9NQVhfUkVTVUxUUykge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgIGBvcHRpb25zLm1heFJlc3VsdHMgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gJHtNSU5fTUFYX1JFU1VMVFN9IGFuZCAke01BWF9NQVhfUkVTVUxUU30sIGdvdCAke1N0cmluZyhtYXhSZXN1bHRzKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBtYXhSZXN1bHRzLFxuICAgICAgcXVlcnlSZXN1bHRUeXBlOiBvcHRpb25zLnF1ZXJ5UmVzdWx0VHlwZSA/PyBERUZBVUxUX1FVRVJZX1JFU1VMVF9UWVBFLFxuICAgIH07XG4gICAgdGhpcy5wYXJzZVJlc3VsdFNldE9wdGlvbnMgPSBvcHRpb25zLnBhcnNlUmVzdWx0U2V0T3B0aW9ucztcbiAgICB0aGlzLnBhcnNlciA9IG5ldyBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIHNpbmdsZSByZXN1bHRzIHBhZ2UgYXMgZGljdGlvbmFyeS1zaGFwZWQge0BsaW5rIFBhcnNlZFJvd30gdmFsdWVzLlxuICAgKlxuICAgKiBVc2VzIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlci5wYXJzZVJlc3VsdFNldH0gb24gdGhlIEFXUyByZXNwb25zZS5cbiAgICpcbiAgICogQHBhcmFtIHF1ZXJ5RXhlY3V0aW9uSWQgLSBBdGhlbmEgcXVlcnkgZXhlY3V0aW9uIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSBuZXh0VG9rZW4gLSBQYXNzIGB1bmRlZmluZWRgIGZpcnN0OyBzdWJzZXF1ZW50IGNhbGxzIHVzZSB7QGxpbmsgUGFnZVJlc3VsdC5uZXh0VG9rZW59LlxuICAgKiBAcmV0dXJucyBQYXJzZWQgcm93cyBwbHVzIHBhZ2luYXRpb24gbWV0YWRhdGEgZnJvbSB0aGlzIHJlc3BvbnNlIG9ubHkuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIGBxdWVyeUV4ZWN1dGlvbklkYCBpcyBlbXB0eSBvciB3aGl0ZXNwYWNlIG9ubHkuXG4gICAqL1xuICBhc3luYyBmZXRjaFBhZ2UoXG4gICAgcXVlcnlFeGVjdXRpb25JZDogc3RyaW5nLFxuICAgIG5leHRUb2tlbj86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxQYWdlUmVzdWx0PFBhcnNlZFJvdz4+IHtcbiAgICBpZiAocXVlcnlFeGVjdXRpb25JZC50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5RXhlY3V0aW9uSWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dDogR2V0UXVlcnlSZXN1bHRzQ29tbWFuZElucHV0ID0ge1xuICAgICAgUXVlcnlFeGVjdXRpb25JZDogcXVlcnlFeGVjdXRpb25JZCxcbiAgICAgIE5leHRUb2tlbjogbmV4dFRva2VuLFxuICAgICAgTWF4UmVzdWx0czogdGhpcy5vcHRpb25zLm1heFJlc3VsdHMsXG4gICAgICBRdWVyeVJlc3VsdFR5cGU6IHRoaXMub3B0aW9ucy5xdWVyeVJlc3VsdFR5cGUsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZChuZXcgR2V0UXVlcnlSZXN1bHRzQ29tbWFuZChpbnB1dCkpO1xuXG4gICAgY29uc3Qgcm93cyA9IHRoaXMucGFyc2VyLnBhcnNlUmVzdWx0U2V0KHJlc3BvbnNlLlJlc3VsdFNldCwgdGhpcy5wYXJzZVJlc3VsdFNldE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJvd3MsXG4gICAgICBuZXh0VG9rZW46IHJlc3BvbnNlLk5leHRUb2tlbixcbiAgICAgIHJvd0NvdW50OiByb3dzLmxlbmd0aCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBvbmUgcGFnZSBhbmQgbWFwcyBlYWNoIHtAbGluayBQYXJzZWRSb3d9IHRocm91Z2ggYHJvd1BhcnNlcmAuXG4gICAqXG4gICAqIFVzZXMge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyLnBhcnNlUmVzdWx0U2V0V2l0aH0gb24gdGhlIEFXUyByZXNwb25zZS5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gT3V0cHV0IHR5cGUgcHJvZHVjZWQgYnkgYHJvd1BhcnNlcmAuXG4gICAqIEBwYXJhbSBxdWVyeUV4ZWN1dGlvbklkIC0gQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gcm93UGFyc2VyIC0gQ29udmVydHMgZWFjaCBkaWN0aW9uYXJ5IHJvdyBpbnRvIGBUYC5cbiAgICogQHBhcmFtIG5leHRUb2tlbiAtIFBhc3MgYHVuZGVmaW5lZGAgZmlyc3Q7IHN1YnNlcXVlbnQgY2FsbHMgdXNlIHtAbGluayBQYWdlUmVzdWx0Lm5leHRUb2tlbn0uXG4gICAqIEByZXR1cm5zIFRyYW5zZm9ybWVkIHJvd3MgcGx1cyBwYWdpbmF0aW9uIG1ldGFkYXRhIGZyb20gdGhpcyByZXNwb25zZSBvbmx5LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBgcXVlcnlFeGVjdXRpb25JZGAgaXMgZW1wdHkgb3Igd2hpdGVzcGFjZSBvbmx5LlxuICAgKi9cbiAgYXN5bmMgZmV0Y2hQYWdlV2l0aDxUPihcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgcm93UGFyc2VyOiBSb3dQYXJzZXI8VD4sXG4gICAgbmV4dFRva2VuPzogc3RyaW5nLFxuICApOiBQcm9taXNlPFBhZ2VSZXN1bHQ8VD4+IHtcbiAgICBpZiAocXVlcnlFeGVjdXRpb25JZC50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5RXhlY3V0aW9uSWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dDogR2V0UXVlcnlSZXN1bHRzQ29tbWFuZElucHV0ID0ge1xuICAgICAgUXVlcnlFeGVjdXRpb25JZDogcXVlcnlFeGVjdXRpb25JZCxcbiAgICAgIE5leHRUb2tlbjogbmV4dFRva2VuLFxuICAgICAgTWF4UmVzdWx0czogdGhpcy5vcHRpb25zLm1heFJlc3VsdHMsXG4gICAgICBRdWVyeVJlc3VsdFR5cGU6IHRoaXMub3B0aW9ucy5xdWVyeVJlc3VsdFR5cGUsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZChuZXcgR2V0UXVlcnlSZXN1bHRzQ29tbWFuZChpbnB1dCkpO1xuXG4gICAgY29uc3Qgcm93cyA9IHRoaXMucGFyc2VyLnBhcnNlUmVzdWx0U2V0V2l0aChcbiAgICAgIHJlc3BvbnNlLlJlc3VsdFNldCxcbiAgICAgIHJvd1BhcnNlcixcbiAgICAgIHRoaXMucGFyc2VSZXN1bHRTZXRPcHRpb25zLFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcm93cyxcbiAgICAgIG5leHRUb2tlbjogcmVzcG9uc2UuTmV4dFRva2VuLFxuICAgICAgcm93Q291bnQ6IHJvd3MubGVuZ3RoLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTGF6aWx5IHdhbGtzIGFsbCBwYWdlcyBmb3IgYW4gZXhlY3V0aW9uLCB5aWVsZGluZyBvbmUge0BsaW5rIFBhZ2VSZXN1bHR9IG9mIHtAbGluayBQYXJzZWRSb3d9IHBlciBzdGVwLlxuICAgKlxuICAgKiBAcGFyYW0gcXVlcnlFeGVjdXRpb25JZCAtIEF0aGVuYSBxdWVyeSBleGVjdXRpb24gaWRlbnRpZmllci5cbiAgICogQHlpZWxkcyBPbmUgcGFnZSBhdCBhIHRpbWUgdW50aWwgQVdTIHJldHVybnMgbm8gYE5leHRUb2tlbmAuXG4gICAqL1xuICBhc3luYyAqaXRlcmF0ZVBhZ2VzKFxuICAgIHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgKTogQXN5bmNHZW5lcmF0b3I8UGFnZVJlc3VsdDxQYXJzZWRSb3c+PiB7XG4gICAgbGV0IG5leHRUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IHRoaXMuZmV0Y2hQYWdlKHF1ZXJ5RXhlY3V0aW9uSWQsIG5leHRUb2tlbik7XG4gICAgICB5aWVsZCBwYWdlO1xuICAgICAgbmV4dFRva2VuID0gcGFnZS5uZXh0VG9rZW47XG4gICAgfSB3aGlsZSAobmV4dFRva2VuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW1lIGFzIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLml0ZXJhdGVQYWdlc30gYnV0IG1hcHMgZWFjaCByb3cgdGhyb3VnaCBgcm93UGFyc2VyYCBvbiBldmVyeSBwYWdlLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFQgLSBPdXRwdXQgdHlwZSBlbWl0dGVkIGluIHtAbGluayBQYWdlUmVzdWx0LnJvd3N9LlxuICAgKiBAcGFyYW0gcXVlcnlFeGVjdXRpb25JZCAtIEF0aGVuYSBxdWVyeSBleGVjdXRpb24gaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHJvd1BhcnNlciAtIENvbnZlcnRzIGVhY2ggcGFyc2VkIHJvdyBpbnRvIGBUYC5cbiAgICogQHlpZWxkcyBTdWNjZXNzaXZlIHtAbGluayBQYWdlUmVzdWx0fSB2YWx1ZXMgd2hvc2UgYHJvd3NgIGFyZSB0eXBlZCBhcyBgVGAuXG4gICAqL1xuICBhc3luYyAqaXRlcmF0ZVBhZ2VzV2l0aDxUPihcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgcm93UGFyc2VyOiBSb3dQYXJzZXI8VD4sXG4gICk6IEFzeW5jR2VuZXJhdG9yPFBhZ2VSZXN1bHQ8VD4+IHtcbiAgICBsZXQgbmV4dFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBkbyB7XG4gICAgICBjb25zdCBwYWdlID0gYXdhaXQgdGhpcy5mZXRjaFBhZ2VXaXRoKHF1ZXJ5RXhlY3V0aW9uSWQsIHJvd1BhcnNlciwgbmV4dFRva2VuKTtcbiAgICAgIHlpZWxkIHBhZ2U7XG4gICAgICBuZXh0VG9rZW4gPSBwYWdlLm5leHRUb2tlbjtcbiAgICB9IHdoaWxlIChuZXh0VG9rZW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW5zIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLml0ZXJhdGVQYWdlc30gaW50byBpbmRpdmlkdWFsIHtAbGluayBQYXJzZWRSb3d9IHZhbHVlcyAob25lIHJvdyBwZXIgYG5leHQoKWApLlxuICAgKlxuICAgKiBPbmx5IG9uZSBwYWdlIG9mIHJvd3MgaXMgaGVsZCBpbiBtZW1vcnkgYXQgYSB0aW1lLlxuICAgKlxuICAgKiBAcGFyYW0gcXVlcnlFeGVjdXRpb25JZCAtIEF0aGVuYSBxdWVyeSBleGVjdXRpb24gaWRlbnRpZmllci5cbiAgICogQHlpZWxkcyBFYWNoIGRpY3Rpb25hcnktc2hhcGVkIHJvdyBpbiBleGVjdXRpb24gb3JkZXIuXG4gICAqL1xuICBpdGVyYXRlUm93cyhcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICk6IEFzeW5jR2VuZXJhdG9yPFBhcnNlZFJvdz47XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW5zIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLml0ZXJhdGVQYWdlc1dpdGh9IGludG8gaW5kaXZpZHVhbCBgVGAgdmFsdWVzIChvbmUgcm93IHBlciBgbmV4dCgpYCkuXG4gICAqXG4gICAqIE9ubHkgb25lIHBhZ2Ugb2Ygcm93cyBpcyBoZWxkIGluIG1lbW9yeSBhdCBhIHRpbWUuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVCAtIE91dHB1dCB0eXBlIHByb2R1Y2VkIGJ5IGByb3dQYXJzZXJgLlxuICAgKiBAcGFyYW0gcXVlcnlFeGVjdXRpb25JZCAtIEF0aGVuYSBxdWVyeSBleGVjdXRpb24gaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHJvd1BhcnNlciAtIENvbnZlcnRzIGVhY2ggcGFyc2VkIHJvdyBpbnRvIGBUYC5cbiAgICogQHlpZWxkcyBFYWNoIHRyYW5zZm9ybWVkIHJvdyBpbiBleGVjdXRpb24gb3JkZXIuXG4gICAqL1xuICBpdGVyYXRlUm93czxUPihcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgcm93UGFyc2VyOiBSb3dQYXJzZXI8VD4sXG4gICk6IEFzeW5jR2VuZXJhdG9yPFQ+O1xuXG4gIC8qKlxuICAgKiBTaGFyZWQgaW1wbGVtZW50YXRpb24gZm9yIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLml0ZXJhdGVSb3dzfSBvdmVybG9hZHMuXG4gICAqXG4gICAqIERlbGVnYXRlcyB0byB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlci5pdGVyYXRlUGFnZXN9IHdoZW4gYHJvd1BhcnNlcmAgaXMgb21pdHRlZDsgb3RoZXJ3aXNlIHRvXG4gICAqIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLml0ZXJhdGVQYWdlc1dpdGh9LlxuICAgKi9cbiAgYXN5bmMgKml0ZXJhdGVSb3dzPFQ+KFxuICAgIHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgICByb3dQYXJzZXI/OiBSb3dQYXJzZXI8VD4sXG4gICk6IEFzeW5jR2VuZXJhdG9yPFBhcnNlZFJvdyB8IFQ+IHtcbiAgICBjb25zdCBwYWdlcyA9IHJvd1BhcnNlclxuICAgICAgPyB0aGlzLml0ZXJhdGVQYWdlc1dpdGgocXVlcnlFeGVjdXRpb25JZCwgcm93UGFyc2VyKVxuICAgICAgOiB0aGlzLml0ZXJhdGVQYWdlcyhxdWVyeUV4ZWN1dGlvbklkKTtcblxuICAgIGZvciBhd2FpdCAoY29uc3QgcGFnZSBvZiBwYWdlcykge1xuICAgICAgZm9yIChjb25zdCByb3cgb2YgcGFnZS5yb3dzKSB7XG4gICAgICAgIHlpZWxkIHJvdztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYnVuZGxlZCBwYXJzZXIncyBtb3N0IHJlY2VudCBoZWFkZXItcm93IGRlY2lzaW9uLlxuICAgKlxuICAgKiBVc2VmdWwgd2hlbiB7QGxpbmsgUGFnZXJPcHRpb25zLnBhcnNlUmVzdWx0U2V0T3B0aW9uc30gdXNlcyBgc2tpcEhlYWRlclJvdzogJ2F1dG8nYC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGxhc3Qge0BsaW5rIEhlYWRlclJvd0RlY2lzaW9ufSwgb3IgYG51bGxgIGJlZm9yZSBhbnkgcGFyc2Ugb24gdGhpcyBwYWdlci5cbiAgICovXG4gIGdldExhc3RIZWFkZXJSb3dEZWNpc2lvbigpOiBIZWFkZXJSb3dEZWNpc2lvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5nZXRMYXN0SGVhZGVyUm93RGVjaXNpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGJ1bmRsZWQge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyfSBzdGF0ZSBzbyBoZWFkZXItcm93IGhhbmRsaW5nIGRvZXMgbm90IGxlYWsgYmV0d2VlbiBxdWVyaWVzLlxuICAgKlxuICAgKiBDYWxsIHdoZW4gcmV1c2luZyB0aGlzIHBhZ2VyIGZvciBhIGRpZmZlcmVudCBgcXVlcnlFeGVjdXRpb25JZGAgdGhhbiB0aGUgcHJldmlvdXMgcGFyc2Ugc2VxdWVuY2UuXG4gICAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnBhcnNlci5yZXNldCgpO1xuICB9XG59XG5cbi8qKiBSZS1leHBvcnRzIHtAbGluayBRdWVyeVJlc3VsdFR5cGV9IGZyb20gYEBhd3Mtc2RrL2NsaWVudC1hdGhlbmFgLiAqL1xuZXhwb3J0IHsgUXVlcnlSZXN1bHRUeXBlIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWF0aGVuYSc7XG5leHBvcnQge1xuICBFWFRSQV9DT0xVTU5TX0tFWSxcbiAgaGVhZGVyc0Zyb21NZXRhLFxuICBpc0hlYWRlclJvdyxcbiAgcm93VG9PYmplY3QsXG4gIHJvd1RvVHlwZWRPYmplY3QsXG4gIHRvQm9vbGVhbixcbiAgdG9EYXRlLFxuICB0b051bWJlcixcbn0gZnJvbSAnYXRoZW5hLXF1ZXJ5LXJlc3VsdC1wYXJzZXInO1xuZXhwb3J0IHR5cGUge1xuICBBdGhlbmFUeXBlZFZhbHVlLFxuICBDb2x1bW5Db3VudE1pc21hdGNoQmVoYXZpb3IsXG4gIEhlYWRlclJvd0RlY2lzaW9uLFxuICBQYXJzZVJlc3VsdFNldE9wdGlvbnMsXG4gIFBhcnNlZFJvdyxcbiAgUm93UGFyc2VyLFxuICBUeXBlZFBhcnNlZFJvdyxcbn0gZnJvbSAnYXRoZW5hLXF1ZXJ5LXJlc3VsdC1wYXJzZXInOyJdfQ==
219
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMERBQWlJO0FBQ2pJLDJFQU1vQztBQUVwQyxrSEFBa0g7QUFDbEgsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFDakMsc0VBQXNFO0FBQ3RFLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUMxQixzRUFBc0U7QUFDdEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDO0FBRTdCLHVFQUF1RTtBQUN2RSxNQUFNLHlCQUF5QixHQUFHLCtCQUFlLENBQUMsU0FBUyxDQUFDO0FBMEM1RDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFhLHNCQUFzQjtJQUVqQzs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsV0FBVyxDQUFJLFVBQXlCO1FBQzdDLE9BQU8sVUFBVSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUM7SUFDNUMsQ0FBQztJQWFEOzs7Ozs7T0FNRztJQUNILFlBQVksTUFBb0IsRUFBRSxVQUF3QixFQUFFO1FBaUI1RDs7Ozs7O1dBTUc7UUFDYyw2QkFBd0IsR0FBRyxDQUFDLGdCQUF3QixFQUFRLEVBQUU7WUFDN0UsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNsRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RCLENBQUM7WUFDRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsZ0JBQWdCLENBQUM7UUFDakQsQ0FBQyxDQUFDO1FBNUJBLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksbUJBQW1CLENBQUM7UUFDN0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksVUFBVSxHQUFHLGVBQWUsSUFBSSxVQUFVLEdBQUcsZUFBZSxFQUFF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QUNILEtBQUs7UUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxTQUFTLENBQUM7SUFDMUMsQ0FBQztDQUNGO0FBaFFELHdEQWdRQztBQUVELHdFQUF3RTtBQUN4RSx3REFBeUQ7QUFBaEQsZ0hBQUEsZUFBZSxPQUFBO0FBQ3hCLHlFQVNvQztBQVJsQywrSEFBQSxpQkFBaUIsT0FBQTtBQUNqQiw2SEFBQSxlQUFlLE9BQUE7QUFDZix5SEFBQSxXQUFXLE9BQUE7QUFDWCx5SEFBQSxXQUFXLE9BQUE7QUFDWCw4SEFBQSxnQkFBZ0IsT0FBQTtBQUNoQix1SEFBQSxTQUFTLE9BQUE7QUFDVCxvSEFBQSxNQUFNLE9BQUE7QUFDTixzSEFBQSxRQUFRLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdGhlbmFDbGllbnQsIEdldFF1ZXJ5UmVzdWx0c0NvbW1hbmQsIFF1ZXJ5UmVzdWx0VHlwZSwgdHlwZSBHZXRRdWVyeVJlc3VsdHNDb21tYW5kSW5wdXQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtYXRoZW5hJztcbmltcG9ydCB7XG4gIEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyLFxuICB0eXBlIEhlYWRlclJvd0RlY2lzaW9uLFxuICB0eXBlIFBhcnNlUmVzdWx0U2V0T3B0aW9ucyxcbiAgdHlwZSBQYXJzZWRSb3csXG4gIHR5cGUgUm93UGFyc2VyLFxufSBmcm9tICdhdGhlbmEtcXVlcnktcmVzdWx0LXBhcnNlcic7XG5cbi8qKiBEZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIHJlc3VsdCByb3dzIHJlcXVlc3RlZCBwZXIge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXJ9IEFQSSBjYWxsIChgTWF4UmVzdWx0c2ApLiAqL1xuY29uc3QgREVGQVVMVF9NQVhfUkVTVUxUUyA9IDEwMDA7XG4vKiogTWluaW11bSBgTWF4UmVzdWx0c2AgdmFsdWUgYWxsb3dlZCBieSBBdGhlbmEgYEdldFF1ZXJ5UmVzdWx0c2AuICovXG5jb25zdCBNSU5fTUFYX1JFU1VMVFMgPSAxO1xuLyoqIE1heGltdW0gYE1heFJlc3VsdHNgIHZhbHVlIGFsbG93ZWQgYnkgQXRoZW5hIGBHZXRRdWVyeVJlc3VsdHNgLiAqL1xuY29uc3QgTUFYX01BWF9SRVNVTFRTID0gMTAwMDtcblxuLyoqIERlZmF1bHQgYFF1ZXJ5UmVzdWx0VHlwZWAgZm9yd2FyZGVkIHRvIEF0aGVuYSBgR2V0UXVlcnlSZXN1bHRzYC4gKi9cbmNvbnN0IERFRkFVTFRfUVVFUllfUkVTVUxUX1RZUEUgPSBRdWVyeVJlc3VsdFR5cGUuREFUQV9ST1dTO1xuXG4vKipcbiAqIE9uZSBwYWdlIG9mIEF0aGVuYSBxdWVyeSByZXN1bHRzIHJldHVybmVkIGJ5IHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyfSBhZnRlciBhIGZldGNoIG9yIGdlbmVyYXRvciBzdGVwLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFJvdyByZXByZXNlbnRhdGlvbjsgdXNlIHtAbGluayBQYXJzZWRSb3d9IG9yIGEgdHlwZSBwcm9kdWNlZCBieSB7QGxpbmsgUm93UGFyc2VyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlUmVzdWx0PFQ+IHtcbiAgLyoqIFBhcnNlZCByb3dzIGZvciB0aGlzIHBhZ2Ugb25seS4gKi9cbiAgcm93czogVFtdO1xuICAvKiogQ29udGludWF0aW9uIHRva2VuIGZvciB0aGUgZm9sbG93aW5nIHBhZ2UgKGB1bmRlZmluZWRgIHdoZW4gdGhpcyBpcyB0aGUgbGFzdCBwYWdlKS4gKi9cbiAgbmV4dFRva2VuPzogc3RyaW5nO1xuICAvKiogU2FtZSBhcyBgcm93cy5sZW5ndGhgIGZvciBjb252ZW5pZW5jZS4gKi9cbiAgcm93Q291bnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBTZXR0aW5ncyBhcHBsaWVkIHRvIGV2ZXJ5IGBHZXRRdWVyeVJlc3VsdHNgIGludm9jYXRpb24gbWFkZSBieSB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIGBNYXhSZXN1bHRzYCBwZXIgcmVxdWVzdCDigJQgbXVzdCBiZSBhbiBpbnRlZ2VyIGZyb20gMSB0aHJvdWdoIDEwMDAgKEF0aGVuYSBsaW1pdHMpLlxuICAgKiBAZGVmYXVsdFZhbHVlIDEwMDBcbiAgICovXG4gIG1heFJlc3VsdHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBBdGhlbmEgYEdldFF1ZXJ5UmVzdWx0c2Age0BsaW5rIFF1ZXJ5UmVzdWx0VHlwZX0g4oCUIGFueSBtZW1iZXIgb2YgdGhlIEFXUyBTREsgZW51bVxuICAgKiAoZm9yIGV4YW1wbGUge0BsaW5rIFF1ZXJ5UmVzdWx0VHlwZS5EQVRBX1JPV1N9IGZvciB0YWJ1bGFyIHJvd3Mgb3Ige0BsaW5rIFF1ZXJ5UmVzdWx0VHlwZS5EQVRBX01BTklGRVNUfVxuICAgKiBmb3IgQ1RBUyAvIFVOTE9BRCAvIElOU0VSVCBtYW5pZmVzdCBvdXRwdXRzIHdoZW4gQXRoZW5hIHN1cHBvcnRzIHRoZW0pLlxuICAgKiBAZGVmYXVsdFZhbHVlIHtAbGluayBRdWVyeVJlc3VsdFR5cGUuREFUQV9ST1dTfVxuICAgKi9cbiAgcXVlcnlSZXN1bHRUeXBlPzogUXVlcnlSZXN1bHRUeXBlO1xuICAvKipcbiAgICogT3B0aW9ucyBmb3J3YXJkZWQgdG8gZXZlcnkge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyLnBhcnNlUmVzdWx0U2V0fSAvXG4gICAqIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlci5wYXJzZVJlc3VsdFNldFdpdGh9IGNhbGwgKGZvciBleGFtcGxlXG4gICAqIGBjb2x1bW5Db3VudE1pc21hdGNoQmVoYXZpb3JgLCBgc2tpcEhlYWRlclJvd2AsIGBoZWFkZXJSb3dEZXRlY3Rpb25TdHJhdGVneWApLlxuICAgKlxuICAgKiBAc2VlIFBhcnNlUmVzdWx0U2V0T3B0aW9uc1xuICAgKi9cbiAgcGFyc2VSZXN1bHRTZXRPcHRpb25zPzogUGFyc2VSZXN1bHRTZXRPcHRpb25zO1xufVxuXG4vKipcbiAqIFBhZ2luYXRlcyBBdGhlbmEgYEdldFF1ZXJ5UmVzdWx0c2AgKEFXUyBTREsgZm9yIEphdmFTY3JpcHQgdjMpOiB3YWxrcyBgTmV4dFRva2VuYCBhbmQgcGFyc2VzIHRhYnVsYXIgcm93cyB3aXRoXG4gKiBgYXRoZW5hLXF1ZXJ5LXJlc3VsdC1wYXJzZXJgIHdoZW4gbmVlZGVkLlxuICpcbiAqIFByb3ZpZGVzIHBhaXJlZCBBUElzIGZvciByYXcge0BsaW5rIFBhcnNlZFJvd30gYWNjZXNzIHZlcnN1cyBjdXN0b20ge0BsaW5rIFJvd1BhcnNlcn0gbWFwcGluZyBhdCB0aGUgcGFnZSBsZXZlbFxuICogKGBmZXRjaFBhZ2VgIC8gYGZldGNoUGFnZVdpdGhgLCBgaXRlcmF0ZVBhZ2VzYCAvIGBpdGVyYXRlUGFnZXNXaXRoYCkgYW5kIGF0IHRoZSByb3cgbGV2ZWxcbiAqIChgaXRlcmF0ZVJvd3NgIHdpdGggb3Igd2l0aG91dCBgcm93UGFyc2VyYCkuXG4gKlxuICogQ29uc3RydWN0b3IgYG1heFJlc3VsdHNgLCBgcXVlcnlSZXN1bHRUeXBlYCwgYW5kIG9wdGlvbmFsIGBwYXJzZVJlc3VsdFNldE9wdGlvbnNgIGFyZSBhcHBsaWVkIG9uIGV2ZXJ5XG4gKiBgR2V0UXVlcnlSZXN1bHRzYCByZXF1ZXN0IGFuZCB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYXJzZXJ9IGludm9jYXRpb24gcmVzcGVjdGl2ZWx5LlxuICogV2hlbiBgcXVlcnlFeGVjdXRpb25JZGAgY2hhbmdlcyBiZXR3ZWVuIGZldGNoZXMsIHRoZSBidW5kbGVkIHBhcnNlciBpcyByZXNldCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIERvZXMgbm90IHdhaXQgZm9yIHF1ZXJ5IGNvbXBsZXRpb24gb3IgYWRkIEF0aGVuYS1zcGVjaWZpYyByZXRyeTogY2FsbGVycyBzaG91bGQgd2FpdCB1bnRpbCB0aGUgZXhlY3V0aW9uXG4gKiBzdWNjZWVkcyAoZm9yIGV4YW1wbGUgdmlhIGBHZXRRdWVyeUV4ZWN1dGlvbmApIGFuZCBjb25maWd1cmUgU0RLIC8gYXBwbGljYXRpb24tbGV2ZWwgcmV0cnkgZm9yIHRocm90dGxpbmcuXG4gKiBBV1MgU0RLIGVycm9ycyBmcm9tIGBHZXRRdWVyeVJlc3VsdHNgIGFyZSBwcm9wYWdhdGVkIGFzIHRocm93bi5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTSmF2YVNjcmlwdFNESy92My9sYXRlc3QvY2xpZW50L2F0aGVuYS9jb21tYW5kL0dldFF1ZXJ5UmVzdWx0c0NvbW1hbmQvIHwgR2V0UXVlcnlSZXN1bHRzQ29tbWFuZCAoQVdTIFNESyl9XG4gKi9cbmV4cG9ydCBjbGFzcyBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyIHtcblxuICAvKipcbiAgICogUmVwb3J0cyB3aGV0aGVyIGFub3RoZXIgcmVzdWx0cyBwYWdlIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHNhbWUgcXVlcnkgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFQgLSBSb3cgdHlwZSBoZWxkIGluIHtAbGluayBQYWdlUmVzdWx0LnJvd3N9LlxuICAgKiBAcGFyYW0gcGFnZVJlc3VsdCAtIFRoZSBtb3N0IHJlY2VudGx5IHJldHJpZXZlZCBwYWdlIGZyb20gYGZldGNoUGFnZWAsIGBmZXRjaFBhZ2VXaXRoYCwgb3IgYSBwYWdlIGl0ZXJhdG9yLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB7QGxpbmsgUGFnZVJlc3VsdC5uZXh0VG9rZW59IGlzIGRlZmluZWQgYW5kIGFub3RoZXIgcGFnZSBzaG91bGQgYmUgZmV0Y2hlZC5cbiAgICovXG4gIHN0YXRpYyBoYXNOZXh0UGFnZTxUPihwYWdlUmVzdWx0OiBQYWdlUmVzdWx0PFQ+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBhZ2VSZXN1bHQubmV4dFRva2VuICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogU0RLIHYzIGNsaWVudCB1c2VkIGZvciBldmVyeSBgR2V0UXVlcnlSZXN1bHRzYCBjYWxsLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudDogQXRoZW5hQ2xpZW50O1xuICAvKiogTm9ybWFsaXplZCBwYWdlciBzZXR0aW5ncyAoZXZlcnkgZmllbGQgc2V0IGFmdGVyIG1lcmdpbmcgZGVmYXVsdHMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFJlcXVpcmVkPFBpY2s8UGFnZXJPcHRpb25zLCAnbWF4UmVzdWx0cycgfCAncXVlcnlSZXN1bHRUeXBlJz4+O1xuICAvKiogUGFyc2VyIG9wdGlvbnMgYXBwbGllZCBvbiBldmVyeSBwYWdlIHBhcnNlICh1bmRlZmluZWQgdXNlcyBwYXJzZXIgZGVmYXVsdHMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcnNlUmVzdWx0U2V0T3B0aW9ucz86IFBhcnNlUmVzdWx0U2V0T3B0aW9ucztcbiAgLyoqIFN0YXRlZnVsIHBhcnNlciByZXVzZWQgYWNyb3NzIHBhZ2VzIG9mIHRoZSBzYW1lIGV4ZWN1dGlvbjsgcmVzZXQgb24gZXhlY3V0aW9uIGNoYW5nZSBvciB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlci5yZXNldH0uICovXG4gIHByaXZhdGUgcGFyc2VyOiBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlcjtcbiAgLyoqIExhc3QgYHF1ZXJ5RXhlY3V0aW9uSWRgIHBhc3NlZCB0byBgZmV0Y2hQYWdlYCAvIGBmZXRjaFBhZ2VXaXRoYDsgdXNlZCB0byBhdXRvLXJlc2V0IHRoZSBwYXJzZXIuICovXG4gIHByaXZhdGUgYWN0aXZlUXVlcnlFeGVjdXRpb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcGFnZXIgYm91bmQgdG8gYGNsaWVudGAgd2l0aCBvcHRpb25hbCBwZXItcmVxdWVzdCBkZWZhdWx0cy5cbiAgICpcbiAgICogQHBhcmFtIGNsaWVudCAtIFNESyB2MyBgQXRoZW5hQ2xpZW50YCB1c2VkIHRvIGNhbGwgYEdldFF1ZXJ5UmVzdWx0c2AuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgYE1heFJlc3VsdHNgLCBgUXVlcnlSZXN1bHRUeXBlYCwgYW5kIGBQYXJzZVJlc3VsdFNldE9wdGlvbnNgOyBkZWZhdWx0cyBhcHBseSB3aGVuIG9taXR0ZWQuXG4gICAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IFdoZW4gYG1heFJlc3VsdHNgIGlzIG5vdCBhbiBpbnRlZ2VyIGluIGAxLi4xMDAwYCBpbmNsdXNpdmUuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjbGllbnQ6IEF0aGVuYUNsaWVudCwgb3B0aW9uczogUGFnZXJPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBtYXhSZXN1bHRzID0gb3B0aW9ucy5tYXhSZXN1bHRzID8/IERFRkFVTFRfTUFYX1JFU1VMVFM7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heFJlc3VsdHMpIHx8IG1heFJlc3VsdHMgPCBNSU5fTUFYX1JFU1VMVFMgfHwgbWF4UmVzdWx0cyA+IE1BWF9NQVhfUkVTVUxUUykge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgIGBvcHRpb25zLm1heFJlc3VsdHMgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gJHtNSU5fTUFYX1JFU1VMVFN9IGFuZCAke01BWF9NQVhfUkVTVUxUU30sIGdvdCAke1N0cmluZyhtYXhSZXN1bHRzKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBtYXhSZXN1bHRzLFxuICAgICAgcXVlcnlSZXN1bHRUeXBlOiBvcHRpb25zLnF1ZXJ5UmVzdWx0VHlwZSA/PyBERUZBVUxUX1FVRVJZX1JFU1VMVF9UWVBFLFxuICAgIH07XG4gICAgdGhpcy5wYXJzZVJlc3VsdFNldE9wdGlvbnMgPSBvcHRpb25zLnBhcnNlUmVzdWx0U2V0T3B0aW9ucztcbiAgICB0aGlzLnBhcnNlciA9IG5ldyBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgYnVuZGxlZCBwYXJzZXIgd2hlbiBgcXVlcnlFeGVjdXRpb25JZGAgZGlmZmVycyBmcm9tIHRoZSBwcmV2aW91cyBmZXRjaCBzZXF1ZW5jZS5cbiAgICpcbiAgICogU2FtZS1leGVjdXRpb24gcGFnaW5hdGlvbiAod2l0aCBgbmV4dFRva2VuYCkga2VlcHMgcGFyc2VyIHN0YXRlIHNvIGhlYWRlci1yb3cgaGFuZGxpbmcgc3RheXMgY29ycmVjdC5cbiAgICpcbiAgICogQHBhcmFtIHF1ZXJ5RXhlY3V0aW9uSWQgLSBBdGhlbmEgcXVlcnkgZXhlY3V0aW9uIGlkZW50aWZpZXIgZm9yIHRoZSB1cGNvbWluZyBmZXRjaC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZW5zdXJlUGFyc2VyRm9yRXhlY3V0aW9uID0gKHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLmFjdGl2ZVF1ZXJ5RXhlY3V0aW9uSWQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmFjdGl2ZVF1ZXJ5RXhlY3V0aW9uSWQgIT09IHF1ZXJ5RXhlY3V0aW9uSWQpIHtcbiAgICAgIHRoaXMucGFyc2VyLnJlc2V0KCk7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlUXVlcnlFeGVjdXRpb25JZCA9IHF1ZXJ5RXhlY3V0aW9uSWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIHNpbmdsZSByZXN1bHRzIHBhZ2UgYXMgZGljdGlvbmFyeS1zaGFwZWQge0BsaW5rIFBhcnNlZFJvd30gdmFsdWVzLlxuICAgKlxuICAgKiBVc2VzIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlci5wYXJzZVJlc3VsdFNldH0gb24gdGhlIEFXUyByZXNwb25zZS5cbiAgICogV2hlbiBgcXVlcnlFeGVjdXRpb25JZGAgZGlmZmVycyBmcm9tIHRoZSBwcmV2aW91cyBmZXRjaCBzZXF1ZW5jZSwgdGhlIGJ1bmRsZWQgcGFyc2VyIGlzIHJlc2V0IGZpcnN0LlxuICAgKlxuICAgKiBAcGFyYW0gcXVlcnlFeGVjdXRpb25JZCAtIEF0aGVuYSBxdWVyeSBleGVjdXRpb24gaWRlbnRpZmllci5cbiAgICogQHBhcmFtIG5leHRUb2tlbiAtIFBhc3MgYHVuZGVmaW5lZGAgZmlyc3Q7IHN1YnNlcXVlbnQgY2FsbHMgdXNlIHtAbGluayBQYWdlUmVzdWx0Lm5leHRUb2tlbn0uXG4gICAqIEByZXR1cm5zIFBhcnNlZCByb3dzIHBsdXMgcGFnaW5hdGlvbiBtZXRhZGF0YSBmcm9tIHRoaXMgcmVzcG9uc2Ugb25seS5cbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gYHF1ZXJ5RXhlY3V0aW9uSWRgIGlzIGVtcHR5IG9yIHdoaXRlc3BhY2Ugb25seS5cbiAgICovXG4gIGFzeW5jIGZldGNoUGFnZShcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgbmV4dFRva2VuPzogc3RyaW5nLFxuICApOiBQcm9taXNlPFBhZ2VSZXN1bHQ8UGFyc2VkUm93Pj4ge1xuICAgIGlmIChxdWVyeUV4ZWN1dGlvbklkLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncXVlcnlFeGVjdXRpb25JZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgIH1cblxuICAgIHRoaXMuZW5zdXJlUGFyc2VyRm9yRXhlY3V0aW9uKHF1ZXJ5RXhlY3V0aW9uSWQpO1xuXG4gICAgY29uc3QgaW5wdXQ6IEdldFF1ZXJ5UmVzdWx0c0NvbW1hbmRJbnB1dCA9IHtcbiAgICAgIFF1ZXJ5RXhlY3V0aW9uSWQ6IHF1ZXJ5RXhlY3V0aW9uSWQsXG4gICAgICBOZXh0VG9rZW46IG5leHRUb2tlbixcbiAgICAgIE1heFJlc3VsdHM6IHRoaXMub3B0aW9ucy5tYXhSZXN1bHRzLFxuICAgICAgUXVlcnlSZXN1bHRUeXBlOiB0aGlzLm9wdGlvbnMucXVlcnlSZXN1bHRUeXBlLFxuICAgIH07XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnNlbmQobmV3IEdldFF1ZXJ5UmVzdWx0c0NvbW1hbmQoaW5wdXQpKTtcblxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLnBhcnNlci5wYXJzZVJlc3VsdFNldChyZXNwb25zZS5SZXN1bHRTZXQsIHRoaXMucGFyc2VSZXN1bHRTZXRPcHRpb25zKTtcblxuICAgIHJldHVybiB7XG4gICAgICByb3dzLFxuICAgICAgbmV4dFRva2VuOiByZXNwb25zZS5OZXh0VG9rZW4sXG4gICAgICByb3dDb3VudDogcm93cy5sZW5ndGgsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgb25lIHBhZ2UgYW5kIG1hcHMgZWFjaCB7QGxpbmsgUGFyc2VkUm93fSB0aHJvdWdoIGByb3dQYXJzZXJgLlxuICAgKlxuICAgKiBVc2VzIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlci5wYXJzZVJlc3VsdFNldFdpdGh9IG9uIHRoZSBBV1MgcmVzcG9uc2UuXG4gICAqIFdoZW4gYHF1ZXJ5RXhlY3V0aW9uSWRgIGRpZmZlcnMgZnJvbSB0aGUgcHJldmlvdXMgZmV0Y2ggc2VxdWVuY2UsIHRoZSBidW5kbGVkIHBhcnNlciBpcyByZXNldCBmaXJzdC5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gT3V0cHV0IHR5cGUgcHJvZHVjZWQgYnkgYHJvd1BhcnNlcmAuXG4gICAqIEBwYXJhbSBxdWVyeUV4ZWN1dGlvbklkIC0gQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gcm93UGFyc2VyIC0gQ29udmVydHMgZWFjaCBkaWN0aW9uYXJ5IHJvdyBpbnRvIGBUYC5cbiAgICogQHBhcmFtIG5leHRUb2tlbiAtIFBhc3MgYHVuZGVmaW5lZGAgZmlyc3Q7IHN1YnNlcXVlbnQgY2FsbHMgdXNlIHtAbGluayBQYWdlUmVzdWx0Lm5leHRUb2tlbn0uXG4gICAqIEByZXR1cm5zIFRyYW5zZm9ybWVkIHJvd3MgcGx1cyBwYWdpbmF0aW9uIG1ldGFkYXRhIGZyb20gdGhpcyByZXNwb25zZSBvbmx5LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBgcXVlcnlFeGVjdXRpb25JZGAgaXMgZW1wdHkgb3Igd2hpdGVzcGFjZSBvbmx5LlxuICAgKi9cbiAgYXN5bmMgZmV0Y2hQYWdlV2l0aDxUPihcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgcm93UGFyc2VyOiBSb3dQYXJzZXI8VD4sXG4gICAgbmV4dFRva2VuPzogc3RyaW5nLFxuICApOiBQcm9taXNlPFBhZ2VSZXN1bHQ8VD4+IHtcbiAgICBpZiAocXVlcnlFeGVjdXRpb25JZC50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5RXhlY3V0aW9uSWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICB0aGlzLmVuc3VyZVBhcnNlckZvckV4ZWN1dGlvbihxdWVyeUV4ZWN1dGlvbklkKTtcblxuICAgIGNvbnN0IGlucHV0OiBHZXRRdWVyeVJlc3VsdHNDb21tYW5kSW5wdXQgPSB7XG4gICAgICBRdWVyeUV4ZWN1dGlvbklkOiBxdWVyeUV4ZWN1dGlvbklkLFxuICAgICAgTmV4dFRva2VuOiBuZXh0VG9rZW4sXG4gICAgICBNYXhSZXN1bHRzOiB0aGlzLm9wdGlvbnMubWF4UmVzdWx0cyxcbiAgICAgIFF1ZXJ5UmVzdWx0VHlwZTogdGhpcy5vcHRpb25zLnF1ZXJ5UmVzdWx0VHlwZSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKG5ldyBHZXRRdWVyeVJlc3VsdHNDb21tYW5kKGlucHV0KSk7XG5cbiAgICBjb25zdCByb3dzID0gdGhpcy5wYXJzZXIucGFyc2VSZXN1bHRTZXRXaXRoKFxuICAgICAgcmVzcG9uc2UuUmVzdWx0U2V0LFxuICAgICAgcm93UGFyc2VyLFxuICAgICAgdGhpcy5wYXJzZVJlc3VsdFNldE9wdGlvbnMsXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICByb3dzLFxuICAgICAgbmV4dFRva2VuOiByZXNwb25zZS5OZXh0VG9rZW4sXG4gICAgICByb3dDb3VudDogcm93cy5sZW5ndGgsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXppbHkgd2Fsa3MgYWxsIHBhZ2VzIGZvciBhbiBleGVjdXRpb24sIHlpZWxkaW5nIG9uZSB7QGxpbmsgUGFnZVJlc3VsdH0gb2Yge0BsaW5rIFBhcnNlZFJvd30gcGVyIHN0ZXAuXG4gICAqXG4gICAqIEBwYXJhbSBxdWVyeUV4ZWN1dGlvbklkIC0gQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiBpZGVudGlmaWVyLlxuICAgKiBAeWllbGRzIE9uZSBwYWdlIGF0IGEgdGltZSB1bnRpbCBBV1MgcmV0dXJucyBubyBgTmV4dFRva2VuYC5cbiAgICovXG4gIGFzeW5jICppdGVyYXRlUGFnZXMoXG4gICAgcXVlcnlFeGVjdXRpb25JZDogc3RyaW5nLFxuICApOiBBc3luY0dlbmVyYXRvcjxQYWdlUmVzdWx0PFBhcnNlZFJvdz4+IHtcbiAgICBsZXQgbmV4dFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBkbyB7XG4gICAgICBjb25zdCBwYWdlID0gYXdhaXQgdGhpcy5mZXRjaFBhZ2UocXVlcnlFeGVjdXRpb25JZCwgbmV4dFRva2VuKTtcbiAgICAgIHlpZWxkIHBhZ2U7XG4gICAgICBuZXh0VG9rZW4gPSBwYWdlLm5leHRUb2tlbjtcbiAgICB9IHdoaWxlIChuZXh0VG9rZW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhbWUgYXMge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIuaXRlcmF0ZVBhZ2VzfSBidXQgbWFwcyBlYWNoIHJvdyB0aHJvdWdoIGByb3dQYXJzZXJgIG9uIGV2ZXJ5IHBhZ2UuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVCAtIE91dHB1dCB0eXBlIGVtaXR0ZWQgaW4ge0BsaW5rIFBhZ2VSZXN1bHQucm93c30uXG4gICAqIEBwYXJhbSBxdWVyeUV4ZWN1dGlvbklkIC0gQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gcm93UGFyc2VyIC0gQ29udmVydHMgZWFjaCBwYXJzZWQgcm93IGludG8gYFRgLlxuICAgKiBAeWllbGRzIFN1Y2Nlc3NpdmUge0BsaW5rIFBhZ2VSZXN1bHR9IHZhbHVlcyB3aG9zZSBgcm93c2AgYXJlIHR5cGVkIGFzIGBUYC5cbiAgICovXG4gIGFzeW5jICppdGVyYXRlUGFnZXNXaXRoPFQ+KFxuICAgIHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgICByb3dQYXJzZXI6IFJvd1BhcnNlcjxUPixcbiAgKTogQXN5bmNHZW5lcmF0b3I8UGFnZVJlc3VsdDxUPj4ge1xuICAgIGxldCBuZXh0VG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGRvIHtcbiAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCB0aGlzLmZldGNoUGFnZVdpdGgocXVlcnlFeGVjdXRpb25JZCwgcm93UGFyc2VyLCBuZXh0VG9rZW4pO1xuICAgICAgeWllbGQgcGFnZTtcbiAgICAgIG5leHRUb2tlbiA9IHBhZ2UubmV4dFRva2VuO1xuICAgIH0gd2hpbGUgKG5leHRUb2tlbik7XG4gIH1cblxuICAvKipcbiAgICogRmxhdHRlbnMge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIuaXRlcmF0ZVBhZ2VzfSBpbnRvIGluZGl2aWR1YWwge0BsaW5rIFBhcnNlZFJvd30gdmFsdWVzIChvbmUgcm93IHBlciBgbmV4dCgpYCkuXG4gICAqXG4gICAqIE9ubHkgb25lIHBhZ2Ugb2Ygcm93cyBpcyBoZWxkIGluIG1lbW9yeSBhdCBhIHRpbWUuXG4gICAqXG4gICAqIEBwYXJhbSBxdWVyeUV4ZWN1dGlvbklkIC0gQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiBpZGVudGlmaWVyLlxuICAgKiBAeWllbGRzIEVhY2ggZGljdGlvbmFyeS1zaGFwZWQgcm93IGluIGV4ZWN1dGlvbiBvcmRlci5cbiAgICovXG4gIGl0ZXJhdGVSb3dzKFxuICAgIHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgKTogQXN5bmNHZW5lcmF0b3I8UGFyc2VkUm93PjtcblxuICAvKipcbiAgICogRmxhdHRlbnMge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIuaXRlcmF0ZVBhZ2VzV2l0aH0gaW50byBpbmRpdmlkdWFsIGBUYCB2YWx1ZXMgKG9uZSByb3cgcGVyIGBuZXh0KClgKS5cbiAgICpcbiAgICogT25seSBvbmUgcGFnZSBvZiByb3dzIGlzIGhlbGQgaW4gbWVtb3J5IGF0IGEgdGltZS5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gT3V0cHV0IHR5cGUgcHJvZHVjZWQgYnkgYHJvd1BhcnNlcmAuXG4gICAqIEBwYXJhbSBxdWVyeUV4ZWN1dGlvbklkIC0gQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gcm93UGFyc2VyIC0gQ29udmVydHMgZWFjaCBwYXJzZWQgcm93IGludG8gYFRgLlxuICAgKiBAeWllbGRzIEVhY2ggdHJhbnNmb3JtZWQgcm93IGluIGV4ZWN1dGlvbiBvcmRlci5cbiAgICovXG4gIGl0ZXJhdGVSb3dzPFQ+KFxuICAgIHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgICByb3dQYXJzZXI6IFJvd1BhcnNlcjxUPixcbiAgKTogQXN5bmNHZW5lcmF0b3I8VD47XG5cbiAgLyoqXG4gICAqIFNoYXJlZCBpbXBsZW1lbnRhdGlvbiBmb3Ige0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIuaXRlcmF0ZVJvd3N9IG92ZXJsb2Fkcy5cbiAgICpcbiAgICogRGVsZWdhdGVzIHRvIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLml0ZXJhdGVQYWdlc30gd2hlbiBgcm93UGFyc2VyYCBpcyBvbWl0dGVkOyBvdGhlcndpc2UgdG9cbiAgICoge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIuaXRlcmF0ZVBhZ2VzV2l0aH0uXG4gICAqL1xuICBhc3luYyAqaXRlcmF0ZVJvd3M8VD4oXG4gICAgcXVlcnlFeGVjdXRpb25JZDogc3RyaW5nLFxuICAgIHJvd1BhcnNlcj86IFJvd1BhcnNlcjxUPixcbiAgKTogQXN5bmNHZW5lcmF0b3I8UGFyc2VkUm93IHwgVD4ge1xuICAgIGNvbnN0IHBhZ2VzID0gcm93UGFyc2VyXG4gICAgICA/IHRoaXMuaXRlcmF0ZVBhZ2VzV2l0aChxdWVyeUV4ZWN1dGlvbklkLCByb3dQYXJzZXIpXG4gICAgICA6IHRoaXMuaXRlcmF0ZVBhZ2VzKHF1ZXJ5RXhlY3V0aW9uSWQpO1xuXG4gICAgZm9yIGF3YWl0IChjb25zdCBwYWdlIG9mIHBhZ2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBwYWdlLnJvd3MpIHtcbiAgICAgICAgeWllbGQgcm93O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBidW5kbGVkIHBhcnNlcidzIG1vc3QgcmVjZW50IGhlYWRlci1yb3cgZGVjaXNpb24uXG4gICAqXG4gICAqIFVzZWZ1bCB3aGVuIHtAbGluayBQYWdlck9wdGlvbnMucGFyc2VSZXN1bHRTZXRPcHRpb25zfSB1c2VzIGBza2lwSGVhZGVyUm93OiAnYXV0bydgLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbGFzdCB7QGxpbmsgSGVhZGVyUm93RGVjaXNpb259LCBvciBgbnVsbGAgYmVmb3JlIGFueSBwYXJzZSAvIGFmdGVyIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLnJlc2V0fS5cbiAgICovXG4gIGdldExhc3RIZWFkZXJSb3dEZWNpc2lvbigpOiBIZWFkZXJSb3dEZWNpc2lvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5nZXRMYXN0SGVhZGVyUm93RGVjaXNpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGJ1bmRsZWQge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyfSBzdGF0ZSBhbmQgdGhlIHRyYWNrZWQgYWN0aXZlIGV4ZWN1dGlvbiBpZC5cbiAgICpcbiAgICogVXN1YWxseSB1bm5lY2Vzc2FyeToge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIuZmV0Y2hQYWdlfSBhbmQge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIuZmV0Y2hQYWdlV2l0aH1cbiAgICogcmVzZXQgYXV0b21hdGljYWxseSB3aGVuIGBxdWVyeUV4ZWN1dGlvbklkYCBjaGFuZ2VzLiBDYWxsIGV4cGxpY2l0bHkgdG8gY2xlYXIgc3RhdGUgd2l0aG91dCBzdGFydGluZyBhIG5ldyBmZXRjaFxuICAgKiAoZm9yIGV4YW1wbGUgc28ge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIuZ2V0TGFzdEhlYWRlclJvd0RlY2lzaW9ufSByZXR1cm5zIGBudWxsYCkuXG4gICAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnBhcnNlci5yZXNldCgpO1xuICAgIHRoaXMuYWN0aXZlUXVlcnlFeGVjdXRpb25JZCA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogUmUtZXhwb3J0cyB7QGxpbmsgUXVlcnlSZXN1bHRUeXBlfSBmcm9tIGBAYXdzLXNkay9jbGllbnQtYXRoZW5hYC4gKi9cbmV4cG9ydCB7IFF1ZXJ5UmVzdWx0VHlwZSB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1hdGhlbmEnO1xuZXhwb3J0IHtcbiAgRVhUUkFfQ09MVU1OU19LRVksXG4gIGhlYWRlcnNGcm9tTWV0YSxcbiAgaXNIZWFkZXJSb3csXG4gIHJvd1RvT2JqZWN0LFxuICByb3dUb1R5cGVkT2JqZWN0LFxuICB0b0Jvb2xlYW4sXG4gIHRvRGF0ZSxcbiAgdG9OdW1iZXIsXG59IGZyb20gJ2F0aGVuYS1xdWVyeS1yZXN1bHQtcGFyc2VyJztcbmV4cG9ydCB0eXBlIHtcbiAgQXRoZW5hVHlwZWRWYWx1ZSxcbiAgQ29sdW1uQ291bnRNaXNtYXRjaEJlaGF2aW9yLFxuICBIZWFkZXJSb3dEZWNpc2lvbixcbiAgUGFyc2VSZXN1bHRTZXRPcHRpb25zLFxuICBQYXJzZWRSb3csXG4gIFJvd1BhcnNlcixcbiAgVHlwZWRQYXJzZWRSb3csXG59IGZyb20gJ2F0aGVuYS1xdWVyeS1yZXN1bHQtcGFyc2VyJzsiXX0=
package/package.json CHANGED
@@ -47,7 +47,7 @@
47
47
  "projen": "^0.101.20",
48
48
  "ts-jest": "^29.4.12",
49
49
  "ts-node": "^10.9.2",
50
- "typescript": "5.9.x"
50
+ "typescript": "6.0.x"
51
51
  },
52
52
  "dependencies": {
53
53
  "@aws-sdk/client-athena": "^3.983.0",
@@ -66,8 +66,7 @@
66
66
  },
67
67
  "devEngines": {
68
68
  "packageManager": {
69
- "name": "yarn",
70
- "version": "1.22.22",
69
+ "name": "npm",
71
70
  "onFail": "ignore"
72
71
  }
73
72
  },
@@ -76,7 +75,7 @@
76
75
  "publishConfig": {
77
76
  "access": "public"
78
77
  },
79
- "version": "0.4.6",
78
+ "version": "0.5.0",
80
79
  "jest": {
81
80
  "coverageProvider": "v8",
82
81
  "testMatch": [