@workflow/core 5.0.0-beta.50 → 5.0.0-beta.52
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 +5 -0
- package/dist/events-consumer.d.ts +26 -0
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +28 -1
- package/dist/flushable-stream.d.ts +41 -0
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +169 -1
- package/dist/log-format.d.ts +3 -0
- package/dist/log-format.d.ts.map +1 -1
- package/dist/log-format.js +45 -10
- package/dist/replay-divergence.d.ts +25 -0
- package/dist/replay-divergence.d.ts.map +1 -0
- package/dist/replay-divergence.js +61 -0
- package/dist/runtime/helpers.d.ts +75 -1
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +134 -5
- package/dist/runtime/quickjs-entrypoint.d.ts +30 -8
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
- package/dist/runtime/quickjs-entrypoint.js +209 -32
- package/dist/runtime/quickjs-log-view.d.ts +129 -0
- package/dist/runtime/quickjs-log-view.d.ts.map +1 -0
- package/dist/runtime/quickjs-log-view.js +229 -0
- package/dist/runtime/step-executor.d.ts +2 -21
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +85 -80
- package/dist/runtime/suspension-handler.d.ts +0 -22
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +126 -75
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +262 -91
- package/dist/serialization.d.ts +2 -2
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +16 -13
- package/dist/step/context-storage.d.ts +2 -0
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +1 -1
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +14 -10
- package/dist/telemetry/semantic-conventions.d.ts +36 -0
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +23 -1
- package/dist/test-support/orchestrator-context.d.ts.map +1 -1
- package/dist/test-support/orchestrator-context.js +8 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +8 -3
- package/docs/foundations/streaming.mdx +1 -1
- package/docs/how-it-works/event-sourcing.mdx +27 -0
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
# @workflow/core
|
|
2
2
|
|
|
3
3
|
Core runtime package for [Workflow SDK](https://workflow-sdk.dev).
|
|
4
|
+
|
|
5
|
+
Queued step messages carry immutable run identity in `runContext`, so step
|
|
6
|
+
execution skips the initial `runs.get` and fetches the run row only when
|
|
7
|
+
continuing into workflow replay. Messages from older producers without
|
|
8
|
+
`runContext` retain the initial fetch.
|
|
@@ -76,6 +76,13 @@ export interface EventsConsumerOptions {
|
|
|
76
76
|
*/
|
|
77
77
|
isDeliveryIdle: () => boolean;
|
|
78
78
|
}
|
|
79
|
+
/** See {@link EventsConsumer.describe}. */
|
|
80
|
+
export interface EventsConsumerSnapshot {
|
|
81
|
+
index: number;
|
|
82
|
+
length: number;
|
|
83
|
+
parked: number;
|
|
84
|
+
lastConsumedEventId: string | undefined;
|
|
85
|
+
}
|
|
79
86
|
export declare class EventsConsumer {
|
|
80
87
|
eventIndex: number;
|
|
81
88
|
readonly events: Event[];
|
|
@@ -113,6 +120,13 @@ export declare class EventsConsumer {
|
|
|
113
120
|
private pendingUnconsumedCheck;
|
|
114
121
|
private pendingUnconsumedTimeout;
|
|
115
122
|
private unconsumedCheckVersion;
|
|
123
|
+
/**
|
|
124
|
+
* The event a callback most recently claimed, for {@link describe}. Tracked
|
|
125
|
+
* separately from {@link eventIndex} because the walk also steps over events
|
|
126
|
+
* (parked, sealed no-ops, duplicates) without anyone consuming them, so
|
|
127
|
+
* `events[eventIndex - 1]` does not say what replay last acted on.
|
|
128
|
+
*/
|
|
129
|
+
private lastConsumed;
|
|
116
130
|
constructor(events: Event[], options: EventsConsumerOptions);
|
|
117
131
|
/**
|
|
118
132
|
* The oldest event the walk stepped over that no consumer has claimed yet,
|
|
@@ -137,6 +151,18 @@ export declare class EventsConsumer {
|
|
|
137
151
|
eventId: string;
|
|
138
152
|
eventType: Event['eventType'];
|
|
139
153
|
} | undefined;
|
|
154
|
+
/**
|
|
155
|
+
* Where the walk stands, for a divergence message. Everything here is
|
|
156
|
+
* already known to the consumer; the point of the method is that the
|
|
157
|
+
* orchestrator can print it without reaching into private state.
|
|
158
|
+
*
|
|
159
|
+
* `index` is the ordered walk's position (the offset of the event it is
|
|
160
|
+
* stuck on, when it is stuck), `length` the log as this consumer holds it,
|
|
161
|
+
* `parked` how many events the walk stepped over and still holds, and
|
|
162
|
+
* `lastConsumedEventId` the id of the event a callback most recently
|
|
163
|
+
* claimed, `undefined` before the first claim.
|
|
164
|
+
*/
|
|
165
|
+
describe(): EventsConsumerSnapshot;
|
|
140
166
|
append(events: Event[]): void;
|
|
141
167
|
/**
|
|
142
168
|
* Registers a callback function to be called after an event has been consumed
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events-consumer.d.ts","sourceRoot":"","sources":["../src/events-consumer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAQ7C;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAE3C;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAsG9C,oBAAY,mBAAmB;IAC7B;;OAEG;IACH,QAAQ,IAAA;IACR;;OAEG;IACH,WAAW,IAAA;IACX;;OAEG;IACH,QAAQ,IAAA;CACT;AAED,KAAK,qBAAqB,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,KAAK,mBAAmB,CAAC;AAE1E,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACzC;;;;;;OAMG;IACH,iBAAiB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC1C;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IAC9E;;;;;OAKG;IACH,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC;;;;;;;;;;;OAWG;IACH,cAAc,EAAE,MAAM,OAAO,CAAC;CAC/B;AAED,qBAAa,cAAc;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,qBAAqB,EAAE,CAAM;IACjD;;;;;;;;;OASG;IACH,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;IAChE;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAyC;IAC1E,OAAO,CAAC,eAAe,CAAC,CAAyB;IACjD,OAAO,CAAC,iBAAiB,CAAyB;IAClD,OAAO,CAAC,gBAAgB,CAAC,CAGf;IACV,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,sBAAsB,CAA8B;IAC5D,OAAO,CAAC,wBAAwB,CAA8C;IAC9E,OAAO,CAAC,sBAAsB,CAAK;
|
|
1
|
+
{"version":3,"file":"events-consumer.d.ts","sourceRoot":"","sources":["../src/events-consumer.ts"],"names":[],"mappings":"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"}
|
package/dist/events-consumer.js
CHANGED
|
@@ -163,6 +163,13 @@ export class EventsConsumer {
|
|
|
163
163
|
pendingUnconsumedCheck = null;
|
|
164
164
|
pendingUnconsumedTimeout = null;
|
|
165
165
|
unconsumedCheckVersion = 0;
|
|
166
|
+
/**
|
|
167
|
+
* The event a callback most recently claimed, for {@link describe}. Tracked
|
|
168
|
+
* separately from {@link eventIndex} because the walk also steps over events
|
|
169
|
+
* (parked, sealed no-ops, duplicates) without anyone consuming them, so
|
|
170
|
+
* `events[eventIndex - 1]` does not say what replay last acted on.
|
|
171
|
+
*/
|
|
172
|
+
lastConsumed;
|
|
166
173
|
constructor(events, options) {
|
|
167
174
|
// Own copy: the runtime mutates its event array in place, and a retained
|
|
168
175
|
// session must only observe new events through append() so resume()'s
|
|
@@ -206,6 +213,25 @@ export class EventsConsumer {
|
|
|
206
213
|
eventType: oldest.eventType,
|
|
207
214
|
};
|
|
208
215
|
}
|
|
216
|
+
/**
|
|
217
|
+
* Where the walk stands, for a divergence message. Everything here is
|
|
218
|
+
* already known to the consumer; the point of the method is that the
|
|
219
|
+
* orchestrator can print it without reaching into private state.
|
|
220
|
+
*
|
|
221
|
+
* `index` is the ordered walk's position (the offset of the event it is
|
|
222
|
+
* stuck on, when it is stuck), `length` the log as this consumer holds it,
|
|
223
|
+
* `parked` how many events the walk stepped over and still holds, and
|
|
224
|
+
* `lastConsumedEventId` the id of the event a callback most recently
|
|
225
|
+
* claimed, `undefined` before the first claim.
|
|
226
|
+
*/
|
|
227
|
+
describe() {
|
|
228
|
+
return {
|
|
229
|
+
index: this.eventIndex,
|
|
230
|
+
length: this.events.length,
|
|
231
|
+
parked: this.parked.length,
|
|
232
|
+
lastConsumedEventId: this.lastConsumed?.eventId,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
209
235
|
append(events) {
|
|
210
236
|
for (const event of events)
|
|
211
237
|
this.events.push(event);
|
|
@@ -331,6 +357,7 @@ export class EventsConsumer {
|
|
|
331
357
|
this.resolved.add(resolutionKey(currentEvent.eventType, currentEvent.correlationId));
|
|
332
358
|
}
|
|
333
359
|
this.recordEventClass(currentEvent);
|
|
360
|
+
this.lastConsumed = currentEvent;
|
|
334
361
|
this.notifyConsumedEvent(currentEvent);
|
|
335
362
|
}
|
|
336
363
|
// remove the callback if it has finished
|
|
@@ -724,4 +751,4 @@ export class EventsConsumer {
|
|
|
724
751
|
poll();
|
|
725
752
|
}
|
|
726
753
|
}
|
|
727
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLWNvbnN1bWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2V2ZW50cy1jb25zdW1lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsR0FDbEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTNDOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0FBRTNDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxFQUFFLENBQUM7QUFFOUM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sdUJBQXVCLEdBQUcsR0FBVyxFQUFFLENBQzNDLFNBQVMsQ0FBQyxrQ0FBa0MsRUFBRSx1QkFBdUIsRUFBRTtJQUNyRSxPQUFPLEVBQUUsSUFBSTtJQUNiLEdBQUcsRUFBRSwyQkFBMkI7Q0FDakMsQ0FBQyxDQUFDO0FBRUw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Q0c7QUFDSCxNQUFNLG9CQUFvQixHQUFvQyxJQUFJLEdBQUcsQ0FBQztJQUNwRSxlQUFlO0lBQ2YsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQixVQUFVO0lBQ1YsZUFBZTtDQUNoQixDQUFDLENBQUM7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sb0JBQW9CLEdBQW9DLElBQUksR0FBRyxDQUFDO0lBQ3BFLGdCQUFnQjtDQUNqQixDQUFDLENBQUM7QUFFSCxpRUFBaUU7QUFDakUsU0FBUyxhQUFhLENBQUMsU0FBaUIsRUFBRSxhQUFxQjtJQUM3RCxPQUFPLEdBQUcsU0FBUyxJQUFJLGFBQWEsRUFBRSxDQUFDO0FBQ3pDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFN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ekUsc0VBQXNFO2dCQUN0RSxzRUFBc0U7Z0JBQ3RFLHlFQUF5RTtnQkFDekUsd0VBQXdFO2dCQUN4RSxVQUFVO2dCQUNWLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxFQUFFLENBQUM7SUFDVCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEV2ZW50IH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IGVudk51bWJlciB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZC9lbnYtY29uZmlnJztcbmltcG9ydCB7XG4gIGNsYXNzaWZ5RW50aXR5RXZlbnQsXG4gIGlzU2VhbGVkTm9vcEV2ZW50LFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQvZXZlbnQtbWV0YWRhdGEnO1xuaW1wb3J0IHsgZXZlbnRzTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuXG4vKipcbiAqIERlbGF5IGJlZm9yZSBmaXJpbmcgdGhlIGRlZmVycmVkIHVuY29uc3VtZWQtZXZlbnQgY2hlY2sgYWZ0ZXIgdGhlIHByb21pc2VcbiAqIHF1ZXVlIGhhcyBkcmFpbmVkLiBNdXN0IGJlIGxvbmcgZW5vdWdoIGZvciBjcm9zcy1WTSBtaWNyb3Rhc2sgY2hhaW5zIHRvXG4gKiBwcm9wYWdhdGUgKHJlc29sdmUgaW4gaG9zdCDihpIgd29ya2Zsb3cgY29kZSBpbiBWTSDihpIgc3Vic2NyaWJlIGNhbGwgYmFja1xuICogaW4gaG9zdCkuIEFueSBzdWJzY3JpYmUoKSBhcnJpdmluZyBkdXJpbmcgdGhpcyB3aW5kb3cgY2FuY2VscyB0aGUgY2hlY2suXG4gKi9cbmV4cG9ydCBjb25zdCBERUZFUlJFRF9DSEVDS19ERUxBWV9NUyA9IDEwMDtcblxuLyoqXG4gKiBGbG9vciBmb3IgdGhlIGRlZmVycmVkLWNoZWNrIGRlbGF5LCBzbyBhIHRvby1sb3cgb3ZlcnJpZGUgY2FuJ3QgbWFudWZhY3R1cmVcbiAqIHNwdXJpb3VzIGRpdmVyZ2VuY2UgKGVhY2ggZmFsc2UgcG9zaXRpdmUgYnVybnMgYSBkaXZlcmdlbmNlLXJlY292ZXJ5IHJldHJ5XG4gKiBhbmQgY2FuIGVzY2FsYXRlIHRvIGEgdGVybWluYWwgYENvcnJ1cHRlZEV2ZW50TG9nRXJyb3JgKS5cbiAqXG4gKiBFeHBvcnRlZCBzbyB0ZXN0cyBuZWVkaW5nIHRoZSBzaG9ydGVzdCBsZWdhbCBkZWxheSBjYW4gYXNrIGZvciBpdCBpbnN0ZWFkIG9mXG4gKiBoYXJkY29kaW5nIGEgbnVtYmVyIHRoaXMgZmxvb3Igd291bGQgc2lsZW50bHkgY2xhbXAgdXAuXG4gKi9cbmV4cG9ydCBjb25zdCBNSU5fREVGRVJSRURfQ0hFQ0tfREVMQVlfTVMgPSAxMDtcblxuLyoqXG4gKiBFZmZlY3RpdmUgZGVmZXJyZWQtY2hlY2sgZGVsYXkuIE92ZXJyaWRlOiBgV09SS0ZMT1dfREVGRVJSRURfQ0hFQ0tfREVMQVlfTVNgLlxuICpcbiAqIFVubGlrZSB0aGUgb3RoZXIgdGltaW5nIGtub2JzIHRoaXMgaXMgbm90IGEgcG9sbGluZyBpbnRlcnZhbCBidXQgYVxuICogZGV0ZXJtaW5pc20gc2FmZXR5IG1hcmdpbjogZmlyaW5nIHRoZSB1bmNvbnN1bWVkLWV2ZW50IGNoZWNrIGJlZm9yZSB0aGVcbiAqIGNyb3NzLVZNIHN1YnNjcmliZSgpIGNoYWluIGhhcyBsYW5kZWQgcmVqZWN0cyBhIGhlYWx0aHkgcnVuIHdpdGhcbiAqIGBSZXBsYXlEaXZlcmdlbmNlRXJyb3JgLlxuICovXG5jb25zdCBnZXREZWZlcnJlZENoZWNrRGVsYXlNcyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKCdXT1JLRkxPV19ERUZFUlJFRF9DSEVDS19ERUxBWV9NUycsIERFRkVSUkVEX0NIRUNLX0RFTEFZX01TLCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgICBtaW46IE1JTl9ERUZFUlJFRF9DSEVDS19ERUxBWV9NUyxcbiAgfSk7XG5cbi8qKlxuICogRXZlbnQgdHlwZXMgdGhlIG9yZGVyZWQgd2FsayBtYXkgc3RlcCBvdmVyIGFuZCBkZWxpdmVyIGxhdGVyLlxuICpcbiAqIE1lbWJlcnNoaXAgaXMgbm90IGFib3V0IHdobyB3cm90ZSB0aGUgZXZlbnQuIEl0IGlzIGFib3V0IHdoZXRoZXIgdGhlIGV2ZW50XG4gKiBjYW4gcmVhY2ggdGhlIGhlYWQgb2YgdGhlIHdhbGsgd2l0aCBub3RoaW5nIHJlZ2lzdGVyZWQgdG8gY29uc3VtZSBpdCwgd2hpY2hcbiAqIGlzIHRoZSBvbmx5IHNpdHVhdGlvbiBwYXJraW5nIGV4aXN0cyBmb3IuXG4gKlxuICogTW9zdCB0eXBlcyBjYW5ub3QuIFRoZXkgYXJlIHJlcGxheS1vcmlnaW46IGEgcmVwbGF5IGVtaXRzIHRoZW0sIGluIHRoZSBvcmRlclxuICogaXRzIGNvZGUgcmVhY2hlcyB0aGVtLCBzbyB0aGVpciBwb3NpdGlvbiBpbiB0aGUgbG9nIGlzIHRoZSByZWNvcmQgb2Ygd2hhdFxuICogdGhhdCByZXBsYXkgZGVjaWRlZC4gUmVhY2hpbmcgb25lIG9mIHRob3NlIG91dCBvZiBvcmRlciBtZWFucyB0aGlzIHJlcGxheVxuICogZGVjaWRlZCBkaWZmZXJlbnRseSB0aGFuIHRoZSBsb2cgaG9sZHMsIHdoaWNoIGlzIGRpdmVyZ2VuY2UgYW5kIG5vdGhpbmcgZWxzZS5cbiAqXG4gKiBTdGVwIGxpZmVjeWNsZSBldmVudHMgYXJlIG5vdCByZXBsYXktb3JpZ2luLCBhbmQgYXJlIHN0aWxsIGFic2VudCwgYmVjYXVzZVxuICogdGhleSBhbHdheXMgaGF2ZSBhIGNsYWltYW50LiBgc3RlcCgpYCBzdWJzY3JpYmVzIGl0cyBjb25zdW1lciBiZWZvcmUgdGhlXG4gKiBzdGVwJ3MgZmlyc3QgZXZlbnQgY2FuIGV4aXN0OyBgc3RlcF9jcmVhdGVkYCBpcyBvcmRlcmVkLCBzbyB0aGUgd2FsayBjYW5ub3RcbiAqIHBhc3MgaXQgdW5sZXNzIGEgY29uc3VtZXIgdGFrZXMgaXQ7IGFuZCB0aGF0IGNvbnN1bWVyIHN0YXlzIHN1YnNjcmliZWQgdW50aWxcbiAqIGBzdGVwX2NvbXBsZXRlZGAgb3IgYHN0ZXBfZmFpbGVkYCwgYWZ0ZXIgd2hpY2ggdGhlIFdvcmxkIHJlZnVzZXMgYW55IGZ1cnRoZXJcbiAqIHdyaXRlIGZvciB0aGF0IHN0ZXAuIFRoZXJlIGlzIG5vIHdpbmRvdyBpbiB3aGljaCBhIHJlcGxheSBrbm93cyBhYm91dCBhIHN0ZXBcbiAqIGFuZCBoYXMgbm90aGluZyByZWdpc3RlcmVkIHRvIGNvbnN1bWUgaXRzIGV2ZW50cywgc28gcGFya2luZyB0aGVtIHdvdWxkIG9ubHlcbiAqIGRlZmVyIHJlcG9ydHMgb2Ygd2hhdCBpcyBkaXZlcmdlbmNlIGVpdGhlciB3YXkuIFRoZSBzYW1lIGhvbGRzIGZvclxuICogYHdhaXRfY3JlYXRlZGAgYW5kIGl0cyBjb25zdW1lci4gYHdhaXRfY29tcGxldGVkYCBpcyBsaXN0ZWQgYW55d2F5OiBhIHNsZWVwXG4gKiBjYW4gYWxzbyBiZSBjb21wbGV0ZWQgb3V0IG9mIGJhbmQsIGJ5IHRoZSBBUEkgdGhhdCBmb3JjZS1jb21wbGV0ZXMgcGVuZGluZ1xuICogd2FpdHMsIGFuZCB0b2xlcmF0aW5nIGEgc3RyYXkgb25lIGlzIHRoZSBjaGVhcGVyIGRpcmVjdGlvbiB0byBiZSB3cm9uZyBpbi5cbiAqXG4gKiBBbiBhbGxvd2xpc3QgcmF0aGVyIHRoYW4gdGhlIGNvbXBsZW1lbnQgb2YgdGhlIG9yZGVyZWQgc2V0LCBzbyBhIHR5cGUgdGhpc1xuICogZmlsZSBoYXMgbm90IGJlZW4gdGF1Z2h0IGFib3V0IGtlZXBzIHRoZSBzdHJpY3Qgb2xkIGJlaGF2aW9yLlxuICpcbiAqIGBob29rX2Rpc3Bvc2VkYCBpcyBkZWxpYmVyYXRlbHkgYWJzZW50IGRlc3BpdGUgYmVpbmcgYWJvdXQgYSBob29rOiBpdCBpc1xuICogd3JpdHRlbiB3aGVuIHRoZSB3b3JrZmxvdydzIG93biBgdXNpbmdgIHNjb3BlIGV4aXRzLCBzbyBpdCBpcyByZXBsYXktb3JpZ2luLlxuICpcbiAqIGBhdHRyX3NldGAgaXMgbGlzdGVkIGJ5IHR5cGUgZXZlbiB0aG91Z2ggYSBnaXZlbiBpbnN0YW5jZSBvZiBpdCBtYXkgYmVcbiAqIHJlcGxheS1vcmlnaW4sIHNpbmNlIGl0IGlzIHJlcGxheS1vcmlnaW4gd2hlbiBpdHMgd3JpdGVyIGlzIHRoZSB3b3JrZmxvdy5cbiAqIFNwbGl0dGluZyB0aGF0IG91dCBwZXIgZXZlbnQgd2FzIGNvbnNpZGVyZWQgYW5kIHJlamVjdGVkLiBBIHJlcGxheSB0aGF0XG4gKiByZWFjaGVzIG9uZSBvZiBpdHMgb3duIHdyaXRlcyBvdXQgb2YgcG9zaXRpb24gaGFzIGRpdmVyZ2VkLCBidXQgYSByZXBsYXkgdGhhdFxuICogcmVhY2hlcyBhbiBldmVudCBpdCBkaWQgTk9UIHdyaXRlLCBzaXR0aW5nIHdoZXJlIGl0cyBvd24gd3JpdGUgd291bGQgZ28sIGhhc1xuICogbm90OiB0aGUgd3JpdGVyIGZpZWxkIHNheXMgd2hvIHdyb3RlIHRoZSBldmVudCwgYW5kIG5vdCB3aGV0aGVyIHRoaXMgcmVwbGF5XG4gKiBpcyB0aGUgc2FtZSBvbmUuIEd1ZXNzaW5nIHdyb25nIGluIHRoYXQgZGlyZWN0aW9uIGZhaWxzIGhlYWx0aHkgcnVucywgd2hpY2hcbiAqIGlzIHRoZSBmYWlsdXJlIHRoaXMgZmlsZSBleGlzdHMgdG8gc3RvcCwgc28gdGhlIHdob2xlIHR5cGUgaXMgdG9sZXJhdGVkLiBUaGVcbiAqIGNvc3QgaXMgdGhhdCBhIGRpdmVyZ2VuY2UgaW52b2x2aW5nIGBhdHRyX3NldGAgc3VyZmFjZXMgYXQgdGhlIGVuZCBvZiB0aGVcbiAqIHJlcGxheSwgdGhyb3VnaCBgc3RyYW5kZWRFdmVudGAsIHJhdGhlciB0aGFuIGF0IHRoZSBvZmZlbmRpbmcgZXZlbnQuXG4gKlxuICogUGFya2luZyBoZXJlIGlzIGZvciBhbiBgYXR0cl9zZXRgIHRoZSB3YWxrIHJlYWNoZXMgKmJlZm9yZSogdGhlIGJvZHkgaGFzIG1hZGVcbiAqIHRoZSBjYWxsIHRoYXQgY2xhaW1zIGl0LiBBIHNlY29uZCBldmVudCB1bmRlciBhbiBpZCBhbHJlYWR5IGNsYWltZWQgaXMgYVxuICogZGlmZmVyZW50IHRoaW5nOiBgYXR0cl9zZXRgIGhhcyBhbiBlbnRpdHkgZXZlbnQgY2xhc3MsIHNvIHRoZSBkdXBsaWNhdGUgc2tpcFxuICogdGFrZXMgaXQgYmVmb3JlIHRoaXMgc2V0IGlzIGNvbnN1bHRlZCwgYW5kIGEgY29weSB0aGF0IHBhcmtlZCBhaGVhZCBvZiBhbnlcbiAqIGNvbnN1bXB0aW9uIGlzIHJlbGVhc2VkIGJ5IHtAbGluayBkcm9wUGFya2VkRHVwbGljYXRlc30gb25jZSBvbmUgbGFuZHMuXG4gKi9cbmNvbnN0IFBBUktBQkxFX0VWRU5UX1RZUEVTOiBSZWFkb25seVNldDxFdmVudFsnZXZlbnRUeXBlJ10+ID0gbmV3IFNldChbXG4gICdob29rX3JlY2VpdmVkJyxcbiAgJ2hvb2tfY29uZmxpY3QnLFxuICAnd2FpdF9jb21wbGV0ZWQnLFxuICAnYXR0cl9zZXQnLFxuICAncnVuX2NhbmNlbGxlZCcsXG5dKTtcblxuLyoqXG4gKiBQYXJrYWJsZSB0eXBlcyB0aGF0IGNhbiBvbmx5IGV2ZXIgcmVzb2x2ZSB0aGVpciBjb3JyZWxhdGlvbiBpZCBvbmNlLlxuICpcbiAqIEEgc2Vjb25kIG9uZSBmb3IgdGhlIHNhbWUgaWQgaXMgbm90IGEgZGVsaXZlcnkgdGhpcyByZXBsYXkgaGFzIG5vdCByZWFjaGVkXG4gKiB5ZXQ6IGl0IGlzIGEgcmVzb2x1dGlvbiBmb3Igc29tZXRoaW5nIGFscmVhZHkgcmVzb2x2ZWQsIHdoaWNoIG5vIGNvbnN1bWVyXG4gKiB0aGlzIHJlcGxheSBvciBhbnkgbGF0ZXIgb25lIHJlZ2lzdGVycyBjYW4gZXZlciBjbGFpbS4gYGhvb2tfcmVjZWl2ZWRgIGlzXG4gKiBhYnNlbnQgYmVjYXVzZSBhIGhvb2sgbGVnaXRpbWF0ZWx5IGZpcmVzIG1hbnkgdGltZXMgdW5kZXIgb25lIGlkLlxuICpcbiAqIE11c3Qgc3RheSBhIHN1YnNldCBvZiB7QGxpbmsgUEFSS0FCTEVfRVZFTlRfVFlQRVN9OiB7QGxpbmsgcGFya30gaXMgdGhlIG9ubHlcbiAqIHJlYWRlciBvZiB3aGF0IHRoaXMgcmVjb3JkcywgYW5kIGl0IHJlamVjdHMgYSBub24tcGFya2FibGUgdHlwZSBiZWZvcmUgaXRcbiAqIGxvb2tzLCBzbyBhbiBlbnRyeSBvdXRzaWRlIHRoYXQgc2V0IGlzIGRlYWQgd2VpZ2h0IG9uIGEgaG90IHBhdGguXG4gKi9cbmNvbnN0IE9ORV9TSE9UX0VWRU5UX1RZUEVTOiBSZWFkb25seVNldDxFdmVudFsnZXZlbnRUeXBlJ10+ID0gbmV3IFNldChbXG4gICd3YWl0X2NvbXBsZXRlZCcsXG5dKTtcblxuLyoqIElkZW50aWZpZXMgdGhlIHRoaW5nIGEgb25lLXNob3QgcmVzb2x1dGlvbiBldmVudCByZXNvbHZlcy4gKi9cbmZ1bmN0aW9uIHJlc29sdXRpb25LZXkoZXZlbnRUeXBlOiBzdHJpbmcsIGNvcnJlbGF0aW9uSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtldmVudFR5cGV9OiR7Y29ycmVsYXRpb25JZH1gO1xufVxuXG4vKipcbiAqIFR5cGVzIHRoYXQgZW5kIGEgcnVuLiBPbmNlIG9uZSBpcyBpbiB0aGUgbG9nLCBubyBjb25zdW1lciB3aWxsIGV2ZXIgYmVcbiAqIHJlZ2lzdGVyZWQgYWdhaW4sIHNvIGEgcGFya2VkIGV2ZW50IHN0aWxsIHBhcmtlZCBoZXJlIHdpbGwgbmV2ZXIgYmUgY2xhaW1lZC5cbiAqL1xuY29uc3QgVEVSTUlOQUxfRVZFTlRfVFlQRVM6IFJlYWRvbmx5U2V0PEV2ZW50WydldmVudFR5cGUnXT4gPSBuZXcgU2V0KFtcbiAgJ3J1bl9jb21wbGV0ZWQnLFxuICAncnVuX2ZhaWxlZCcsXG4gICdydW5fY2FuY2VsbGVkJyxcbl0pO1xuXG5leHBvcnQgZW51bSBFdmVudENvbnN1bWVyUmVzdWx0IHtcbiAgLyoqXG4gICAqIENhbGxiYWNrIGNvbnN1bWVkIHRoZSBldmVudCwgYnV0IHNob3VsZCBub3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWxsYmFja3MgbGlzdFxuICAgKi9cbiAgQ29uc3VtZWQsXG4gIC8qKlxuICAgKiBDYWxsYmFjayBkaWQgbm90IGNvbnN1bWUgdGhlIGV2ZW50LCBzbyBpdCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBuZXh0IGNhbGxiYWNrXG4gICAqL1xuICBOb3RDb25zdW1lZCxcbiAgLyoqXG4gICAqIENhbGxiYWNrIGNvbnN1bWVkIHRoZSBldmVudCwgYW5kIHNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIGNhbGxiYWNrcyBsaXN0XG4gICAqL1xuICBGaW5pc2hlZCxcbn1cblxudHlwZSBFdmVudENvbnN1bWVyQ2FsbGJhY2sgPSAoZXZlbnQ6IEV2ZW50IHwgbnVsbCkgPT4gRXZlbnRDb25zdW1lclJlc3VsdDtcblxuZXhwb3J0IGludGVyZmFjZSBFdmVudHNDb25zdW1lck9wdGlvbnMge1xuICAvKipcbiAgICogQ2FsbGJhY2sgaW52b2tlZCBhZnRlciBhbiBldmVudCBoYXMgYmVlbiBjb25zdW1lZC4gQ29uc3VtZXJzIHN1Y2ggYXMgdGhlXG4gICAqIGRldGVybWluaXN0aWMgd29ya2Zsb3cgY2xvY2sgbXVzdCBub3Qgb2JzZXJ2ZSBldmVudHMgdGhhdCBhcmUgbWVyZWx5XG4gICAqIGluc3BlY3RlZCB3aGlsZSB3YWl0aW5nIGZvciB1c2VyIGNvZGUgdG8gc3Vic2NyaWJlIHRvIHRoZSBuZXh0IG9wZXJhdGlvbi5cbiAgICovXG4gIG9uQ29uc3VtZWRFdmVudD86IChldmVudDogRXZlbnQpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gYSBub24tbnVsbCBldmVudCBjYW5ub3QgYmUgY29uc3VtZWQgYnkgYW55IHJlZ2lzdGVyZWRcbiAgICogY2FsbGJhY2ssIGluZGljYXRpbmcgYW4gb3JwaGFuZWQgb3IgaW52YWxpZCBldmVudCBpbiB0aGUgZXZlbnQgbG9nLiBUaGVcbiAgICogY2hlY2sgaXMgZGVmZXJyZWQgdW50aWwgYWZ0ZXIgdGhlIHByb21pc2UgcXVldWUgaGFzIGRyYWluZWQsIGVuc3VyaW5nIHRoYXRcbiAgICogYW55IHBlbmRpbmcgYXN5bmMgd29yayAoZS5nLiwgZGVzZXJpYWxpemF0aW9uL2RlY3J5cHRpb24pIGNvbXBsZXRlcyBhbmRcbiAgICogZG93bnN0cmVhbSBzdWJzY3JpYmUoKSBjYWxscyBoYXZlIGEgY2hhbmNlIHRvIGNhbmNlbCB0aGUgY2hlY2sgZmlyc3QuXG4gICAqL1xuICBvblVuY29uc3VtZWRFdmVudDogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIENhbGxiYWNrIGludm9rZWQgd2hlbiBhbiBldmVudCBpcyBza2lwcGVkIGJlY2F1c2UgaXQgcmVwZWF0cyBhbiBldmVudFxuICAgKiBjbGFzcyB0aGUgd2FsayBhbHJlYWR5IGNvbnN1bWVkIGZvciB0aGUgc2FtZSBlbnRpdHkuIGBmaXJzdEV2ZW50VHlwZWAgaXNcbiAgICogdGhlIHR5cGUgdGhhdCByZWNvcmRlZCB0aGUgY2xhc3MsIHdoaWNoIGlzIHRoZSBvbmUgdGhlIHdvcmtmbG93IG9ic2VydmVkLlxuICAgKiBEaWFnbm9zdGljcyBvbmx5OiBza2lwcGluZyBpcyBhIG5vcm1hbCBvdXRjb21lLCBub3QgYW4gZXJyb3IsIHRob3VnaCBhXG4gICAqIGBmaXJzdEV2ZW50VHlwZWAgZGlmZmVyaW5nIGZyb20gYGV2ZW50LmV2ZW50VHlwZWAgc2F5cyB0aGUgdHdvIHdyaXRlcnNcbiAgICogZGVjaWRlZCB0aGUgZW50aXR5J3Mgb3V0Y29tZSBkaWZmZXJlbnRseSwgd2hpY2ggaXMgd29ydGggbW9yZSB0aGFuIGFuXG4gICAqIGluZm8gbG9nLlxuICAgKi9cbiAgb25EdXBsaWNhdGVFdmVudD86IChldmVudDogRXZlbnQsIGZpcnN0RXZlbnRUeXBlOiBFdmVudFsnZXZlbnRUeXBlJ10pID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHByb21pc2UgcXVldWUuIFRoZSB1bmNvbnN1bWVkIGV2ZW50IGNoZWNrIGlzIGNoYWluZWRcbiAgICogb250byB0aGlzIHF1ZXVlIHNvIGl0IG9ubHkgZmlyZXMgYWZ0ZXIgYWxsIHBlbmRpbmcgYXN5bmMgd29yayAoZS5nLixcbiAgICogZGVzZXJpYWxpemF0aW9uKSBoYXMgY29tcGxldGVkLiBUaGlzIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyB3aGVuIGFzeW5jXG4gICAqIGRlc2VyaWFsaXphdGlvbiBkZWxheXMgdGhlIHJlc29sdmUoKSB0aGF0IHRyaWdnZXJzIHRoZSBuZXh0IHN1YnNjcmliZSgpLlxuICAgKi9cbiAgZ2V0UHJvbWlzZVF1ZXVlOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogV2hldGhlciBubyBkYXRhIGRlbGl2ZXJ5IGlzIGluIGZsaWdodCAoYGlzRGVsaXZlcnlJZGxlYCBpbiBwcml2YXRlLnRzKS5cbiAgICogVGhlIHVuY29uc3VtZWQtZXZlbnQgY2hlY2sgd2FpdHMgZm9yIHRoaXMgYmVmb3JlIGl0IGZpcmVzOiBhIGRlbGl2ZXJ5IGluXG4gICAqIGZsaWdodCBtZWFucyB0aGUgd29ya2Zsb3cgVk0gaXMgbWlkLXJlYWN0aW9uLCBhbmQgYW4gZXZlbnQgaXQgaGFzIG5vdFxuICAgKiBjbGFpbWVkIHlldCBpcyBhbiBldmVudCBpdCBoYXMgbm90IHJlYWNoZWQgeWV0LlxuICAgKlxuICAgKiBSZXF1aXJlZCByYXRoZXIgdGhhbiBkZWZhdWx0aW5nIHRvIGFsd2F5cy1pZGxlOiBhbHdheXMtaWRsZSBpcyBleGFjdGx5IHRoZVxuICAgKiBwcmUtZ2F0ZSBiZWhhdmlvciwgc28gYSBkZWZhdWx0ZWQgb3B0aW9uIHdvdWxkIGxldCBhIGNvbnN0cnVjdGlvbiBzaXRlIG9wdFxuICAgKiBhIHdob2xlIHJlcGxheSBwYXRoIGJhY2sgb3V0IHdpdGhvdXQgc2F5aW5nIHNvLiBUZXN0cyB0aGF0IGRyaXZlIGEgY29uc3VtZXJcbiAgICogd2l0aCBubyBvcmNoZXN0cmF0b3IgY29udGV4dCBwYXNzIGAoKSA9PiB0cnVlYCB0byBrZWVwIHRoZSBwcmUtZXhpc3RpbmdcbiAgICogdGltaW5nLCBhbmQgc2F5IHNvIGF0IHRoZSBjYWxsIHNpdGUuXG4gICAqL1xuICBpc0RlbGl2ZXJ5SWRsZTogKCkgPT4gYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50c0NvbnN1bWVyIHtcbiAgZXZlbnRJbmRleDogbnVtYmVyO1xuICByZWFkb25seSBldmVudHM6IEV2ZW50W107XG4gIHJlYWRvbmx5IGNhbGxiYWNrczogRXZlbnRDb25zdW1lckNhbGxiYWNrW10gPSBbXTtcbiAgLyoqXG4gICAqIEV2ZW50cyB0aGUgb3JkZXJlZCB3YWxrIHN0ZXBwZWQgb3ZlciBiZWNhdXNlIG5vYm9keSBjbGFpbWVkIHRoZW0gYW5kIHRoZWlyXG4gICAqIHR5cGUgY2FycmllcyBubyBvcmRlcmluZyBjbGFpbS4gRWFjaCBrZWVwcyB0aGUgaW5kZXggaXQgaGVsZCBpbiB0aGUgbG9nOlxuICAgKiBjb25zdW1lcnMgcmVhZCB7QGxpbmsgZXZlbnRJbmRleH0gYXQgY29uc3VtcHRpb24gdGltZSB0byBvcmRlciB0aGVpclxuICAgKiBkZWxpdmVyeSBhZ2FpbnN0IHRoZSByZXN0IG9mIHRoZSBsb2csIGFuZCBhIGxhdGUgZGVsaXZlcnkgbXVzdCBzdGlsbCBtYWtlXG4gICAqIHRoZSBjbGFpbSBpdHMgcG9zaXRpb24gZ2F2ZSBpdC5cbiAgICpcbiAgICogSGVsZCBpbiBsb2cgb3JkZXIsIGRyYWluZWQgaW4gbG9nIG9yZGVyLCBhbmQgZHJhaW5lZCBiZWZvcmUgZXZlcnkgb2ZmZXIgc29cbiAgICogYSBjb25zdW1lciByZWdpc3RlcmVkIGFmdGVyIHRoZSB3YWxrIHBhc3NlZCB0aGUgZXZlbnQgc3RpbGwgcmVjZWl2ZXMgaXQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmtlZDogeyBldmVudDogRXZlbnQ7IGluZGV4OiBudW1iZXIgfVtdID0gW107XG4gIC8qKlxuICAgKiBDb3JyZWxhdGlvbiBpZHMgb2YgdGhlIHtAbGluayBPTkVfU0hPVF9FVkVOVF9UWVBFU30gZXZlbnRzIGNvbnN1bWVkIHNvXG4gICAqIGZhciwgc28gYSBzZWNvbmQgcmVzb2x1dGlvbiBmb3Igb25lIG9mIHRoZW0gaXMgcmVjb2duaXplZCBhcyB1bmNsYWltYWJsZVxuICAgKiByYXRoZXIgdGhhbiBwYXJrZWQgZm9yIGEgY29uc3VtZXIgdGhhdCBjYW5ub3QgZXhpc3QuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8qKlxuICAgKiBgPGNsYXNzPjo8Y29ycmVsYXRpb25JZD5gIGZvciBldmVyeSBldmVudCBjbGFzcyB0aGUgd2FsayBoYXMgYWxyZWFkeVxuICAgKiBjb25zdW1lZCwgbWFwcGVkIHRvIHRoZSBldmVudCB0eXBlIHRoYXQgcmVjb3JkZWQgaXQuIFRoZSB0eXBlIGlzIGtlcHQgc28gYVxuICAgKiByZXBlYXQgdGhhdCBkZWNpZGVkIHRoZSBzYW1lIGNsYXNzICpkaWZmZXJlbnRseSogKGEgYHN0ZXBfZmFpbGVkYCBiZWhpbmQgYVxuICAgKiBgc3RlcF9jb21wbGV0ZWRgKSBjYW4gYmUgcmVwb3J0ZWQgYXMgbW9yZSB0aGFuIGEgcmUtY29tbWl0LiBTZWVcbiAgICoge0BsaW5rIEV2ZW50c0NvbnN1bWVyLmZpcnN0RXZlbnRUeXBlT2ZDbGFzc30uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNlZW5FdmVudENsYXNzZXMgPSBuZXcgTWFwPHN0cmluZywgRXZlbnRbJ2V2ZW50VHlwZSddPigpO1xuICBwcml2YXRlIG9uQ29uc3VtZWRFdmVudD86IChldmVudDogRXZlbnQpID0+IHZvaWQ7XG4gIHByaXZhdGUgb25VbmNvbnN1bWVkRXZlbnQ6IChldmVudDogRXZlbnQpID0+IHZvaWQ7XG4gIHByaXZhdGUgb25EdXBsaWNhdGVFdmVudD86IChcbiAgICBldmVudDogRXZlbnQsXG4gICAgZmlyc3RUeXBlOiBFdmVudFsnZXZlbnRUeXBlJ11cbiAgKSA9PiB2b2lkO1xuICBwcml2YXRlIGdldFByb21pc2VRdWV1ZTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcHJpdmF0ZSBpc0RlbGl2ZXJ5SWRsZTogKCkgPT4gYm9vbGVhbjtcbiAgcHJpdmF0ZSBwZW5kaW5nVW5jb25zdW1lZENoZWNrOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGVuZGluZ1VuY29uc3VtZWRUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHVuY29uc3VtZWRDaGVja1ZlcnNpb24gPSAwO1xuXG4gIGNvbnN0cnVjdG9yKGV2ZW50czogRXZlbnRbXSwgb3B0aW9uczogRXZlbnRzQ29uc3VtZXJPcHRpb25zKSB7XG4gICAgLy8gT3duIGNvcHk6IHRoZSBydW50aW1lIG11dGF0ZXMgaXRzIGV2ZW50IGFycmF5IGluIHBsYWNlLCBhbmQgYSByZXRhaW5lZFxuICAgIC8vIHNlc3Npb24gbXVzdCBvbmx5IG9ic2VydmUgbmV3IGV2ZW50cyB0aHJvdWdoIGFwcGVuZCgpIHNvIHJlc3VtZSgpJ3NcbiAgICAvLyBzdHJpY3QtZXh0ZW5zaW9uIGNoZWNrIHN0YXlzIG1lYW5pbmdmdWwuXG4gICAgdGhpcy5ldmVudHMgPSBbLi4uZXZlbnRzXTtcbiAgICB0aGlzLmV2ZW50SW5kZXggPSAwO1xuICAgIHRoaXMub25Db25zdW1lZEV2ZW50ID0gb3B0aW9ucy5vbkNvbnN1bWVkRXZlbnQ7XG4gICAgdGhpcy5vblVuY29uc3VtZWRFdmVudCA9IG9wdGlvbnMub25VbmNvbnN1bWVkRXZlbnQ7XG4gICAgdGhpcy5vbkR1cGxpY2F0ZUV2ZW50ID0gb3B0aW9ucy5vbkR1cGxpY2F0ZUV2ZW50O1xuICAgIHRoaXMuZ2V0UHJvbWlzZVF1ZXVlID0gb3B0aW9ucy5nZXRQcm9taXNlUXVldWU7XG4gICAgdGhpcy5pc0RlbGl2ZXJ5SWRsZSA9IG9wdGlvbnMuaXNEZWxpdmVyeUlkbGU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG9sZGVzdCBldmVudCB0aGUgd2FsayBzdGVwcGVkIG92ZXIgdGhhdCBubyBjb25zdW1lciBoYXMgY2xhaW1lZCB5ZXQsXG4gICAqIGlmIGFueS4gUGFya2luZyBpcyBhIGJldCB0aGF0IGEgY29uc3VtZXIgd2lsbCBiZSByZWdpc3RlcmVkIGxhdGVyLCBzbyBhdFxuICAgKiBhbnkgcG9pbnQgd2hlcmUgbm8gY29uc3VtZXIgZXZlciB3aWxsIGJlIGFnYWluICh0aGUgcmVwbGF5IGZpbmlzaGluZyBpc1xuICAgKiB0aGUgZGVmaW5pdGl2ZSBvbmUpLCB0aGlzIGFuc3dlcnMgd2hpY2ggZXZlbnQgdGhlIGJldCBsb3N0IG9uLlxuICAgKi9cbiAgZ2V0IHN0cmFuZGVkRXZlbnQoKTogRXZlbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmtlZFswXT8uZXZlbnQ7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCB0aGUgd2FsayBpcyBzdGlsbCBob2xkaW5nLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGhvbGRzIG5vdGhpbmcuXG4gICAqXG4gICAqIFJlYWQgYXQgZXZlcnkgcG9pbnQgYSByZXBsYXkgc3RvcHMsIGluY2x1ZGluZyB0aGUgc3VzcGVuc2lvbnMgdGhhdCBhcmUgbm90XG4gICAqIHNldHRsaW5nIHBvaW50cywgc28gdGhlIGhlbGQgc3RhdGUgcmVhY2hlcyB0ZWxlbWV0cnkuIEEgcmVwbGF5IGNhbm5vdCB0ZWxsXG4gICAqIGEgZGVsaXZlcnkgYXdhaXRpbmcgYSBsYXRlciBjb25zdW1lciBmcm9tIG9uZSBubyBjb25zdW1lciB3aWxsIGV2ZXJcbiAgICogcmVnaXN0ZXIsIHNvIGl0IHJlcG9ydHMgcmF0aGVyIHRoYW4gZGVjaWRlczogdGhlIHNhbWUgYGV2ZW50SWRgIHJlcG9ydGVkIG9uXG4gICAqIHN1c3BlbnNpb24gYWZ0ZXIgc3VzcGVuc2lvbiBvZiBvbmUgcnVuIGlzIHRoZSBzaGFwZSB0aGF0IHNheXMgdGhlIGJldFxuICAgKiBwYXJraW5nIG1hZGUgaXMgbm90IGdvaW5nIHRvIHBheSBvZmYsIGFuZCB0aGF0IHNoYXBlIGlzIG9ubHkgdmlzaWJsZSBhY3Jvc3NcbiAgICogcmVwbGF5cy5cbiAgICovXG4gIGdldCBwYXJrZWRTdW1tYXJ5KCk6XG4gICAgfCB7IGNvdW50OiBudW1iZXI7IGV2ZW50SWQ6IHN0cmluZzsgZXZlbnRUeXBlOiBFdmVudFsnZXZlbnRUeXBlJ10gfVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBvbGRlc3QgPSB0aGlzLnBhcmtlZFswXT8uZXZlbnQ7XG4gICAgaWYgKCFvbGRlc3QpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjb3VudDogdGhpcy5wYXJrZWQubGVuZ3RoLFxuICAgICAgZXZlbnRJZDogb2xkZXN0LmV2ZW50SWQsXG4gICAgICBldmVudFR5cGU6IG9sZGVzdC5ldmVudFR5cGUsXG4gICAgfTtcbiAgfVxuXG4gIGFwcGVuZChldmVudHM6IEV2ZW50W10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykgdGhpcy5ldmVudHMucHVzaChldmVudCk7XG4gICAgcHJvY2Vzcy5uZXh0VGljayh0aGlzLmNvbnN1bWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhZnRlciBhbiBldmVudCBoYXMgYmVlbiBjb25zdW1lZFxuICAgKiBieSBhIGRpZmZlcmVudCBjYWxsYmFjay4gVGhlIGNhbGxiYWNrIGNhbiByZXR1cm46XG4gICAqICAtIGBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkYCB0aGUgZXZlbnQgaXMgY29uc2lkZXJlZCBjb25zdW1lZCBhbmQgd2lsbCBub3QgYmUgcGFzc2VkIHRvIGFueSBvdGhlciBjYWxsYmFjaywgYnV0IHRoZSBjYWxsYmFjayB3aWxsIHJlbWFpbiBpbiB0aGUgY2FsbGJhY2tzIGxpc3RcbiAgICogIC0gYEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWRgIHRoZSBldmVudCBpcyBwYXNzZWQgdG8gdGhlIG5leHQgY2FsbGJhY2tcbiAgICogIC0gYEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWRgIHRoZSBldmVudCBpcyBjb25zaWRlcmVkIGNvbnN1bWVkIGFuZCB0aGUgY2FsbGJhY2sgaXMgcmVtb3ZlZCBmcm9tIHRoZSBjYWxsYmFja3MgbGlzdFxuICAgKlxuICAgKiBAcGFyYW0gZm4gLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcmVnaXN0ZXIuXG4gICAqL1xuICBzdWJzY3JpYmUoZm46IEV2ZW50Q29uc3VtZXJDYWxsYmFjaykge1xuICAgIHRoaXMuY2FsbGJhY2tzLnB1c2goZm4pO1xuICAgIC8vIENhbmNlbCBhbnkgcGVuZGluZyB1bmNvbnN1bWVkIGNoZWNrIHNpbmNlIGEgbmV3IGNhbGxiYWNrIG1heSBjb25zdW1lIHRoZSBldmVudC5cbiAgICAvLyBJbmNyZW1lbnRpbmcgdGhlIHZlcnNpb24gY2F1c2VzIGFueSBpbi1mbGlnaHQgcHJvbWlzZSBjaGFpbiBjaGVjayB0byBuby1vcC5cbiAgICAvLyBBbHNvIGNsZWFyIHRoZSBwZW5kaW5nIHNldFRpbWVvdXQgaWYgaXQgaGFzbid0IGZpcmVkIHlldC5cbiAgICBpZiAodGhpcy5wZW5kaW5nVW5jb25zdW1lZENoZWNrICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnVuY29uc3VtZWRDaGVja1ZlcnNpb24rKztcbiAgICAgIHRoaXMucGVuZGluZ1VuY29uc3VtZWRDaGVjayA9IG51bGw7XG4gICAgICBpZiAodGhpcy5wZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucGVuZGluZ1VuY29uc3VtZWRUaW1lb3V0KTtcbiAgICAgICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBwcm9jZXNzLm5leHRUaWNrKHRoaXMuY29uc3VtZSk7XG4gIH1cblxuICBwcml2YXRlIG5vdGlmeUNvbnN1bWVkRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLm9uQ29uc3VtZWRFdmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5vbkNvbnN1bWVkRXZlbnQoZXZlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBldmVudHNMb2dnZXIuZXJyb3IoJ29uQ29uc3VtZWRFdmVudCBjYWxsYmFjayB0aHJldyBhbiBlcnJvcicsIHtcbiAgICAgICAgZXJyb3IsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWUgPSAoKSA9PiB7XG4gICAgLy8gRHJhaW4gY29uc2VjdXRpdmVseSBjb25zdW1hYmxlIGV2ZW50cyBzeW5jaHJvbm91c2x5IHdpdGhpbiBhIHNpbmdsZVxuICAgIC8vIHBhc3MgaW5zdGVhZCBvZiBwYXlpbmcgb25lIGBwcm9jZXNzLm5leHRUaWNrYCBwZXIgY29uc3VtZWQgZXZlbnQuXG4gICAgLy9cbiAgICAvLyBXaHkgdGhpcyBpcyBzYWZlOiBhIGNhbGxiYWNrIG9ubHkgY29uc3VtZXMgYW4gZXZlbnQgdXNpbmcgYSBjb25zdW1lclxuICAgIC8vIHRoYXQgaXMgQUxSRUFEWSByZWdpc3RlcmVkIChlLmcuIGEgbG9uZy1saXZlZCBzdGVwIGNvbnN1bWVyIHdhbGtpbmdcbiAgICAvLyBgc3RlcF9jcmVhdGVkYCDihpIgYHN0ZXBfc3RhcnRlZGAg4oaSIGBzdGVwX2NvbXBsZXRlZGAsIG9yIHRoZSBzdHJ1Y3R1cmFsXG4gICAgLy8gbGlmZWN5Y2xlIGNvbnN1bWVyKS4gTmV3IGNvbnN1bWVycyBhcmUgb25seSBldmVyIHJlZ2lzdGVyZWQgYnkgd29ya2Zsb3dcbiAgICAvLyBWTSBib2R5IGNvZGUgdGhhdCBydW5zIGFzeW5jaHJvbm91c2x5IG9mZiBgY3R4LnByb21pc2VRdWV1ZWAgYWZ0ZXIgYVxuICAgIC8vIGRlbGl2ZXJ5IGByZXNvbHZlKClgOyBub25lIG9mIHRoZSBjYWxsYmFja3MgaGVyZSBjYWxsIGBzdWJzY3JpYmUoKWBcbiAgICAvLyBzeW5jaHJvbm91c2x5LiBTbyB3aXRoaW4gb25lIHBhc3MgYHRoaXMuY2FsbGJhY2tzYCBpcyBtdXRhdGVkIG9ubHkgYnlcbiAgICAvLyB0aGlzIGxvb3AgKHRoZSBgRmluaXNoZWRgIHNwbGljZSksIGFuZCB0aGUgbmV4dCBldmVudCdzIGNvbnN1bWVyIGlzXG4gICAgLy8gZWl0aGVyIGFscmVhZHkgcHJlc2VudCAoYWR2YW5jZSBub3cpIG9yIG5vdCB5ZXQgcmVnaXN0ZXJlZCwgaW4gd2hpY2hcbiAgICAvLyBjYXNlIG5vIGNhbGxiYWNrIGNvbnN1bWVzIHRoZSBldmVudCBhbmQgd2UgZmFsbCB0aHJvdWdoIHRvIHRoZVxuICAgIC8vIGNyb3NzLVZNLXNhZmUgZGVmZXJyZWQgdW5jb25zdW1lZC1ldmVudCBjaGVjayBiZWxvdywgZXhhY3RseSBhcyBiZWZvcmUuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIC8vIEJlZm9yZSBldmVyeSBvZmZlciwgbm90IGp1c3Qgb24gc3Vic2NyaWJlOiBhIGNhbGxiYWNrIHJlZ2lzdGVyZWQgYnlcbiAgICAgIC8vIHRoZSB3b3JrIHRoaXMgc2FtZSBwYXNzIGtpY2tlZCBvZmYgbWF5IGJlIHRoZSBvd25lciBvZiBzb21ldGhpbmdcbiAgICAgIC8vIHBhcmtlZCwgYW5kIHRoZSBwYXJrZWQgZXZlbnQncyBkZWxpdmVyeSBpcyBvcmRlcmVkIGFoZWFkIG9mIHRoZSBoZWFkXG4gICAgICAvLyBldmVudCdzIGJ5IHRoZSBpbmRleCBpdCBob2xkcy5cbiAgICAgIHRoaXMuZHJhaW5QYXJrZWQoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRFdmVudCA9IHRoaXMuZXZlbnRzW3RoaXMuZXZlbnRJbmRleF0gPz8gbnVsbDtcbiAgICAgIGlmIChjdXJyZW50RXZlbnQgIT09IG51bGwgJiYgaXNTZWFsZWROb29wRXZlbnQoY3VycmVudEV2ZW50KSkge1xuICAgICAgICB0aGlzLnNraXBTZWFsZWROb29wKGN1cnJlbnRFdmVudCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgY29uc3VtZWQgPSB0aGlzLm9mZmVyKGN1cnJlbnRFdmVudCk7XG4gICAgICBpZiAoY29uc3VtZWQpIHtcbiAgICAgICAgdGhpcy5ldmVudEluZGV4Kys7XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudEV2ZW50ID09PSBudWxsKSB7XG4gICAgICAgIC8vIEVuZCBvZiBsb2cuIENvbnN1bWVycyByZXR1cm4gTm90Q29uc3VtZWQgZm9yIHRoZSBgbnVsbGAgc2VudGluZWxcbiAgICAgICAgLy8gKHRoZSBvbmUgdGhhdCByZWNvZ25pemVzIGl0IGFzIGl0cyBvd24gYm91bmRhcnkgc2NoZWR1bGVzIHRoZVxuICAgICAgICAvLyBzdXNwZW5zaW9uIGFzIGEgc2lkZSBlZmZlY3QgYW5kIHN0aWxsIGRlY2xpbmVzIGl0KSwgc28gdGhlIGRyYWluXG4gICAgICAgIC8vIHN0b3BzIGhlcmUgcmF0aGVyIHRoYW4gc3Bpbm5pbmcgcGFzdCB0aGUgZW5kLiBgY29uc3VtZWRgIGlzIG9ubHlcbiAgICAgICAgLy8gdHJ1ZSBmb3IgYSBjYWxsYmFjayB0aGF0IGNsYWltcyB0aGUgc2VudGluZWwgb3V0cmlnaHQsIHdoaWNoIG5vXG4gICAgICAgIC8vIHByb2R1Y3Rpb24gY29uc3VtZXIgZG9lcy5cbiAgICAgICAgaWYgKCFjb25zdW1lZCkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlRW5kT2ZMb2coKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWNvbnN1bWVkKSB7XG4gICAgICAgIC8vIE5vYm9keSB3YW50ZWQgaXQuIElmIGl0IHJlcGVhdHMgYSBjbGFzcyB0aGlzIHdhbGsgYWxyZWFkeSBjb25zdW1lZFxuICAgICAgICAvLyBmb3IgdGhlIHNhbWUgZW50aXR5IGl0IGlzIGEgc3RyYWdnbGVyIGZyb20gYSBjb25jdXJyZW50IHJlcGxheTpcbiAgICAgICAgLy8gc3RlcCBvdmVyIGl0IGluIHRoaXMgcGFzcyByYXRoZXIgdGhhbiBwYXlpbmcgdGhlIGRlZmVycmVkIHdpbmRvdyBmb3JcbiAgICAgICAgLy8gYSBjb25zdW1lciB0aGF0IGNhbm5vdCBjb21lIChzZWUgYGZpcnN0RXZlbnRUeXBlT2ZDbGFzc2ApLlxuICAgICAgICBjb25zdCBmaXJzdFR5cGUgPSB0aGlzLmZpcnN0RXZlbnRUeXBlT2ZDbGFzcyhjdXJyZW50RXZlbnQpO1xuICAgICAgICBpZiAoZmlyc3RUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLnNraXBEdXBsaWNhdGVFdmVudChjdXJyZW50RXZlbnQsIGZpcnN0VHlwZSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY2hlZHVsZVVuY29uc3VtZWRDaGVjayhjdXJyZW50RXZlbnQsIHRydWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBBIHJlYWwgZXZlbnQgd2FzIGNvbnN1bWVkLCBzbyBhZHZhbmNlIHRvIHRoZSBuZXh0IGluIHRoZSBzYW1lIHBhc3MuXG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBPZmZlciBgY3VycmVudEV2ZW50YCB0byBlYWNoIHJlZ2lzdGVyZWQgY2FsbGJhY2sgaW4gdHVybi4gUmV0dXJucyB0cnVlXG4gICAqIHdoZW4gYSBjYWxsYmFjayBjb25zdW1lZCBpdC4gRG9lcyBub3QgbW92ZSB7QGxpbmsgZXZlbnRJbmRleH06IHRoZSBvcmRlcmVkXG4gICAqIHdhbGsgYW5kIHRoZSBwYXJrZWQgZHJhaW4gYWR2YW5jZSBkaWZmZXJlbnRseSwgc28gZWFjaCBkb2VzIGl0cyBvd24uXG4gICAqL1xuICBwcml2YXRlIG9mZmVyKGN1cnJlbnRFdmVudDogRXZlbnQgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLmNhbGxiYWNrc1tpXTtcbiAgICAgIGxldCBoYW5kbGVkID0gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZWQgPSBjYWxsYmFjayhjdXJyZW50RXZlbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZXZlbnRzTG9nZ2VyLmVycm9yKCdFdmVudENvbnN1bWVyIGNhbGxiYWNrIHRocmV3IGFuIGVycm9yJywgeyBlcnJvciB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgaGFuZGxlZCAhPT0gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZCAmJlxuICAgICAgICBoYW5kbGVkICE9PSBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudEV2ZW50ICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjdXJyZW50RXZlbnQuY29ycmVsYXRpb25JZCAmJlxuICAgICAgICAgIE9ORV9TSE9UX0VWRU5UX1RZUEVTLmhhcyhjdXJyZW50RXZlbnQuZXZlbnRUeXBlKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnJlc29sdmVkLmFkZChcbiAgICAgICAgICAgIHJlc29sdXRpb25LZXkoY3VycmVudEV2ZW50LmV2ZW50VHlwZSwgY3VycmVudEV2ZW50LmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlY29yZEV2ZW50Q2xhc3MoY3VycmVudEV2ZW50KTtcbiAgICAgICAgdGhpcy5ub3RpZnlDb25zdW1lZEV2ZW50KGN1cnJlbnRFdmVudCk7XG4gICAgICB9XG4gICAgICAvLyByZW1vdmUgdGhlIGNhbGxiYWNrIGlmIGl0IGhhcyBmaW5pc2hlZFxuICAgICAgaWYgKGhhbmRsZWQgPT09IEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQpIHtcbiAgICAgICAgdGhpcy5jYWxsYmFja3Muc3BsaWNlKGksIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPZmZlciBldmVyeXRoaW5nIHBhcmtlZCwgb2xkZXN0IGZpcnN0LCB1bnRpbCBhIHBhc3MgY2xhaW1zIG5vdGhpbmcuXG4gICAqXG4gICAqIEVhY2ggb2ZmZXIgcnVucyB3aXRoIHtAbGluayBldmVudEluZGV4fSBtb3ZlZCBiYWNrIHRvIHRoZSBwb3NpdGlvbiB0aGVcbiAgICogcGFya2VkIGV2ZW50IGhlbGQgaW4gdGhlIGxvZywgYmVjYXVzZSB0aGF0IGlzIHRoZSBwb3NpdGlvbiBpdHMgY29uc3VtZXJcbiAgICogd2lsbCByZWdpc3RlciBhIGRlbGl2ZXJ5IGJhcnJpZXIgdW5kZXIuIFJlc3RvcmluZyB0aGUgd2FsayBwb2ludGVyXG4gICAqIGFmdGVyd2FyZHMgaXMgd2hhdCBrZWVwcyB0aGUgdHdvIHBvaW50ZXJzIGZyb20gaW50ZXJmZXJpbmcuXG4gICAqL1xuICBwcml2YXRlIGRyYWluUGFya2VkKCk6IHZvaWQge1xuICAgIGxldCBwcm9ncmVzc2VkID0gdGhpcy5wYXJrZWQubGVuZ3RoID4gMDtcbiAgICB3aGlsZSAocHJvZ3Jlc3NlZCkge1xuICAgICAgcHJvZ3Jlc3NlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5kcm9wUGFya2VkRHVwbGljYXRlcygpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBhcmtlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMucGFya2VkW2ldO1xuICAgICAgICBjb25zdCB3YWxrSW5kZXggPSB0aGlzLmV2ZW50SW5kZXg7XG4gICAgICAgIHRoaXMuZXZlbnRJbmRleCA9IGVudHJ5LmluZGV4O1xuICAgICAgICBsZXQgY29uc3VtZWQ6IGJvb2xlYW47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3VtZWQgPSB0aGlzLm9mZmVyKGVudHJ5LmV2ZW50KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0aGlzLmV2ZW50SW5kZXggPSB3YWxrSW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnN1bWVkKSB7XG4gICAgICAgICAgdGhpcy5wYXJrZWQuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIC8vIEEgYEZpbmlzaGVkYCBjYWxsYmFjayB3YXMgc3BsaWNlZCBvdXQgb2YgdGhlIGxpc3QgdGhpcyBwYXNzLCBzb1xuICAgICAgICAgIC8vIHJlc3RhcnQgcmF0aGVyIHRoYW4ga2VlcCB3YWxraW5nIGEgbXV0YXRlZCBhcnJheS5cbiAgICAgICAgICBwcm9ncmVzc2VkID0gdGhpcy5wYXJrZWQubGVuZ3RoID4gMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlIGFueXRoaW5nIHBhcmtlZCB3aG9zZSBjbGFzcyBhIGNvbnN1bXB0aW9uIGhhcyBzaW5jZSByZWNvcmRlZCBmb3JcbiAgICogdGhlIHNhbWUgZW50aXR5LCBvbiB0aGUgc2FtZSB0ZXJtcyBhcyB7QGxpbmsgc2tpcER1cGxpY2F0ZUV2ZW50fS5cbiAgICpcbiAgICogVGhlIG9yZGVyZWQgd2FsayBkZWNpZGVzIGEgc3RyYWdnbGVyIGF0IHRoZSBldmVudCwgYnV0IG9ubHkgZm9yIG9uZSBvZiB0aGVcbiAgICogdHdvIG9yZGVycyB0aGUgY29waWVzIGNhbiBhcnJpdmUgaW4uIFdoZW4gbmVpdGhlciBjb3B5IGhhcyBhIGNvbnN1bWVyIHlldCxcbiAgICogYm90aCBwYXJrIOKAlCB0aGUgd2FsayBzdGVwcyBvdmVyIHRoZSBmaXJzdCBhbmQgcmUtZW50ZXJzIGltbWVkaWF0ZWx5LCBzb1xuICAgKiB0aGUgc2Vjb25kIGlzIG9mZmVyZWQgaW4gdGhlIHNhbWUgdGljaywgd2l0aCBubyBjbGFzcyByZWNvcmRlZCBiZWNhdXNlXG4gICAqIG5vdGhpbmcgaGFzIGJlZW4gKmNvbnN1bWVkKi4gVGhlIGRyYWluIHRoZW4gY2xhaW1zIHRoZSBmaXJzdCBhbmQgdGhlXG4gICAqIHNlY29uZCBpcyBsZWZ0IGhlbGQgYnkgYSBjb25zdW1lciBsaXN0IHRoYXQgd2lsbCBuZXZlciBncm93IHRoZSBjYWxsYmFja1xuICAgKiBpdCBuZWVkcywgd2hpY2ggdGhlIHdvcmtmbG93IGZ1bmN0aW9uIHJldHVybmluZyByZXBvcnRzIHRocm91Z2hcbiAgICoge0BsaW5rIHN0cmFuZGVkRXZlbnR9IGFzIGEgcmVwbGF5IGRpdmVyZ2VuY2UuXG4gICAqXG4gICAqIFJ1biBiZWZvcmUgZWFjaCBvZmZlciBwYXNzIHJhdGhlciB0aGFuIG9uY2UsIGJlY2F1c2UgdGhlIGNvbnN1bXB0aW9uIHRoYXRcbiAgICogcmVjb3JkcyB0aGUgY2xhc3MgaGFwcGVucyBpbnNpZGUgdGhlIGRyYWluIGl0c2VsZi5cbiAgICpcbiAgICogTm90IHNwZWNpZmljIHRvIGBhdHRyX3NldGA6IGB3YWl0X2NvbXBsZXRlZGAgcmVhY2hlcyB0aGUgc2FtZSBzdGF0ZSwgYW5kXG4gICAqIHtAbGluayBPTkVfU0hPVF9FVkVOVF9UWVBFU30gb25seSBjb3ZlcnMgaXQgaW4gdGhlIG9yZGVyIHdoZXJlIHRoZVxuICAgKiBjb25zdW1wdGlvbiBjYW1lIGZpcnN0LlxuICAgKi9cbiAgcHJpdmF0ZSBkcm9wUGFya2VkRHVwbGljYXRlcygpOiB2b2lkIHtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5wYXJrZWQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5wYXJrZWRbaV0uZXZlbnQ7XG4gICAgICBjb25zdCBmaXJzdFR5cGUgPSB0aGlzLmZpcnN0RXZlbnRUeXBlT2ZDbGFzcyhldmVudCk7XG4gICAgICBpZiAoZmlyc3RUeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLnBhcmtlZC5zcGxpY2UoaSwgMSk7XG4gICAgICAvLyBUaGUgd2FsayBpbmRleCBtb3ZlZCBwYXN0IHRoaXMgZXZlbnQgd2hlbiBpdCB3YXMgcGFya2VkLCBzbyB1bmxpa2VcbiAgICAgIC8vIGBza2lwRHVwbGljYXRlRXZlbnRgIHRoZXJlIGlzIG5vdGhpbmcgdG8gYWR2YW5jZSBoZXJlLlxuICAgICAgZXZlbnRzTG9nZ2VyLmRlYnVnKFxuICAgICAgICAnUmVsZWFzaW5nIGEgcGFya2VkIGV2ZW50IHRoYXQgcmVwZWF0cyBhIGNsYXNzIGFscmVhZHkgaW4gdGhlIGxvZycsXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudElkOiBldmVudC5ldmVudElkLFxuICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICAgIGZpcnN0RXZlbnRUeXBlOiBmaXJzdFR5cGUsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogZXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMub25EdXBsaWNhdGVFdmVudD8uKGV2ZW50LCBmaXJzdFR5cGUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZXZlbnRzTG9nZ2VyLmVycm9yKCdvbkR1cGxpY2F0ZUV2ZW50IGNhbGxiYWNrIHRocmV3IGFuIGVycm9yJywge1xuICAgICAgICAgIGVycm9yLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RlcCB0aGUgb3JkZXJlZCB3YWxrIG92ZXIgYW4gZXZlbnQgbm9ib2R5IGNsYWltZWQsIGhvbGRpbmcgb24gdG8gaXQgZm9yIGFcbiAgICogbGF0ZXIgY29uc3VtZXIuIFJldHVybnMgZmFsc2Ugd2hlbiB0aGUgZXZlbnQncyB0eXBlIG1ha2VzIGl0cyBwb3NpdGlvbiBhXG4gICAqIGRlY2lzaW9uIHJlY29yZCwgd2hpY2ggaXMgdGhlIG9uZSBjYXNlIHdoZXJlIG5vYm9keSBjbGFpbWluZyBpdCBtZWFucyB0aGVcbiAgICogcmVwbGF5IGRpdmVyZ2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBwYXJrKGV2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmICghUEFSS0FCTEVfRVZFTlRfVFlQRVMuaGFzKGV2ZW50LmV2ZW50VHlwZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZXZlbnQuY29ycmVsYXRpb25JZCAmJlxuICAgICAgdGhpcy5yZXNvbHZlZC5oYXMocmVzb2x1dGlvbktleShldmVudC5ldmVudFR5cGUsIGV2ZW50LmNvcnJlbGF0aW9uSWQpKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnBhcmtlZC5wdXNoKHsgZXZlbnQsIGluZGV4OiB0aGlzLmV2ZW50SW5kZXggfSk7XG4gICAgdGhpcy5ldmVudEluZGV4Kys7XG4gICAgZXZlbnRzTG9nZ2VyLmRlYnVnKCdQYXJrZWQgYW4gdW5jbGFpbWVkIGV2ZW50IGZvciBsYXRlciBkZWxpdmVyeScsIHtcbiAgICAgIGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgICBldmVudFR5cGU6IGV2ZW50LmV2ZW50VHlwZSxcbiAgICAgIGNvcnJlbGF0aW9uSWQ6IGV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICBwYXJrZWQ6IHRoaXMucGFya2VkLmxlbmd0aCxcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUga2V5IGBldmVudGAncyBjbGFzcyBpcyB0cmFja2VkIHVuZGVyLCBvciBgdW5kZWZpbmVkYCBmb3IgdGhlIGV2ZW50c1xuICAgKiB0aGF0IGJlbG9uZyB0byBubyBjbGFzcyBhbmQgYXJlIHRoZXJlZm9yZSBuZXZlciBza2lwcGVkOiB0aGUgdHlwZXMgd2l0aCBub1xuICAgKiBlbnRyeSBhdCBhbGwgKGBob29rX3JlY2VpdmVkYCwgYGhvb2tfY29uZmxpY3RgLCBgcnVuX2NyZWF0ZWRgKSwgYW5kIGFcbiAgICogY2xhc3NlZCB0eXBlIGNhcnJ5aW5nIG5vIGVudGl0eSB0byB0cmFjayBpdCB1bmRlci5cbiAgICpcbiAgICoge0BsaW5rIGNsYXNzaWZ5RW50aXR5RXZlbnR9IG93bnMgdGhhdCBydWxlLCBiZWNhdXNlIHRoZSBvYnNlcnZhYmlsaXR5IFVJXG4gICAqIGRlY2lkZXMgdGhlIHNhbWUgcXVlc3Rpb24gYWJvdXQgdGhlIHNhbWUgbG9nIGFuZCB0aGUgdHdvIG11c3Qgbm90IGRyaWZ0LlxuICAgKi9cbiAgcHJpdmF0ZSBldmVudENsYXNzS2V5KGV2ZW50OiBFdmVudCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2xhc3NpZmljYXRpb24gPSBjbGFzc2lmeUVudGl0eUV2ZW50KGV2ZW50KTtcbiAgICByZXR1cm4gY2xhc3NpZmljYXRpb24gPT09IHVuZGVmaW5lZFxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogYCR7Y2xhc3NpZmljYXRpb24uZXZlbnRDbGFzc306JHtjbGFzc2lmaWNhdGlvbi5lbnRpdHl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1lbWJlcnMgdGhhdCBgZXZlbnRgJ3MgY2xhc3MgaXMgbm93IGRlY2lkZWQgZm9yIGl0cyBlbnRpdHksIGlmIHRoZSB0eXBlXG4gICAqIGJlbG9uZ3MgdG8gYSBjbGFzcy4gRmlyc3Qgd3JpdGVyIHdpbnM6IHRoZSByZWNvcmRlZCB0eXBlIGlzIHRoZSBvbmUgdGhlXG4gICAqIHdvcmtmbG93IG9ic2VydmVkLCBhbmQgYSBsYXRlciByZXBlYXQgaXMgbWVhc3VyZWQgYWdhaW5zdCBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVjb3JkRXZlbnRDbGFzcyhldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmV2ZW50Q2xhc3NLZXkoZXZlbnQpO1xuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy5zZWVuRXZlbnRDbGFzc2VzLmhhcyhrZXkpKSB7XG4gICAgICB0aGlzLnNlZW5FdmVudENsYXNzZXMuc2V0KGtleSwgZXZlbnQuZXZlbnRUeXBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHR5cGUgdGhhdCBhbHJlYWR5IGRlY2lkZWQgYGV2ZW50YCdzIGNsYXNzIGZvciB0aGUgc2FtZSBlbnRpdHksIG9yXG4gICAqIGB1bmRlZmluZWRgIHdoZW4gbm90aGluZyBoYXM6IGEgc2Vjb25kIGBzdGVwX2NyZWF0ZWRgIGZvciBvbmUgc3RlcCwgYVxuICAgKiBzZWNvbmQgdGVybWluYWwgb3V0Y29tZSwgYSBzZWNvbmQgYHN0ZXBfc3RhcnRlZGAgYWZ0ZXIgdGhlIHN0ZXAncyByZXN1bHQgaXNcbiAgICogYWxyZWFkeSBpbiB0aGUgbG9nLlxuICAgKlxuICAgKiBTdWNoIGFuIGV2ZW50IGlzIGNvbW1pdHRlZCBidXQgaW5lcnQuIENvbmN1cnJlbnQgcmVwbGF5cyB3cml0ZSBpbnRvIG9uZVxuICAgKiBsb2cgd2l0aG91dCBhIGN1cnJlbmN5IGd1YXJkLCBzbyBhIHJlcGxheSB3b3JraW5nIGZyb20gYSBwcmVmaXggdGhhdFxuICAgKiBwcmVkYXRlcyBhbm90aGVyIHJlcGxheSdzIHdyaXRlIGNhbiBjb21taXQgaXRzIG93biBjb3B5IG9mIHdvcmsgdGhlIGxvZ1xuICAgKiBhbHJlYWR5IHJlY29yZHMuIFRoYXQgY29weSBjYW5ub3QgY2hhbmdlIHdoYXQgdGhlIHdvcmtmbG93IG9ic2VydmVkOiB0aGVcbiAgICogb3V0Y29tZSB3YXMgZGVjaWRlZCBieSB0aGUgZmlyc3QgZXZlbnQgb2YgdGhlIGNsYXNzIGFuZCBldmVyeSBsYXRlciByZXBsYXlcbiAgICogcmVhZHMgdGhhdCBzYW1lIGV2ZW50IGF0IHRoZSBzYW1lIGxvZyBwb3NpdGlvbiwgc28gaWdub3JpbmcgdGhlIHN0cmFnZ2xlclxuICAgKiBpcyBkZXRlcm1pbmlzdGljIGFjcm9zcyByZXBsYXlzLlxuICAgKlxuICAgKiBDbGFzc2VzIGFyZSB0cmFja2VkIHNlcGFyYXRlbHksIHNvIHBhc3Npbmcgb25lIGRvZXMgbm90IHN1cHByZXNzIGFub3RoZXIuXG4gICAqIEEgc3RlcCB3aG9zZSByZXN1bHQgaXMgaW4gdGhlIGxvZyBzdGlsbCByZWFjaGVzIGl0cyBgc3RlcF9jcmVhdGVkYCBhbmRcbiAgICogYHN0ZXBfc3RhcnRlZGAgY29uc3VtZXJzIGlmIGl0IGhhcyB5ZXQgdG8gc2VlIHRob3NlIGNsYXNzZXMuXG4gICAqXG4gICAqIENvbnN1bHRlZCBvbmx5IGFmdGVyIGV2ZXJ5IHJlZ2lzdGVyZWQgY2FsbGJhY2sgaGFzIGRlY2xpbmVkIHRoZSBldmVudCwgc29cbiAgICogaXQgY2FuIG5ldmVyIHRha2UgYW4gZXZlbnQgYSBjb25zdW1lciB3YW50ZWQuIEEgcmV0cnkncyBgc3RlcF9zdGFydGVkYCBpc1xuICAgKiBjbGFpbWVkIGJ5IHRoZSBzdGVwJ3MgbGl2ZSBjb25zdW1lciBhbmQgY291bnRzIGFzIGFuIGF0dGVtcHQgZXhhY3RseSBhc1xuICAgKiBiZWZvcmUsIGFuZCBhIHNlY29uZCBgc3RlcF9jcmVhdGVkYCByZWFjaGluZyBhIHN0ZXAgdGhhdCBoYXMgbm90IGZpbmlzaGVkXG4gICAqIGlzIGxpa2V3aXNlIGNvbnN1bWVkIHJhdGhlciB0aGFuIHNraXBwZWQ7IG9ubHkgdGhlIGNvcGllcyBub2JvZHkgY2xhaW1zIGFyZVxuICAgKiBza2lwcGVkLlxuICAgKlxuICAgKiBVbmxpa2UgdGhlIGRpdmVyZ2VuY2UgcmVwb3J0LCB0aGlzIGRvZXMgKm5vdCogd2FpdCBvdXQgdGhlIGRlZmVycmVkIHdpbmRvd1xuICAgKiBmaXJzdCwgYW5kIGl0IGRvZXMgbm90IG5lZWQgdG8uIFRoZSB3aW5kb3cgYnV5cyB0aW1lIGZvciBhIGNvbnN1bWVyIHRoYXRcbiAgICogaGFzIHlldCB0byByZWdpc3RlciwgYW5kIG5vIHN1Y2ggY29uc3VtZXIgY2FuIHdhbnQgdGhpcyBldmVudDogdGhlIGNsYXNzXG4gICAqIHdhcyByZWNvcmRlZCBieSBhIGNvbnN1bXB0aW9uIGluIHRoaXMgc2FtZSByZXBsYXksIHdoaWNoIG1lYW5zIHRoZSBlbnRpdHknc1xuICAgKiBjb25zdW1lciB3YXMgcmVnaXN0ZXJlZCBhbmQgdG9vayBhbiBldmVudCBvZiB0aGlzIGNsYXNzLCBhbmQgY29ycmVsYXRpb25cbiAgICogaWRzIGFyZSBtaW50ZWQgZnJvbSBhIG1vbm90b25pYyBVTElEIHBlciBib2R5IHBvc2l0aW9uLCBzbyBub3RoaW5nIGxhdGVyIGluXG4gICAqIHRoZSBib2R5IHJlZ2lzdGVycyBhIHNlY29uZCBjb25zdW1lciB1bmRlciB0aGlzIGlkLiBXYWl0aW5nIHdvdWxkIGNvc3RcbiAgICogYGdldERlZmVycmVkQ2hlY2tEZWxheU1zKClgIHBlciBzdHJhZ2dsZXIgcGVyIHJlcGxheSBmb3IgaW5mb3JtYXRpb24gdGhhdFxuICAgKiBjYW5ub3QgYXJyaXZlOiAwLjc1JSBvZiBwcm9kdWN0aW9uIHJ1bnMgY2FycnkgYXQgbGVhc3Qgb25lIHN0cmFnZ2xlciwgYW5kXG4gICAqIHRoZSBwOTkgYW1vbmcgdGhvc2UgY2FycmllcyAxNTUuXG4gICAqXG4gICAqIFRoZSBpbnZhcmlhbnQgdG8gcHJlc2VydmUgaWYgaG9vayBpZGVudGl0eSBldmVyIGJlY29tZXMgY2FsbGVyLXN1cHBsaWVkXG4gICAqIChhbiBpZGVtcG90ZW5jeSBrZXkgcmF0aGVyIHRoYW4gYSBtaW50ZWQgaWQpOiB0d28gYGNyZWF0ZUhvb2tgIGNhbGxzIGluIG9uZVxuICAgKiBib2R5IGNvdWxkIHRoZW4gc2hhcmUgYSBjb3JyZWxhdGlvbiBpZCwgYW5kIHRoZSBzZWNvbmQgY29uc3VtZXInc1xuICAgKiBgaG9va19jcmVhdGVkYCB3b3VsZCBiZSBhIHJlcGVhdCBvZiBhIGNsYXNzIHRoaXMgcmVwbGF5IGFscmVhZHkgcmVjb3JkZWQuXG4gICAqIFRoYXQgd291bGQgbWFrZSBza2lwcGluZyB3cm9uZyBmb3IgYGhvb2tfY3JlYXRlZGAsIGFuZCBpcyB0aGUgcmVhc29uIHRoZVxuICAgKiBjbGFzcyBtYXAgbGl2ZXMgbmV4dCB0byB0aGUgZXZlbnQgdHlwZXMgcmF0aGVyIHRoYW4gYmVpbmcgaW5mZXJyZWQuXG4gICAqL1xuICBwcml2YXRlIGZpcnN0RXZlbnRUeXBlT2ZDbGFzcyhldmVudDogRXZlbnQpOiBFdmVudFsnZXZlbnRUeXBlJ10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZXZlbnRDbGFzc0tleShldmVudCk7XG4gICAgcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy5zZWVuRXZlbnRDbGFzc2VzLmdldChrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0ZXBzIHRoZSB3YWxrIG92ZXIgYSBzZWFsZWQtbG9nIGBub29wYCAoc3BlY1ZlcnNpb24gPj0gNyk6IHRoZSBXb3JsZCdzXG4gICAqIGJhY2tlbmQgd3JvdGUgaXQgdG8gb2NjdXB5IGEgc2xvdCB3aG9zZSB3cml0ZXIgYWxsb2NhdGVkIHRoZSBwb3NpdGlvbiBhbmRcbiAgICogZGllZCwgc28gdGhlIGxvZydzIGRlbnNpdHkgYXJpdGhtZXRpYyBob2xkcy4gSXQgaXMgaW52aXNpYmxlIHRvIHRoZVxuICAgKiB3b3JrZmxvdzogbm8gY29uc3VtZXIgaXMgb2ZmZXJlZCBpdCwgbm8gZXZlbnQgY2xhc3MgaXMgcmVjb3JkZWQsIGFuZCB0aGVcbiAgICogZGV0ZXJtaW5pc3RpYyBjbG9jayBkb2VzIG5vdCBhZHZhbmNlLCBleGFjdGx5IGFzIHdpdGhcbiAgICoge0BsaW5rIHNraXBEdXBsaWNhdGVFdmVudH0sIHNvIGEgbG9nIHRoYXQgaGFwcGVucyB0byBjb250YWluIG9uZSBwcm9kdWNlcyB0aGUgc2FtZVxuICAgKiB0aW1lc3RhbXBzIGFzIGEgbG9nIHRoYXQgZG9lcyBub3QuIChJdHMgYGNyZWF0ZWRBdGAgaXMgdGhlIHNlYWwgdGltZSxcbiAgICogd2hpY2ggY2FuIGV2ZW4gcG9zdGRhdGUgbGF0ZXIgc2xvdHMnIGV2ZW50czsgbGV0dGluZyBpdCB0b3VjaCB0aGUgY2xvY2tcbiAgICogd291bGQgbGVhayB0aGUgc2VhbGVyJ3Mgd2FsbCBjbG9jayBpbnRvIHJlcGxheS4pXG4gICAqL1xuICBwcml2YXRlIHNraXBTZWFsZWROb29wKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMuZXZlbnRJbmRleCsrO1xuICAgIGV2ZW50c0xvZ2dlci5kZWJ1ZygnU2tpcHBpbmcgc2VhbGVkLWxvZyBub29wIGV2ZW50Jywge1xuICAgICAgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTdGVwcyB0aGUgd2FsayBvdmVyIGEgcmVwZWF0IG9mIGFuIGFscmVhZHktY29uc3VtZWQgY2xhc3MuICovXG4gIHByaXZhdGUgc2tpcER1cGxpY2F0ZUV2ZW50KGV2ZW50OiBFdmVudCwgZmlyc3RUeXBlOiBFdmVudFsnZXZlbnRUeXBlJ10pIHtcbiAgICB0aGlzLmV2ZW50SW5kZXgrKztcbiAgICAvLyBEZWxpYmVyYXRlbHkgbm90IHJvdXRlZCB0aHJvdWdoIGBub3RpZnlDb25zdW1lZEV2ZW50YDogdGhlIGRldGVybWluaXN0aWNcbiAgICAvLyBjbG9jayBhZHZhbmNlcyBvbmx5IG9uIGV2ZW50cyB0aGUgd29ya2Zsb3cgYWN0dWFsbHkgb2JzZXJ2ZWQuIEEgc2tpcHBlZFxuICAgIC8vIGV2ZW50IGlzIGludmlzaWJsZSB0byB0aGUgd29ya2Zsb3cgYm9keSwgYW5kIGEgbG9nIHRoYXQgaGFwcGVucyB0b1xuICAgIC8vIGNvbnRhaW4gb25lIG11c3QgcHJvZHVjZSB0aGUgc2FtZSB0aW1lc3RhbXBzIGFzIGEgbG9nIHRoYXQgZG9lcyBub3QuXG4gICAgZXZlbnRzTG9nZ2VyLmRlYnVnKFxuICAgICAgJ1NraXBwaW5nIGV2ZW50IHRoYXQgcmVwZWF0cyBhIGNsYXNzIGFscmVhZHkgaW4gdGhlIGxvZycsXG4gICAgICB7XG4gICAgICAgIGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgICAgIGV2ZW50VHlwZTogZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICBmaXJzdEV2ZW50VHlwZTogZmlyc3RUeXBlLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBldmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgfVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMub25EdXBsaWNhdGVFdmVudD8uKGV2ZW50LCBmaXJzdFR5cGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBldmVudHNMb2dnZXIuZXJyb3IoJ29uRHVwbGljYXRlRXZlbnQgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3InLCB7XG4gICAgICAgIGVycm9yLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFbmRPZkxvZygpIHtcbiAgICAvLyBFdmVyeXRoaW5nIHN0aWxsIHBhcmtlZCBpcyB3YWl0aW5nIGZvciBhIGNvbnN1bWVyIHNvbWUgbGF0ZXIgcmVwbGF5IHdpbGxcbiAgICAvLyByZWdpc3Rlciwgd2hpY2ggaXMgdGhlIHdob2xlIHBvaW50IG9mIHBhcmtpbmcsIGV4Y2VwdCBvbmNlIHRoZSBsb2dcbiAgICAvLyBhbHJlYWR5IGhvbGRzIHRoZSBydW4ncyB0ZXJtaW5hbCBldmVudCwgYmVjYXVzZSB0aGVuIHRoZXJlIGlzIG5vIGxhdGVyXG4gICAgLy8gcmVwbGF5IGFuZCBubyBjb25zdW1lciB3aWxsIGV2ZXIgY29tZS5cbiAgICBpZiAodGhpcy5wYXJrZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxhc3QgPSB0aGlzLmV2ZW50cy5hdCgtMSk7XG4gICAgaWYgKCFsYXN0IHx8ICFURVJNSU5BTF9FVkVOVF9UWVBFUy5oYXMobGFzdC5ldmVudFR5cGUpKSB7XG4gICAgICAvLyBBIGxhdGVyIHJlcGxheSBpcyBzdGlsbCBleHBlY3RlZCwgc28gbm90aGluZyBoZXJlIGlzIGRlY2lkYWJsZSBhbmRcbiAgICAgIC8vIGVzY2FsYXRpbmcgd291bGQgZmFpbCB0aGUgaGVhbHRoeSBydW5zIHBhcmtpbmcgZXhpc3RzIHRvIGtlZXAgYWxpdmUuXG4gICAgICAvLyBSZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBsb2cgaG9sZGluZyBzb21ldGhpbmcgaXMgbm90IGJ5IGl0c2VsZiBhIGZhdWx0LFxuICAgICAgLy8gc28gdGhpcyBzdGF5cyBhdCBgZGVidWdgOyB7QGxpbmsgcGFya2VkU3VtbWFyeX0gaXMgd2hhdCBjYXJyaWVzIHRoZVxuICAgICAgLy8gc3RhdGUgdG8gdGhlIHNwYW4sIHdoZXJlIGEgcnVuIHRoYXQga2VlcHMgc3RvcHBpbmcgb24gdGhlIHNhbWUgaGVsZFxuICAgICAgLy8gZXZlbnQgaXMgdmlzaWJsZSBhbmQgYSBzaW5nbGUgcmVwbGF5J3MgdmlldyBpcyBub3QuXG4gICAgICBldmVudHNMb2dnZXIuZGVidWcoJ1JlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbG9nIHN0aWxsIGhvbGRpbmcgZXZlbnRzJywge1xuICAgICAgICBldmVudElkOiB0aGlzLnBhcmtlZFswXS5ldmVudC5ldmVudElkLFxuICAgICAgICBldmVudFR5cGU6IHRoaXMucGFya2VkWzBdLmV2ZW50LmV2ZW50VHlwZSxcbiAgICAgICAgY29ycmVsYXRpb25JZDogdGhpcy5wYXJrZWRbMF0uZXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgcGFya2VkOiB0aGlzLnBhcmtlZC5sZW5ndGgsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zY2hlZHVsZVVuY29uc3VtZWRDaGVjayh0aGlzLnBhcmtlZFswXS5ldmVudCwgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVVuY29uc3VtZWRDaGVjayhjdXJyZW50RXZlbnQ6IEV2ZW50LCBtYXlQYXJrOiBib29sZWFuKSB7XG4gICAgLy8gQWxsIGNhbGxiYWNrcyByZXR1cm5lZCBOb3RDb25zdW1lZCBmb3IgdGhlIGN1cnJlbnQgZXZlbnQuXG4gICAgLy8gU2NoZWR1bGUgYSBkZWZlcnJlZCBjaGVjay4gV2UgY2hhaW4gb250byB0aGUgcHJvbWlzZVF1ZXVlIHNvIHRoYXQgYW55XG4gICAgLy8gcGVuZGluZyBhc3luYyB3b3JrIChlLmcuLCBkZXNlcmlhbGl6YXRpb24vZGVjcnlwdGlvbiB0aGF0IHRyaWdnZXJzXG4gICAgLy8gcmVzb2x2ZSgpIOKGkiB1c2VyIGNvZGUg4oaSIHN1YnNjcmliZSgpKSBjb21wbGV0ZXMgZmlyc3QuIElmIHRoZSBldmVudFxuICAgIC8vIGlzIHN0aWxsIHVuY29uc3VtZWQgYWZ0ZXIgdGhlIHF1ZXVlIGRyYWlucywgaXQncyB0cnVseSBvcnBoYW5lZCwgb3IsXG4gICAgLy8gd2hlbiBpdHMgdHlwZSBjYXJyaWVzIG5vIG9yZGVyaW5nIGNsYWltLCBwYXJrZWQgZm9yIGEgbGF0ZXIgY29uc3VtZXIuXG4gICAgY29uc3QgY2hlY2tWZXJzaW9uID0gKyt0aGlzLnVuY29uc3VtZWRDaGVja1ZlcnNpb247XG4gICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZENoZWNrID0gdGhpcy5nZXRQcm9taXNlUXVldWUoKVxuICAgICAgLnRoZW4oXG4gICAgICAgIC8vIFlpZWxkIG9uY2UgYWZ0ZXIgdGhlIGZpcnN0IHF1ZXVlIGRyYWluIHNvIHByb21pc2UgY2hhaW5zIHJlc3VtZWQgYnlcbiAgICAgICAgLy8gdGhhdCBkcmFpbiBjYW4gcnVuIGFjcm9zcyB0aGUgVk0gYm91bmRhcnkgYW5kIGFwcGVuZCBhbnkgZm9sbG93LXVwXG4gICAgICAgIC8vIGFzeW5jIHdvcmsgKGZvciBleGFtcGxlOiBzdGVwX2NvbXBsZXRlZCByZXNvbHZlcyAtPiBmb3ItYXdhaXQgbG9vcFxuICAgICAgICAvLyByZXN1bWVzIC0+IHRoZSBuZXh0IGhvb2sgcGF5bG9hZCBzdGFydHMgaHlkcmF0aW5nKS5cbiAgICAgICAgKCkgPT4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpXG4gICAgICApXG4gICAgICAudGhlbigoKSA9PiB0aGlzLmdldFByb21pc2VRdWV1ZSgpKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAvLyBXYWl0IG91dCBhbnkgZGVsaXZlcnkgc3RpbGwgaW4gZmxpZ2h0IGJlZm9yZSBzdGFydGluZyB0aGUgdGltZXIuXG4gICAgICAgIC8vIFRoZSBxdWV1ZSBkcmFpbmluZyBzYXlzIHRoZSBob3N0IGhhcyBubyBoeWRyYXRpb24gd29yayBsZWZ0OyBpdFxuICAgICAgICAvLyBkb2VzIG5vdCBzYXkgdGhlIFZNIGhhcyBmaW5pc2hlZCByZWFjdGluZyB0byB3aGF0IHdhcyBoeWRyYXRlZC5cbiAgICAgICAgdGhpcy53aGVuRGVsaXZlcnlJZGxlKGNoZWNrVmVyc2lvbiwgKCkgPT4ge1xuICAgICAgICAgIC8vIFVzZSBhIGRlbGF5ZWQgc2V0VGltZW91dCBvbmNlIGRlbGl2ZXJpZXMgYXJlIGlkbGUuIFRoZSBkZWxheSBtdXN0XG4gICAgICAgICAgLy8gYmUgbG9uZyBlbm91Z2ggZm9yIHByb21pc2UgY2hhaW5zIHRvIHByb3BhZ2F0ZSBhY3Jvc3MgdGhlIFZNXG4gICAgICAgICAgLy8gYm91bmRhcnkgKGZyb20gcmVzb2x2ZSgpIGluIHRoZSBob3N0IGNvbnRleHQgdGhyb3VnaCB0byB0aGVcbiAgICAgICAgICAvLyB3b3JrZmxvdyBjb2RlIGNhbGxpbmcgc3Vic2NyaWJlKCkgaW4gdGhlIFZNIGNvbnRleHQpLiBOb2RlLmpzIGRvZXNcbiAgICAgICAgICAvLyBub3QgZ3VhcmFudGVlIHRoYXQgc2V0VGltZW91dCgwKSBmaXJlcyBhZnRlciBhbGwgY3Jvc3MtY29udGV4dFxuICAgICAgICAgIC8vIG1pY3JvdGFza3Mgc2V0dGxlLCBzbyB3ZSB1c2UgYSBzbWFsbCBidXQgbm9uLXplcm8gZGVsYXkuIEFueVxuICAgICAgICAgIC8vIHN1YnNjcmliZSgpIGNhbGwgdGhhdCBhcnJpdmVzIGR1cmluZyB0aGlzIHdpbmRvdyB3aWxsIGNhbmNlbCB0aGVcbiAgICAgICAgICAvLyBjaGVjayB2aWEgdmVyc2lvbiBpbnZhbGlkYXRpb24gKyBjbGVhclRpbWVvdXQuXG4gICAgICAgICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1VuY29uc3VtZWRUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGlzLnVuY29uc3VtZWRDaGVja1ZlcnNpb24gIT09IGNoZWNrVmVyc2lvbikge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdVbmNvbnN1bWVkQ2hlY2sgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlVW5jb25zdW1lZEV2ZW50KGN1cnJlbnRFdmVudCwgbWF5UGFyayk7XG4gICAgICAgICAgfSwgZ2V0RGVmZXJyZWRDaGVja0RlbGF5TXMoKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlIHdoYXQgYSBzdGlsbC11bmNvbnN1bWVkIGV2ZW50IGlzLCBub3cgdGhhdCB0aGUgcHJvbWlzZSBxdWV1ZSBoYXNcbiAgICogZHJhaW5lZCBhbmQgdGhlIGRlbGl2ZXJ5IGdhdGUgc2F5cyB0aGUgVk0gaXMgbm90IG1pZC1yZWFjdGlvbi5cbiAgICpcbiAgICogYG1heVBhcmtgIGlzIGZhbHNlIG9ubHkgZm9yIHRoZSBlbmQtb2YtbG9nIHJlY2hlY2sgb2YgYW4gZXZlbnQge0BsaW5rIHBhcmt9XG4gICAqIGFscmVhZHkgaG9sZHMuIE5vdGhpbmcgaW4gdGhlIGZpcnN0IGJyYW5jaCBhcHBsaWVzIHRvIG9uZSBvZiB0aG9zZTogaXQgaXNcbiAgICogbm90IHRoZSBldmVudCBhdCB0aGUgY3Vyc29yLCBzbyB0aGUgaWRlbnRpdHkgZ3VhcmQgaXMgbm90IG1lYW5pbmdmdWwsIGFuZFxuICAgKiBpdCBpcyBwYXJrZWQgYWxyZWFkeS5cbiAgICpcbiAgICogQSBkdXBsaWNhdGUgY2xhc3MgbmV2ZXIgYXJyaXZlcyBoZXJlLiB7QGxpbmsgY29uc3VtZX0gc3RlcHMgb3ZlciBvbmUgaW4gdGhlXG4gICAqIHBhc3MgdGhhdCBvZmZlcmVkIGl0LCBiZWZvcmUgdGhpcyBjaGVjayBpcyBldmVyIHNjaGVkdWxlZCwgYW5kIGEgY2xhc3NcbiAgICogcmVjb3JkZWQgd2hpbGUgdGhlIGNoZWNrIHdhcyBpbiBmbGlnaHQgY2FuIG9ubHkgaGF2ZSBiZWVuIHJlY29yZGVkIGJ5IGFcbiAgICogY29uc3VtcHRpb24gaW5zaWRlIHtAbGluayBjb25zdW1lfSwgd2hvc2UgbmV4dCBwYXNzIHJlLW9mZmVycyB0aGlzIGV2ZW50XG4gICAqIGFuZCBzdGVwcyBvdmVyIGl0IHRoZXJlLCBsZWF2aW5nIHRoZSBpZGVudGl0eSBndWFyZCBhYm92ZSB0byBkcm9wIHRoZVxuICAgKiBpbi1mbGlnaHQgY2hlY2suIE9uZSB0aGF0IHBhcmtzIGJlZm9yZSBhbnkgY29uc3VtcHRpb24gcmVjb3JkcyBpdHMgY2xhc3NcbiAgICogaXMgcmVsZWFzZWQgbGF0ZXIgYnkge0BsaW5rIGRyb3BQYXJrZWREdXBsaWNhdGVzfSBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlVW5jb25zdW1lZEV2ZW50KGN1cnJlbnRFdmVudDogRXZlbnQsIG1heVBhcms6IGJvb2xlYW4pIHtcbiAgICBpZiAobWF5UGFyaykge1xuICAgICAgaWYgKHRoaXMuZXZlbnRzW3RoaXMuZXZlbnRJbmRleF0gIT09IGN1cnJlbnRFdmVudCkge1xuICAgICAgICAvLyBBbiBhcHBlbmQoKSBkcmFpbiBjbGFpbWVkIGl0IHdoaWxlIHRoZSBjaGVjayB3YXMgaW4gZmxpZ2h0LlxuICAgICAgICAvLyBPbmx5IHN1YnNjcmliZSgpIGNhbmNlbHMgdGhlIGNoZWNrLCBzbyB0aGlzIGlzIHJlYWNoYWJsZS5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucGFyayhjdXJyZW50RXZlbnQpKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25VbmNvbnN1bWVkRXZlbnQoY3VycmVudEV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYGZuYCBvbmNlIG5vIGRhdGEgZGVsaXZlcnkgaXMgaW4gZmxpZ2h0LCBwb2xsaW5nIHRoZSB3YXlcbiAgICogYHNjaGVkdWxlV2hlbklkbGVgIGRvZXM6IGxldCB0aGUgcHJvbWlzZSBxdWV1ZSBkcmFpbiwgcmUtY2hlY2sgYSB0aW1lclxuICAgKiB0aWNrIGxhdGVyLCByZXBlYXQuXG4gICAqXG4gICAqIFdpdGhvdXQgdGhpcyB0aGUgY2hlY2sgaXMgYSBiZXQgdGhhdCBldmVyeSBkZWxpdmVyeSB0aGUgd2FsayBpcyBydW5uaW5nXG4gICAqIGFoZWFkIG9mIGxhbmRzIGluc2lkZSBhIGZpeGVkIHdpbmRvdy4gQ29uc3VtcHRpb24gaXMgc3luY2hyb25vdXMgd2hpbGUgdGhlXG4gICAqIHJlc29sdXRpb24gaXQgdHJpZ2dlcnMgaXMgbm90OiBhIHN0ZXAgcmVzdWx0IGh5ZHJhdGVzIGluIHRoZSBob3N0LCByZXNvbHZlc1xuICAgKiBmcm9tIGEgZGV0YWNoZWQgY29udGludWF0aW9uIGJlaGluZCBgYXdhaXRFYXJsaWVyRGVsaXZlcmllc2AsIGFuZCBvbmx5IHRoZW5cbiAgICogZG9lcyBWTSBjb2RlIHJ1biBmYXIgZW5vdWdoIHRvIHN1YnNjcmliZSB0aGUgbmV4dCBjb25zdW1lci4gUmVwbGF5aW5nIGFcbiAgICogYmF0Y2ggb2YgTiBwYXJhbGxlbCBzdGVwIHJlc3VsdHMgbGVhdmVzIE4tMSBvZiB0aGVtIG9uIHRoYXQgZGV0YWNoZWQgcGF0aFxuICAgKiB3aXRoIHRoZSBxdWV1ZSBhbHJlYWR5IGRyYWluZWQsIHNvIHRoZSB3YWxrIHNpdHMgb24gdGhlIG9yZGVyZWQgZXZlbnQgdGhlXG4gICAqIFZNIGlzIGFib3V0IHRvIGRyYXcgYW5kIHRoZSB3aW5kb3cgaXMgdGhlIG9ubHkgdGhpbmcgc3RhbmRpbmcgYmV0d2VlbiBhXG4gICAqIGhlYWx0aHkgcnVuIGFuZCBgUmVwbGF5RGl2ZXJnZW5jZUVycm9yYC5cbiAgICpcbiAgICogU2hvcnRlbmluZyB0aGUgd2luZG93IHNob3dzIHRoYXQgbWVjaGFuaXNtIGRpcmVjdGx5OiBvbiBpZGVudGljYWwgZXZlbnQgbG9nc1xuICAgKiB0aGUgbG9jYWwgcmFjZSByZXBybyBjb3JydXB0cyAzNCBvZiA0MiBydW5zIGF0IGEgMTBtcyB3aW5kb3cgYW5kIDAgb2YgMTE0IGF0XG4gICAqIHRoZSAxMDBtcyBkZWZhdWx0LiBUaGF0IG1lYXN1cmVzIGhvdyB0aGUgYmV0IGxvc2VzLCBub3QgdGhhdCB0aGUgZGVmYXVsdFxuICAgKiBsb3NlcyBpdCwgYW5kIG5vIG1lYXN1cmVtZW50IG9mIGEgZGVsaXZlcnkgb3V0cnVubmluZyAxMDBtcyBleGlzdHMgZWl0aGVyXG4gICAqIHdheS4gU28gcmVhZCB0aGlzIGFzIHJldGlyaW5nIHRoZSBiZXQgcmF0aGVyIHRoYW4gYXMgcmVwYWlyaW5nIGFuIG9ic2VydmVkXG4gICAqIGZhaWx1cmUgb2YgdGhhdCBudW1iZXI6IHRoZSBkZWxheSBpcyBhIHVzZXItc2V0dGFibGUgZW52IG92ZXJyaWRlLCB3aGljaFxuICAgKiBsZWF2ZXMgdGhlIG9sZCBiZWhhdmlvciBvbmUgY29uZmlndXJhdGlvbiBhd2F5IGZyb20gbG9zaW5nIG9uIGFueSBiYWNrZW5kLlxuICAgKlxuICAgKiBUZXJtaW5hdGlvbiBpcyBgaGFzUGFya2VkQ29tbWl0dGVkRGVsaXZlcnlgJ3M6IGl0IGNvdW50cyBvbmx5IGRlbGl2ZXJpZXNcbiAgICogdGhhdCByZXNvbHZlIG9uIHRoZWlyIG93biwgc28gbm90aGluZyBoZXJlIGNhbiBnYXRlIGl0cyBvd24gcmV0aXJlbWVudC4gQVxuICAgKiBnZW51aW5lbHkgb3JwaGFuZWQgZXZlbnQgaGFzIG5vIGRlbGl2ZXJ5IHRvIHdhaXQgb24gYW5kIHJlYWNoZXMgYGZuYCBvbiB0aGVcbiAgICogZmlyc3QgcG9sbC5cbiAgICpcbiAgICogV2hhdCB0aGUgZ2F0ZSBnaXZlcyB1cDogZm9yIHRoZSBvcmRlcmVkIGV2ZW50cyB0aGF0IHN0aWxsIHJlYWNoXG4gICAqIGBvblVuY29uc3VtZWRFdmVudGAgcmF0aGVyIHRoYW4ge0BsaW5rIHBhcmt9LCB0aGlzIHN0b3BzIGJlaW5nIHRoZSB0aGluZ1xuICAgKiB0aGF0IGNhdGNoZXMgYSBkaXZlcmdlZCBsb2cgd2hpbGUgYSBkZWxpdmVyeSBpcyBpbiBmbGlnaHQuIFRoZSBzdXNwZW5zaW9uXG4gICAqIGFuZCB0aGlzIGNoZWNrIG5vdyB3YWtlIGZyb20gdGhlIHNhbWUgYGlzRGVsaXZlcnlJZGxlYCBlZGdlLCBhbmRcbiAgICogYHNjaGVkdWxlV2hlbklkbGVgIGZpcmVzIG9uIHRoZSBmaXJzdCB0aW1lciB0aWNrIGFmdGVyIGlkbGUgd2hpbGUgdGhpcyB3YWl0c1xuICAgKiBhIGZ1cnRoZXIgYGdldERlZmVycmVkQ2hlY2tEZWxheU1zKClgLiBTbyBhIHJ1biB3aXRoIGEgcGVuZGluZyBgc2xlZXAoKWBcbiAgICogc3VzcGVuZHMgZmlyc3QsIGFuZCBgb25Xb3JrZmxvd0Vycm9yYCBkcm9wcyB0aGUgZGl2ZXJnZW5jZSBhcnJpdmluZyBzZWNvbmRcbiAgICogKGl0cyBgJ3N1c3BlbmRlZCdgIGJyYW5jaCBkZW1vdGVzIHRvIGAncmVwbGF5J2AgYW5kIHN1cmZhY2VzIG5vdGhpbmcpLFxuICAgKiBsZWF2aW5nIGEgbGF0ZXIgYHJlc3VtZSgpYCB0byBkZWNsaW5lIGludG8gYSBjb2xkIHJlcGxheS4gUHJlLWdhdGUgdGhlXG4gICAqIHN1c3BlbnNpb24gYWxyZWFkeSB3b24gdGhhdCByYWNlIHdoZW5ldmVyIHRoZSBkZWxpdmVyeSBsYW5kZWQgaW5zaWRlIHRoZVxuICAgKiBmaXhlZCB3aW5kb3csIHNvIHdoYXQgY2hhbmdlZCBpcyB0aGF0IHRoZSBvdXRjb21lIHN0b3BwZWQgZGVwZW5kaW5nIG9uXG4gICAqIHRpbWluZy4gTm90aGluZyBzaG91bGQgdHJlYXQgdGhpcyBjaGVjayBhcyB0aGUgbWVjaGFuaXNtIHRoYXQgcmVwb3J0c1xuICAgKiBkaXZlcmdlbmNlIG9uIGEgbG9nIHRoZSBydW4gaXMgc3RpbGwgZGVsaXZlcmluZyBpbnRvLlxuICAgKi9cbiAgcHJpdmF0ZSB3aGVuRGVsaXZlcnlJZGxlKGNoZWNrVmVyc2lvbjogbnVtYmVyLCBmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnN0IHBvbGwgPSAoKSA9PiB7XG4gICAgICB0aGlzLnBlbmRpbmdVbmNvbnN1bWVkVGltZW91dCA9IG51bGw7XG4gICAgICBpZiAodGhpcy51bmNvbnN1bWVkQ2hlY2tWZXJzaW9uICE9PSBjaGVja1ZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNEZWxpdmVyeUlkbGUoKSkge1xuICAgICAgICBmbigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmdldFByb21pc2VRdWV1ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy51bmNvbnN1bWVkQ2hlY2tWZXJzaW9uICE9PSBjaGVja1ZlcnNpb24pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGVsZCBpbiB0aGUgc2FtZSBmaWVsZCB0aGUgZmlyZWQgY2hlY2sgdXNlcyBzbyBzdWJzY3JpYmUoKSBjYW5jZWxzIGFcbiAgICAgICAgLy8gcG9sbCBpbiBwcm9ncmVzcyB0b28uIFRoZSB0d28gY2FuY2VsbGF0aW9ucyBhcmUgbm90IGlkZW50aWNhbDogZm9yIHRoZVxuICAgICAgICAvLyBwb2xsIGl0IGlzIHRoZSB2ZXJzaW9uIGJ1bXAgdGhhdCBkb2VzIHRoZSB3b3JrIGFuZCB0aGUgY2xlYXJUaW1lb3V0IGlzXG4gICAgICAgIC8vIGJlbHQtYW5kLWJyYWNlcy4gVHdvIHN0YXRlIG1hY2hpbmVzIHdyaXRlIHRoaXMgb25lIGZpZWxkLCBzbyBhIHBvbGxcbiAgICAgICAgLy8gaW52YWxpZGF0ZWQgYmV0d2VlbiBzY2hlZHVsaW5nIGFuZCBmaXJpbmcgY2FuIG51bGwgb3V0IGEgaGFuZGxlIHRoZVxuICAgICAgICAvLyBsaXZlIGNoYWluIGhhcyBzaW5jZSBzdG9yZWQsIHdoaWNoIGlzIHdoeSBldmVyeSBwYXRoIG91dCBvZiBgcG9sbGAgYW5kXG4gICAgICAgIC8vIG91dCBvZiB0aGUgZmlyZWQgY2hlY2sgcmUtY2hlY2tzIHRoZSB2ZXJzaW9uIHJhdGhlciB0aGFuIHRydXN0aW5nIHRoZVxuICAgICAgICAvLyBoYW5kbGUuXG4gICAgICAgIHRoaXMucGVuZGluZ1VuY29uc3VtZWRUaW1lb3V0ID0gc2V0VGltZW91dChwb2xsLCAwKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcG9sbCgpO1xuICB9XG59XG4iXX0=
|
|
754
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLWNvbnN1bWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2V2ZW50cy1jb25zdW1lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsR0FDbEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTNDOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0FBRTNDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxFQUFFLENBQUM7QUFFOUM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sdUJBQXVCLEdBQUcsR0FBVyxFQUFFLENBQzNDLFNBQVMsQ0FBQyxrQ0FBa0MsRUFBRSx1QkFBdUIsRUFBRTtJQUNyRSxPQUFPLEVBQUUsSUFBSTtJQUNiLEdBQUcsRUFBRSwyQkFBMkI7Q0FDakMsQ0FBQyxDQUFDO0FBRUw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Q0c7QUFDSCxNQUFNLG9CQUFvQixHQUFvQyxJQUFJLEdBQUcsQ0FBQztJQUNwRSxlQUFlO0lBQ2YsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQixVQUFVO0lBQ1YsZUFBZTtDQUNoQixDQUFDLENBQUM7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sb0JBQW9CLEdBQW9DLElBQUksR0FBRyxDQUFDO0lBQ3BFLGdCQUFnQjtDQUNqQixDQUFDLENBQUM7QUFFSCxpRUFBaUU7QUFDakUsU0FBUyxhQUFhLENBQUMsU0FBaUIsRUFBRSxhQUFxQjtJQUM3RCxPQUFPLEdBQUcsU0FBUyxJQUFJLGFBQWEsRUFBRSxDQUFDO0FBQ3pDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFN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LEVBQUUsQ0FBQztnQkFDakQsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO2dCQUMxQixFQUFFLEVBQUUsQ0FBQztnQkFDTCxPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUMvQixJQUFJLElBQUksQ0FBQyxzQkFBc0IsS0FBSyxZQUFZLEVBQUUsQ0FBQztvQkFDakQsT0FBTztnQkFDVCxDQUFDO2dCQUNELHVFQUF1RTtnQkFDdkUseUVBQXlFO2dCQUN6RSx5RUFBeUU7Z0JBQ3pFLHNFQUFzRTtnQkFDdEUsc0VBQXNFO2dCQUN0RSx5RUFBeUU7Z0JBQ3pFLHdFQUF3RTtnQkFDeEUsVUFBVTtnQkFDVixJQUFJLENBQUMsd0JBQXdCLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0RCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQztRQUNGLElBQUksRUFBRSxDQUFDO0lBQ1QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFdmVudCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBlbnZOdW1iZXIgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQvZW52LWNvbmZpZyc7XG5pbXBvcnQge1xuICBjbGFzc2lmeUVudGl0eUV2ZW50LFxuICBpc1NlYWxlZE5vb3BFdmVudCxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkL2V2ZW50LW1ldGFkYXRhJztcbmltcG9ydCB7IGV2ZW50c0xvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcblxuLyoqXG4gKiBEZWxheSBiZWZvcmUgZmlyaW5nIHRoZSBkZWZlcnJlZCB1bmNvbnN1bWVkLWV2ZW50IGNoZWNrIGFmdGVyIHRoZSBwcm9taXNlXG4gKiBxdWV1ZSBoYXMgZHJhaW5lZC4gTXVzdCBiZSBsb25nIGVub3VnaCBmb3IgY3Jvc3MtVk0gbWljcm90YXNrIGNoYWlucyB0b1xuICogcHJvcGFnYXRlIChyZXNvbHZlIGluIGhvc3Qg4oaSIHdvcmtmbG93IGNvZGUgaW4gVk0g4oaSIHN1YnNjcmliZSBjYWxsIGJhY2tcbiAqIGluIGhvc3QpLiBBbnkgc3Vic2NyaWJlKCkgYXJyaXZpbmcgZHVyaW5nIHRoaXMgd2luZG93IGNhbmNlbHMgdGhlIGNoZWNrLlxuICovXG5leHBvcnQgY29uc3QgREVGRVJSRURfQ0hFQ0tfREVMQVlfTVMgPSAxMDA7XG5cbi8qKlxuICogRmxvb3IgZm9yIHRoZSBkZWZlcnJlZC1jaGVjayBkZWxheSwgc28gYSB0b28tbG93IG92ZXJyaWRlIGNhbid0IG1hbnVmYWN0dXJlXG4gKiBzcHVyaW91cyBkaXZlcmdlbmNlIChlYWNoIGZhbHNlIHBvc2l0aXZlIGJ1cm5zIGEgZGl2ZXJnZW5jZS1yZWNvdmVyeSByZXRyeVxuICogYW5kIGNhbiBlc2NhbGF0ZSB0byBhIHRlcm1pbmFsIGBDb3JydXB0ZWRFdmVudExvZ0Vycm9yYCkuXG4gKlxuICogRXhwb3J0ZWQgc28gdGVzdHMgbmVlZGluZyB0aGUgc2hvcnRlc3QgbGVnYWwgZGVsYXkgY2FuIGFzayBmb3IgaXQgaW5zdGVhZCBvZlxuICogaGFyZGNvZGluZyBhIG51bWJlciB0aGlzIGZsb29yIHdvdWxkIHNpbGVudGx5IGNsYW1wIHVwLlxuICovXG5leHBvcnQgY29uc3QgTUlOX0RFRkVSUkVEX0NIRUNLX0RFTEFZX01TID0gMTA7XG5cbi8qKlxuICogRWZmZWN0aXZlIGRlZmVycmVkLWNoZWNrIGRlbGF5LiBPdmVycmlkZTogYFdPUktGTE9XX0RFRkVSUkVEX0NIRUNLX0RFTEFZX01TYC5cbiAqXG4gKiBVbmxpa2UgdGhlIG90aGVyIHRpbWluZyBrbm9icyB0aGlzIGlzIG5vdCBhIHBvbGxpbmcgaW50ZXJ2YWwgYnV0IGFcbiAqIGRldGVybWluaXNtIHNhZmV0eSBtYXJnaW46IGZpcmluZyB0aGUgdW5jb25zdW1lZC1ldmVudCBjaGVjayBiZWZvcmUgdGhlXG4gKiBjcm9zcy1WTSBzdWJzY3JpYmUoKSBjaGFpbiBoYXMgbGFuZGVkIHJlamVjdHMgYSBoZWFsdGh5IHJ1biB3aXRoXG4gKiBgUmVwbGF5RGl2ZXJnZW5jZUVycm9yYC5cbiAqL1xuY29uc3QgZ2V0RGVmZXJyZWRDaGVja0RlbGF5TXMgPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcignV09SS0ZMT1dfREVGRVJSRURfQ0hFQ0tfREVMQVlfTVMnLCBERUZFUlJFRF9DSEVDS19ERUxBWV9NUywge1xuICAgIGludGVnZXI6IHRydWUsXG4gICAgbWluOiBNSU5fREVGRVJSRURfQ0hFQ0tfREVMQVlfTVMsXG4gIH0pO1xuXG4vKipcbiAqIEV2ZW50IHR5cGVzIHRoZSBvcmRlcmVkIHdhbGsgbWF5IHN0ZXAgb3ZlciBhbmQgZGVsaXZlciBsYXRlci5cbiAqXG4gKiBNZW1iZXJzaGlwIGlzIG5vdCBhYm91dCB3aG8gd3JvdGUgdGhlIGV2ZW50LiBJdCBpcyBhYm91dCB3aGV0aGVyIHRoZSBldmVudFxuICogY2FuIHJlYWNoIHRoZSBoZWFkIG9mIHRoZSB3YWxrIHdpdGggbm90aGluZyByZWdpc3RlcmVkIHRvIGNvbnN1bWUgaXQsIHdoaWNoXG4gKiBpcyB0aGUgb25seSBzaXR1YXRpb24gcGFya2luZyBleGlzdHMgZm9yLlxuICpcbiAqIE1vc3QgdHlwZXMgY2Fubm90LiBUaGV5IGFyZSByZXBsYXktb3JpZ2luOiBhIHJlcGxheSBlbWl0cyB0aGVtLCBpbiB0aGUgb3JkZXJcbiAqIGl0cyBjb2RlIHJlYWNoZXMgdGhlbSwgc28gdGhlaXIgcG9zaXRpb24gaW4gdGhlIGxvZyBpcyB0aGUgcmVjb3JkIG9mIHdoYXRcbiAqIHRoYXQgcmVwbGF5IGRlY2lkZWQuIFJlYWNoaW5nIG9uZSBvZiB0aG9zZSBvdXQgb2Ygb3JkZXIgbWVhbnMgdGhpcyByZXBsYXlcbiAqIGRlY2lkZWQgZGlmZmVyZW50bHkgdGhhbiB0aGUgbG9nIGhvbGRzLCB3aGljaCBpcyBkaXZlcmdlbmNlIGFuZCBub3RoaW5nIGVsc2UuXG4gKlxuICogU3RlcCBsaWZlY3ljbGUgZXZlbnRzIGFyZSBub3QgcmVwbGF5LW9yaWdpbiwgYW5kIGFyZSBzdGlsbCBhYnNlbnQsIGJlY2F1c2VcbiAqIHRoZXkgYWx3YXlzIGhhdmUgYSBjbGFpbWFudC4gYHN0ZXAoKWAgc3Vic2NyaWJlcyBpdHMgY29uc3VtZXIgYmVmb3JlIHRoZVxuICogc3RlcCdzIGZpcnN0IGV2ZW50IGNhbiBleGlzdDsgYHN0ZXBfY3JlYXRlZGAgaXMgb3JkZXJlZCwgc28gdGhlIHdhbGsgY2Fubm90XG4gKiBwYXNzIGl0IHVubGVzcyBhIGNvbnN1bWVyIHRha2VzIGl0OyBhbmQgdGhhdCBjb25zdW1lciBzdGF5cyBzdWJzY3JpYmVkIHVudGlsXG4gKiBgc3RlcF9jb21wbGV0ZWRgIG9yIGBzdGVwX2ZhaWxlZGAsIGFmdGVyIHdoaWNoIHRoZSBXb3JsZCByZWZ1c2VzIGFueSBmdXJ0aGVyXG4gKiB3cml0ZSBmb3IgdGhhdCBzdGVwLiBUaGVyZSBpcyBubyB3aW5kb3cgaW4gd2hpY2ggYSByZXBsYXkga25vd3MgYWJvdXQgYSBzdGVwXG4gKiBhbmQgaGFzIG5vdGhpbmcgcmVnaXN0ZXJlZCB0byBjb25zdW1lIGl0cyBldmVudHMsIHNvIHBhcmtpbmcgdGhlbSB3b3VsZCBvbmx5XG4gKiBkZWZlciByZXBvcnRzIG9mIHdoYXQgaXMgZGl2ZXJnZW5jZSBlaXRoZXIgd2F5LiBUaGUgc2FtZSBob2xkcyBmb3JcbiAqIGB3YWl0X2NyZWF0ZWRgIGFuZCBpdHMgY29uc3VtZXIuIGB3YWl0X2NvbXBsZXRlZGAgaXMgbGlzdGVkIGFueXdheTogYSBzbGVlcFxuICogY2FuIGFsc28gYmUgY29tcGxldGVkIG91dCBvZiBiYW5kLCBieSB0aGUgQVBJIHRoYXQgZm9yY2UtY29tcGxldGVzIHBlbmRpbmdcbiAqIHdhaXRzLCBhbmQgdG9sZXJhdGluZyBhIHN0cmF5IG9uZSBpcyB0aGUgY2hlYXBlciBkaXJlY3Rpb24gdG8gYmUgd3JvbmcgaW4uXG4gKlxuICogQW4gYWxsb3dsaXN0IHJhdGhlciB0aGFuIHRoZSBjb21wbGVtZW50IG9mIHRoZSBvcmRlcmVkIHNldCwgc28gYSB0eXBlIHRoaXNcbiAqIGZpbGUgaGFzIG5vdCBiZWVuIHRhdWdodCBhYm91dCBrZWVwcyB0aGUgc3RyaWN0IG9sZCBiZWhhdmlvci5cbiAqXG4gKiBgaG9va19kaXNwb3NlZGAgaXMgZGVsaWJlcmF0ZWx5IGFic2VudCBkZXNwaXRlIGJlaW5nIGFib3V0IGEgaG9vazogaXQgaXNcbiAqIHdyaXR0ZW4gd2hlbiB0aGUgd29ya2Zsb3cncyBvd24gYHVzaW5nYCBzY29wZSBleGl0cywgc28gaXQgaXMgcmVwbGF5LW9yaWdpbi5cbiAqXG4gKiBgYXR0cl9zZXRgIGlzIGxpc3RlZCBieSB0eXBlIGV2ZW4gdGhvdWdoIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgaXQgbWF5IGJlXG4gKiByZXBsYXktb3JpZ2luLCBzaW5jZSBpdCBpcyByZXBsYXktb3JpZ2luIHdoZW4gaXRzIHdyaXRlciBpcyB0aGUgd29ya2Zsb3cuXG4gKiBTcGxpdHRpbmcgdGhhdCBvdXQgcGVyIGV2ZW50IHdhcyBjb25zaWRlcmVkIGFuZCByZWplY3RlZC4gQSByZXBsYXkgdGhhdFxuICogcmVhY2hlcyBvbmUgb2YgaXRzIG93biB3cml0ZXMgb3V0IG9mIHBvc2l0aW9uIGhhcyBkaXZlcmdlZCwgYnV0IGEgcmVwbGF5IHRoYXRcbiAqIHJlYWNoZXMgYW4gZXZlbnQgaXQgZGlkIE5PVCB3cml0ZSwgc2l0dGluZyB3aGVyZSBpdHMgb3duIHdyaXRlIHdvdWxkIGdvLCBoYXNcbiAqIG5vdDogdGhlIHdyaXRlciBmaWVsZCBzYXlzIHdobyB3cm90ZSB0aGUgZXZlbnQsIGFuZCBub3Qgd2hldGhlciB0aGlzIHJlcGxheVxuICogaXMgdGhlIHNhbWUgb25lLiBHdWVzc2luZyB3cm9uZyBpbiB0aGF0IGRpcmVjdGlvbiBmYWlscyBoZWFsdGh5IHJ1bnMsIHdoaWNoXG4gKiBpcyB0aGUgZmFpbHVyZSB0aGlzIGZpbGUgZXhpc3RzIHRvIHN0b3AsIHNvIHRoZSB3aG9sZSB0eXBlIGlzIHRvbGVyYXRlZC4gVGhlXG4gKiBjb3N0IGlzIHRoYXQgYSBkaXZlcmdlbmNlIGludm9sdmluZyBgYXR0cl9zZXRgIHN1cmZhY2VzIGF0IHRoZSBlbmQgb2YgdGhlXG4gKiByZXBsYXksIHRocm91Z2ggYHN0cmFuZGVkRXZlbnRgLCByYXRoZXIgdGhhbiBhdCB0aGUgb2ZmZW5kaW5nIGV2ZW50LlxuICpcbiAqIFBhcmtpbmcgaGVyZSBpcyBmb3IgYW4gYGF0dHJfc2V0YCB0aGUgd2FsayByZWFjaGVzICpiZWZvcmUqIHRoZSBib2R5IGhhcyBtYWRlXG4gKiB0aGUgY2FsbCB0aGF0IGNsYWltcyBpdC4gQSBzZWNvbmQgZXZlbnQgdW5kZXIgYW4gaWQgYWxyZWFkeSBjbGFpbWVkIGlzIGFcbiAqIGRpZmZlcmVudCB0aGluZzogYGF0dHJfc2V0YCBoYXMgYW4gZW50aXR5IGV2ZW50IGNsYXNzLCBzbyB0aGUgZHVwbGljYXRlIHNraXBcbiAqIHRha2VzIGl0IGJlZm9yZSB0aGlzIHNldCBpcyBjb25zdWx0ZWQsIGFuZCBhIGNvcHkgdGhhdCBwYXJrZWQgYWhlYWQgb2YgYW55XG4gKiBjb25zdW1wdGlvbiBpcyByZWxlYXNlZCBieSB7QGxpbmsgZHJvcFBhcmtlZER1cGxpY2F0ZXN9IG9uY2Ugb25lIGxhbmRzLlxuICovXG5jb25zdCBQQVJLQUJMRV9FVkVOVF9UWVBFUzogUmVhZG9ubHlTZXQ8RXZlbnRbJ2V2ZW50VHlwZSddPiA9IG5ldyBTZXQoW1xuICAnaG9va19yZWNlaXZlZCcsXG4gICdob29rX2NvbmZsaWN0JyxcbiAgJ3dhaXRfY29tcGxldGVkJyxcbiAgJ2F0dHJfc2V0JyxcbiAgJ3J1bl9jYW5jZWxsZWQnLFxuXSk7XG5cbi8qKlxuICogUGFya2FibGUgdHlwZXMgdGhhdCBjYW4gb25seSBldmVyIHJlc29sdmUgdGhlaXIgY29ycmVsYXRpb24gaWQgb25jZS5cbiAqXG4gKiBBIHNlY29uZCBvbmUgZm9yIHRoZSBzYW1lIGlkIGlzIG5vdCBhIGRlbGl2ZXJ5IHRoaXMgcmVwbGF5IGhhcyBub3QgcmVhY2hlZFxuICogeWV0OiBpdCBpcyBhIHJlc29sdXRpb24gZm9yIHNvbWV0aGluZyBhbHJlYWR5IHJlc29sdmVkLCB3aGljaCBubyBjb25zdW1lclxuICogdGhpcyByZXBsYXkgb3IgYW55IGxhdGVyIG9uZSByZWdpc3RlcnMgY2FuIGV2ZXIgY2xhaW0uIGBob29rX3JlY2VpdmVkYCBpc1xuICogYWJzZW50IGJlY2F1c2UgYSBob29rIGxlZ2l0aW1hdGVseSBmaXJlcyBtYW55IHRpbWVzIHVuZGVyIG9uZSBpZC5cbiAqXG4gKiBNdXN0IHN0YXkgYSBzdWJzZXQgb2Yge0BsaW5rIFBBUktBQkxFX0VWRU5UX1RZUEVTfToge0BsaW5rIHBhcmt9IGlzIHRoZSBvbmx5XG4gKiByZWFkZXIgb2Ygd2hhdCB0aGlzIHJlY29yZHMsIGFuZCBpdCByZWplY3RzIGEgbm9uLXBhcmthYmxlIHR5cGUgYmVmb3JlIGl0XG4gKiBsb29rcywgc28gYW4gZW50cnkgb3V0c2lkZSB0aGF0IHNldCBpcyBkZWFkIHdlaWdodCBvbiBhIGhvdCBwYXRoLlxuICovXG5jb25zdCBPTkVfU0hPVF9FVkVOVF9UWVBFUzogUmVhZG9ubHlTZXQ8RXZlbnRbJ2V2ZW50VHlwZSddPiA9IG5ldyBTZXQoW1xuICAnd2FpdF9jb21wbGV0ZWQnLFxuXSk7XG5cbi8qKiBJZGVudGlmaWVzIHRoZSB0aGluZyBhIG9uZS1zaG90IHJlc29sdXRpb24gZXZlbnQgcmVzb2x2ZXMuICovXG5mdW5jdGlvbiByZXNvbHV0aW9uS2V5KGV2ZW50VHlwZTogc3RyaW5nLCBjb3JyZWxhdGlvbklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7ZXZlbnRUeXBlfToke2NvcnJlbGF0aW9uSWR9YDtcbn1cblxuLyoqXG4gKiBUeXBlcyB0aGF0IGVuZCBhIHJ1bi4gT25jZSBvbmUgaXMgaW4gdGhlIGxvZywgbm8gY29uc3VtZXIgd2lsbCBldmVyIGJlXG4gKiByZWdpc3RlcmVkIGFnYWluLCBzbyBhIHBhcmtlZCBldmVudCBzdGlsbCBwYXJrZWQgaGVyZSB3aWxsIG5ldmVyIGJlIGNsYWltZWQuXG4gKi9cbmNvbnN0IFRFUk1JTkFMX0VWRU5UX1RZUEVTOiBSZWFkb25seVNldDxFdmVudFsnZXZlbnRUeXBlJ10+ID0gbmV3IFNldChbXG4gICdydW5fY29tcGxldGVkJyxcbiAgJ3J1bl9mYWlsZWQnLFxuICAncnVuX2NhbmNlbGxlZCcsXG5dKTtcblxuZXhwb3J0IGVudW0gRXZlbnRDb25zdW1lclJlc3VsdCB7XG4gIC8qKlxuICAgKiBDYWxsYmFjayBjb25zdW1lZCB0aGUgZXZlbnQsIGJ1dCBzaG91bGQgbm90IGJlIHJlbW92ZWQgZnJvbSB0aGUgY2FsbGJhY2tzIGxpc3RcbiAgICovXG4gIENvbnN1bWVkLFxuICAvKipcbiAgICogQ2FsbGJhY2sgZGlkIG5vdCBjb25zdW1lIHRoZSBldmVudCwgc28gaXQgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgbmV4dCBjYWxsYmFja1xuICAgKi9cbiAgTm90Q29uc3VtZWQsXG4gIC8qKlxuICAgKiBDYWxsYmFjayBjb25zdW1lZCB0aGUgZXZlbnQsIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWxsYmFja3MgbGlzdFxuICAgKi9cbiAgRmluaXNoZWQsXG59XG5cbnR5cGUgRXZlbnRDb25zdW1lckNhbGxiYWNrID0gKGV2ZW50OiBFdmVudCB8IG51bGwpID0+IEV2ZW50Q29uc3VtZXJSZXN1bHQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRzQ29uc3VtZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIENhbGxiYWNrIGludm9rZWQgYWZ0ZXIgYW4gZXZlbnQgaGFzIGJlZW4gY29uc3VtZWQuIENvbnN1bWVycyBzdWNoIGFzIHRoZVxuICAgKiBkZXRlcm1pbmlzdGljIHdvcmtmbG93IGNsb2NrIG11c3Qgbm90IG9ic2VydmUgZXZlbnRzIHRoYXQgYXJlIG1lcmVseVxuICAgKiBpbnNwZWN0ZWQgd2hpbGUgd2FpdGluZyBmb3IgdXNlciBjb2RlIHRvIHN1YnNjcmliZSB0byB0aGUgbmV4dCBvcGVyYXRpb24uXG4gICAqL1xuICBvbkNvbnN1bWVkRXZlbnQ/OiAoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkO1xuICAvKipcbiAgICogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIGEgbm9uLW51bGwgZXZlbnQgY2Fubm90IGJlIGNvbnN1bWVkIGJ5IGFueSByZWdpc3RlcmVkXG4gICAqIGNhbGxiYWNrLCBpbmRpY2F0aW5nIGFuIG9ycGhhbmVkIG9yIGludmFsaWQgZXZlbnQgaW4gdGhlIGV2ZW50IGxvZy4gVGhlXG4gICAqIGNoZWNrIGlzIGRlZmVycmVkIHVudGlsIGFmdGVyIHRoZSBwcm9taXNlIHF1ZXVlIGhhcyBkcmFpbmVkLCBlbnN1cmluZyB0aGF0XG4gICAqIGFueSBwZW5kaW5nIGFzeW5jIHdvcmsgKGUuZy4sIGRlc2VyaWFsaXphdGlvbi9kZWNyeXB0aW9uKSBjb21wbGV0ZXMgYW5kXG4gICAqIGRvd25zdHJlYW0gc3Vic2NyaWJlKCkgY2FsbHMgaGF2ZSBhIGNoYW5jZSB0byBjYW5jZWwgdGhlIGNoZWNrIGZpcnN0LlxuICAgKi9cbiAgb25VbmNvbnN1bWVkRXZlbnQ6IChldmVudDogRXZlbnQpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gYW4gZXZlbnQgaXMgc2tpcHBlZCBiZWNhdXNlIGl0IHJlcGVhdHMgYW4gZXZlbnRcbiAgICogY2xhc3MgdGhlIHdhbGsgYWxyZWFkeSBjb25zdW1lZCBmb3IgdGhlIHNhbWUgZW50aXR5LiBgZmlyc3RFdmVudFR5cGVgIGlzXG4gICAqIHRoZSB0eXBlIHRoYXQgcmVjb3JkZWQgdGhlIGNsYXNzLCB3aGljaCBpcyB0aGUgb25lIHRoZSB3b3JrZmxvdyBvYnNlcnZlZC5cbiAgICogRGlhZ25vc3RpY3Mgb25seTogc2tpcHBpbmcgaXMgYSBub3JtYWwgb3V0Y29tZSwgbm90IGFuIGVycm9yLCB0aG91Z2ggYVxuICAgKiBgZmlyc3RFdmVudFR5cGVgIGRpZmZlcmluZyBmcm9tIGBldmVudC5ldmVudFR5cGVgIHNheXMgdGhlIHR3byB3cml0ZXJzXG4gICAqIGRlY2lkZWQgdGhlIGVudGl0eSdzIG91dGNvbWUgZGlmZmVyZW50bHksIHdoaWNoIGlzIHdvcnRoIG1vcmUgdGhhbiBhblxuICAgKiBpbmZvIGxvZy5cbiAgICovXG4gIG9uRHVwbGljYXRlRXZlbnQ/OiAoZXZlbnQ6IEV2ZW50LCBmaXJzdEV2ZW50VHlwZTogRXZlbnRbJ2V2ZW50VHlwZSddKSA9PiB2b2lkO1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBwcm9taXNlIHF1ZXVlLiBUaGUgdW5jb25zdW1lZCBldmVudCBjaGVjayBpcyBjaGFpbmVkXG4gICAqIG9udG8gdGhpcyBxdWV1ZSBzbyBpdCBvbmx5IGZpcmVzIGFmdGVyIGFsbCBwZW5kaW5nIGFzeW5jIHdvcmsgKGUuZy4sXG4gICAqIGRlc2VyaWFsaXphdGlvbikgaGFzIGNvbXBsZXRlZC4gVGhpcyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgd2hlbiBhc3luY1xuICAgKiBkZXNlcmlhbGl6YXRpb24gZGVsYXlzIHRoZSByZXNvbHZlKCkgdGhhdCB0cmlnZ2VycyB0aGUgbmV4dCBzdWJzY3JpYmUoKS5cbiAgICovXG4gIGdldFByb21pc2VRdWV1ZTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgbm8gZGF0YSBkZWxpdmVyeSBpcyBpbiBmbGlnaHQgKGBpc0RlbGl2ZXJ5SWRsZWAgaW4gcHJpdmF0ZS50cykuXG4gICAqIFRoZSB1bmNvbnN1bWVkLWV2ZW50IGNoZWNrIHdhaXRzIGZvciB0aGlzIGJlZm9yZSBpdCBmaXJlczogYSBkZWxpdmVyeSBpblxuICAgKiBmbGlnaHQgbWVhbnMgdGhlIHdvcmtmbG93IFZNIGlzIG1pZC1yZWFjdGlvbiwgYW5kIGFuIGV2ZW50IGl0IGhhcyBub3RcbiAgICogY2xhaW1lZCB5ZXQgaXMgYW4gZXZlbnQgaXQgaGFzIG5vdCByZWFjaGVkIHlldC5cbiAgICpcbiAgICogUmVxdWlyZWQgcmF0aGVyIHRoYW4gZGVmYXVsdGluZyB0byBhbHdheXMtaWRsZTogYWx3YXlzLWlkbGUgaXMgZXhhY3RseSB0aGVcbiAgICogcHJlLWdhdGUgYmVoYXZpb3IsIHNvIGEgZGVmYXVsdGVkIG9wdGlvbiB3b3VsZCBsZXQgYSBjb25zdHJ1Y3Rpb24gc2l0ZSBvcHRcbiAgICogYSB3aG9sZSByZXBsYXkgcGF0aCBiYWNrIG91dCB3aXRob3V0IHNheWluZyBzby4gVGVzdHMgdGhhdCBkcml2ZSBhIGNvbnN1bWVyXG4gICAqIHdpdGggbm8gb3JjaGVzdHJhdG9yIGNvbnRleHQgcGFzcyBgKCkgPT4gdHJ1ZWAgdG8ga2VlcCB0aGUgcHJlLWV4aXN0aW5nXG4gICAqIHRpbWluZywgYW5kIHNheSBzbyBhdCB0aGUgY2FsbCBzaXRlLlxuICAgKi9cbiAgaXNEZWxpdmVyeUlkbGU6ICgpID0+IGJvb2xlYW47XG59XG5cbi8qKiBTZWUge0BsaW5rIEV2ZW50c0NvbnN1bWVyLmRlc2NyaWJlfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRzQ29uc3VtZXJTbmFwc2hvdCB7XG4gIGluZGV4OiBudW1iZXI7XG4gIGxlbmd0aDogbnVtYmVyO1xuICBwYXJrZWQ6IG51bWJlcjtcbiAgbGFzdENvbnN1bWVkRXZlbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRzQ29uc3VtZXIge1xuICBldmVudEluZGV4OiBudW1iZXI7XG4gIHJlYWRvbmx5IGV2ZW50czogRXZlbnRbXTtcbiAgcmVhZG9ubHkgY2FsbGJhY2tzOiBFdmVudENvbnN1bWVyQ2FsbGJhY2tbXSA9IFtdO1xuICAvKipcbiAgICogRXZlbnRzIHRoZSBvcmRlcmVkIHdhbGsgc3RlcHBlZCBvdmVyIGJlY2F1c2Ugbm9ib2R5IGNsYWltZWQgdGhlbSBhbmQgdGhlaXJcbiAgICogdHlwZSBjYXJyaWVzIG5vIG9yZGVyaW5nIGNsYWltLiBFYWNoIGtlZXBzIHRoZSBpbmRleCBpdCBoZWxkIGluIHRoZSBsb2c6XG4gICAqIGNvbnN1bWVycyByZWFkIHtAbGluayBldmVudEluZGV4fSBhdCBjb25zdW1wdGlvbiB0aW1lIHRvIG9yZGVyIHRoZWlyXG4gICAqIGRlbGl2ZXJ5IGFnYWluc3QgdGhlIHJlc3Qgb2YgdGhlIGxvZywgYW5kIGEgbGF0ZSBkZWxpdmVyeSBtdXN0IHN0aWxsIG1ha2VcbiAgICogdGhlIGNsYWltIGl0cyBwb3NpdGlvbiBnYXZlIGl0LlxuICAgKlxuICAgKiBIZWxkIGluIGxvZyBvcmRlciwgZHJhaW5lZCBpbiBsb2cgb3JkZXIsIGFuZCBkcmFpbmVkIGJlZm9yZSBldmVyeSBvZmZlciBzb1xuICAgKiBhIGNvbnN1bWVyIHJlZ2lzdGVyZWQgYWZ0ZXIgdGhlIHdhbGsgcGFzc2VkIHRoZSBldmVudCBzdGlsbCByZWNlaXZlcyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFya2VkOiB7IGV2ZW50OiBFdmVudDsgaW5kZXg6IG51bWJlciB9W10gPSBbXTtcbiAgLyoqXG4gICAqIENvcnJlbGF0aW9uIGlkcyBvZiB0aGUge0BsaW5rIE9ORV9TSE9UX0VWRU5UX1RZUEVTfSBldmVudHMgY29uc3VtZWQgc29cbiAgICogZmFyLCBzbyBhIHNlY29uZCByZXNvbHV0aW9uIGZvciBvbmUgb2YgdGhlbSBpcyByZWNvZ25pemVkIGFzIHVuY2xhaW1hYmxlXG4gICAqIHJhdGhlciB0aGFuIHBhcmtlZCBmb3IgYSBjb25zdW1lciB0aGF0IGNhbm5vdCBleGlzdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLyoqXG4gICAqIGA8Y2xhc3M+Ojxjb3JyZWxhdGlvbklkPmAgZm9yIGV2ZXJ5IGV2ZW50IGNsYXNzIHRoZSB3YWxrIGhhcyBhbHJlYWR5XG4gICAqIGNvbnN1bWVkLCBtYXBwZWQgdG8gdGhlIGV2ZW50IHR5cGUgdGhhdCByZWNvcmRlZCBpdC4gVGhlIHR5cGUgaXMga2VwdCBzbyBhXG4gICAqIHJlcGVhdCB0aGF0IGRlY2lkZWQgdGhlIHNhbWUgY2xhc3MgKmRpZmZlcmVudGx5KiAoYSBgc3RlcF9mYWlsZWRgIGJlaGluZCBhXG4gICAqIGBzdGVwX2NvbXBsZXRlZGApIGNhbiBiZSByZXBvcnRlZCBhcyBtb3JlIHRoYW4gYSByZS1jb21taXQuIFNlZVxuICAgKiB7QGxpbmsgRXZlbnRzQ29uc3VtZXIuZmlyc3RFdmVudFR5cGVPZkNsYXNzfS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VlbkV2ZW50Q2xhc3NlcyA9IG5ldyBNYXA8c3RyaW5nLCBFdmVudFsnZXZlbnRUeXBlJ10+KCk7XG4gIHByaXZhdGUgb25Db25zdW1lZEV2ZW50PzogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBvblVuY29uc3VtZWRFdmVudDogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBvbkR1cGxpY2F0ZUV2ZW50PzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBmaXJzdFR5cGU6IEV2ZW50WydldmVudFR5cGUnXVxuICApID0+IHZvaWQ7XG4gIHByaXZhdGUgZ2V0UHJvbWlzZVF1ZXVlOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBwcml2YXRlIGlzRGVsaXZlcnlJZGxlOiAoKSA9PiBib29sZWFuO1xuICBwcml2YXRlIHBlbmRpbmdVbmNvbnN1bWVkQ2hlY2s6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdW5jb25zdW1lZENoZWNrVmVyc2lvbiA9IDA7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgYSBjYWxsYmFjayBtb3N0IHJlY2VudGx5IGNsYWltZWQsIGZvciB7QGxpbmsgZGVzY3JpYmV9LiBUcmFja2VkXG4gICAqIHNlcGFyYXRlbHkgZnJvbSB7QGxpbmsgZXZlbnRJbmRleH0gYmVjYXVzZSB0aGUgd2FsayBhbHNvIHN0ZXBzIG92ZXIgZXZlbnRzXG4gICAqIChwYXJrZWQsIHNlYWxlZCBuby1vcHMsIGR1cGxpY2F0ZXMpIHdpdGhvdXQgYW55b25lIGNvbnN1bWluZyB0aGVtLCBzb1xuICAgKiBgZXZlbnRzW2V2ZW50SW5kZXggLSAxXWAgZG9lcyBub3Qgc2F5IHdoYXQgcmVwbGF5IGxhc3QgYWN0ZWQgb24uXG4gICAqL1xuICBwcml2YXRlIGxhc3RDb25zdW1lZDogRXZlbnQgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoZXZlbnRzOiBFdmVudFtdLCBvcHRpb25zOiBFdmVudHNDb25zdW1lck9wdGlvbnMpIHtcbiAgICAvLyBPd24gY29weTogdGhlIHJ1bnRpbWUgbXV0YXRlcyBpdHMgZXZlbnQgYXJyYXkgaW4gcGxhY2UsIGFuZCBhIHJldGFpbmVkXG4gICAgLy8gc2Vzc2lvbiBtdXN0IG9ubHkgb2JzZXJ2ZSBuZXcgZXZlbnRzIHRocm91Z2ggYXBwZW5kKCkgc28gcmVzdW1lKCknc1xuICAgIC8vIHN0cmljdC1leHRlbnNpb24gY2hlY2sgc3RheXMgbWVhbmluZ2Z1bC5cbiAgICB0aGlzLmV2ZW50cyA9IFsuLi5ldmVudHNdO1xuICAgIHRoaXMuZXZlbnRJbmRleCA9IDA7XG4gICAgdGhpcy5vbkNvbnN1bWVkRXZlbnQgPSBvcHRpb25zLm9uQ29uc3VtZWRFdmVudDtcbiAgICB0aGlzLm9uVW5jb25zdW1lZEV2ZW50ID0gb3B0aW9ucy5vblVuY29uc3VtZWRFdmVudDtcbiAgICB0aGlzLm9uRHVwbGljYXRlRXZlbnQgPSBvcHRpb25zLm9uRHVwbGljYXRlRXZlbnQ7XG4gICAgdGhpcy5nZXRQcm9taXNlUXVldWUgPSBvcHRpb25zLmdldFByb21pc2VRdWV1ZTtcbiAgICB0aGlzLmlzRGVsaXZlcnlJZGxlID0gb3B0aW9ucy5pc0RlbGl2ZXJ5SWRsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb2xkZXN0IGV2ZW50IHRoZSB3YWxrIHN0ZXBwZWQgb3ZlciB0aGF0IG5vIGNvbnN1bWVyIGhhcyBjbGFpbWVkIHlldCxcbiAgICogaWYgYW55LiBQYXJraW5nIGlzIGEgYmV0IHRoYXQgYSBjb25zdW1lciB3aWxsIGJlIHJlZ2lzdGVyZWQgbGF0ZXIsIHNvIGF0XG4gICAqIGFueSBwb2ludCB3aGVyZSBubyBjb25zdW1lciBldmVyIHdpbGwgYmUgYWdhaW4gKHRoZSByZXBsYXkgZmluaXNoaW5nIGlzXG4gICAqIHRoZSBkZWZpbml0aXZlIG9uZSksIHRoaXMgYW5zd2VycyB3aGljaCBldmVudCB0aGUgYmV0IGxvc3Qgb24uXG4gICAqL1xuICBnZXQgc3RyYW5kZWRFdmVudCgpOiBFdmVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFya2VkWzBdPy5ldmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IHRoZSB3YWxrIGlzIHN0aWxsIGhvbGRpbmcsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgaG9sZHMgbm90aGluZy5cbiAgICpcbiAgICogUmVhZCBhdCBldmVyeSBwb2ludCBhIHJlcGxheSBzdG9wcywgaW5jbHVkaW5nIHRoZSBzdXNwZW5zaW9ucyB0aGF0IGFyZSBub3RcbiAgICogc2V0dGxpbmcgcG9pbnRzLCBzbyB0aGUgaGVsZCBzdGF0ZSByZWFjaGVzIHRlbGVtZXRyeS4gQSByZXBsYXkgY2Fubm90IHRlbGxcbiAgICogYSBkZWxpdmVyeSBhd2FpdGluZyBhIGxhdGVyIGNvbnN1bWVyIGZyb20gb25lIG5vIGNvbnN1bWVyIHdpbGwgZXZlclxuICAgKiByZWdpc3Rlciwgc28gaXQgcmVwb3J0cyByYXRoZXIgdGhhbiBkZWNpZGVzOiB0aGUgc2FtZSBgZXZlbnRJZGAgcmVwb3J0ZWQgb25cbiAgICogc3VzcGVuc2lvbiBhZnRlciBzdXNwZW5zaW9uIG9mIG9uZSBydW4gaXMgdGhlIHNoYXBlIHRoYXQgc2F5cyB0aGUgYmV0XG4gICAqIHBhcmtpbmcgbWFkZSBpcyBub3QgZ29pbmcgdG8gcGF5IG9mZiwgYW5kIHRoYXQgc2hhcGUgaXMgb25seSB2aXNpYmxlIGFjcm9zc1xuICAgKiByZXBsYXlzLlxuICAgKi9cbiAgZ2V0IHBhcmtlZFN1bW1hcnkoKTpcbiAgICB8IHsgY291bnQ6IG51bWJlcjsgZXZlbnRJZDogc3RyaW5nOyBldmVudFR5cGU6IEV2ZW50WydldmVudFR5cGUnXSB9XG4gICAgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG9sZGVzdCA9IHRoaXMucGFya2VkWzBdPy5ldmVudDtcbiAgICBpZiAoIW9sZGVzdCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvdW50OiB0aGlzLnBhcmtlZC5sZW5ndGgsXG4gICAgICBldmVudElkOiBvbGRlc3QuZXZlbnRJZCxcbiAgICAgIGV2ZW50VHlwZTogb2xkZXN0LmV2ZW50VHlwZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSB3YWxrIHN0YW5kcywgZm9yIGEgZGl2ZXJnZW5jZSBtZXNzYWdlLiBFdmVyeXRoaW5nIGhlcmUgaXNcbiAgICogYWxyZWFkeSBrbm93biB0byB0aGUgY29uc3VtZXI7IHRoZSBwb2ludCBvZiB0aGUgbWV0aG9kIGlzIHRoYXQgdGhlXG4gICAqIG9yY2hlc3RyYXRvciBjYW4gcHJpbnQgaXQgd2l0aG91dCByZWFjaGluZyBpbnRvIHByaXZhdGUgc3RhdGUuXG4gICAqXG4gICAqIGBpbmRleGAgaXMgdGhlIG9yZGVyZWQgd2FsaydzIHBvc2l0aW9uICh0aGUgb2Zmc2V0IG9mIHRoZSBldmVudCBpdCBpc1xuICAgKiBzdHVjayBvbiwgd2hlbiBpdCBpcyBzdHVjayksIGBsZW5ndGhgIHRoZSBsb2cgYXMgdGhpcyBjb25zdW1lciBob2xkcyBpdCxcbiAgICogYHBhcmtlZGAgaG93IG1hbnkgZXZlbnRzIHRoZSB3YWxrIHN0ZXBwZWQgb3ZlciBhbmQgc3RpbGwgaG9sZHMsIGFuZFxuICAgKiBgbGFzdENvbnN1bWVkRXZlbnRJZGAgdGhlIGlkIG9mIHRoZSBldmVudCBhIGNhbGxiYWNrIG1vc3QgcmVjZW50bHlcbiAgICogY2xhaW1lZCwgYHVuZGVmaW5lZGAgYmVmb3JlIHRoZSBmaXJzdCBjbGFpbS5cbiAgICovXG4gIGRlc2NyaWJlKCk6IEV2ZW50c0NvbnN1bWVyU25hcHNob3Qge1xuICAgIHJldHVybiB7XG4gICAgICBpbmRleDogdGhpcy5ldmVudEluZGV4LFxuICAgICAgbGVuZ3RoOiB0aGlzLmV2ZW50cy5sZW5ndGgsXG4gICAgICBwYXJrZWQ6IHRoaXMucGFya2VkLmxlbmd0aCxcbiAgICAgIGxhc3RDb25zdW1lZEV2ZW50SWQ6IHRoaXMubGFzdENvbnN1bWVkPy5ldmVudElkLFxuICAgIH07XG4gIH1cblxuICBhcHBlbmQoZXZlbnRzOiBFdmVudFtdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHRoaXMuZXZlbnRzLnB1c2goZXZlbnQpO1xuICAgIHByb2Nlc3MubmV4dFRpY2sodGhpcy5jb25zdW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYWZ0ZXIgYW4gZXZlbnQgaGFzIGJlZW4gY29uc3VtZWRcbiAgICogYnkgYSBkaWZmZXJlbnQgY2FsbGJhY2suIFRoZSBjYWxsYmFjayBjYW4gcmV0dXJuOlxuICAgKiAgLSBgRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZGAgdGhlIGV2ZW50IGlzIGNvbnNpZGVyZWQgY29uc3VtZWQgYW5kIHdpbGwgbm90IGJlIHBhc3NlZCB0byBhbnkgb3RoZXIgY2FsbGJhY2ssIGJ1dCB0aGUgY2FsbGJhY2sgd2lsbCByZW1haW4gaW4gdGhlIGNhbGxiYWNrcyBsaXN0XG4gICAqICAtIGBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkYCB0aGUgZXZlbnQgaXMgcGFzc2VkIHRvIHRoZSBuZXh0IGNhbGxiYWNrXG4gICAqICAtIGBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkYCB0aGUgZXZlbnQgaXMgY29uc2lkZXJlZCBjb25zdW1lZCBhbmQgdGhlIGNhbGxiYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FsbGJhY2tzIGxpc3RcbiAgICpcbiAgICogQHBhcmFtIGZuIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyLlxuICAgKi9cbiAgc3Vic2NyaWJlKGZuOiBFdmVudENvbnN1bWVyQ2FsbGJhY2spIHtcbiAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKGZuKTtcbiAgICAvLyBDYW5jZWwgYW55IHBlbmRpbmcgdW5jb25zdW1lZCBjaGVjayBzaW5jZSBhIG5ldyBjYWxsYmFjayBtYXkgY29uc3VtZSB0aGUgZXZlbnQuXG4gICAgLy8gSW5jcmVtZW50aW5nIHRoZSB2ZXJzaW9uIGNhdXNlcyBhbnkgaW4tZmxpZ2h0IHByb21pc2UgY2hhaW4gY2hlY2sgdG8gbm8tb3AuXG4gICAgLy8gQWxzbyBjbGVhciB0aGUgcGVuZGluZyBzZXRUaW1lb3V0IGlmIGl0IGhhc24ndCBmaXJlZCB5ZXQuXG4gICAgaWYgKHRoaXMucGVuZGluZ1VuY29uc3VtZWRDaGVjayAhPT0gbnVsbCkge1xuICAgICAgdGhpcy51bmNvbnN1bWVkQ2hlY2tWZXJzaW9uKys7XG4gICAgICB0aGlzLnBlbmRpbmdVbmNvbnN1bWVkQ2hlY2sgPSBudWxsO1xuICAgICAgaWYgKHRoaXMucGVuZGluZ1VuY29uc3VtZWRUaW1lb3V0ICE9PSBudWxsKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnBlbmRpbmdVbmNvbnN1bWVkVGltZW91dCk7XG4gICAgICAgIHRoaXMucGVuZGluZ1VuY29uc3VtZWRUaW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcHJvY2Vzcy5uZXh0VGljayh0aGlzLmNvbnN1bWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlDb25zdW1lZEV2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIGlmICghdGhpcy5vbkNvbnN1bWVkRXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMub25Db25zdW1lZEV2ZW50KGV2ZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXZlbnRzTG9nZ2VyLmVycm9yKCdvbkNvbnN1bWVkRXZlbnQgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3InLCB7XG4gICAgICAgIGVycm9yLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb25zdW1lID0gKCkgPT4ge1xuICAgIC8vIERyYWluIGNvbnNlY3V0aXZlbHkgY29uc3VtYWJsZSBldmVudHMgc3luY2hyb25vdXNseSB3aXRoaW4gYSBzaW5nbGVcbiAgICAvLyBwYXNzIGluc3RlYWQgb2YgcGF5aW5nIG9uZSBgcHJvY2Vzcy5uZXh0VGlja2AgcGVyIGNvbnN1bWVkIGV2ZW50LlxuICAgIC8vXG4gICAgLy8gV2h5IHRoaXMgaXMgc2FmZTogYSBjYWxsYmFjayBvbmx5IGNvbnN1bWVzIGFuIGV2ZW50IHVzaW5nIGEgY29uc3VtZXJcbiAgICAvLyB0aGF0IGlzIEFMUkVBRFkgcmVnaXN0ZXJlZCAoZS5nLiBhIGxvbmctbGl2ZWQgc3RlcCBjb25zdW1lciB3YWxraW5nXG4gICAgLy8gYHN0ZXBfY3JlYXRlZGAg4oaSIGBzdGVwX3N0YXJ0ZWRgIOKGkiBgc3RlcF9jb21wbGV0ZWRgLCBvciB0aGUgc3RydWN0dXJhbFxuICAgIC8vIGxpZmVjeWNsZSBjb25zdW1lcikuIE5ldyBjb25zdW1lcnMgYXJlIG9ubHkgZXZlciByZWdpc3RlcmVkIGJ5IHdvcmtmbG93XG4gICAgLy8gVk0gYm9keSBjb2RlIHRoYXQgcnVucyBhc3luY2hyb25vdXNseSBvZmYgYGN0eC5wcm9taXNlUXVldWVgIGFmdGVyIGFcbiAgICAvLyBkZWxpdmVyeSBgcmVzb2x2ZSgpYDsgbm9uZSBvZiB0aGUgY2FsbGJhY2tzIGhlcmUgY2FsbCBgc3Vic2NyaWJlKClgXG4gICAgLy8gc3luY2hyb25vdXNseS4gU28gd2l0aGluIG9uZSBwYXNzIGB0aGlzLmNhbGxiYWNrc2AgaXMgbXV0YXRlZCBvbmx5IGJ5XG4gICAgLy8gdGhpcyBsb29wICh0aGUgYEZpbmlzaGVkYCBzcGxpY2UpLCBhbmQgdGhlIG5leHQgZXZlbnQncyBjb25zdW1lciBpc1xuICAgIC8vIGVpdGhlciBhbHJlYWR5IHByZXNlbnQgKGFkdmFuY2Ugbm93KSBvciBub3QgeWV0IHJlZ2lzdGVyZWQsIGluIHdoaWNoXG4gICAgLy8gY2FzZSBubyBjYWxsYmFjayBjb25zdW1lcyB0aGUgZXZlbnQgYW5kIHdlIGZhbGwgdGhyb3VnaCB0byB0aGVcbiAgICAvLyBjcm9zcy1WTS1zYWZlIGRlZmVycmVkIHVuY29uc3VtZWQtZXZlbnQgY2hlY2sgYmVsb3csIGV4YWN0bHkgYXMgYmVmb3JlLlxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAvLyBCZWZvcmUgZXZlcnkgb2ZmZXIsIG5vdCBqdXN0IG9uIHN1YnNjcmliZTogYSBjYWxsYmFjayByZWdpc3RlcmVkIGJ5XG4gICAgICAvLyB0aGUgd29yayB0aGlzIHNhbWUgcGFzcyBraWNrZWQgb2ZmIG1heSBiZSB0aGUgb3duZXIgb2Ygc29tZXRoaW5nXG4gICAgICAvLyBwYXJrZWQsIGFuZCB0aGUgcGFya2VkIGV2ZW50J3MgZGVsaXZlcnkgaXMgb3JkZXJlZCBhaGVhZCBvZiB0aGUgaGVhZFxuICAgICAgLy8gZXZlbnQncyBieSB0aGUgaW5kZXggaXQgaG9sZHMuXG4gICAgICB0aGlzLmRyYWluUGFya2VkKCk7XG4gICAgICBjb25zdCBjdXJyZW50RXZlbnQgPSB0aGlzLmV2ZW50c1t0aGlzLmV2ZW50SW5kZXhdID8/IG51bGw7XG4gICAgICBpZiAoY3VycmVudEV2ZW50ICE9PSBudWxsICYmIGlzU2VhbGVkTm9vcEV2ZW50KGN1cnJlbnRFdmVudCkpIHtcbiAgICAgICAgdGhpcy5za2lwU2VhbGVkTm9vcChjdXJyZW50RXZlbnQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnN1bWVkID0gdGhpcy5vZmZlcihjdXJyZW50RXZlbnQpO1xuICAgICAgaWYgKGNvbnN1bWVkKSB7XG4gICAgICAgIHRoaXMuZXZlbnRJbmRleCsrO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRFdmVudCA9PT0gbnVsbCkge1xuICAgICAgICAvLyBFbmQgb2YgbG9nLiBDb25zdW1lcnMgcmV0dXJuIE5vdENvbnN1bWVkIGZvciB0aGUgYG51bGxgIHNlbnRpbmVsXG4gICAgICAgIC8vICh0aGUgb25lIHRoYXQgcmVjb2duaXplcyBpdCBhcyBpdHMgb3duIGJvdW5kYXJ5IHNjaGVkdWxlcyB0aGVcbiAgICAgICAgLy8gc3VzcGVuc2lvbiBhcyBhIHNpZGUgZWZmZWN0IGFuZCBzdGlsbCBkZWNsaW5lcyBpdCksIHNvIHRoZSBkcmFpblxuICAgICAgICAvLyBzdG9wcyBoZXJlIHJhdGhlciB0aGFuIHNwaW5uaW5nIHBhc3QgdGhlIGVuZC4gYGNvbnN1bWVkYCBpcyBvbmx5XG4gICAgICAgIC8vIHRydWUgZm9yIGEgY2FsbGJhY2sgdGhhdCBjbGFpbXMgdGhlIHNlbnRpbmVsIG91dHJpZ2h0LCB3aGljaCBub1xuICAgICAgICAvLyBwcm9kdWN0aW9uIGNvbnN1bWVyIGRvZXMuXG4gICAgICAgIGlmICghY29uc3VtZWQpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUVuZE9mTG9nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFjb25zdW1lZCkge1xuICAgICAgICAvLyBOb2JvZHkgd2FudGVkIGl0LiBJZiBpdCByZXBlYXRzIGEgY2xhc3MgdGhpcyB3YWxrIGFscmVhZHkgY29uc3VtZWRcbiAgICAgICAgLy8gZm9yIHRoZSBzYW1lIGVudGl0eSBpdCBpcyBhIHN0cmFnZ2xlciBmcm9tIGEgY29uY3VycmVudCByZXBsYXk6XG4gICAgICAgIC8vIHN0ZXAgb3ZlciBpdCBpbiB0aGlzIHBhc3MgcmF0aGVyIHRoYW4gcGF5aW5nIHRoZSBkZWZlcnJlZCB3aW5kb3cgZm9yXG4gICAgICAgIC8vIGEgY29uc3VtZXIgdGhhdCBjYW5ub3QgY29tZSAoc2VlIGBmaXJzdEV2ZW50VHlwZU9mQ2xhc3NgKS5cbiAgICAgICAgY29uc3QgZmlyc3RUeXBlID0gdGhpcy5maXJzdEV2ZW50VHlwZU9mQ2xhc3MoY3VycmVudEV2ZW50KTtcbiAgICAgICAgaWYgKGZpcnN0VHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5za2lwRHVwbGljYXRlRXZlbnQoY3VycmVudEV2ZW50LCBmaXJzdFR5cGUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2NoZWR1bGVVbmNvbnN1bWVkQ2hlY2soY3VycmVudEV2ZW50LCB0cnVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gQSByZWFsIGV2ZW50IHdhcyBjb25zdW1lZCwgc28gYWR2YW5jZSB0byB0aGUgbmV4dCBpbiB0aGUgc2FtZSBwYXNzLlxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogT2ZmZXIgYGN1cnJlbnRFdmVudGAgdG8gZWFjaCByZWdpc3RlcmVkIGNhbGxiYWNrIGluIHR1cm4uIFJldHVybnMgdHJ1ZVxuICAgKiB3aGVuIGEgY2FsbGJhY2sgY29uc3VtZWQgaXQuIERvZXMgbm90IG1vdmUge0BsaW5rIGV2ZW50SW5kZXh9OiB0aGUgb3JkZXJlZFxuICAgKiB3YWxrIGFuZCB0aGUgcGFya2VkIGRyYWluIGFkdmFuY2UgZGlmZmVyZW50bHksIHNvIGVhY2ggZG9lcyBpdHMgb3duLlxuICAgKi9cbiAgcHJpdmF0ZSBvZmZlcihjdXJyZW50RXZlbnQ6IEV2ZW50IHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5jYWxsYmFja3NbaV07XG4gICAgICBsZXQgaGFuZGxlZCA9IEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBoYW5kbGVkID0gY2FsbGJhY2soY3VycmVudEV2ZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGV2ZW50c0xvZ2dlci5lcnJvcignRXZlbnRDb25zdW1lciBjYWxsYmFjayB0aHJldyBhbiBlcnJvcicsIHsgZXJyb3IgfSk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGhhbmRsZWQgIT09IEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQgJiZcbiAgICAgICAgaGFuZGxlZCAhPT0gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZFxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRFdmVudCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgY3VycmVudEV2ZW50LmNvcnJlbGF0aW9uSWQgJiZcbiAgICAgICAgICBPTkVfU0hPVF9FVkVOVF9UWVBFUy5oYXMoY3VycmVudEV2ZW50LmV2ZW50VHlwZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yZXNvbHZlZC5hZGQoXG4gICAgICAgICAgICByZXNvbHV0aW9uS2V5KGN1cnJlbnRFdmVudC5ldmVudFR5cGUsIGN1cnJlbnRFdmVudC5jb3JyZWxhdGlvbklkKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWNvcmRFdmVudENsYXNzKGN1cnJlbnRFdmVudCk7XG4gICAgICAgIHRoaXMubGFzdENvbnN1bWVkID0gY3VycmVudEV2ZW50O1xuICAgICAgICB0aGlzLm5vdGlmeUNvbnN1bWVkRXZlbnQoY3VycmVudEV2ZW50KTtcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0aGUgY2FsbGJhY2sgaWYgaXQgaGFzIGZpbmlzaGVkXG4gICAgICBpZiAoaGFuZGxlZCA9PT0gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZCkge1xuICAgICAgICB0aGlzLmNhbGxiYWNrcy5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE9mZmVyIGV2ZXJ5dGhpbmcgcGFya2VkLCBvbGRlc3QgZmlyc3QsIHVudGlsIGEgcGFzcyBjbGFpbXMgbm90aGluZy5cbiAgICpcbiAgICogRWFjaCBvZmZlciBydW5zIHdpdGgge0BsaW5rIGV2ZW50SW5kZXh9IG1vdmVkIGJhY2sgdG8gdGhlIHBvc2l0aW9uIHRoZVxuICAgKiBwYXJrZWQgZXZlbnQgaGVsZCBpbiB0aGUgbG9nLCBiZWNhdXNlIHRoYXQgaXMgdGhlIHBvc2l0aW9uIGl0cyBjb25zdW1lclxuICAgKiB3aWxsIHJlZ2lzdGVyIGEgZGVsaXZlcnkgYmFycmllciB1bmRlci4gUmVzdG9yaW5nIHRoZSB3YWxrIHBvaW50ZXJcbiAgICogYWZ0ZXJ3YXJkcyBpcyB3aGF0IGtlZXBzIHRoZSB0d28gcG9pbnRlcnMgZnJvbSBpbnRlcmZlcmluZy5cbiAgICovXG4gIHByaXZhdGUgZHJhaW5QYXJrZWQoKTogdm9pZCB7XG4gICAgbGV0IHByb2dyZXNzZWQgPSB0aGlzLnBhcmtlZC5sZW5ndGggPiAwO1xuICAgIHdoaWxlIChwcm9ncmVzc2VkKSB7XG4gICAgICBwcm9ncmVzc2VkID0gZmFsc2U7XG4gICAgICB0aGlzLmRyb3BQYXJrZWREdXBsaWNhdGVzKCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFya2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5wYXJrZWRbaV07XG4gICAgICAgIGNvbnN0IHdhbGtJbmRleCA9IHRoaXMuZXZlbnRJbmRleDtcbiAgICAgICAgdGhpcy5ldmVudEluZGV4ID0gZW50cnkuaW5kZXg7XG4gICAgICAgIGxldCBjb25zdW1lZDogYm9vbGVhbjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdW1lZCA9IHRoaXMub2ZmZXIoZW50cnkuZXZlbnQpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRoaXMuZXZlbnRJbmRleCA9IHdhbGtJbmRleDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uc3VtZWQpIHtcbiAgICAgICAgICB0aGlzLnBhcmtlZC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgLy8gQSBgRmluaXNoZWRgIGNhbGxiYWNrIHdhcyBzcGxpY2VkIG91dCBvZiB0aGUgbGlzdCB0aGlzIHBhc3MsIHNvXG4gICAgICAgICAgLy8gcmVzdGFydCByYXRoZXIgdGhhbiBrZWVwIHdhbGtpbmcgYSBtdXRhdGVkIGFycmF5LlxuICAgICAgICAgIHByb2dyZXNzZWQgPSB0aGlzLnBhcmtlZC5sZW5ndGggPiAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2UgYW55dGhpbmcgcGFya2VkIHdob3NlIGNsYXNzIGEgY29uc3VtcHRpb24gaGFzIHNpbmNlIHJlY29yZGVkIGZvclxuICAgKiB0aGUgc2FtZSBlbnRpdHksIG9uIHRoZSBzYW1lIHRlcm1zIGFzIHtAbGluayBza2lwRHVwbGljYXRlRXZlbnR9LlxuICAgKlxuICAgKiBUaGUgb3JkZXJlZCB3YWxrIGRlY2lkZXMgYSBzdHJhZ2dsZXIgYXQgdGhlIGV2ZW50LCBidXQgb25seSBmb3Igb25lIG9mIHRoZVxuICAgKiB0d28gb3JkZXJzIHRoZSBjb3BpZXMgY2FuIGFycml2ZSBpbi4gV2hlbiBuZWl0aGVyIGNvcHkgaGFzIGEgY29uc3VtZXIgeWV0LFxuICAgKiBib3RoIHBhcmsg4oCUIHRoZSB3YWxrIHN0ZXBzIG92ZXIgdGhlIGZpcnN0IGFuZCByZS1lbnRlcnMgaW1tZWRpYXRlbHksIHNvXG4gICAqIHRoZSBzZWNvbmQgaXMgb2ZmZXJlZCBpbiB0aGUgc2FtZSB0aWNrLCB3aXRoIG5vIGNsYXNzIHJlY29yZGVkIGJlY2F1c2VcbiAgICogbm90aGluZyBoYXMgYmVlbiAqY29uc3VtZWQqLiBUaGUgZHJhaW4gdGhlbiBjbGFpbXMgdGhlIGZpcnN0IGFuZCB0aGVcbiAgICogc2Vjb25kIGlzIGxlZnQgaGVsZCBieSBhIGNvbnN1bWVyIGxpc3QgdGhhdCB3aWxsIG5ldmVyIGdyb3cgdGhlIGNhbGxiYWNrXG4gICAqIGl0IG5lZWRzLCB3aGljaCB0aGUgd29ya2Zsb3cgZnVuY3Rpb24gcmV0dXJuaW5nIHJlcG9ydHMgdGhyb3VnaFxuICAgKiB7QGxpbmsgc3RyYW5kZWRFdmVudH0gYXMgYSByZXBsYXkgZGl2ZXJnZW5jZS5cbiAgICpcbiAgICogUnVuIGJlZm9yZSBlYWNoIG9mZmVyIHBhc3MgcmF0aGVyIHRoYW4gb25jZSwgYmVjYXVzZSB0aGUgY29uc3VtcHRpb24gdGhhdFxuICAgKiByZWNvcmRzIHRoZSBjbGFzcyBoYXBwZW5zIGluc2lkZSB0aGUgZHJhaW4gaXRzZWxmLlxuICAgKlxuICAgKiBOb3Qgc3BlY2lmaWMgdG8gYGF0dHJfc2V0YDogYHdhaXRfY29tcGxldGVkYCByZWFjaGVzIHRoZSBzYW1lIHN0YXRlLCBhbmRcbiAgICoge0BsaW5rIE9ORV9TSE9UX0VWRU5UX1RZUEVTfSBvbmx5IGNvdmVycyBpdCBpbiB0aGUgb3JkZXIgd2hlcmUgdGhlXG4gICAqIGNvbnN1bXB0aW9uIGNhbWUgZmlyc3QuXG4gICAqL1xuICBwcml2YXRlIGRyb3BQYXJrZWREdXBsaWNhdGVzKCk6IHZvaWQge1xuICAgIGZvciAobGV0IGkgPSB0aGlzLnBhcmtlZC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLnBhcmtlZFtpXS5ldmVudDtcbiAgICAgIGNvbnN0IGZpcnN0VHlwZSA9IHRoaXMuZmlyc3RFdmVudFR5cGVPZkNsYXNzKGV2ZW50KTtcbiAgICAgIGlmIChmaXJzdFR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGFya2VkLnNwbGljZShpLCAxKTtcbiAgICAgIC8vIFRoZSB3YWxrIGluZGV4IG1vdmVkIHBhc3QgdGhpcyBldmVudCB3aGVuIGl0IHdhcyBwYXJrZWQsIHNvIHVubGlrZVxuICAgICAgLy8gYHNraXBEdXBsaWNhdGVFdmVudGAgdGhlcmUgaXMgbm90aGluZyB0byBhZHZhbmNlIGhlcmUuXG4gICAgICBldmVudHNMb2dnZXIuZGVidWcoXG4gICAgICAgICdSZWxlYXNpbmcgYSBwYXJrZWQgZXZlbnQgdGhhdCByZXBlYXRzIGEgY2xhc3MgYWxyZWFkeSBpbiB0aGUgbG9nJyxcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgICAgICAgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGUsXG4gICAgICAgICAgZmlyc3RFdmVudFR5cGU6IGZpcnN0VHlwZSxcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBldmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5vbkR1cGxpY2F0ZUV2ZW50Py4oZXZlbnQsIGZpcnN0VHlwZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBldmVudHNMb2dnZXIuZXJyb3IoJ29uRHVwbGljYXRlRXZlbnQgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3InLCB7XG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGVwIHRoZSBvcmRlcmVkIHdhbGsgb3ZlciBhbiBldmVudCBub2JvZHkgY2xhaW1lZCwgaG9sZGluZyBvbiB0byBpdCBmb3IgYVxuICAgKiBsYXRlciBjb25zdW1lci4gUmV0dXJucyBmYWxzZSB3aGVuIHRoZSBldmVudCdzIHR5cGUgbWFrZXMgaXRzIHBvc2l0aW9uIGFcbiAgICogZGVjaXNpb24gcmVjb3JkLCB3aGljaCBpcyB0aGUgb25lIGNhc2Ugd2hlcmUgbm9ib2R5IGNsYWltaW5nIGl0IG1lYW5zIHRoZVxuICAgKiByZXBsYXkgZGl2ZXJnZWQuXG4gICAqL1xuICBwcml2YXRlIHBhcmsoZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKCFQQVJLQUJMRV9FVkVOVF9UWVBFUy5oYXMoZXZlbnQuZXZlbnRUeXBlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBldmVudC5jb3JyZWxhdGlvbklkICYmXG4gICAgICB0aGlzLnJlc29sdmVkLmhhcyhyZXNvbHV0aW9uS2V5KGV2ZW50LmV2ZW50VHlwZSwgZXZlbnQuY29ycmVsYXRpb25JZCkpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMucGFya2VkLnB1c2goeyBldmVudCwgaW5kZXg6IHRoaXMuZXZlbnRJbmRleCB9KTtcbiAgICB0aGlzLmV2ZW50SW5kZXgrKztcbiAgICBldmVudHNMb2dnZXIuZGVidWcoJ1BhcmtlZCBhbiB1bmNsYWltZWQgZXZlbnQgZm9yIGxhdGVyIGRlbGl2ZXJ5Jywge1xuICAgICAgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCxcbiAgICAgIGV2ZW50VHlwZTogZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgY29ycmVsYXRpb25JZDogZXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgIHBhcmtlZDogdGhpcy5wYXJrZWQubGVuZ3RoLFxuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBrZXkgYGV2ZW50YCdzIGNsYXNzIGlzIHRyYWNrZWQgdW5kZXIsIG9yIGB1bmRlZmluZWRgIGZvciB0aGUgZXZlbnRzXG4gICAqIHRoYXQgYmVsb25nIHRvIG5vIGNsYXNzIGFuZCBhcmUgdGhlcmVmb3JlIG5ldmVyIHNraXBwZWQ6IHRoZSB0eXBlcyB3aXRoIG5vXG4gICAqIGVudHJ5IGF0IGFsbCAoYGhvb2tfcmVjZWl2ZWRgLCBgaG9va19jb25mbGljdGAsIGBydW5fY3JlYXRlZGApLCBhbmQgYVxuICAgKiBjbGFzc2VkIHR5cGUgY2Fycnlpbmcgbm8gZW50aXR5IHRvIHRyYWNrIGl0IHVuZGVyLlxuICAgKlxuICAgKiB7QGxpbmsgY2xhc3NpZnlFbnRpdHlFdmVudH0gb3ducyB0aGF0IHJ1bGUsIGJlY2F1c2UgdGhlIG9ic2VydmFiaWxpdHkgVUlcbiAgICogZGVjaWRlcyB0aGUgc2FtZSBxdWVzdGlvbiBhYm91dCB0aGUgc2FtZSBsb2cgYW5kIHRoZSB0d28gbXVzdCBub3QgZHJpZnQuXG4gICAqL1xuICBwcml2YXRlIGV2ZW50Q2xhc3NLZXkoZXZlbnQ6IEV2ZW50KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjbGFzc2lmaWNhdGlvbiA9IGNsYXNzaWZ5RW50aXR5RXZlbnQoZXZlbnQpO1xuICAgIHJldHVybiBjbGFzc2lmaWNhdGlvbiA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBgJHtjbGFzc2lmaWNhdGlvbi5ldmVudENsYXNzfToke2NsYXNzaWZpY2F0aW9uLmVudGl0eX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbWVtYmVycyB0aGF0IGBldmVudGAncyBjbGFzcyBpcyBub3cgZGVjaWRlZCBmb3IgaXRzIGVudGl0eSwgaWYgdGhlIHR5cGVcbiAgICogYmVsb25ncyB0byBhIGNsYXNzLiBGaXJzdCB3cml0ZXIgd2luczogdGhlIHJlY29yZGVkIHR5cGUgaXMgdGhlIG9uZSB0aGVcbiAgICogd29ya2Zsb3cgb2JzZXJ2ZWQsIGFuZCBhIGxhdGVyIHJlcGVhdCBpcyBtZWFzdXJlZCBhZ2FpbnN0IGl0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWNvcmRFdmVudENsYXNzKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZXZlbnRDbGFzc0tleShldmVudCk7XG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkICYmICF0aGlzLnNlZW5FdmVudENsYXNzZXMuaGFzKGtleSkpIHtcbiAgICAgIHRoaXMuc2VlbkV2ZW50Q2xhc3Nlcy5zZXQoa2V5LCBldmVudC5ldmVudFR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSB0aGF0IGFscmVhZHkgZGVjaWRlZCBgZXZlbnRgJ3MgY2xhc3MgZm9yIHRoZSBzYW1lIGVudGl0eSwgb3JcbiAgICogYHVuZGVmaW5lZGAgd2hlbiBub3RoaW5nIGhhczogYSBzZWNvbmQgYHN0ZXBfY3JlYXRlZGAgZm9yIG9uZSBzdGVwLCBhXG4gICAqIHNlY29uZCB0ZXJtaW5hbCBvdXRjb21lLCBhIHNlY29uZCBgc3RlcF9zdGFydGVkYCBhZnRlciB0aGUgc3RlcCdzIHJlc3VsdCBpc1xuICAgKiBhbHJlYWR5IGluIHRoZSBsb2cuXG4gICAqXG4gICAqIFN1Y2ggYW4gZXZlbnQgaXMgY29tbWl0dGVkIGJ1dCBpbmVydC4gQ29uY3VycmVudCByZXBsYXlzIHdyaXRlIGludG8gb25lXG4gICAqIGxvZyB3aXRob3V0IGEgY3VycmVuY3kgZ3VhcmQsIHNvIGEgcmVwbGF5IHdvcmtpbmcgZnJvbSBhIHByZWZpeCB0aGF0XG4gICAqIHByZWRhdGVzIGFub3RoZXIgcmVwbGF5J3Mgd3JpdGUgY2FuIGNvbW1pdCBpdHMgb3duIGNvcHkgb2Ygd29yayB0aGUgbG9nXG4gICAqIGFscmVhZHkgcmVjb3Jkcy4gVGhhdCBjb3B5IGNhbm5vdCBjaGFuZ2Ugd2hhdCB0aGUgd29ya2Zsb3cgb2JzZXJ2ZWQ6IHRoZVxuICAgKiBvdXRjb21lIHdhcyBkZWNpZGVkIGJ5IHRoZSBmaXJzdCBldmVudCBvZiB0aGUgY2xhc3MgYW5kIGV2ZXJ5IGxhdGVyIHJlcGxheVxuICAgKiByZWFkcyB0aGF0IHNhbWUgZXZlbnQgYXQgdGhlIHNhbWUgbG9nIHBvc2l0aW9uLCBzbyBpZ25vcmluZyB0aGUgc3RyYWdnbGVyXG4gICAqIGlzIGRldGVybWluaXN0aWMgYWNyb3NzIHJlcGxheXMuXG4gICAqXG4gICAqIENsYXNzZXMgYXJlIHRyYWNrZWQgc2VwYXJhdGVseSwgc28gcGFzc2luZyBvbmUgZG9lcyBub3Qgc3VwcHJlc3MgYW5vdGhlci5cbiAgICogQSBzdGVwIHdob3NlIHJlc3VsdCBpcyBpbiB0aGUgbG9nIHN0aWxsIHJlYWNoZXMgaXRzIGBzdGVwX2NyZWF0ZWRgIGFuZFxuICAgKiBgc3RlcF9zdGFydGVkYCBjb25zdW1lcnMgaWYgaXQgaGFzIHlldCB0byBzZWUgdGhvc2UgY2xhc3Nlcy5cbiAgICpcbiAgICogQ29uc3VsdGVkIG9ubHkgYWZ0ZXIgZXZlcnkgcmVnaXN0ZXJlZCBjYWxsYmFjayBoYXMgZGVjbGluZWQgdGhlIGV2ZW50LCBzb1xuICAgKiBpdCBjYW4gbmV2ZXIgdGFrZSBhbiBldmVudCBhIGNvbnN1bWVyIHdhbnRlZC4gQSByZXRyeSdzIGBzdGVwX3N0YXJ0ZWRgIGlzXG4gICAqIGNsYWltZWQgYnkgdGhlIHN0ZXAncyBsaXZlIGNvbnN1bWVyIGFuZCBjb3VudHMgYXMgYW4gYXR0ZW1wdCBleGFjdGx5IGFzXG4gICAqIGJlZm9yZSwgYW5kIGEgc2Vjb25kIGBzdGVwX2NyZWF0ZWRgIHJlYWNoaW5nIGEgc3RlcCB0aGF0IGhhcyBub3QgZmluaXNoZWRcbiAgICogaXMgbGlrZXdpc2UgY29uc3VtZWQgcmF0aGVyIHRoYW4gc2tpcHBlZDsgb25seSB0aGUgY29waWVzIG5vYm9keSBjbGFpbXMgYXJlXG4gICAqIHNraXBwZWQuXG4gICAqXG4gICAqIFVubGlrZSB0aGUgZGl2ZXJnZW5jZSByZXBvcnQsIHRoaXMgZG9lcyAqbm90KiB3YWl0IG91dCB0aGUgZGVmZXJyZWQgd2luZG93XG4gICAqIGZpcnN0LCBhbmQgaXQgZG9lcyBub3QgbmVlZCB0by4gVGhlIHdpbmRvdyBidXlzIHRpbWUgZm9yIGEgY29uc3VtZXIgdGhhdFxuICAgKiBoYXMgeWV0IHRvIHJlZ2lzdGVyLCBhbmQgbm8gc3VjaCBjb25zdW1lciBjYW4gd2FudCB0aGlzIGV2ZW50OiB0aGUgY2xhc3NcbiAgICogd2FzIHJlY29yZGVkIGJ5IGEgY29uc3VtcHRpb24gaW4gdGhpcyBzYW1lIHJlcGxheSwgd2hpY2ggbWVhbnMgdGhlIGVudGl0eSdzXG4gICAqIGNvbnN1bWVyIHdhcyByZWdpc3RlcmVkIGFuZCB0b29rIGFuIGV2ZW50IG9mIHRoaXMgY2xhc3MsIGFuZCBjb3JyZWxhdGlvblxuICAgKiBpZHMgYXJlIG1pbnRlZCBmcm9tIGEgbW9ub3RvbmljIFVMSUQgcGVyIGJvZHkgcG9zaXRpb24sIHNvIG5vdGhpbmcgbGF0ZXIgaW5cbiAgICogdGhlIGJvZHkgcmVnaXN0ZXJzIGEgc2Vjb25kIGNvbnN1bWVyIHVuZGVyIHRoaXMgaWQuIFdhaXRpbmcgd291bGQgY29zdFxuICAgKiBgZ2V0RGVmZXJyZWRDaGVja0RlbGF5TXMoKWAgcGVyIHN0cmFnZ2xlciBwZXIgcmVwbGF5IGZvciBpbmZvcm1hdGlvbiB0aGF0XG4gICAqIGNhbm5vdCBhcnJpdmU6IDAuNzUlIG9mIHByb2R1Y3Rpb24gcnVucyBjYXJyeSBhdCBsZWFzdCBvbmUgc3RyYWdnbGVyLCBhbmRcbiAgICogdGhlIHA5OSBhbW9uZyB0aG9zZSBjYXJyaWVzIDE1NS5cbiAgICpcbiAgICogVGhlIGludmFyaWFudCB0byBwcmVzZXJ2ZSBpZiBob29rIGlkZW50aXR5IGV2ZXIgYmVjb21lcyBjYWxsZXItc3VwcGxpZWRcbiAgICogKGFuIGlkZW1wb3RlbmN5IGtleSByYXRoZXIgdGhhbiBhIG1pbnRlZCBpZCk6IHR3byBgY3JlYXRlSG9va2AgY2FsbHMgaW4gb25lXG4gICAqIGJvZHkgY291bGQgdGhlbiBzaGFyZSBhIGNvcnJlbGF0aW9uIGlkLCBhbmQgdGhlIHNlY29uZCBjb25zdW1lcidzXG4gICAqIGBob29rX2NyZWF0ZWRgIHdvdWxkIGJlIGEgcmVwZWF0IG9mIGEgY2xhc3MgdGhpcyByZXBsYXkgYWxyZWFkeSByZWNvcmRlZC5cbiAgICogVGhhdCB3b3VsZCBtYWtlIHNraXBwaW5nIHdyb25nIGZvciBgaG9va19jcmVhdGVkYCwgYW5kIGlzIHRoZSByZWFzb24gdGhlXG4gICAqIGNsYXNzIG1hcCBsaXZlcyBuZXh0IHRvIHRoZSBldmVudCB0eXBlcyByYXRoZXIgdGhhbiBiZWluZyBpbmZlcnJlZC5cbiAgICovXG4gIHByaXZhdGUgZmlyc3RFdmVudFR5cGVPZkNsYXNzKGV2ZW50OiBFdmVudCk6IEV2ZW50WydldmVudFR5cGUnXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5ldmVudENsYXNzS2V5KGV2ZW50KTtcbiAgICByZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0aGlzLnNlZW5FdmVudENsYXNzZXMuZ2V0KGtleSk7XG4gIH1cblxuICAvKipcbiAgICogU3RlcHMgdGhlIHdhbGsgb3ZlciBhIHNlYWxlZC1sb2cgYG5vb3BgIChzcGVjVmVyc2lvbiA+PSA3KTogdGhlIFdvcmxkJ3NcbiAgICogYmFja2VuZCB3cm90ZSBpdCB0byBvY2N1cHkgYSBzbG90IHdob3NlIHdyaXRlciBhbGxvY2F0ZWQgdGhlIHBvc2l0aW9uIGFuZFxuICAgKiBkaWVkLCBzbyB0aGUgbG9nJ3MgZGVuc2l0eSBhcml0aG1ldGljIGhvbGRzLiBJdCBpcyBpbnZpc2libGUgdG8gdGhlXG4gICAqIHdvcmtmbG93OiBubyBjb25zdW1lciBpcyBvZmZlcmVkIGl0LCBubyBldmVudCBjbGFzcyBpcyByZWNvcmRlZCwgYW5kIHRoZVxuICAgKiBkZXRlcm1pbmlzdGljIGNsb2NrIGRvZXMgbm90IGFkdmFuY2UsIGV4YWN0bHkgYXMgd2l0aFxuICAgKiB7QGxpbmsgc2tpcER1cGxpY2F0ZUV2ZW50fSwgc28gYSBsb2cgdGhhdCBoYXBwZW5zIHRvIGNvbnRhaW4gb25lIHByb2R1Y2VzIHRoZSBzYW1lXG4gICAqIHRpbWVzdGFtcHMgYXMgYSBsb2cgdGhhdCBkb2VzIG5vdC4gKEl0cyBgY3JlYXRlZEF0YCBpcyB0aGUgc2VhbCB0aW1lLFxuICAgKiB3aGljaCBjYW4gZXZlbiBwb3N0ZGF0ZSBsYXRlciBzbG90cycgZXZlbnRzOyBsZXR0aW5nIGl0IHRvdWNoIHRoZSBjbG9ja1xuICAgKiB3b3VsZCBsZWFrIHRoZSBzZWFsZXIncyB3YWxsIGNsb2NrIGludG8gcmVwbGF5LilcbiAgICovXG4gIHByaXZhdGUgc2tpcFNlYWxlZE5vb3AoZXZlbnQ6IEV2ZW50KSB7XG4gICAgdGhpcy5ldmVudEluZGV4Kys7XG4gICAgZXZlbnRzTG9nZ2VyLmRlYnVnKCdTa2lwcGluZyBzZWFsZWQtbG9nIG5vb3AgZXZlbnQnLCB7XG4gICAgICBldmVudElkOiBldmVudC5ldmVudElkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFN0ZXBzIHRoZSB3YWxrIG92ZXIgYSByZXBlYXQgb2YgYW4gYWxyZWFkeS1jb25zdW1lZCBjbGFzcy4gKi9cbiAgcHJpdmF0ZSBza2lwRHVwbGljYXRlRXZlbnQoZXZlbnQ6IEV2ZW50LCBmaXJzdFR5cGU6IEV2ZW50WydldmVudFR5cGUnXSkge1xuICAgIHRoaXMuZXZlbnRJbmRleCsrO1xuICAgIC8vIERlbGliZXJhdGVseSBub3Qgcm91dGVkIHRocm91Z2ggYG5vdGlmeUNvbnN1bWVkRXZlbnRgOiB0aGUgZGV0ZXJtaW5pc3RpY1xuICAgIC8vIGNsb2NrIGFkdmFuY2VzIG9ubHkgb24gZXZlbnRzIHRoZSB3b3JrZmxvdyBhY3R1YWxseSBvYnNlcnZlZC4gQSBza2lwcGVkXG4gICAgLy8gZXZlbnQgaXMgaW52aXNpYmxlIHRvIHRoZSB3b3JrZmxvdyBib2R5LCBhbmQgYSBsb2cgdGhhdCBoYXBwZW5zIHRvXG4gICAgLy8gY29udGFpbiBvbmUgbXVzdCBwcm9kdWNlIHRoZSBzYW1lIHRpbWVzdGFtcHMgYXMgYSBsb2cgdGhhdCBkb2VzIG5vdC5cbiAgICBldmVudHNMb2dnZXIuZGVidWcoXG4gICAgICAnU2tpcHBpbmcgZXZlbnQgdGhhdCByZXBlYXRzIGEgY2xhc3MgYWxyZWFkeSBpbiB0aGUgbG9nJyxcbiAgICAgIHtcbiAgICAgICAgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCxcbiAgICAgICAgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGUsXG4gICAgICAgIGZpcnN0RXZlbnRUeXBlOiBmaXJzdFR5cGUsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IGV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICB9XG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5vbkR1cGxpY2F0ZUV2ZW50Py4oZXZlbnQsIGZpcnN0VHlwZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGV2ZW50c0xvZ2dlci5lcnJvcignb25EdXBsaWNhdGVFdmVudCBjYWxsYmFjayB0aHJldyBhbiBlcnJvcicsIHtcbiAgICAgICAgZXJyb3IsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVuZE9mTG9nKCkge1xuICAgIC8vIEV2ZXJ5dGhpbmcgc3RpbGwgcGFya2VkIGlzIHdhaXRpbmcgZm9yIGEgY29uc3VtZXIgc29tZSBsYXRlciByZXBsYXkgd2lsbFxuICAgIC8vIHJlZ2lzdGVyLCB3aGljaCBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgcGFya2luZywgZXhjZXB0IG9uY2UgdGhlIGxvZ1xuICAgIC8vIGFscmVhZHkgaG9sZHMgdGhlIHJ1bidzIHRlcm1pbmFsIGV2ZW50LCBiZWNhdXNlIHRoZW4gdGhlcmUgaXMgbm8gbGF0ZXJcbiAgICAvLyByZXBsYXkgYW5kIG5vIGNvbnN1bWVyIHdpbGwgZXZlciBjb21lLlxuICAgIGlmICh0aGlzLnBhcmtlZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGFzdCA9IHRoaXMuZXZlbnRzLmF0KC0xKTtcbiAgICBpZiAoIWxhc3QgfHwgIVRFUk1JTkFMX0VWRU5UX1RZUEVTLmhhcyhsYXN0LmV2ZW50VHlwZSkpIHtcbiAgICAgIC8vIEEgbGF0ZXIgcmVwbGF5IGlzIHN0aWxsIGV4cGVjdGVkLCBzbyBub3RoaW5nIGhlcmUgaXMgZGVjaWRhYmxlIGFuZFxuICAgICAgLy8gZXNjYWxhdGluZyB3b3VsZCBmYWlsIHRoZSBoZWFsdGh5IHJ1bnMgcGFya2luZyBleGlzdHMgdG8ga2VlcCBhbGl2ZS5cbiAgICAgIC8vIFJlYWNoaW5nIHRoZSBlbmQgb2YgdGhlIGxvZyBob2xkaW5nIHNvbWV0aGluZyBpcyBub3QgYnkgaXRzZWxmIGEgZmF1bHQsXG4gICAgICAvLyBzbyB0aGlzIHN0YXlzIGF0IGBkZWJ1Z2A7IHtAbGluayBwYXJrZWRTdW1tYXJ5fSBpcyB3aGF0IGNhcnJpZXMgdGhlXG4gICAgICAvLyBzdGF0ZSB0byB0aGUgc3Bhbiwgd2hlcmUgYSBydW4gdGhhdCBrZWVwcyBzdG9wcGluZyBvbiB0aGUgc2FtZSBoZWxkXG4gICAgICAvLyBldmVudCBpcyB2aXNpYmxlIGFuZCBhIHNpbmdsZSByZXBsYXkncyB2aWV3IGlzIG5vdC5cbiAgICAgIGV2ZW50c0xvZ2dlci5kZWJ1ZygnUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBsb2cgc3RpbGwgaG9sZGluZyBldmVudHMnLCB7XG4gICAgICAgIGV2ZW50SWQ6IHRoaXMucGFya2VkWzBdLmV2ZW50LmV2ZW50SWQsXG4gICAgICAgIGV2ZW50VHlwZTogdGhpcy5wYXJrZWRbMF0uZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiB0aGlzLnBhcmtlZFswXS5ldmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgICBwYXJrZWQ6IHRoaXMucGFya2VkLmxlbmd0aCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNjaGVkdWxlVW5jb25zdW1lZENoZWNrKHRoaXMucGFya2VkWzBdLmV2ZW50LCBmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlVW5jb25zdW1lZENoZWNrKGN1cnJlbnRFdmVudDogRXZlbnQsIG1heVBhcms6IGJvb2xlYW4pIHtcbiAgICAvLyBBbGwgY2FsbGJhY2tzIHJldHVybmVkIE5vdENvbnN1bWVkIGZvciB0aGUgY3VycmVudCBldmVudC5cbiAgICAvLyBTY2hlZHVsZSBhIGRlZmVycmVkIGNoZWNrLiBXZSBjaGFpbiBvbnRvIHRoZSBwcm9taXNlUXVldWUgc28gdGhhdCBhbnlcbiAgICAvLyBwZW5kaW5nIGFzeW5jIHdvcmsgKGUuZy4sIGRlc2VyaWFsaXphdGlvbi9kZWNyeXB0aW9uIHRoYXQgdHJpZ2dlcnNcbiAgICAvLyByZXNvbHZlKCkg4oaSIHVzZXIgY29kZSDihpIgc3Vic2NyaWJlKCkpIGNvbXBsZXRlcyBmaXJzdC4gSWYgdGhlIGV2ZW50XG4gICAgLy8gaXMgc3RpbGwgdW5jb25zdW1lZCBhZnRlciB0aGUgcXVldWUgZHJhaW5zLCBpdCdzIHRydWx5IG9ycGhhbmVkLCBvcixcbiAgICAvLyB3aGVuIGl0cyB0eXBlIGNhcnJpZXMgbm8gb3JkZXJpbmcgY2xhaW0sIHBhcmtlZCBmb3IgYSBsYXRlciBjb25zdW1lci5cbiAgICBjb25zdCBjaGVja1ZlcnNpb24gPSArK3RoaXMudW5jb25zdW1lZENoZWNrVmVyc2lvbjtcbiAgICB0aGlzLnBlbmRpbmdVbmNvbnN1bWVkQ2hlY2sgPSB0aGlzLmdldFByb21pc2VRdWV1ZSgpXG4gICAgICAudGhlbihcbiAgICAgICAgLy8gWWllbGQgb25jZSBhZnRlciB0aGUgZmlyc3QgcXVldWUgZHJhaW4gc28gcHJvbWlzZSBjaGFpbnMgcmVzdW1lZCBieVxuICAgICAgICAvLyB0aGF0IGRyYWluIGNhbiBydW4gYWNyb3NzIHRoZSBWTSBib3VuZGFyeSBhbmQgYXBwZW5kIGFueSBmb2xsb3ctdXBcbiAgICAgICAgLy8gYXN5bmMgd29yayAoZm9yIGV4YW1wbGU6IHN0ZXBfY29tcGxldGVkIHJlc29sdmVzIC0+IGZvci1hd2FpdCBsb29wXG4gICAgICAgIC8vIHJlc3VtZXMgLT4gdGhlIG5leHQgaG9vayBwYXlsb2FkIHN0YXJ0cyBoeWRyYXRpbmcpLlxuICAgICAgICAoKSA9PiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAwKSlcbiAgICAgIClcbiAgICAgIC50aGVuKCgpID0+IHRoaXMuZ2V0UHJvbWlzZVF1ZXVlKCkpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIC8vIFdhaXQgb3V0IGFueSBkZWxpdmVyeSBzdGlsbCBpbiBmbGlnaHQgYmVmb3JlIHN0YXJ0aW5nIHRoZSB0aW1lci5cbiAgICAgICAgLy8gVGhlIHF1ZXVlIGRyYWluaW5nIHNheXMgdGhlIGhvc3QgaGFzIG5vIGh5ZHJhdGlvbiB3b3JrIGxlZnQ7IGl0XG4gICAgICAgIC8vIGRvZXMgbm90IHNheSB0aGUgVk0gaGFzIGZpbmlzaGVkIHJlYWN0aW5nIHRvIHdoYXQgd2FzIGh5ZHJhdGVkLlxuICAgICAgICB0aGlzLndoZW5EZWxpdmVyeUlkbGUoY2hlY2tWZXJzaW9uLCAoKSA9PiB7XG4gICAgICAgICAgLy8gVXNlIGEgZGVsYXllZCBzZXRUaW1lb3V0IG9uY2UgZGVsaXZlcmllcyBhcmUgaWRsZS4gVGhlIGRlbGF5IG11c3RcbiAgICAgICAgICAvLyBiZSBsb25nIGVub3VnaCBmb3IgcHJvbWlzZSBjaGFpbnMgdG8gcHJvcGFnYXRlIGFjcm9zcyB0aGUgVk1cbiAgICAgICAgICAvLyBib3VuZGFyeSAoZnJvbSByZXNvbHZlKCkgaW4gdGhlIGhvc3QgY29udGV4dCB0aHJvdWdoIHRvIHRoZVxuICAgICAgICAgIC8vIHdvcmtmbG93IGNvZGUgY2FsbGluZyBzdWJzY3JpYmUoKSBpbiB0aGUgVk0gY29udGV4dCkuIE5vZGUuanMgZG9lc1xuICAgICAgICAgIC8vIG5vdCBndWFyYW50ZWUgdGhhdCBzZXRUaW1lb3V0KDApIGZpcmVzIGFmdGVyIGFsbCBjcm9zcy1jb250ZXh0XG4gICAgICAgICAgLy8gbWljcm90YXNrcyBzZXR0bGUsIHNvIHdlIHVzZSBhIHNtYWxsIGJ1dCBub24temVybyBkZWxheS4gQW55XG4gICAgICAgICAgLy8gc3Vic2NyaWJlKCkgY2FsbCB0aGF0IGFycml2ZXMgZHVyaW5nIHRoaXMgd2luZG93IHdpbGwgY2FuY2VsIHRoZVxuICAgICAgICAgIC8vIGNoZWNrIHZpYSB2ZXJzaW9uIGludmFsaWRhdGlvbiArIGNsZWFyVGltZW91dC5cbiAgICAgICAgICB0aGlzLnBlbmRpbmdVbmNvbnN1bWVkVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMudW5jb25zdW1lZENoZWNrVmVyc2lvbiAhPT0gY2hlY2tWZXJzaW9uKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1VuY29uc3VtZWRDaGVjayA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVVbmNvbnN1bWVkRXZlbnQoY3VycmVudEV2ZW50LCBtYXlQYXJrKTtcbiAgICAgICAgICB9LCBnZXREZWZlcnJlZENoZWNrRGVsYXlNcygpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGUgd2hhdCBhIHN0aWxsLXVuY29uc3VtZWQgZXZlbnQgaXMsIG5vdyB0aGF0IHRoZSBwcm9taXNlIHF1ZXVlIGhhc1xuICAgKiBkcmFpbmVkIGFuZCB0aGUgZGVsaXZlcnkgZ2F0ZSBzYXlzIHRoZSBWTSBpcyBub3QgbWlkLXJlYWN0aW9uLlxuICAgKlxuICAgKiBgbWF5UGFya2AgaXMgZmFsc2Ugb25seSBmb3IgdGhlIGVuZC1vZi1sb2cgcmVjaGVjayBvZiBhbiBldmVudCB7QGxpbmsgcGFya31cbiAgICogYWxyZWFkeSBob2xkcy4gTm90aGluZyBpbiB0aGUgZmlyc3QgYnJhbmNoIGFwcGxpZXMgdG8gb25lIG9mIHRob3NlOiBpdCBpc1xuICAgKiBub3QgdGhlIGV2ZW50IGF0IHRoZSBjdXJzb3IsIHNvIHRoZSBpZGVudGl0eSBndWFyZCBpcyBub3QgbWVhbmluZ2Z1bCwgYW5kXG4gICAqIGl0IGlzIHBhcmtlZCBhbHJlYWR5LlxuICAgKlxuICAgKiBBIGR1cGxpY2F0ZSBjbGFzcyBuZXZlciBhcnJpdmVzIGhlcmUuIHtAbGluayBjb25zdW1lfSBzdGVwcyBvdmVyIG9uZSBpbiB0aGVcbiAgICogcGFzcyB0aGF0IG9mZmVyZWQgaXQsIGJlZm9yZSB0aGlzIGNoZWNrIGlzIGV2ZXIgc2NoZWR1bGVkLCBhbmQgYSBjbGFzc1xuICAgKiByZWNvcmRlZCB3aGlsZSB0aGUgY2hlY2sgd2FzIGluIGZsaWdodCBjYW4gb25seSBoYXZlIGJlZW4gcmVjb3JkZWQgYnkgYVxuICAgKiBjb25zdW1wdGlvbiBpbnNpZGUge0BsaW5rIGNvbnN1bWV9LCB3aG9zZSBuZXh0IHBhc3MgcmUtb2ZmZXJzIHRoaXMgZXZlbnRcbiAgICogYW5kIHN0ZXBzIG92ZXIgaXQgdGhlcmUsIGxlYXZpbmcgdGhlIGlkZW50aXR5IGd1YXJkIGFib3ZlIHRvIGRyb3AgdGhlXG4gICAqIGluLWZsaWdodCBjaGVjay4gT25lIHRoYXQgcGFya3MgYmVmb3JlIGFueSBjb25zdW1wdGlvbiByZWNvcmRzIGl0cyBjbGFzc1xuICAgKiBpcyByZWxlYXNlZCBsYXRlciBieSB7QGxpbmsgZHJvcFBhcmtlZER1cGxpY2F0ZXN9IGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVVbmNvbnN1bWVkRXZlbnQoY3VycmVudEV2ZW50OiBFdmVudCwgbWF5UGFyazogYm9vbGVhbikge1xuICAgIGlmIChtYXlQYXJrKSB7XG4gICAgICBpZiAodGhpcy5ldmVudHNbdGhpcy5ldmVudEluZGV4XSAhPT0gY3VycmVudEV2ZW50KSB7XG4gICAgICAgIC8vIEFuIGFwcGVuZCgpIGRyYWluIGNsYWltZWQgaXQgd2hpbGUgdGhlIGNoZWNrIHdhcyBpbiBmbGlnaHQuXG4gICAgICAgIC8vIE9ubHkgc3Vic2NyaWJlKCkgY2FuY2VscyB0aGUgY2hlY2ssIHNvIHRoaXMgaXMgcmVhY2hhYmxlLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wYXJrKGN1cnJlbnRFdmVudCkpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vblVuY29uc3VtZWRFdmVudChjdXJyZW50RXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBgZm5gIG9uY2Ugbm8gZGF0YSBkZWxpdmVyeSBpcyBpbiBmbGlnaHQsIHBvbGxpbmcgdGhlIHdheVxuICAgKiBgc2NoZWR1bGVXaGVuSWRsZWAgZG9lczogbGV0IHRoZSBwcm9taXNlIHF1ZXVlIGRyYWluLCByZS1jaGVjayBhIHRpbWVyXG4gICAqIHRpY2sgbGF0ZXIsIHJlcGVhdC5cbiAgICpcbiAgICogV2l0aG91dCB0aGlzIHRoZSBjaGVjayBpcyBhIGJldCB0aGF0IGV2ZXJ5IGRlbGl2ZXJ5IHRoZSB3YWxrIGlzIHJ1bm5pbmdcbiAgICogYWhlYWQgb2YgbGFuZHMgaW5zaWRlIGEgZml4ZWQgd2luZG93LiBDb25zdW1wdGlvbiBpcyBzeW5jaHJvbm91cyB3aGlsZSB0aGVcbiAgICogcmVzb2x1dGlvbiBpdCB0cmlnZ2VycyBpcyBub3Q6IGEgc3RlcCByZXN1bHQgaHlkcmF0ZXMgaW4gdGhlIGhvc3QsIHJlc29sdmVzXG4gICAqIGZyb20gYSBkZXRhY2hlZCBjb250aW51YXRpb24gYmVoaW5kIGBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzYCwgYW5kIG9ubHkgdGhlblxuICAgKiBkb2VzIFZNIGNvZGUgcnVuIGZhciBlbm91Z2ggdG8gc3Vic2NyaWJlIHRoZSBuZXh0IGNvbnN1bWVyLiBSZXBsYXlpbmcgYVxuICAgKiBiYXRjaCBvZiBOIHBhcmFsbGVsIHN0ZXAgcmVzdWx0cyBsZWF2ZXMgTi0xIG9mIHRoZW0gb24gdGhhdCBkZXRhY2hlZCBwYXRoXG4gICAqIHdpdGggdGhlIHF1ZXVlIGFscmVhZHkgZHJhaW5lZCwgc28gdGhlIHdhbGsgc2l0cyBvbiB0aGUgb3JkZXJlZCBldmVudCB0aGVcbiAgICogVk0gaXMgYWJvdXQgdG8gZHJhdyBhbmQgdGhlIHdpbmRvdyBpcyB0aGUgb25seSB0aGluZyBzdGFuZGluZyBiZXR3ZWVuIGFcbiAgICogaGVhbHRoeSBydW4gYW5kIGBSZXBsYXlEaXZlcmdlbmNlRXJyb3JgLlxuICAgKlxuICAgKiBTaG9ydGVuaW5nIHRoZSB3aW5kb3cgc2hvd3MgdGhhdCBtZWNoYW5pc20gZGlyZWN0bHk6IG9uIGlkZW50aWNhbCBldmVudCBsb2dzXG4gICAqIHRoZSBsb2NhbCByYWNlIHJlcHJvIGNvcnJ1cHRzIDM0IG9mIDQyIHJ1bnMgYXQgYSAxMG1zIHdpbmRvdyBhbmQgMCBvZiAxMTQgYXRcbiAgICogdGhlIDEwMG1zIGRlZmF1bHQuIFRoYXQgbWVhc3VyZXMgaG93IHRoZSBiZXQgbG9zZXMsIG5vdCB0aGF0IHRoZSBkZWZhdWx0XG4gICAqIGxvc2VzIGl0LCBhbmQgbm8gbWVhc3VyZW1lbnQgb2YgYSBkZWxpdmVyeSBvdXRydW5uaW5nIDEwMG1zIGV4aXN0cyBlaXRoZXJcbiAgICogd2F5LiBTbyByZWFkIHRoaXMgYXMgcmV0aXJpbmcgdGhlIGJldCByYXRoZXIgdGhhbiBhcyByZXBhaXJpbmcgYW4gb2JzZXJ2ZWRcbiAgICogZmFpbHVyZSBvZiB0aGF0IG51bWJlcjogdGhlIGRlbGF5IGlzIGEgdXNlci1zZXR0YWJsZSBlbnYgb3ZlcnJpZGUsIHdoaWNoXG4gICAqIGxlYXZlcyB0aGUgb2xkIGJlaGF2aW9yIG9uZSBjb25maWd1cmF0aW9uIGF3YXkgZnJvbSBsb3Npbmcgb24gYW55IGJhY2tlbmQuXG4gICAqXG4gICAqIFRlcm1pbmF0aW9uIGlzIGBoYXNQYXJrZWRDb21taXR0ZWREZWxpdmVyeWAnczogaXQgY291bnRzIG9ubHkgZGVsaXZlcmllc1xuICAgKiB0aGF0IHJlc29sdmUgb24gdGhlaXIgb3duLCBzbyBub3RoaW5nIGhlcmUgY2FuIGdhdGUgaXRzIG93biByZXRpcmVtZW50LiBBXG4gICAqIGdlbnVpbmVseSBvcnBoYW5lZCBldmVudCBoYXMgbm8gZGVsaXZlcnkgdG8gd2FpdCBvbiBhbmQgcmVhY2hlcyBgZm5gIG9uIHRoZVxuICAgKiBmaXJzdCBwb2xsLlxuICAgKlxuICAgKiBXaGF0IHRoZSBnYXRlIGdpdmVzIHVwOiBmb3IgdGhlIG9yZGVyZWQgZXZlbnRzIHRoYXQgc3RpbGwgcmVhY2hcbiAgICogYG9uVW5jb25zdW1lZEV2ZW50YCByYXRoZXIgdGhhbiB7QGxpbmsgcGFya30sIHRoaXMgc3RvcHMgYmVpbmcgdGhlIHRoaW5nXG4gICAqIHRoYXQgY2F0Y2hlcyBhIGRpdmVyZ2VkIGxvZyB3aGlsZSBhIGRlbGl2ZXJ5IGlzIGluIGZsaWdodC4gVGhlIHN1c3BlbnNpb25cbiAgICogYW5kIHRoaXMgY2hlY2sgbm93IHdha2UgZnJvbSB0aGUgc2FtZSBgaXNEZWxpdmVyeUlkbGVgIGVkZ2UsIGFuZFxuICAgKiBgc2NoZWR1bGVXaGVuSWRsZWAgZmlyZXMgb24gdGhlIGZpcnN0IHRpbWVyIHRpY2sgYWZ0ZXIgaWRsZSB3aGlsZSB0aGlzIHdhaXRzXG4gICAqIGEgZnVydGhlciBgZ2V0RGVmZXJyZWRDaGVja0RlbGF5TXMoKWAuIFNvIGEgcnVuIHdpdGggYSBwZW5kaW5nIGBzbGVlcCgpYFxuICAgKiBzdXNwZW5kcyBmaXJzdCwgYW5kIGBvbldvcmtmbG93RXJyb3JgIGRyb3BzIHRoZSBkaXZlcmdlbmNlIGFycml2aW5nIHNlY29uZFxuICAgKiAoaXRzIGAnc3VzcGVuZGVkJ2AgYnJhbmNoIGRlbW90ZXMgdG8gYCdyZXBsYXknYCBhbmQgc3VyZmFjZXMgbm90aGluZyksXG4gICAqIGxlYXZpbmcgYSBsYXRlciBgcmVzdW1lKClgIHRvIGRlY2xpbmUgaW50byBhIGNvbGQgcmVwbGF5LiBQcmUtZ2F0ZSB0aGVcbiAgICogc3VzcGVuc2lvbiBhbHJlYWR5IHdvbiB0aGF0IHJhY2Ugd2hlbmV2ZXIgdGhlIGRlbGl2ZXJ5IGxhbmRlZCBpbnNpZGUgdGhlXG4gICAqIGZpeGVkIHdpbmRvdywgc28gd2hhdCBjaGFuZ2VkIGlzIHRoYXQgdGhlIG91dGNvbWUgc3RvcHBlZCBkZXBlbmRpbmcgb25cbiAgICogdGltaW5nLiBOb3RoaW5nIHNob3VsZCB0cmVhdCB0aGlzIGNoZWNrIGFzIHRoZSBtZWNoYW5pc20gdGhhdCByZXBvcnRzXG4gICAqIGRpdmVyZ2VuY2Ugb24gYSBsb2cgdGhlIHJ1biBpcyBzdGlsbCBkZWxpdmVyaW5nIGludG8uXG4gICAqL1xuICBwcml2YXRlIHdoZW5EZWxpdmVyeUlkbGUoY2hlY2tWZXJzaW9uOiBudW1iZXIsIGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3QgcG9sbCA9ICgpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ1VuY29uc3VtZWRUaW1lb3V0ID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLnVuY29uc3VtZWRDaGVja1ZlcnNpb24gIT09IGNoZWNrVmVyc2lvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc0RlbGl2ZXJ5SWRsZSgpKSB7XG4gICAgICAgIGZuKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2V0UHJvbWlzZVF1ZXVlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnVuY29uc3VtZWRDaGVja1ZlcnNpb24gIT09IGNoZWNrVmVyc2lvbikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBIZWxkIGluIHRoZSBzYW1lIGZpZWxkIHRoZSBmaXJlZCBjaGVjayB1c2VzIHNvIHN1YnNjcmliZSgpIGNhbmNlbHMgYVxuICAgICAgICAvLyBwb2xsIGluIHByb2dyZXNzIHRvby4gVGhlIHR3byBjYW5jZWxsYXRpb25zIGFyZSBub3QgaWRlbnRpY2FsOiBmb3IgdGhlXG4gICAgICAgIC8vIHBvbGwgaXQgaXMgdGhlIHZlcnNpb24gYnVtcCB0aGF0IGRvZXMgdGhlIHdvcmsgYW5kIHRoZSBjbGVhclRpbWVvdXQgaXNcbiAgICAgICAgLy8gYmVsdC1hbmQtYnJhY2VzLiBUd28gc3RhdGUgbWFjaGluZXMgd3JpdGUgdGhpcyBvbmUgZmllbGQsIHNvIGEgcG9sbFxuICAgICAgICAvLyBpbnZhbGlkYXRlZCBiZXR3ZWVuIHNjaGVkdWxpbmcgYW5kIGZpcmluZyBjYW4gbnVsbCBvdXQgYSBoYW5kbGUgdGhlXG4gICAgICAgIC8vIGxpdmUgY2hhaW4gaGFzIHNpbmNlIHN0b3JlZCwgd2hpY2ggaXMgd2h5IGV2ZXJ5IHBhdGggb3V0IG9mIGBwb2xsYCBhbmRcbiAgICAgICAgLy8gb3V0IG9mIHRoZSBmaXJlZCBjaGVjayByZS1jaGVja3MgdGhlIHZlcnNpb24gcmF0aGVyIHRoYW4gdHJ1c3RpbmcgdGhlXG4gICAgICAgIC8vIGhhbmRsZS5cbiAgICAgICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQgPSBzZXRUaW1lb3V0KHBvbGwsIDApO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBwb2xsKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -82,6 +82,30 @@ export declare const LOCK_POLL_INTERVAL_MS = 10;
|
|
|
82
82
|
export interface FlushableStreamState extends PromiseWithResolvers<void> {
|
|
83
83
|
/** Number of write operations currently in flight to the server */
|
|
84
84
|
pendingOps: number;
|
|
85
|
+
/** Frames emitted by this pipe's producer. */
|
|
86
|
+
producedFrames: number;
|
|
87
|
+
/** Produced frames accepted by this pipe's sink. */
|
|
88
|
+
acceptedFrames: number;
|
|
89
|
+
/** Terminal pipe error, retained for snapshots registered after failure. */
|
|
90
|
+
pipeError?: unknown;
|
|
91
|
+
/**
|
|
92
|
+
* If the user-facing writable is unlocked, enqueue an ordered checkpoint and
|
|
93
|
+
* durably drain every write ahead of it. Returns false while a writer remains
|
|
94
|
+
* locked, so lock-held streams never block step completion.
|
|
95
|
+
*/
|
|
96
|
+
settleReleasedWrites?: () => Promise<boolean>;
|
|
97
|
+
/** Whether release settlement waits for explicit step-end arming. */
|
|
98
|
+
deferReleaseSettlement?: boolean;
|
|
99
|
+
/** Whether step-end processing has armed released-writer settlement. */
|
|
100
|
+
releaseSettlementArmed?: boolean;
|
|
101
|
+
/** Whether the user-facing writable has begun a normal close. */
|
|
102
|
+
userWritableClosing?: boolean;
|
|
103
|
+
/** Step-end snapshot waiters blocked until their target reaches the sink. */
|
|
104
|
+
frameWaiters: Array<{
|
|
105
|
+
target: number;
|
|
106
|
+
resolve: () => void;
|
|
107
|
+
reject: (error: unknown) => void;
|
|
108
|
+
}>;
|
|
85
109
|
/** Whether the `done` promise has been resolved */
|
|
86
110
|
doneResolved: boolean;
|
|
87
111
|
/** Whether the underlying stream has actually closed/errored */
|
|
@@ -99,6 +123,23 @@ export interface FlushableStreamState extends PromiseWithResolvers<void> {
|
|
|
99
123
|
drainBarrier?: DrainBarrier;
|
|
100
124
|
}
|
|
101
125
|
export declare function createFlushableState(): FlushableStreamState;
|
|
126
|
+
/**
|
|
127
|
+
* Capture a step-end producer watermark, wait until the pipe has handed every
|
|
128
|
+
* frame through that watermark to its sink, then await the sink's durability
|
|
129
|
+
* barrier. Unlike {@link FlushableStreamState.promise}, this never waits for a
|
|
130
|
+
* user writer lock to be released.
|
|
131
|
+
*/
|
|
132
|
+
export declare function drainFlushableSnapshot(state: FlushableStreamState): Promise<void>;
|
|
133
|
+
/**
|
|
134
|
+
* Mark byte-stream chunks at the producer side of a flushable pipe. Serialized
|
|
135
|
+
* streams should instead use `getSerializeStream`'s synchronous output hook.
|
|
136
|
+
*/
|
|
137
|
+
/**
|
|
138
|
+
* Wrap the user-facing producer boundary of a flushable writable. A completed
|
|
139
|
+
* write through this handle has a sequence number before step-end snapshots,
|
|
140
|
+
* while the original writable remains the input to the serialization pipe.
|
|
141
|
+
*/
|
|
142
|
+
export declare function trackFlushableWritable<T>(writable: WritableStream<T>, state: FlushableStreamState, WritableStreamConstructor?: typeof WritableStream): WritableStream<T>;
|
|
102
143
|
/**
|
|
103
144
|
* Polls a WritableStream to check if the user has released their lock.
|
|
104
145
|
* Resolves the done promise when lock is released and no pending ops remain.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flushable-stream.d.ts","sourceRoot":"","sources":["../src/flushable-stream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,oBAAoB,EAAiB,MAAM,iBAAiB,CAAC;AAI3E;;;;GAIG;AACH,KAAK,YAAY,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAExC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC,eAAO,MAAM,oBAAoB,QAAO,MAIpC,CAAC;AAEL;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC,eAAO,MAAM,oBAAoB,QAAO,MAIpC,CAAC;AAEL;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,QAAc,CAAC;AAE/C,eAAO,MAAM,mBAAmB,QAAO,MAInC,CAAC;AAEL;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,QAAkB,CAAC;AAElD,eAAO,MAAM,mBAAmB,QAAO,MAInC,CAAC;AAEL;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAC;AASxC;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,oBAAqB,SAAQ,oBAAoB,CAAC,IAAI,CAAC;IACtE,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,YAAY,EAAE,OAAO,CAAC;IACtB,gEAAgE;IAChE,WAAW,EAAE,OAAO,CAAC;IACrB,wDAAwD;IACxD,uBAAuB,CAAC,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IACzD,wDAAwD;IACxD,uBAAuB,CAAC,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IACzD;;;;;OAKG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,wBAAgB,oBAAoB,IAAI,oBAAoB,
|
|
1
|
+
{"version":3,"file":"flushable-stream.d.ts","sourceRoot":"","sources":["../src/flushable-stream.ts"],"names":[],"mappings":"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"}
|