footprintjs 9.48.3 → 9.48.4
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/dist/esm/lib/memory/backtrack.d.ts +6 -0
- package/dist/esm/lib/memory/backtrack.js +18 -8
- package/dist/esm/lib/slice/sliceForKey.js +5 -3
- package/dist/lib/memory/backtrack.js +20 -9
- package/dist/lib/slice/sliceForKey.js +4 -2
- package/dist/types/lib/memory/backtrack.d.ts +6 -0
- package/package.json +3 -1
|
@@ -257,6 +257,12 @@ export type KeysReadLookup = (runtimeStageId: string) => string[];
|
|
|
257
257
|
* @returns Root CausalNode with .parents forming the DAG, or undefined if startId not found
|
|
258
258
|
*/
|
|
259
259
|
export declare function causalChain(commitLog: CommitBundle[], startId: string, getKeysRead: KeysReadLookup, options?: CausalChainOptions): CausalNode | undefined;
|
|
260
|
+
/**
|
|
261
|
+
* Internal slice composition: keep the actual bundle selected by the writer
|
|
262
|
+
* query (including a nonempty continuation). This is not a public entry point.
|
|
263
|
+
* The read position still belongs to the execution's first commit.
|
|
264
|
+
*/
|
|
265
|
+
export declare function causalChainFromCommit(commitLog: CommitBundle[], writer: CommitBundle, getKeysRead: KeysReadLookup, options?: CausalChainOptions): CausalNode | undefined;
|
|
260
266
|
/**
|
|
261
267
|
* Flatten the causal DAG into a BFS-ordered list of nodes.
|
|
262
268
|
* Each node appears exactly once (first occurrence by BFS order).
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
* console.log(formatCausalChain(dag)); // human-readable
|
|
57
57
|
* ```
|
|
58
58
|
*/
|
|
59
|
-
import { findLastWriter } from './commitLogUtils.js';
|
|
59
|
+
import { buildCommitIndex, findLastWriter } from './commitLogUtils.js';
|
|
60
60
|
import { queryWork, relation, writesOnlyInside } from './keyPaths.js';
|
|
61
61
|
import { logModel } from './logModel.js';
|
|
62
62
|
// ── Staged optimization: writer lookup strategies ──────────────────────
|
|
@@ -148,6 +148,17 @@ function incompleteSourcesFragment(commit) {
|
|
|
148
148
|
* @returns Root CausalNode with .parents forming the DAG, or undefined if startId not found
|
|
149
149
|
*/
|
|
150
150
|
export function causalChain(commitLog, startId, getKeysRead, options) {
|
|
151
|
+
return buildCausalChain(commitLog, startId, getKeysRead, options);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Internal slice composition: keep the actual bundle selected by the writer
|
|
155
|
+
* query (including a nonempty continuation). This is not a public entry point.
|
|
156
|
+
* The read position still belongs to the execution's first commit.
|
|
157
|
+
*/
|
|
158
|
+
export function causalChainFromCommit(commitLog, writer, getKeysRead, options) {
|
|
159
|
+
return buildCausalChain(commitLog, writer.runtimeStageId, getKeysRead, options, writer);
|
|
160
|
+
}
|
|
161
|
+
function buildCausalChain(commitLog, startId, getKeysRead, options, selectedWriter) {
|
|
151
162
|
const maxDepth = options?.maxDepth ?? 20;
|
|
152
163
|
const maxNodes = options?.maxNodes ?? 100;
|
|
153
164
|
const controlDeps = options?.controlDeps;
|
|
@@ -158,16 +169,15 @@ export function causalChain(commitLog, startId, getKeysRead, options) {
|
|
|
158
169
|
// never mistake a truncated slice for a complete one.
|
|
159
170
|
let truncatedByDepth = false;
|
|
160
171
|
let truncatedByNodes = false;
|
|
161
|
-
//
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
}
|
|
172
|
+
// A continuation may write more data, but it is not another execution of
|
|
173
|
+
// the stage's reads. Use the shared FIRST-commit rule for every read cutoff;
|
|
174
|
+
// keep writer bundles separately for their write metadata and read prefixes.
|
|
175
|
+
const idxMap = buildCommitIndex(commitLog);
|
|
166
176
|
queryWork.units += commitLog.length;
|
|
167
177
|
const startIdx = idxMap.get(startId);
|
|
168
178
|
if (startIdx === undefined)
|
|
169
179
|
return undefined;
|
|
170
|
-
const startCommit = commitLog[startIdx];
|
|
180
|
+
const startCommit = selectedWriter ?? commitLog[startIdx];
|
|
171
181
|
// Pick writer lookup strategy based on log size
|
|
172
182
|
const findWriter = createWriterLookup(commitLog);
|
|
173
183
|
// Node dedup map: runtimeStageId → CausalNode (ensures DAG, not tree)
|
|
@@ -454,4 +464,4 @@ export function formatCausalChain(root) {
|
|
|
454
464
|
// ── Exported for testing (internal) ────────────────────────────────────
|
|
455
465
|
/** @internal Exposed for testing the strategy selection. */
|
|
456
466
|
export const _REVERSE_INDEX_THRESHOLD = REVERSE_INDEX_THRESHOLD;
|
|
457
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3RyYWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvYmFja3RyYWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5REc7QUFFSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQWdNekMsMEVBQTBFO0FBRTFFOzs7O0dBSUc7QUFDSCxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQVFwQyxrRUFBa0U7QUFDbEUsU0FBUyxnQkFBZ0IsQ0FBQyxTQUF5QjtJQUNqRCxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLFNBQXlCO0lBQ25ELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxPQUFPLENBQUMsR0FBVyxFQUFFLFNBQWlCLEVBQTRCLEVBQUU7UUFDbEUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRCxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzdDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxNQUFvQixF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QztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVkLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ25CLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksa0JBQWtCLENBQUM7YUFDeEcsTUFBTSxDQUFDLE9BQU8sQ0FBQzthQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMsc0JBQXNCLE1BQU0sNENBQTRDLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFFRCwwRUFBMEU7QUFFMUUsNERBQTREO0FBQzVELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLHVCQUF1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBiYWNrdHJhY2sudHMg4oCUIEJhY2t3YXJkIGNhdXNhbCBjaGFpbiBhbmFseXNpcyBvbiB0aGUgY29tbWl0IGxvZy5cbiAqXG4gKiBJbXBsZW1lbnRzICoqYmFja3dhcmQgcHJvZ3JhbSBzbGljaW5nKiogKFdlaXNlciAxOTg0LCB0aGluLXNsaWNlIHZhcmlhbnQpOlxuICogZ2l2ZW4gYSBzdGFydGluZyBleGVjdXRpb24gc3RlcCwgd2FsayBiYWNrd2FyZHMgdGhyb3VnaCByZWFk4oaSd3JpdGVcbiAqIGRlcGVuZGVuY2llcyB0byBidWlsZCB0aGUgY2F1c2FsIERBRyB0aGF0IHByb2R1Y2VkIHRoZSBkYXRhIGF0IHRoYXQgc3RlcC5cbiAqXG4gKiAjIyBBbGdvcml0aG1cbiAqXG4gKiBCRlMgb24gdGhlIGltcGxpY2l0IGRlcGVuZGVuY3kgZ3JhcGggd2hlcmUgZWRnZXMgcnVuIGZyb20gcmVhZGVyIOKGkiB3cml0ZXIuXG4gKlxuICogMS4gTG9jYXRlIHN0YXJ0SWQgaW4gY29tbWl0TG9nIOKGkiByb290IG5vZGVcbiAqIDIuIEdldCBrZXlzUmVhZCBmb3Igcm9vdCB2aWEgYGdldEtleXNSZWFkYCBjYWxsYmFja1xuICogMy4gRm9yIGVhY2gga2V5IHJlYWQsIGZpbmQgd2hvIGxhc3Qgd3JvdGUgaXQgYmVmb3JlIHRoaXMgc3RlcCDihpIgcGFyZW50IGNvbW1pdFxuICogICAgKFwid3JvdGVcIiBpcyB0aGUgd3JpdGVyIHJ1bGUgb2YgYGtleVBhdGhzLnRzYCwgOS4zMy4wOiBhIHJvdyBvbiB0aGUga2V5LCBpbnNpZGUgaXQsIG9yXG4gKiAgICBhcm91bmQgaXQgdGhhdCBjaGFuZ2VkIGl0IOKAlCBzbyBhIHN0YWdlIHRoYXQgcmVhZCBgY2ZnYCBsaW5rcyB0byB0aGUgc3ViZmxvdyBzZWVkIG9yXG4gKiAgICBtZXJnZS1iYWNrIHRoYXQgd3JvdGUgYGNmZ+KQn2JgKVxuICogNC4gQ3JlYXRlIHBhcmVudCBDYXVzYWxOb2RlLCBsaW5rIHRvIHJvb3QucGFyZW50c1xuICogNS4gRW5xdWV1ZSBwYXJlbnQuIFJlcGVhdCB1bnRpbCBxdWV1ZSBlbXB0eSBvciBsaW1pdHMgaGl0LlxuICpcbiAqIE91dHB1dCBpcyBhICoqREFHKiogKG5vdCBhIGxpbmtlZCBsaXN0KTogYSBzdGFnZSByZWFkaW5nIGBjcmVkaXRTY29yZWAgQU5EIGBkdGlgXG4gKiBmcm9tIGRpZmZlcmVudCB3cml0ZXJzIGhhcyB0d28gcGFyZW50cy5cbiAqXG4gKiAjIyBTdGFnZWQgT3B0aW1pemF0aW9uXG4gKlxuICogVHdvIHdyaXRlci1sb29rdXAgc3RyYXRlZ2llcywgY2hvc2VuIGF1dG9tYXRpY2FsbHkgYnkgY29tbWl0IGxvZyBzaXplOlxuICpcbiAqIHwgU3RyYXRlZ3kgfCBXaGVuIHwgQ29tcGxleGl0eSBwZXIgbG9va3VwIHxcbiAqIHwtLS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCBMaW5lYXIgc2NhbiB8IE4g4omkIDI1NiB8IE8oTikg4oCUIHNpbXBsZSBiYWNrd2FyZCBzY2FuIHxcbiAqIHwgUmV2ZXJzZSBpbmRleCB8IE4gPiAyNTYgfCBPKEsgbG9nIE4pIOKAlCBwcmVidWlsdCBrZXnihpJbaW5kaWNlc10sIGJpbmFyeSBzZWFyY2ggfFxuICpcbiAqIFRoZSB0aHJlc2hvbGQgKDI1NikgaXMgY2hvc2VuIHNvIHRoZSBPKE4pIGJ1aWxkIGNvc3Qgb2YgdGhlIHJldmVyc2UgaW5kZXhcbiAqIGlzIGFtb3J0aXplZCBvdmVyIHRoZSBCRlMgdHJhdmVyc2FsLiBCZWxvdyAyNTYsIGxpbmVhciBzY2FuIHdpbnMgYmVjYXVzZVxuICogdGhlcmUncyBubyBpbmRleCBidWlsZCBvdmVyaGVhZC4gVGhlIGNvbnN1bWVyIG5ldmVyIHNlZXMgdGhpcyDigJQgYGNhdXNhbENoYWluKClgXG4gKiBwaWNrcyB0aGUgcmlnaHQgc3RyYXRlZ3kgaW50ZXJuYWxseSAobGlrZSBhIHF1ZXJ5IG9wdGltaXplciBjaG9vc2luZyBiZXR3ZWVuXG4gKiBzZXF1ZW50aWFsIHNjYW4gdnMgaW5kZXggc2NhbiBiYXNlZCBvbiB0YWJsZSBzaXplKS5cbiAqXG4gKiAjIyBDb21wbGV4aXR5XG4gKlxuICogLSAqKlNtYWxsIGxvZ3MgKE4g4omkIDI1Nik6KiogTyhWIMOXIEsgw5cgTikgdG90YWwuIFY9dmlzaXRlZCwgSz1hdmcga2V5cy9ub2RlLlxuICogLSAqKkxhcmdlIGxvZ3MgKE4gPiAyNTYpOioqIE8oTiDDlyBVKSBpbmRleCBidWlsZCArIE8oViDDlyBLIMOXIGxvZyBOKSBsb29rdXBzLlxuICogICBVID0gdW5pcXVlIGtleXMuIEFtb3J0aXplZCBvdmVyIGFsbCBCRlMgaG9wcy5cbiAqXG4gKiAjIyBSZWZlcmVuY2VzXG4gKlxuICogLSBXZWlzZXIsIE0uICgxOTg0KS4gXCJQcm9ncmFtIFNsaWNpbmcuXCIgSUVFRSBUU0UuXG4gKiAtIFNyaWRoYXJhbiwgTS4gZXQgYWwuICgyMDA3KS4gXCJUaGluIFNsaWNpbmcuXCIgUExESS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgY2F1c2FsQ2hhaW4sIGZsYXR0ZW5DYXVzYWxEQUcsIGZvcm1hdENhdXNhbENoYWluIH0gZnJvbSAnZm9vdHByaW50anMvdHJhY2UnO1xuICpcbiAqIGNvbnN0IGRhZyA9IGNhdXNhbENoYWluKGNvbW1pdExvZywgJ2RlY2lkZSMyJywgKGlkKSA9PiByZWNvcmRlci5nZXRLZXlzUmVhZChpZCkpO1xuICogY29uc3QgZmxhdCA9IGZsYXR0ZW5DYXVzYWxEQUcoZGFnKTsgICAgIC8vIEJGUy1vcmRlcmVkIGZsYXQgbGlzdFxuICogY29uc29sZS5sb2coZm9ybWF0Q2F1c2FsQ2hhaW4oZGFnKSk7ICAgICAvLyBodW1hbi1yZWFkYWJsZVxuICogYGBgXG4gKi9cblxuaW1wb3J0IHsgZmluZExhc3RXcml0ZXIgfSBmcm9tICcuL2NvbW1pdExvZ1V0aWxzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVnaXN0ZXJlZENvZGUgfSBmcm9tICcuL2hvbmVzdHkuanMnO1xuaW1wb3J0IHsgcXVlcnlXb3JrLCByZWxhdGlvbiwgd3JpdGVzT25seUluc2lkZSB9IGZyb20gJy4va2V5UGF0aHMuanMnO1xuaW1wb3J0IHsgbG9nTW9kZWwgfSBmcm9tICcuL2xvZ01vZGVsLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlLCBUcmFjZUVudHJ5LCBVbnRyYWNrZWRTb3VyY2UgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLy8g4pSA4pSAIFR5cGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogQSBzaW5nbGUgbm9kZSBpbiB0aGUgY2F1c2FsIERBRy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F1c2FsTm9kZSB7XG4gIC8qKiBVbmlxdWUgZXhlY3V0aW9uIHN0ZXAgaWRlbnRpZmllci4gKi9cbiAgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFN0YWJsZSBzdGFnZSBpZGVudGlmaWVyLiAqL1xuICBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBzdGFnZSBuYW1lLiAqL1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgLyoqIEtleXMgdGhpcyBzdGFnZSB3cm90ZSAoZnJvbSBpdHMgQ29tbWl0QnVuZGxlLnRyYWNlKS4gKi9cbiAga2V5c1dyaXR0ZW46IHN0cmluZ1tdO1xuICAvKiogVGhlIGtleSB3aG9zZSByZWFk4oaSd3JpdGUgZGVwZW5kZW5jeSBsaW5rZWQgdGhpcyBub2RlIHRvIGl0cyBjaGlsZC4gRW1wdHkgZm9yIHRoZSByb290LiAqL1xuICBsaW5rZWRCeTogc3RyaW5nO1xuICAvKiogQkZTIGRlcHRoIGZyb20gdGhlIHN0YXJ0aW5nIG5vZGUgKDAgPSBzdGFydCkuICovXG4gIGRlcHRoOiBudW1iZXI7XG4gIC8qKlxuICAgKiBQYXJlbnQgbm9kZXMg4oCUIHN0YWdlcyB0aGlzIG5vZGUgZGVwZW5kcyBvbi4gREFHOiBtdWx0aXBsZSBwYXJlbnRzXG4gICAqIHBvc3NpYmxlLiBLRVBUIGZvciBjb21wYXRpYmlsaXR5OyB3aXRoIHRoZSBgY29udHJvbERlcHNgIG9wdGlvblxuICAgKiAoUkZDLTAwMyBEMykgZ292ZXJuaW5nIGRlY2lkZXJzIGFwcGVhciBoZXJlIHRvby4gRm9yIHR5cGVkL2tleWVkL1xuICAgKiB3ZWlnaHRlZCBkZXRhaWwgdXNlIHtAbGluayBwYXJlbnRFZGdlc30uXG4gICAqL1xuICBwYXJlbnRzOiBDYXVzYWxOb2RlW107XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQzIOKAlCBvbmUgZWRnZSBwZXIgZGVwZW5kZW5jeSBMSU5LIChub3QgcGVyIHBhcmVudCk6IGEgbm9kZVxuICAgKiByZWFkaW5nIHR3byBrZXlzIGZyb20gdGhlIHNhbWUgd3JpdGVyIGhhcyBPTkUgZW50cnkgaW4ge0BsaW5rIHBhcmVudHN9XG4gICAqIGJ1dCBUV08gYCdkYXRhJ2AgZWRnZXMgaGVyZS4gQ29udHJvbCBkZXBlbmRlbmNpZXMgKHZpYSB0aGVcbiAgICogYGNvbnRyb2xEZXBzYCBvcHRpb24pIGFkZCBhIGAnY29udHJvbCdgIGVkZ2UgdG8gdGhlIGdvdmVybmluZyBkZWNpZGVyLlxuICAgKi9cbiAgcGFyZW50RWRnZXM6IENhdXNhbEVkZ2VbXTtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDIgaG9uZXN0eSBtYXJrZXIg4oCUIHN0YW1wZWQgZnJvbSB0aGUgc3RhZ2Unc1xuICAgKiBgQ29tbWl0QnVuZGxlLnVudHJhY2tlZFNvdXJjZXNgLiBQcmVzZW50IHdoZW4gdGhpcyBzdGFnZSBBTFNPIGNvbnN1bWVkXG4gICAqIHVudHJhY2tlZCByZWFkIHBhdGhzIChgYXJnc2AgLyBgZW52YCAvIHVuc2hhZG93ZWQgYHNpbGVudGAgcmVhZHMpOiB0aGVcbiAgICogYmFja3dhcmQgc2xpY2UgdGhyb3VnaCB0aGlzIG5vZGUgbWF5IGJlIGluY29tcGxldGUsIGJlY2F1c2UgdGhvc2UgcmVhZHNcbiAgICogcHJvZHVjZSBubyByZWFk4oaSd3JpdGUgZWRnZSB0byBmb2xsb3cuIGBmb3JtYXRDYXVzYWxDaGFpbmAgcmVuZGVycyB0aGlzXG4gICAqIGFzIGEgYOKaoCDigKYgc2xpY2UgbWF5IGJlIGluY29tcGxldGUgaGVyZWAgbGluZS4gQWJzZW50IHdoZW4gdGhlIHN0YWdlJ3NcbiAgICogcmVhZHMgd2VyZSBmdWxseSB0cmFja2VkLlxuICAgKlxuICAgKiBSZWdpc3RyeSBjb2RlOiBgJ2luY29tcGxldGUtc291cmNlcydgIChgbWVtb3J5L2hvbmVzdHkudHMgwrdcbiAgICogSE9ORVNUWV9DT0RFU2AsIHNlcnZlZCBvbiBgZm9vdHByaW50anMvdHJhY2VgKSBzYXlzIHdoYXQgdGhpcyBmaWVsZFxuICAgKiBtZWFucy4gVGhlIGZpZWxkIGNhcnJpZXMgbm8gYGNvZGVgIOKAlCBpdHMgdmFsdWVzIGFyZSB0aGVcbiAgICoge0BsaW5rIFVudHJhY2tlZFNvdXJjZX1zLlxuICAgKi9cbiAgaW5jb21wbGV0ZVNvdXJjZXM/OiBSZWFkb25seUFycmF5PFVudHJhY2tlZFNvdXJjZT47XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQ0IHRydW5jYXRpb24gdmlzaWJpbGl0eSDigJQgc2V0IG9uIHRoZSBST09UIG5vZGUgb25seSwgYW5kIG9ubHlcbiAgICogd2hlbiBhIGxpbWl0IGFjdHVhbGx5IGN1dCB0aGUgc2xpY2U6IGBieURlcHRoYCB3aGVuIGEgbm9kZSBhdCB0aGVcbiAgICogYG1heERlcHRoYCBob3Jpem9uIHN0aWxsIGhhZCBlZGdlcyB0byBleHBhbmQsIGBieU5vZGVzYCB3aGVuIHRoZVxuICAgKiBgbWF4Tm9kZXNgIGJ1ZGdldCBibG9ja2VkIGNyZWF0aW5nIGEgZGlzY292ZXJlZCBwYXJlbnQuIEFic2VudCB3aGVuIHRoZVxuICAgKiBzbGljZSBpcyBjb21wbGV0ZS4gYGZvcm1hdENhdXNhbENoYWluYCBhcHBlbmRzIGEgYOKaoCBzbGljZSB0cnVuY2F0ZWQg4oCmYFxuICAgKiBsaW5lIOKAlCBhIGNvbnN1bWVyIG11c3QgbmV2ZXIgbWlzdGFrZSBhIHRydW5jYXRlZCBzbGljZSBmb3IgYSBmdWxsIG9uZS5cbiAgICogKFVudGlsIDkuNDguMCBkZXYgbW9kZSBhbHNvIHdhcm5lZCBvbiB0aGUgY29uc29sZTsgdGhlIGZpZWxkIGlzIHRoZVxuICAgKiBzaWduYWwsIHJlYWQgaXQuKVxuICAgKlxuICAgKiBSZWdpc3RyeSBjb2RlOiBgJ3RydW5jYXRlZCdgIChgbWVtb3J5L2hvbmVzdHkudHMgwrcgSE9ORVNUWV9DT0RFU2AsIHNlcnZlZFxuICAgKiBvbiBgZm9vdHByaW50anMvdHJhY2VgKSBzYXlzIHdoYXQgdGhpcyBmaWVsZCBtZWFuczsgdGhlIGZpZWxkIGNhcnJpZXMgbm9cbiAgICogYGNvZGVgLlxuICAgKi9cbiAgdHJ1bmNhdGVkPzogeyBieURlcHRoOiBib29sZWFuOyBieU5vZGVzOiBib29sZWFuIH07XG4gIC8qKlxuICAgKiBGNGIgKDkuMzMuMCkg4oCUIHRoZSBrZXlzIHRoaXMgbm9kZSByZWFkIHRoYXQgTk8gY29tbWl0IGJlZm9yZSBpdCB3cm90ZSAodW5kZXIgdGhlIHdyaXRlciBydWxlKSwgc28gdGhlXG4gICAqIHdhbGsgaGFzIG5vIGVkZ2UgdG8gZm9sbG93IGZvciB0aGVtOiB0aGVpciB2YWx1ZSBjYW1lIGZyb20gdGhlIGluaXRpYWwgc3RhdGUsIGZyb3plbiBydW4gaW5wdXQgb3IgYVxuICAgKiBjbG9zdXJlIOKAlCBvdXRzaWRlIHRoZSBjb21taXQgbG9nLiBUaGUgY29kZSBzYXlzIHNvIChgJ3ByZS1ydW4tb3JpZ2luJ2AsIHJlZ2lzdGVyZWQgaW5cbiAgICogYG1lbW9yeS9ob25lc3R5LnRzIMK3IEhPTkVTVFlfQ09ERVNgKTsgYGtleXNgIGFyZSBpbiB0aGUgb3JkZXIgdGhlIHdhbGsgbWV0IHRoZW0uIEFCU0VOVCB3aGVuIGV2ZXJ5IGtleVxuICAgKiB0aGUgbm9kZSBleHBhbmRlZCBoYWQgYSB3cml0ZXIsIHNvIHN1Y2ggYSBub2RlIGtlZXBzIGl0cyA5LjMyLjAgc2hhcGUuIEJlZm9yZSA5LjMzLjAgdGhlc2UgcmVhZHMgd2VyZVxuICAgKiBkcm9wcGVkIHdpdGhvdXQgYSB3b3JkLlxuICAgKi9cbiAgcHJlUnVuUmVhZHM/OiB7IGNvZGU6IFJlZ2lzdGVyZWRDb2RlPCdwcmUtcnVuLW9yaWdpbic+OyBrZXlzOiBzdHJpbmdbXSB9O1xufVxuXG4vKipcbiAqIFJGQy0wMDMgRDMg4oCUIGEgdHlwZWQgZGVwZW5kZW5jeSBlZGdlIGZyb20gYSBjaGlsZCBub2RlIHRvIG9uZSBwYXJlbnQuXG4gKlxuICogLSBga2luZDogJ2RhdGEnYCAgICDigJQgcmVhZOKGkndyaXRlIGRlcGVuZGVuY3k7IGBrZXlgIGlzIHRoZSBzdGF0ZSBrZXkuXG4gKiAtIGBraW5kOiAnY29udHJvbCdgIOKAlCB0aGUgcGFyZW50IGlzIHRoZSBkZWNpZGVyL3NlbGVjdG9yIHdob3NlIGRlY2lzaW9uXG4gKiAgIGFsbG93ZWQgdGhlIGNoaWxkIHRvIHJ1bjsgYGtleWAgaXMgdGhlIGRlY2lkZSgpIHJ1bGUgbGFiZWwgd2hlbiBwcmVzZW50LlxuICpcbiAqIGB3ZWlnaHRgIGRlZmF1bHRzIHRvIDEuMDsgdGhlIGB3ZWlnaGAgaG9vayAoUkZDLTAwMyBENCkgY2FuIG92ZXJyaWRlIGl0LlxuICogVGhlIGVuZ2luZSBpdHNlbGYgTkVWRVIgY29tcHV0ZXMgd2VpZ2h0cyDigJQgc2VtYW50aWNzIGJlbG9uZyB0byB0aGVcbiAqIGNvbnN1bWVyLWluamVjdGVkIHdlaWdoZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F1c2FsRWRnZSB7XG4gIHBhcmVudDogQ2F1c2FsTm9kZTtcbiAga2luZDogJ2RhdGEnIHwgJ2NvbnRyb2wnO1xuICBrZXk/OiBzdHJpbmc7XG4gIHdlaWdodDogbnVtYmVyO1xuICAvKipcbiAgICogRjRiICg5LjMzLjApIOKAlCBwcmVzZW50IG9ubHkgb24gYSBgJ2RhdGEnYCBlZGdlIHdob3NlIHBhcmVudCB3cm90ZSBga2V5YCBPTkxZIHRocm91Z2ggcm93cyBpbnNpZGUgaXRcbiAgICogKGEgc3ViZmxvdydzIGlucHV0IHNlZWQsIGFuIG91dHB1dE1hcHBlciBtZXJnZS1iYWNrLCBhIGZvcmsgY2hpbGQncyBuYW1lc3BhY2UpOiB0aGF0IHdyaXRlIG1hZGUgcGFydFxuICAgKiBvZiB0aGUgdmFsdWUsIGFuZCBlYXJsaWVyIHdyaXRlcnMgbWF5IGFjY291bnQgZm9yIHRoZSByZXN0LiBSZWdpc3RlcmVkIGFzIGAnbmVzdGVkLXJvd3MnYCBpblxuICAgKiBgbWVtb3J5L2hvbmVzdHkudHMgwrcgSE9ORVNUWV9DT0RFU2AuIEFic2VudCBmb3IgYSB3cml0ZSBvbiBvciBhcm91bmQgdGhlIGtleSwgc28gYW4gZXhhY3QgZWRnZSBrZWVwc1xuICAgKiBpdHMgOS4zMi4wIHNoYXBlLlxuICAgKi9cbiAgYmFzaXM/OiBSZWdpc3RlcmVkQ29kZTwnbmVzdGVkLXJvd3MnPjtcbn1cblxuLyoqXG4gKiBSRkMtMDAzIEQzIOKAlCBhIGNvbnRyb2wgZGVwZW5kZW5jeSByZXNvbHZlZCBmb3Igb25lIGV4ZWN1dGlvbiBzdGVwOlxuICogd2hpY2ggZGVjaWRlci9zZWxlY3RvciBleGVjdXRpb24gYWxsb3dlZCB0aGlzIHN0YWdlIHRvIHJ1bi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250cm9sRGVwZW5kZW5jeSB7XG4gIC8qKiBydW50aW1lU3RhZ2VJZCBvZiB0aGUgZ292ZXJuaW5nIGRlY2lkZXIvc2VsZWN0b3IgZXhlY3V0aW9uIHN0ZXAuICovXG4gIGRlY2lkZXJJZDogc3RyaW5nO1xuICAvKiogVGhlIGRlY2lkZSgpIHJ1bGUgbGFiZWwgZm9yIHRoZSBjaG9zZW4gYnJhbmNoLCB3aGVuIHByZXNlbnQuICovXG4gIGxhYmVsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJGQy0wMDMgRDMg4oCUIGNhbGxiYWNrIHJlc29sdmluZyB0aGUgZ292ZXJuaW5nIGRlY2lkZXIgZm9yIGFuIGV4ZWN1dGlvblxuICogc3RlcC4gUmV0dXJuIGB1bmRlZmluZWRgIHdoZW4gdGhlIHN0ZXAgaXMgbm90IGNvbnRyb2wtZGVwZW5kZW50IG9uIGFueVxuICogcmVjb3JkZWQgZGVjaXNpb24uIEJ1aWxkIG9uZSB3aXRoIGBjb250cm9sRGVwUmVjb3JkZXIoKWAgZnJvbVxuICogYGZvb3RwcmludGpzL3RyYWNlYCwgb3Igc3VwcGx5IHlvdXIgb3duLlxuICovXG5leHBvcnQgdHlwZSBDb250cm9sRGVwTG9va3VwID0gKHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpID0+IENvbnRyb2xEZXBlbmRlbmN5IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFJGQy0wMDMgRDQg4oCUIGNvbnN1bWVyLWluamVjdGVkIGVkZ2Ugd2VpZ2hlci4gQ2FsbGVkIG9uY2UgcGVyIGNyZWF0ZWRcbiAqIGVkZ2U7IHJldHVybiBhIHdlaWdodCwgb3IgYHVuZGVmaW5lZGAgdG8ga2VlcCB0aGUgZGVmYXVsdCAxLjAuIFRoZVxuICogRU5HSU5FIG5ldmVyIGNvbXB1dGVzIHdlaWdodHMgKHplcm8gbmV3IGRlcGVuZGVuY2llcyDigJQgc2VtYW50aWNzIGxpa2VcbiAqIGVtYmVkZGluZyBzaW1pbGFyaXR5IG9yIEZETCBpbmZsdWVuY2UgYmVsb25nIHRvIGRvd25zdHJlYW0gbGlicmFyaWVzLFxuICogdGhlIHNhbWUgcGx1Zy1pbiBwYXR0ZXJuIGFzIGBOYXJyYXRpdmVGb3JtYXR0ZXJgKS4gV2VpZ2h0cyByZW5kZXIgaW5cbiAqIGBmb3JtYXRDYXVzYWxDaGFpbmAgYXMgYOKGkCB2aWEgc3lzdGVtUHJvbXB0ICgwLjE4KWAuXG4gKi9cbmV4cG9ydCB0eXBlIEVkZ2VXZWlnaGVyID0gKFxuICBjaGlsZDogQ2F1c2FsTm9kZSxcbiAgcGFyZW50OiBDYXVzYWxOb2RlLFxuICBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAga2luZDogJ2RhdGEnIHwgJ2NvbnRyb2wnLFxuKSA9PiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbi8qKiBPcHRpb25zIGZvciBjYXVzYWxDaGFpbigpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXVzYWxDaGFpbk9wdGlvbnMge1xuICAvKiogTWF4aW11bSBCRlMgZGVwdGggKGRlZmF1bHQ6IDIwKS4gUHJldmVudHMgcnVuYXdheSB0cmF2ZXJzYWwuICovXG4gIG1heERlcHRoPzogbnVtYmVyO1xuICAvKiogTWF4aW11bSB0b3RhbCBub2RlcyB0byB2aXNpdCAoZGVmYXVsdDogMTAwKS4gSGFyZCBjYXAgZm9yIHNhZmV0eS4gKi9cbiAgbWF4Tm9kZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQzIOKAlCBjb250cm9sLWRlcGVuZGVuY2UgbG9va3VwLiBXaGVuIHByb3ZpZGVkLCBleHBhbmRpbmcgYSBub2RlXG4gICAqIEFMU08gbGlua3MgYSBgJ2NvbnRyb2wnYCBlZGdlIHRvIGl0cyBnb3Zlcm5pbmcgZGVjaWRlciAobGFiZWxlZCBieSB0aGVcbiAgICogZGVjaWRlKCkgcnVsZSBsYWJlbCB3aGVuIHByZXNlbnQpOyB0aGUgZGVjaWRlciBub2RlIHRoZW4gZXhwYW5kc1xuICAgKiBub3JtYWxseSB0aHJvdWdoIGl0cyBvd24gZGF0YSByZWFkcywgc28gY2hhaW5zIGxpa2VcbiAgICogYHN0YXR1cyDihpAgW2NvbnRyb2xdIENsYXNzaWZ5UmlzayDihpAgW2RhdGE6IGNyZWRpdFNjb3JlXSBQdWxsQnVyZWF1YFxuICAgKiByZXNvbHZlIGVuZC10by1lbmQuIFdpdGhvdXQgdGhpcyBvcHRpb24gYmVoYXZpb3IgaXMgdW5jaGFuZ2VkLlxuICAgKi9cbiAgY29udHJvbERlcHM/OiBDb250cm9sRGVwTG9va3VwO1xuICAvKipcbiAgICogUkZDLTAwMyBENCDigJQgZWRnZSB3ZWlnaGVyLiBTdGFtcHMgYENhdXNhbEVkZ2Uud2VpZ2h0YCBhdCBlZGdlIGNyZWF0aW9uO1xuICAgKiBgdW5kZWZpbmVkYCAob3Igbm8gd2VpZ2hlcikg4oaSIDEuMC4gU2VlIHtAbGluayBFZGdlV2VpZ2hlcn0uXG4gICAqL1xuICB3ZWlnaD86IEVkZ2VXZWlnaGVyO1xuICAvKipcbiAgICogI1AxIOKAlCBob3cgYSBub2RlJ3MgZXhwYW5zaW9uIHJlYWQtc2V0IGlzIGRlcml2ZWQ6XG4gICAqXG4gICAqIC0gYCdzdGFnZSdgIChkZWZhdWx0LCBoaXN0b3JpY2FsKSDigJQgZXZlcnkgdmlzaXRlZCBub2RlIGV4cGFuZHMgdGhyb3VnaFxuICAgKiAgIEFMTCBvZiBpdHMgc3RhZ2UncyByZWFkcyAoYGdldEtleXNSZWFkYCkuIEEgc3RhZ2UgcmVhZGluZyBgYSxiYCBhbmRcbiAgICogICB3cml0aW5nIGB4LHlgIGxpbmtzIGJvdGggcmVhZHMgYXMgY2F1c2VzIG9mIGJvdGggd3JpdGVzIOKAlCBhIHNvdW5kIGJ1dFxuICAgKiAgIGNvYXJzZSBvdmVyLWFwcHJveGltYXRpb24uXG4gICAqIC0gYCdwZXItd3JpdGUnYCDigJQgd2hlbiB0aGUgY29tbWl0IGxvZyBjYXJyaWVzIHBlci13cml0ZSByZWFkIHByb3ZlbmFuY2VcbiAgICogICAoYFRyYWNlRW50cnkucmVhZEtleXNgLCByZWNvcmRlZCB1bmRlciB0aGUgZXhlY3V0b3Inc1xuICAgKiAgIGB3cml0ZVByb3ZlbmFuY2U6ICdyZWFkcy1wcmVmaXgnYCBkaWFsKSwgYSBub2RlIHJlYWNoZWQgdmlhIGtleSBga2BcbiAgICogICBleHBhbmRzIHRocm91Z2ggT05MWSB0aGUgcmVhZHMgdGhhdCBwcmVjZWRlZCBpdHMgd3JpdGUgb2YgYGtgXG4gICAqICAgKHRlbXBvcmFsIHByZWZpeCkuIE5vZGVzIGxpbmtlZCBsYXRlciB2aWEgYWRkaXRpb25hbCBrZXlzIGFyZVxuICAgKiAgIGluY3JlbWVudGFsbHkgcmUtZXhwYW5kZWQgd2l0aCBqdXN0IHRoZSBuZXcgcmVhZHMgKHdvcmtsaXN0IOKAlCB0aGVcbiAgICogICBzbGljZSBvbmx5IGV2ZXIgR1JPV1MgdG93YXJkIHRoZSBzdGFnZS1sZXZlbCBjZWlsaW5nKS4gSE9ORVNUXG4gICAqICAgRkFMTEJBQ0s6IGFueSBsaW5rIHdob3NlIHRyYWNlIGVudHJ5IGxhY2tzIGByZWFkS2V5c2AgZXhwYW5kcyB0aGF0XG4gICAqICAgbm9kZSBhdCBzdGFnZSBsZXZlbCDigJQgbWl4ZWQgb3IgZGlhbC1vZmYgbG9ncyBkZWdyYWRlIHRvIGAnc3RhZ2UnYFxuICAgKiAgIGJlaGF2aW9yIGV4YWN0bHksIG5ldmVyIHRvIHNpbGVuY2UuXG4gICAqL1xuICBlZGdlQXR0cmlidXRpb24/OiAnc3RhZ2UnIHwgJ3Blci13cml0ZSc7XG4gIC8qKlxuICAgKiAjUDEg4oCUIHRoZSB3cml0dGVuIGtleXMgdGhhdCBhbmNob3IgdGhlIFJPT1QncyBleHBhbnNpb24gdW5kZXJcbiAgICogYCdwZXItd3JpdGUnYCAoZS5nLiBgc2xpY2VGb3JLZXlgIHBhc3NlcyB0aGUgc2xpY2VkIGtleSwgc28gdGhlIHJvb3RcbiAgICogZXhwYW5kcyB0aHJvdWdoIHRoZSByZWFkcyB0aGF0IGZlZCBUSEFUIHdyaXRlLCBub3QgdGhlIHdob2xlIHN0YWdlKS5cbiAgICogSWdub3JlZCB1bmRlciBgJ3N0YWdlJ2AuIFVuc2V0IOKGkiByb290IGV4cGFuZHMgYXQgc3RhZ2UgbGV2ZWwuXG4gICAqL1xuICByb290TGlua0tleXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDYWxsYmFjayB0aGF0IHJldHVybnMgdGhlIGtleXMgYSBzdGFnZSByZWFkIGR1cmluZyBleGVjdXRpb24uXG4gKiBUaGUgYmFja3RyYWNrZXIgY2FsbHMgdGhpcyBmb3IgZWFjaCB2aXNpdGVkIG5vZGUgdG8gZGV0ZXJtaW5lXG4gKiB3aGljaCByZWFk4oaSd3JpdGUgZWRnZXMgdG8gZm9sbG93LlxuICpcbiAqIEltcGxlbWVudG9yczogUXVhbGl0eVJlY29yZGVyIHRyYWNrcyBrZXlzUmVhZCBwZXIgc3RlcCxcbiAqIG9yIGJ1aWxkIGEgTWFwPHJ1bnRpbWVTdGFnZUlkLCBzdHJpbmdbXT4gZnJvbSBTY29wZVJlY29yZGVyLm9uUmVhZCBldmVudHMuXG4gKi9cbmV4cG9ydCB0eXBlIEtleXNSZWFkTG9va3VwID0gKHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpID0+IHN0cmluZ1tdO1xuXG4vLyDilIDilIAgU3RhZ2VkIG9wdGltaXphdGlvbjogd3JpdGVyIGxvb2t1cCBzdHJhdGVnaWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFRocmVzaG9sZCBmb3Igc3dpdGNoaW5nIGZyb20gbGluZWFyIHNjYW4gdG8gcmV2ZXJzZSBpbmRleC5cbiAqIEJlbG93IHRoaXMsIE8oTikgc2NhbiBpcyBmYXN0ZXIgKG5vIGluZGV4IGJ1aWxkIGNvc3QpLlxuICogQWJvdmUgdGhpcywgTyhsb2cgTikgYmluYXJ5IHNlYXJjaCB3aW5zLlxuICovXG5jb25zdCBSRVZFUlNFX0lOREVYX1RIUkVTSE9MRCA9IDI1NjtcblxuLyoqXG4gKiBXcml0ZXIgbG9va3VwIGZ1bmN0aW9uIHNpZ25hdHVyZS5cbiAqIFJldHVybnMgdGhlIENvbW1pdEJ1bmRsZSB0aGF0IGxhc3Qgd3JvdGUgYGtleWAgYmVmb3JlIHBvc2l0aW9uIGBiZWZvcmVJZHhgLlxuICovXG50eXBlIFdyaXRlckxvb2t1cCA9IChrZXk6IHN0cmluZywgYmVmb3JlSWR4OiBudW1iZXIpID0+IENvbW1pdEJ1bmRsZSB8IHVuZGVmaW5lZDtcblxuLyoqIFN0cmF0ZWd5IDE6IExpbmVhciBzY2FuIOKAlCBPKE4pIHBlciBsb29rdXAsIHplcm8gc2V0dXAgY29zdC4gKi9cbmZ1bmN0aW9uIGxpbmVhclNjYW5Mb29rdXAoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSk6IFdyaXRlckxvb2t1cCB7XG4gIHJldHVybiAoa2V5LCBiZWZvcmVJZHgpID0+IGZpbmRMYXN0V3JpdGVyKGNvbW1pdExvZywga2V5LCBiZWZvcmVJZHgpO1xufVxuXG4vKipcbiAqIFN0cmF0ZWd5IDI6IFJldmVyc2UgaW5kZXgg4oCUIG9uZSBPKHJvd3MpIGJ1aWxkLCBPKGRlcHRoICsgbG9nIE4pIHBlciBsb29rdXAuXG4gKiBUaGUgbG9nJ3MgcmVhZCBtb2RlbCAoYGxvZ01vZGVsLnRzYDogYSBwYXRoIHRyaWUsIGVhY2ggdG9wLWxldmVsIGtleSBmb2xkZWQgYXRcbiAqIG1vc3Qgb25jZSkgYW5zd2VycyB0aGUgd3JpdGVyIHJ1bGUg4oCUIHJvd3Mgb24sIGluc2lkZSBvciBhcm91bmQgdGhlIGtleSDigJQgYnlcbiAqIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBsYXN0IHdyaXRlIG9uIG9yIGluc2lkZSBpdCwgdGhlbiBhIHZlcmRpY3Qgb25seSBmb3IgdGhlXG4gKiBhcm91bmQtY2FuZGlkYXRlcyBhZnRlciBpdC4gVGhlIHNhbWUgYW5zd2VyIGBmaW5kTGFzdFdyaXRlcmAgZ2l2ZXMsIHNvIHRoZVxuICogc3RyYXRlZ3kgc3dpdGNoIGJlbG93IG5ldmVyIGNoYW5nZXMgYSBzbGljZS5cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZUluZGV4TG9va3VwKGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10pOiBXcml0ZXJMb29rdXAge1xuICBjb25zdCBtb2RlbCA9IGxvZ01vZGVsKGNvbW1pdExvZyk7XG4gIHJldHVybiAoa2V5OiBzdHJpbmcsIGJlZm9yZUlkeDogbnVtYmVyKTogQ29tbWl0QnVuZGxlIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCBhdCA9IG1vZGVsLmxhc3RXcml0ZXJCZWZvcmUoa2V5LCBiZWZvcmVJZHgpO1xuICAgIHJldHVybiBhdCA+PSAwID8gY29tbWl0TG9nW2F0XSA6IHVuZGVmaW5lZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgdHJhY2UgZW50cmllcyBvZiBgY29tbWl0YCB0aGF0IG1ha2UgaXQgYSB3cml0ZXIgb2YgYGxpbmtLZXlgIOKAlCB0aGUgZW50cmllcyB3aG9zZSByZWFkXG4gKiBwcmVmaXggKGBUcmFjZUVudHJ5LnJlYWRLZXlzYCkgYSBwZXItd3JpdGUgZWRnZSBleHBhbmRzIHRocm91Z2guIFRoZSBGSVJTVCBlbnRyeSBvbiB0aGUgZXhhY3RcbiAqIHBhdGggd2hlbiB0aGVyZSBpcyBvbmUgKHRoZSAjUDEgYmVoYXZpb3VyLCB1bmNoYW5nZWQpOyBvdGhlcndpc2UgZXZlcnkgZW50cnkgaW5zaWRlIG9yIGFyb3VuZFxuICogdGhlIGtleSAoOS4zMy4wOiB0aGUgY29tbWl0IHdyb3RlIHRoZSBrZXkgdGhyb3VnaCBhIG5lc3RlZCByb3cg4oCUIGEgc3ViZmxvdyBzZWVkLCBhblxuICogb3V0cHV0TWFwcGVyIG1lcmdlLWJhY2sg4oCUIGFuZCBhbGwgb2YgdGhvc2Ugcm93cyB3cm90ZSBpdCkuXG4gKi9cbmZ1bmN0aW9uIGxpbmtpbmdFbnRyaWVzKGNvbW1pdDogQ29tbWl0QnVuZGxlLCBsaW5rS2V5OiBzdHJpbmcpOiBUcmFjZUVudHJ5W10ge1xuICBjb25zdCBleGFjdCA9IGNvbW1pdC50cmFjZS5maW5kKCh0KSA9PiB0LnBhdGggPT09IGxpbmtLZXkpO1xuICBpZiAoZXhhY3QgIT09IHVuZGVmaW5lZCkgcmV0dXJuIFtleGFjdF07XG4gIHJldHVybiBjb21taXQudHJhY2UuZmlsdGVyKCh0KSA9PiByZWxhdGlvbih0LnBhdGgsIGxpbmtLZXkpICE9PSB1bmRlZmluZWQpO1xufVxuXG4vKipcbiAqIFN0YWdlZCBvcHRpbWl6YXRpb246IHBpY2sgdGhlIHJpZ2h0IHdyaXRlci1sb29rdXAgc3RyYXRlZ3kgYmFzZWQgb24gZGF0YSBzaXplLlxuICpcbiAqIExpa2UgYSBkYXRhYmFzZSBxdWVyeSBvcHRpbWl6ZXIgY2hvb3NpbmcgYmV0d2VlbiBzZXF1ZW50aWFsIHNjYW4gYW5kIGluZGV4IHNjYW46XG4gKlxuICogLSAqKlNtYWxsIGxvZyAo4omkIDI1Nik6KiogTGluZWFyIHNjYW4gd2lucy4gWmVybyBzZXR1cCBjb3N0LCBnb29kIGNhY2hlIGxvY2FsaXR5LlxuICogICBUaGUgb3ZlcmhlYWQgb2YgYnVpbGRpbmcgYSByZXZlcnNlIGluZGV4IGlzbid0IHdvcnRoIGl0IGZvciBzaG9ydCBsb2dzLlxuICpcbiAqIC0gKipMYXJnZSBsb2cgKD4gMjU2KToqKiBSZXZlcnNlIGluZGV4IHdpbnMuIE8oTsOXVSkgdXBmcm9udCBidWlsZCBjb3N0IGlzIGFtb3J0aXplZFxuICogICBhY3Jvc3MgYWxsIEJGUyBob3BzLiBFYWNoIGxvb2t1cCBiZWNvbWVzIE8obG9nIE4pIHZpYSBiaW5hcnkgc2VhcmNoIGluc3RlYWQgb2YgTyhOKS5cbiAqICAgRm9yIGFuIGFnZW50IGxvb3Agd2l0aCA1MDAgaXRlcmF0aW9ucyBhbmQgNSBrZXlzIHBlciBob3AsIHRoaXMgaXMgNTAww5c1w5dsb2coNTAwKeKJiDIySyBvcHNcbiAqICAgdnMgNTAww5c1w5c1MDA9MS4yNU0gb3BzIHdpdGggbGluZWFyIHNjYW4uXG4gKlxuICogVGhlIGNhbGxlciBuZXZlciBzZWVzIHRoaXMg4oCUIGBjYXVzYWxDaGFpbigpYCBwaWNrcyBhdXRvbWF0aWNhbGx5LlxuICovXG5mdW5jdGlvbiBjcmVhdGVXcml0ZXJMb29rdXAoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSk6IFdyaXRlckxvb2t1cCB7XG4gIGlmIChjb21taXRMb2cubGVuZ3RoIDw9IFJFVkVSU0VfSU5ERVhfVEhSRVNIT0xEKSB7XG4gICAgcmV0dXJuIGxpbmVhclNjYW5Mb29rdXAoY29tbWl0TG9nKTtcbiAgfVxuICByZXR1cm4gcmV2ZXJzZUluZGV4TG9va3VwKGNvbW1pdExvZyk7XG59XG5cbi8vIOKUgOKUgCBDb3JlIGFsZ29yaXRobSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBSRkMtMDAzIEQyOiB0aGUgYGluY29tcGxldGVTb3VyY2VzYCBub2RlIGZyYWdtZW50IGZvciBhIGNvbW1pdCDigJQgYHt9YFxuICogd2hlbiB0aGUgc3RhZ2UgY29uc3VtZWQgbm8gdW50cmFja2VkIHJlYWQgcGF0aHMsIGtlZXBpbmcgdGhlIGZpZWxkXG4gKiBBQlNFTlQgKG5vdCBlbXB0eS1hcnJheS12YWx1ZWQpIGZvciBmdWxseS10cmFja2VkIHN0YWdlcy5cbiAqL1xuZnVuY3Rpb24gaW5jb21wbGV0ZVNvdXJjZXNGcmFnbWVudChjb21taXQ6IENvbW1pdEJ1bmRsZSk6IHsgaW5jb21wbGV0ZVNvdXJjZXM/OiBSZWFkb25seUFycmF5PFVudHJhY2tlZFNvdXJjZT4gfSB7XG4gIGlmICghY29tbWl0LnVudHJhY2tlZFNvdXJjZXMgfHwgY29tbWl0LnVudHJhY2tlZFNvdXJjZXMubGVuZ3RoID09PSAwKSByZXR1cm4ge307XG4gIHJldHVybiB7IGluY29tcGxldGVTb3VyY2VzOiBjb21taXQudW50cmFja2VkU291cmNlcyB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBjYXVzYWwgREFHIHJvb3RlZCBhdCBgc3RhcnRJZGAgYnkgd2Fsa2luZyBiYWNrd2FyZHNcbiAqIHRocm91Z2ggcmVhZOKGkndyaXRlIGRlcGVuZGVuY2llcyBpbiB0aGUgY29tbWl0IGxvZy5cbiAqXG4gKiBBdXRvbWF0aWNhbGx5IHNlbGVjdHMgdGhlIG9wdGltYWwgd3JpdGVyIGxvb2t1cCBzdHJhdGVneTpcbiAqIC0gTGluZWFyIHNjYW4gZm9yIHNtYWxsIGxvZ3MgKOKJpCAyNTYgY29tbWl0cylcbiAqIC0gUmV2ZXJzZSBpbmRleCB3aXRoIGJpbmFyeSBzZWFyY2ggZm9yIGxhcmdlIGxvZ3MgKD4gMjU2IGNvbW1pdHMpXG4gKlxuICogUHJvZHVjZXMgYSBEQUcgKG5vdCBhIHRyZWUpOiBpZiB0d28gY2hpbGRyZW4gYm90aCByZWFkIGZyb20gdGhlIHNhbWVcbiAqIHBhcmVudCwgdGhlIHBhcmVudCBub2RlIGlzIHNoYXJlZCAoZGVkdXBlZCBieSBydW50aW1lU3RhZ2VJZCkuXG4gKlxuICogQHBhcmFtIGNvbW1pdExvZyAgIE9yZGVyZWQgY29tbWl0IGJ1bmRsZXMgZnJvbSBleGVjdXRvci5nZXRTbmFwc2hvdCgpLmNvbW1pdExvZ1xuICogQHBhcmFtIHN0YXJ0SWQgICAgIHJ1bnRpbWVTdGFnZUlkIHRvIHN0YXJ0IGJhY2t0cmFja2luZyBmcm9tXG4gKiBAcGFyYW0gZ2V0S2V5c1JlYWQgQ2FsbGJhY2sgcmV0dXJuaW5nIGtleXMgcmVhZCBieSBhIGdpdmVuIGV4ZWN1dGlvbiBzdGVwXG4gKiBAcGFyYW0gb3B0aW9ucyAgICAgRGVwdGggYW5kIG5vZGUgbGltaXRzXG4gKiBAcmV0dXJucyBSb290IENhdXNhbE5vZGUgd2l0aCAucGFyZW50cyBmb3JtaW5nIHRoZSBEQUcsIG9yIHVuZGVmaW5lZCBpZiBzdGFydElkIG5vdCBmb3VuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2F1c2FsQ2hhaW4oXG4gIGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sXG4gIHN0YXJ0SWQ6IHN0cmluZyxcbiAgZ2V0S2V5c1JlYWQ6IEtleXNSZWFkTG9va3VwLFxuICBvcHRpb25zPzogQ2F1c2FsQ2hhaW5PcHRpb25zLFxuKTogQ2F1c2FsTm9kZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1heERlcHRoID0gb3B0aW9ucz8ubWF4RGVwdGggPz8gMjA7XG4gIGNvbnN0IG1heE5vZGVzID0gb3B0aW9ucz8ubWF4Tm9kZXMgPz8gMTAwO1xuICBjb25zdCBjb250cm9sRGVwcyA9IG9wdGlvbnM/LmNvbnRyb2xEZXBzO1xuICBjb25zdCB3ZWlnaCA9IG9wdGlvbnM/LndlaWdoO1xuICBjb25zdCBwZXJXcml0ZSA9IG9wdGlvbnM/LmVkZ2VBdHRyaWJ1dGlvbiA9PT0gJ3Blci13cml0ZSc7XG5cbiAgLy8gUkZDLTAwMyBENCDigJQgdHJ1bmNhdGlvbiB2aXNpYmlsaXR5LiBTZXQgb25seSB3aGVuIGEgbGltaXQgYWN0dWFsbHlcbiAgLy8gY3V0cyB0aGUgc2xpY2U7IHN1cmZhY2VkIG9uIHRoZSByb290IGFzIGB0cnVuY2F0ZWRgIHNvIGEgY29uc3VtZXIgY2FuXG4gIC8vIG5ldmVyIG1pc3Rha2UgYSB0cnVuY2F0ZWQgc2xpY2UgZm9yIGEgY29tcGxldGUgb25lLlxuICBsZXQgdHJ1bmNhdGVkQnlEZXB0aCA9IGZhbHNlO1xuICBsZXQgdHJ1bmNhdGVkQnlOb2RlcyA9IGZhbHNlO1xuXG4gIC8vIEJ1aWxkIHBvc2l0aW9uIGluZGV4OiBydW50aW1lU3RhZ2VJZCDihpIgYXJyYXkgcG9zaXRpb24gKE8obikgb25jZSlcbiAgY29uc3QgaWR4TWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21taXRMb2cubGVuZ3RoOyBpKyspIHtcbiAgICBpZHhNYXAuc2V0KGNvbW1pdExvZ1tpXS5ydW50aW1lU3RhZ2VJZCwgaSk7XG4gIH1cbiAgcXVlcnlXb3JrLnVuaXRzICs9IGNvbW1pdExvZy5sZW5ndGg7XG5cbiAgY29uc3Qgc3RhcnRJZHggPSBpZHhNYXAuZ2V0KHN0YXJ0SWQpO1xuICBpZiAoc3RhcnRJZHggPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBzdGFydENvbW1pdCA9IGNvbW1pdExvZ1tzdGFydElkeF07XG5cbiAgLy8gUGljayB3cml0ZXIgbG9va3VwIHN0cmF0ZWd5IGJhc2VkIG9uIGxvZyBzaXplXG4gIGNvbnN0IGZpbmRXcml0ZXIgPSBjcmVhdGVXcml0ZXJMb29rdXAoY29tbWl0TG9nKTtcblxuICAvLyBOb2RlIGRlZHVwIG1hcDogcnVudGltZVN0YWdlSWQg4oaSIENhdXNhbE5vZGUgKGVuc3VyZXMgREFHLCBub3QgdHJlZSlcbiAgY29uc3Qgbm9kZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDYXVzYWxOb2RlPigpO1xuXG4gIGNvbnN0IHJvb3Q6IENhdXNhbE5vZGUgPSB7XG4gICAgcnVudGltZVN0YWdlSWQ6IHN0YXJ0SWQsXG4gICAgc3RhZ2VJZDogc3RhcnRDb21taXQuc3RhZ2VJZCxcbiAgICBzdGFnZU5hbWU6IHN0YXJ0Q29tbWl0LnN0YWdlLFxuICAgIGtleXNXcml0dGVuOiBzdGFydENvbW1pdC50cmFjZS5tYXAoKHQpID0+IHQucGF0aCksXG4gICAgbGlua2VkQnk6ICcnLFxuICAgIGRlcHRoOiAwLFxuICAgIHBhcmVudHM6IFtdLFxuICAgIHBhcmVudEVkZ2VzOiBbXSxcbiAgICAuLi5pbmNvbXBsZXRlU291cmNlc0ZyYWdtZW50KHN0YXJ0Q29tbWl0KSxcbiAgfTtcbiAgbm9kZU1hcC5zZXQoc3RhcnRJZCwgcm9vdCk7XG5cbiAgLy8g4pSA4pSAICNQMSBwZXItd3JpdGUgYXR0cmlidXRpb24gbWFjaGluZXJ5IChpbmVydCB1bmRlciAnc3RhZ2UnKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gZXhwYW5kZWRSZWFkczogcGVyIG5vZGUsIHRoZSByZWFkcyBhbHJlYWR5IHF1ZXVlZCBmb3IgZXhwYW5zaW9uIOKAlCBsYXRlXG4gIC8vIGxpbmtzIHZpYSBhZGRpdGlvbmFsIGtleXMgcmUtZW5xdWV1ZSBvbmx5IHRoZSBERUxUQSwgc28gdGhlIHNsaWNlIGdyb3dzXG4gIC8vIG1vbm90b25pY2FsbHkgdG93YXJkIHRoZSBzdGFnZS1sZXZlbCBjZWlsaW5nIGFuZCB0ZXJtaW5hdGVzIChlYWNoIGtleVxuICAvLyBleHBhbmRzIGF0IG1vc3Qgb25jZSBwZXIgbm9kZSkuIGZ1bGx5RXhwYW5kZWQ6IG5vZGVzIHRoYXQgZmVsbCBiYWNrIHRvXG4gIC8vIHN0YWdlIGxldmVsIChubyByZWFkS2V5cyBvbiBhIGxpbmtpbmcgZW50cnkpIOKAlCBub3RoaW5nIGxlZnQgdG8gYWRkLlxuICBjb25zdCBleHBhbmRlZFJlYWRzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICBjb25zdCBmdWxseUV4cGFuZGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBub2RlJ3MgZXhwYW5zaW9uIHJlYWQtc2V0IGZvciB0aGUgZ2l2ZW4gbGlua2luZyBXUklUVEVOIGtleXMuXG4gICAqIFBlci13cml0ZSBtb2RlIHdpdGggcHJvdmVuYW5jZSBwcmVzZW50IOKGkiB1bmlvbiBvZiB0aGUgbGlua2luZyB3cml0ZXMnXG4gICAqIHRlbXBvcmFsLXByZWZpeCBgcmVhZEtleXNgLiBBbnkgbGlua2luZyBlbnRyeSBXSVRIT1VUIGByZWFkS2V5c2AgKG9yIG5vXG4gICAqIGxpbmtLZXlzIGF0IGFsbCkg4oaSIGhvbmVzdCBzdGFnZS1sZXZlbCBmYWxsYmFjaywgZmxhZ2dlZCB2aWEgdGhlIHNlY29uZFxuICAgKiB0dXBsZSBtZW1iZXIgc28gdGhlIGNhbGxlciBtYXJrcyB0aGUgbm9kZSBmdWxseSBleHBhbmRlZC5cbiAgICovXG4gIGZ1bmN0aW9uIHJlYWRzRm9yTGlua3MoY29tbWl0OiBDb21taXRCdW5kbGUsIGxpbmtLZXlzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IFtzdHJpbmdbXSwgYm9vbGVhbl0ge1xuICAgIGlmICghcGVyV3JpdGUgfHwgIWxpbmtLZXlzIHx8IGxpbmtLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtnZXRLZXlzUmVhZChjb21taXQucnVudGltZVN0YWdlSWQpLCB0cnVlXTtcbiAgICB9XG4gICAgY29uc3QgdW5pb24gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGxpbmtLZXkgb2YgbGlua0tleXMpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBsaW5raW5nRW50cmllcyhjb21taXQsIGxpbmtLZXkpO1xuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwIHx8IGVudHJpZXMuc29tZSgoZSkgPT4gZS5yZWFkS2V5cyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAvLyBNaXhlZC9kaWFsLW9mZiBsb2cg4oCUIGRlZ3JhZGUgVEhJUyBub2RlIHRvIHN0YWdlIGxldmVsLCBob25lc3RseS5cbiAgICAgICAgcmV0dXJuIFtnZXRLZXlzUmVhZChjb21taXQucnVudGltZVN0YWdlSWQpLCB0cnVlXTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykgZm9yIChjb25zdCByayBvZiBlbnRyeS5yZWFkS2V5cyBhcyBzdHJpbmdbXSkgdW5pb24uYWRkKHJrKTtcbiAgICB9XG4gICAgcmV0dXJuIFtbLi4udW5pb25dLCBmYWxzZV07XG4gIH1cblxuICAvLyBCRlMvd29ya2xpc3QgcXVldWU6IFtub2RlLCBjb21taXRJZHgsIGRlcHRoLCBrZXlzVG9FeHBhbmRdXG4gIGNvbnN0IFtyb290UmVhZHMsIHJvb3RJc0Z1bGxdID0gcGVyV3JpdGVcbiAgICA/IHJlYWRzRm9yTGlua3Moc3RhcnRDb21taXQsIG9wdGlvbnM/LnJvb3RMaW5rS2V5cylcbiAgICA6IFtnZXRLZXlzUmVhZChzdGFydElkKSwgdHJ1ZV07XG4gIGV4cGFuZGVkUmVhZHMuc2V0KHN0YXJ0SWQsIG5ldyBTZXQocm9vdFJlYWRzKSk7XG4gIGlmIChyb290SXNGdWxsKSBmdWxseUV4cGFuZGVkLmFkZChzdGFydElkKTtcbiAgY29uc3QgcXVldWU6IEFycmF5PFtDYXVzYWxOb2RlLCBudW1iZXIsIG51bWJlciwgc3RyaW5nW11dPiA9IFtbcm9vdCwgc3RhcnRJZHgsIDAsIHJvb3RSZWFkc11dO1xuICBsZXQgdmlzaXRlZCA9IDE7XG5cbiAgLyoqXG4gICAqIExpbmsgYG5vZGUg4oaSIHBhcmVudGAgKGNyZWF0aW5nICsgZW5xdWV1ZWluZyB0aGUgcGFyZW50IHdoZW4gbmV3KS5cbiAgICogU2hhcmVkIGJ5IGRhdGEtZWRnZSBleHBhbnNpb24gKHJlYWTihpJ3cml0ZSkgYW5kIGNvbnRyb2wtZWRnZSBleHBhbnNpb25cbiAgICogKEQzKS4gT25lIENhdXNhbEVkZ2UgcGVyIGRpc3RpbmN0IChwYXJlbnQsIGtpbmQsIGtleSkgbGluazsgYHBhcmVudHNgXG4gICAqIGtlZXBzIGl0cyBoaXN0b3JpY2FsIG9uZS1lbnRyeS1wZXItcGFyZW50IGRlZHVwLlxuICAgKi9cbiAgZnVuY3Rpb24gbGlua1BhcmVudChcbiAgICBub2RlOiBDYXVzYWxOb2RlLFxuICAgIHBhcmVudENvbW1pdDogQ29tbWl0QnVuZGxlLFxuICAgIGtpbmQ6ICdkYXRhJyB8ICdjb250cm9sJyxcbiAgICBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBkZXB0aDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwYXJlbnRJZCA9IHBhcmVudENvbW1pdC5ydW50aW1lU3RhZ2VJZDtcbiAgICAvLyB0aGUgZGVkdXAgc2NhbnMgYmVsb3csIGFuZCB0aGUgcGFyZW50J3MgdHJhY2Ugd2hlbiBpdCBpcyBuZXcg4oCUIGNvdW50ZWQgZm9yIHRoZSBzY2FsaW5nIHRlc3RcbiAgICBxdWVyeVdvcmsudW5pdHMgKz0gMSArIG5vZGUucGFyZW50cy5sZW5ndGggKyBub2RlLnBhcmVudEVkZ2VzLmxlbmd0aDtcbiAgICAvLyAjUDE6IHRoZSBwYXJlbnQncyBleHBhbnNpb24gcmVhZHMsIHJlc29sdmVkIExBWklMWSAob25seSBmb3IgbmV3IG5vZGVzXG4gICAgLy8gb3IgcGVyLXdyaXRlIHJlLWV4cGFuc2lvbiDigJQgZHVwbGljYXRlIGxpbmtzIHVuZGVyICdzdGFnZScgcGF5IG5vdGhpbmcpLlxuICAgIC8vIERhdGEgbGlua3MgZXhwYW5kIHRocm91Z2ggdGhlIHJlYWRzIHRoYXQgZmVkIHRoZSBwYXJlbnQncyB3cml0ZSBvZlxuICAgIC8vIGBrZXlgOyBjb250cm9sIGxpbmtzIGV4cGFuZCB0aGUgZGVjaWRlciBhdCBzdGFnZSBsZXZlbCAoYSBkZWNpc2lvblxuICAgIC8vIGRlcGVuZHMgb24gZXZlcnl0aGluZyBpdCByZWFkKS5cbiAgICBjb25zdCByZXNvbHZlTGlua1JlYWRzID0gKCk6IFtzdHJpbmdbXSwgYm9vbGVhbl0gPT5cbiAgICAgIGtpbmQgPT09ICdkYXRhJ1xuICAgICAgICA/IHJlYWRzRm9yTGlua3MocGFyZW50Q29tbWl0LCBrZXkgIT09IHVuZGVmaW5lZCA/IFtrZXldIDogdW5kZWZpbmVkKVxuICAgICAgICA6IFtnZXRLZXlzUmVhZChwYXJlbnRJZCksIHRydWVdO1xuXG4gICAgbGV0IHBhcmVudE5vZGUgPSBub2RlTWFwLmdldChwYXJlbnRJZCk7XG4gICAgaWYgKCFwYXJlbnROb2RlKSB7XG4gICAgICAvLyBOZXcgbm9kZSDigJQgY3JlYXRlIGFuZCBlbnF1ZXVlIChyZXNwZWN0aW5nIHRoZSBub2RlIGJ1ZGdldClcbiAgICAgIGlmICh2aXNpdGVkID49IG1heE5vZGVzKSB7XG4gICAgICAgIHRydW5jYXRlZEJ5Tm9kZXMgPSB0cnVlOyAvLyBENDogYSBkaXNjb3ZlcmVkIHBhcmVudCB3YXMgZHJvcHBlZFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudElkeCA9IGlkeE1hcC5nZXQocGFyZW50SWQpO1xuICAgICAgaWYgKHBhcmVudElkeCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgIHF1ZXJ5V29yay51bml0cyArPSBwYXJlbnRDb21taXQudHJhY2UubGVuZ3RoO1xuICAgICAgcGFyZW50Tm9kZSA9IHtcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHBhcmVudElkLFxuICAgICAgICBzdGFnZUlkOiBwYXJlbnRDb21taXQuc3RhZ2VJZCxcbiAgICAgICAgc3RhZ2VOYW1lOiBwYXJlbnRDb21taXQuc3RhZ2UsXG4gICAgICAgIGtleXNXcml0dGVuOiBwYXJlbnRDb21taXQudHJhY2UubWFwKCh0KSA9PiB0LnBhdGgpLFxuICAgICAgICAvLyBsaW5rZWRCeSBzdGF5cyBhIERBVEEta2V5IGNvbmNlcHQgKGJhY2stY29tcGF0KSDigJQgY29udHJvbC1saW5rZWRcbiAgICAgICAgLy8gbm9kZXMgY2FycnkgdGhlaXIgbGFiZWwgb24gdGhlIGVkZ2UgaW5zdGVhZC5cbiAgICAgICAgbGlua2VkQnk6IGtpbmQgPT09ICdkYXRhJyA/IGtleSA/PyAnJyA6ICcnLFxuICAgICAgICBkZXB0aDogZGVwdGggKyAxLFxuICAgICAgICBwYXJlbnRzOiBbXSxcbiAgICAgICAgcGFyZW50RWRnZXM6IFtdLFxuICAgICAgICAuLi5pbmNvbXBsZXRlU291cmNlc0ZyYWdtZW50KHBhcmVudENvbW1pdCksXG4gICAgICB9O1xuICAgICAgbm9kZU1hcC5zZXQocGFyZW50SWQsIHBhcmVudE5vZGUpO1xuICAgICAgdmlzaXRlZCsrO1xuICAgICAgY29uc3QgW2xpbmtSZWFkcywgbGlua0lzRnVsbF0gPSByZXNvbHZlTGlua1JlYWRzKCk7XG4gICAgICBleHBhbmRlZFJlYWRzLnNldChwYXJlbnRJZCwgbmV3IFNldChsaW5rUmVhZHMpKTtcbiAgICAgIGlmIChsaW5rSXNGdWxsKSBmdWxseUV4cGFuZGVkLmFkZChwYXJlbnRJZCk7XG4gICAgICBxdWV1ZS5wdXNoKFtwYXJlbnROb2RlLCBwYXJlbnRJZHgsIGRlcHRoICsgMSwgbGlua1JlYWRzXSk7XG4gICAgfSBlbHNlIGlmIChwZXJXcml0ZSAmJiAhZnVsbHlFeHBhbmRlZC5oYXMocGFyZW50SWQpKSB7XG4gICAgICAvLyAjUDEgd29ya2xpc3Q6IGFuIEVYSVNUSU5HIG5vZGUgbGlua2VkIHZpYSBhbm90aGVyIGtleSBtYXkgb3dlIG1vcmVcbiAgICAgIC8vIGV4cGFuc2lvbiDigJQgZW5xdWV1ZSBvbmx5IHRoZSByZWFkcyBub3QgeWV0IGV4cGFuZGVkIChtb25vdG9uZTsgdGhlXG4gICAgICAvLyBub2RlIGJ1ZGdldCBpcyB1bnRvdWNoZWQsIG5vIG5vZGUgaXMgY3JlYXRlZCkuIFJlLWV4cGFuc2lvbiBrZWVwc1xuICAgICAgLy8gdGhlIG5vZGUncyBPUklHSU5BTCBkZXB0aCBzbyBpdHMgcGFyZW50cyBnZXQgYSBjb25zaXN0ZW50IGRlcHRoKzEuXG4gICAgICBjb25zdCBbbGlua1JlYWRzLCBsaW5rSXNGdWxsXSA9IHJlc29sdmVMaW5rUmVhZHMoKTtcbiAgICAgIGNvbnN0IGV4cGFuZGVkID0gZXhwYW5kZWRSZWFkcy5nZXQocGFyZW50SWQpITtcbiAgICAgIGNvbnN0IGRlbHRhID0gbGlua1JlYWRzLmZpbHRlcigoaykgPT4gIWV4cGFuZGVkLmhhcyhrKSk7XG4gICAgICBpZiAobGlua0lzRnVsbCkgZnVsbHlFeHBhbmRlZC5hZGQocGFyZW50SWQpO1xuICAgICAgaWYgKGRlbHRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChjb25zdCBrIG9mIGRlbHRhKSBleHBhbmRlZC5hZGQoayk7XG4gICAgICAgIGNvbnN0IHBhcmVudElkeCA9IGlkeE1hcC5nZXQocGFyZW50SWQpO1xuICAgICAgICBpZiAocGFyZW50SWR4ICE9PSB1bmRlZmluZWQpIHF1ZXVlLnB1c2goW3BhcmVudE5vZGUsIHBhcmVudElkeCwgcGFyZW50Tm9kZS5kZXB0aCwgZGVsdGFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEQUcgbWVyZ2U6IG9uZSBwYXJlbnRzW10gZW50cnkgcGVyIGRpc3RpbmN0IHBhcmVudCAoaGlzdG9yaWNhbCBzaGFwZSlcbiAgICBpZiAoIW5vZGUucGFyZW50cy5zb21lKChwKSA9PiBwLnJ1bnRpbWVTdGFnZUlkID09PSBwYXJlbnRJZCkpIHtcbiAgICAgIG5vZGUucGFyZW50cy5wdXNoKHBhcmVudE5vZGUpO1xuICAgIH1cbiAgICAvLyBPbmUgZWRnZSBwZXIgZGlzdGluY3QgKHBhcmVudCwga2luZCwga2V5KSBsaW5rLiBUaGUgd2VpZ2hlciAoRDQpXG4gICAgLy8gc3RhbXBzIHRoZSB3ZWlnaHQgYXQgY3JlYXRpb247IGB1bmRlZmluZWRgIOKGkiAxLjAg4oCUIHRoZSBlbmdpbmUgbmV2ZXJcbiAgICAvLyBjb21wdXRlcyB3ZWlnaHRzIGl0c2VsZi5cbiAgICBpZiAoIW5vZGUucGFyZW50RWRnZXMuc29tZSgoZSkgPT4gZS5wYXJlbnQucnVudGltZVN0YWdlSWQgPT09IHBhcmVudElkICYmIGUua2luZCA9PT0ga2luZCAmJiBlLmtleSA9PT0ga2V5KSkge1xuICAgICAgLy8gRXJyb3IgaXNvbGF0aW9uIChyZXZpZXcgZmluZGluZyk6IGEgY29uc3VtZXIgd2VpZ2hlciB0aGF0IHRocm93c1xuICAgICAgLy8gbXVzdCBkZWdyYWRlIHRvIHRoZSBkZWZhdWx0IHdlaWdodCwgbmV2ZXIgY3Jhc2ggdGhlIHNsaWNlIOKAlCB0aGVcbiAgICAgIC8vIHNhbWUgY29udHJhY3QgZXZlcnkgb3RoZXIgY29uc3VtZXIgY2FsbGJhY2sgaW4gdGhlIGxpYnJhcnkgZ2V0cy5cbiAgICAgIGxldCB3ZWlnaHQgPSAxLjA7XG4gICAgICBpZiAod2VpZ2gpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB3ZWlnaHQgPSB3ZWlnaChub2RlLCBwYXJlbnROb2RlLCBrZXksIGtpbmQpID8/IDEuMDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLyogd2VpZ2hlciB0aHJldyDigJQga2VlcCAxLjAsIHRoZSBzbGljZSBzdGF5cyB1c2FibGUgKi9cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgbmVzdGVkID0ga2luZCA9PT0gJ2RhdGEnICYmIGtleSAhPT0gdW5kZWZpbmVkICYmIHdyaXRlc09ubHlJbnNpZGUocGFyZW50Q29tbWl0LCBrZXkpO1xuICAgICAgbm9kZS5wYXJlbnRFZGdlcy5wdXNoKHtcbiAgICAgICAgcGFyZW50OiBwYXJlbnROb2RlLFxuICAgICAgICBraW5kLFxuICAgICAgICBrZXksXG4gICAgICAgIHdlaWdodCxcbiAgICAgICAgLi4uKG5lc3RlZCAmJiB7IGJhc2lzOiAnbmVzdGVkLXJvd3MnIGFzIGNvbnN0IH0pLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBbbm9kZSwgY29tbWl0SWR4LCBkZXB0aCwga2V5c1RvRXhwYW5kXSA9IHF1ZXVlLnNoaWZ0KCkhO1xuICAgIHF1ZXJ5V29yay51bml0cyArPSAxICsga2V5c1RvRXhwYW5kLmxlbmd0aDtcblxuICAgIGlmIChkZXB0aCA+PSBtYXhEZXB0aCkge1xuICAgICAgLy8gRDQ6IG9ubHkgYSBub2RlIHRoYXQgc3RpbGwgSEFEIHNvbWV0aGluZyB0byBleHBhbmQgY291bnRzIGFzIGEgY3V0XG4gICAgICAvLyAoYSBsZWFmIGF0IHRoZSBob3Jpem9uIHRydW5jYXRlcyBub3RoaW5nKS5cbiAgICAgIGlmIChrZXlzVG9FeHBhbmQubGVuZ3RoID4gMCB8fCBjb250cm9sRGVwcz8uKG5vZGUucnVudGltZVN0YWdlSWQpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdHJ1bmNhdGVkQnlEZXB0aCA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBEYXRhIGVkZ2VzOiBmb3IgZWFjaCBrZXkgaW4gdGhpcyBleHBhbnNpb24ncyByZWFkLXNldCwgZmluZCB3aG8gd3JvdGVcbiAgICAvLyBpdC4gVW5kZXIgJ3N0YWdlJyB0aGlzIGlzIHRoZSBub2RlJ3MgZnVsbCByZWFkLXNldCAoaGlzdG9yaWNhbFxuICAgIC8vIGJlaGF2aW9yKTsgdW5kZXIgJ3Blci13cml0ZScgaXQgaXMgdGhlIGxpbmtpbmcgd3JpdGVzJyB0ZW1wb3JhbCBwcmVmaXhcbiAgICAvLyAob3IgYSB3b3JrbGlzdCBkZWx0YSBvbiByZS1leHBhbnNpb24pLlxuICAgIGNvbnN0IGtleXNSZWFkID0ga2V5c1RvRXhwYW5kO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNSZWFkKSB7XG4gICAgICBjb25zdCB3cml0ZXIgPSBmaW5kV3JpdGVyKGtleSwgY29tbWl0SWR4KTtcbiAgICAgIGlmICghd3JpdGVyKSB7XG4gICAgICAgIC8vIEY0Yjogc2F5IHdoeSB0aGVyZSBpcyBubyBlZGdlIOKAlCBubyBjb21taXQgYmVmb3JlIHRoaXMgbm9kZSB3cm90ZSB0aGUga2V5LlxuICAgICAgICBub2RlLnByZVJ1blJlYWRzID8/PSB7IGNvZGU6ICdwcmUtcnVuLW9yaWdpbicsIGtleXM6IFtdIH07XG4gICAgICAgIGlmICghbm9kZS5wcmVSdW5SZWFkcy5rZXlzLmluY2x1ZGVzKGtleSkpIG5vZGUucHJlUnVuUmVhZHMua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGlua1BhcmVudChub2RlLCB3cml0ZXIsICdkYXRhJywga2V5LCBkZXB0aCk7XG4gICAgfVxuXG4gICAgLy8gQ29udHJvbCBlZGdlIChSRkMtMDAzIEQzKTogbGluayB0aGUgZ292ZXJuaW5nIGRlY2lkZXIsIGxhYmVsZWQgYnkgdGhlXG4gICAgLy8gZGVjaWRlKCkgcnVsZSBsYWJlbCB3aGVuIHByZXNlbnQuIFRoZSBkZWNpZGVyIG5vZGUgdGhlbiBleHBhbmRzXG4gICAgLy8gbm9ybWFsbHkgdGhyb3VnaCBpdHMgb3duIGRhdGEgcmVhZHMgKGFuZCBpdHMgb3duIGNvbnRyb2wgcGFyZW50KS5cbiAgICBpZiAoY29udHJvbERlcHMpIHtcbiAgICAgIGNvbnN0IGRlcCA9IGNvbnRyb2xEZXBzKG5vZGUucnVudGltZVN0YWdlSWQpO1xuICAgICAgaWYgKGRlcCkge1xuICAgICAgICBjb25zdCBkZWNpZGVySWR4ID0gaWR4TWFwLmdldChkZXAuZGVjaWRlcklkKTtcbiAgICAgICAgaWYgKGRlY2lkZXJJZHggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGxpbmtQYXJlbnQobm9kZSwgY29tbWl0TG9nW2RlY2lkZXJJZHhdLCAnY29udHJvbCcsIGRlcC5sYWJlbCwgZGVwdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUkZDLTAwMyBENCDigJQgdHJ1bmNhdGlvbiB2aXNpYmlsaXR5IG9uIHRoZSByb290IChhYnNlbnQgd2hlbiBjb21wbGV0ZSkuIEl0IGlzIERBVEEsIGFuZCBvbmx5XG4gIC8vIGRhdGE6IGEgcmVhZGVyIHJlYWRzIGByb290LnRydW5jYXRlZGAgKGFuZCBgZm9ybWF0Q2F1c2FsQ2hhaW5gIHByaW50cyBpdCk7IHRoZSByZWNvcmQgd3JpdGVzIG5vXG4gIC8vIGNvbnNvbGUgbGluZSAodGhlIGRldi1tb2RlIHdhcm5pbmcgd2VudCBpbiBDNiDigJQgdGhlIHJlY29yZCBpbXBvcnRzIG5vdGhpbmcgb3V0c2lkZSBpdHNlbGYpLlxuICBpZiAodHJ1bmNhdGVkQnlEZXB0aCB8fCB0cnVuY2F0ZWRCeU5vZGVzKSB7XG4gICAgcm9vdC50cnVuY2F0ZWQgPSB7IGJ5RGVwdGg6IHRydW5jYXRlZEJ5RGVwdGgsIGJ5Tm9kZXM6IHRydW5jYXRlZEJ5Tm9kZXMgfTtcbiAgfVxuXG4gIHJldHVybiByb290O1xufVxuXG4vLyDilIDilIAgVXRpbGl0aWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEZsYXR0ZW4gdGhlIGNhdXNhbCBEQUcgaW50byBhIEJGUy1vcmRlcmVkIGxpc3Qgb2Ygbm9kZXMuXG4gKiBFYWNoIG5vZGUgYXBwZWFycyBleGFjdGx5IG9uY2UgKGZpcnN0IG9jY3VycmVuY2UgYnkgQkZTIG9yZGVyKS5cbiAqIFVzZWZ1bCBmb3IgbGluZWFyIGRpc3BsYXkgb3IgaXRlcmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbkNhdXNhbERBRyhyb290OiBDYXVzYWxOb2RlKTogQ2F1c2FsTm9kZVtdIHtcbiAgY29uc3QgcmVzdWx0OiBDYXVzYWxOb2RlW10gPSBbXTtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBxdWV1ZTogQ2F1c2FsTm9kZVtdID0gW3Jvb3RdO1xuXG4gIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgbm9kZSA9IHF1ZXVlLnNoaWZ0KCkhO1xuICAgIGlmICh2aXNpdGVkLmhhcyhub2RlLnJ1bnRpbWVTdGFnZUlkKSkgY29udGludWU7XG4gICAgdmlzaXRlZC5hZGQobm9kZS5ydW50aW1lU3RhZ2VJZCk7XG4gICAgcmVzdWx0LnB1c2gobm9kZSk7XG5cbiAgICBmb3IgKGNvbnN0IHBhcmVudCBvZiBub2RlLnBhcmVudHMpIHtcbiAgICAgIGlmICghdmlzaXRlZC5oYXMocGFyZW50LnJ1bnRpbWVTdGFnZUlkKSkge1xuICAgICAgICBxdWV1ZS5wdXNoKHBhcmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBGb3JtYXQgYSBjYXVzYWwgREFHIGFzIGh1bWFuLXJlYWRhYmxlIGluZGVudGVkIHRleHQuXG4gKiBTaG93cyB0aGUgZGVwZW5kZW5jeSBjaGFpbiB3aXRoIGRlcHRoIGluZGVudGF0aW9uIGFuZCBsaW5rZWQtYnkga2V5cy5cbiAqXG4gKiBSRkMtMDAzIEQyOiBub2RlcyB0aGF0IGNvbnN1bWVkIHVudHJhY2tlZCByZWFkIHBhdGhzIHJlbmRlciBhbiBleHRyYVxuICogYOKaoCBhbHNvIGNvbnN1bWVkIOKApiDigJQgc2xpY2UgbWF5IGJlIGluY29tcGxldGUgaGVyZWAgbGluZSwgc28gYSBjb25zdW1lclxuICogKGh1bWFuIG9yIExMTSkgZGVidWdnaW5nIGZyb20gdGhlIHNsaWNlIGlzIFRPTEQgd2hlbiBpdCBpcyBpbmNvbXBsZXRlLlxuICpcbiAqIFJGQy0wMDMgRDM6IGNvbnRyb2wgZWRnZXMgcmVuZGVyIGFzIGDihpAgW2NvbnRyb2w6IDxydWxlIGxhYmVsPl1gXG4gKiAobGFiZWwgb21pdHRlZCB3aGVuIHRoZSBkZWNpc2lvbiBjYXJyaWVkIG5vbmUpLiBEYXRhIHJlbmRlcmluZyBpc1xuICogYnl0ZS1pZGVudGljYWwgdG8gdGhlIHByZS1EMyBvdXRwdXQg4oCUIGDihpAgdmlhIDxrZXk+YCBmcm9tIHRoZSBub2RlJ3NcbiAqIGRpc2NvdmVyeS10aW1lIGBsaW5rZWRCeWAuXG4gKlxuICogUkZDLTAwMyBENDogZWRnZSB3ZWlnaHRzIGZyb20gdGhlIGB3ZWlnaGAgaG9vayByZW5kZXIgYXMgYSBzdWZmaXgg4oCUXG4gKiBg4oaQIHZpYSBzeXN0ZW1Qcm9tcHQgKDAuMTgpYCDigJQgb25seSB3aGVuIOKJoCAxLjAsIHNvIHVud2VpZ2h0ZWQgb3V0cHV0IGlzXG4gKiB1bmNoYW5nZWQuIEEgdHJ1bmNhdGVkIHNsaWNlIChyb290LnRydW5jYXRlZCkgYXBwZW5kcyBhIGZpbmFsXG4gKiBg4pqgIHNsaWNlIHRydW5jYXRlZCDigKZgIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRDYXVzYWxDaGFpbihyb290OiBDYXVzYWxOb2RlKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdCB3ZWlnaHRTdWZmaXggPSAoZWRnZTogQ2F1c2FsRWRnZSB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PlxuICAgIGVkZ2UgIT09IHVuZGVmaW5lZCAmJiBlZGdlLndlaWdodCAhPT0gMSA/IGAgKCR7ZWRnZS53ZWlnaHR9KWAgOiAnJztcblxuICBmdW5jdGlvbiB3YWxrKG5vZGU6IENhdXNhbE5vZGUsIGluZGVudDogbnVtYmVyLCBlZGdlc0Zyb21DaGlsZD86IENhdXNhbEVkZ2VbXSk6IHZvaWQge1xuICAgIGlmICh2aXNpdGVkLmhhcyhub2RlLnJ1bnRpbWVTdGFnZUlkKSkge1xuICAgICAgbGluZXMucHVzaChgJHsnICAnLnJlcGVhdChpbmRlbnQpfeKGsyAke25vZGUucnVudGltZVN0YWdlSWR9IChzZWUgYWJvdmUpYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZpc2l0ZWQuYWRkKG5vZGUucnVudGltZVN0YWdlSWQpO1xuXG4gICAgY29uc3QgbGlua1BhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChub2RlLmxpbmtlZEJ5KSB7XG4gICAgICBjb25zdCBkYXRhRWRnZSA9IGVkZ2VzRnJvbUNoaWxkPy5maW5kKChlKSA9PiBlLmtpbmQgPT09ICdkYXRhJyk7XG4gICAgICBsaW5rUGFydHMucHVzaChgdmlhICR7bm9kZS5saW5rZWRCeX0ke3dlaWdodFN1ZmZpeChkYXRhRWRnZSl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xFZGdlID0gZWRnZXNGcm9tQ2hpbGQ/LmZpbmQoKGUpID0+IGUua2luZCA9PT0gJ2NvbnRyb2wnKTtcbiAgICBpZiAoY29udHJvbEVkZ2UpIHtcbiAgICAgIGxpbmtQYXJ0cy5wdXNoKGBbY29udHJvbCR7Y29udHJvbEVkZ2Uua2V5ID8gYDogJHtjb250cm9sRWRnZS5rZXl9YCA6ICcnfV0ke3dlaWdodFN1ZmZpeChjb250cm9sRWRnZSl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGxpbmsgPSBsaW5rUGFydHMubGVuZ3RoID4gMCA/IGAg4oaQICR7bGlua1BhcnRzLmpvaW4oJyDihpAgJyl9YCA6ICcnO1xuXG4gICAgY29uc3Qgd3JpdGVzID0gbm9kZS5rZXlzV3JpdHRlbi5sZW5ndGggPiAwID8gYCBbd3JvdGU6ICR7bm9kZS5rZXlzV3JpdHRlbi5qb2luKCcsICcpfV1gIDogJyc7XG4gICAgbGluZXMucHVzaChgJHsnICAnLnJlcGVhdChpbmRlbnQpfSR7bm9kZS5zdGFnZU5hbWV9ICgke25vZGUucnVudGltZVN0YWdlSWR9KSR7bGlua30ke3dyaXRlc31gKTtcblxuICAgIGlmIChub2RlLmluY29tcGxldGVTb3VyY2VzICYmIG5vZGUuaW5jb21wbGV0ZVNvdXJjZXMubGVuZ3RoID4gMCkge1xuICAgICAgbGluZXMucHVzaChcbiAgICAgICAgYCR7JyAgJy5yZXBlYXQoaW5kZW50ICsgMSl94pqgIGFsc28gY29uc3VtZWQgJHtub2RlLmluY29tcGxldGVTb3VyY2VzLmpvaW4oJy8nKX0g4oCUIHNsaWNlIG1heSBiZSBpbmNvbXBsZXRlIGhlcmVgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHBhcmVudCBvZiBub2RlLnBhcmVudHMpIHtcbiAgICAgIHdhbGsoXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgaW5kZW50ICsgMSxcbiAgICAgICAgbm9kZS5wYXJlbnRFZGdlcy5maWx0ZXIoKGUpID0+IGUucGFyZW50ID09PSBwYXJlbnQpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB3YWxrKHJvb3QsIDApO1xuXG4gIGlmIChyb290LnRydW5jYXRlZCkge1xuICAgIGNvbnN0IGNhdXNlcyA9IFtyb290LnRydW5jYXRlZC5ieURlcHRoICYmICdtYXhEZXB0aCByZWFjaGVkJywgcm9vdC50cnVuY2F0ZWQuYnlOb2RlcyAmJiAnbWF4Tm9kZXMgcmVhY2hlZCddXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuam9pbignLCAnKTtcbiAgICBsaW5lcy5wdXNoKGDimqAgc2xpY2UgdHJ1bmNhdGVkICgke2NhdXNlc30pIOKAlCBvbGRlciBjYXVzZXMgZXhpc3QgYmV5b25kIHRoaXMgaG9yaXpvbmApO1xuICB9XG5cbiAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xufVxuXG4vLyDilIDilIAgRXhwb3J0ZWQgZm9yIHRlc3RpbmcgKGludGVybmFsKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIEBpbnRlcm5hbCBFeHBvc2VkIGZvciB0ZXN0aW5nIHRoZSBzdHJhdGVneSBzZWxlY3Rpb24uICovXG5leHBvcnQgY29uc3QgX1JFVkVSU0VfSU5ERVhfVEhSRVNIT0xEID0gUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQ7XG4iXX0=
|
|
467
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3RyYWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvYmFja3RyYWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5REc7QUFFSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQWdNekMsMEVBQTBFO0FBRTFFOzs7O0dBSUc7QUFDSCxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQVFwQyxrRUFBa0U7QUFDbEUsU0FBUyxnQkFBZ0IsQ0FBQyxTQUF5QjtJQUNqRCxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLFNBQXlCO0lBQ25ELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxPQUFPLENBQUMsR0FBVyxFQUFFLFNBQWlCLEVBQTRCLEVBQUU7UUFDbEUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRCxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzdDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGNBQWMs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aUNBQWlDLENBQy9HLENBQUM7UUFDSixDQUFDO1FBRUQsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUNGLE1BQU0sRUFDTixNQUFNLEdBQUcsQ0FBQyxFQUNWLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUNwRCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRWQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQzthQUN4RyxNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2QsS0FBSyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsTUFBTSw0Q0FBNEMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQUVELDBFQUEwRTtBQUUxRSw0REFBNEQ7QUFDNUQsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGJhY2t0cmFjay50cyDigJQgQmFja3dhcmQgY2F1c2FsIGNoYWluIGFuYWx5c2lzIG9uIHRoZSBjb21taXQgbG9nLlxuICpcbiAqIEltcGxlbWVudHMgKipiYWNrd2FyZCBwcm9ncmFtIHNsaWNpbmcqKiAoV2Vpc2VyIDE5ODQsIHRoaW4tc2xpY2UgdmFyaWFudCk6XG4gKiBnaXZlbiBhIHN0YXJ0aW5nIGV4ZWN1dGlvbiBzdGVwLCB3YWxrIGJhY2t3YXJkcyB0aHJvdWdoIHJlYWTihpJ3cml0ZVxuICogZGVwZW5kZW5jaWVzIHRvIGJ1aWxkIHRoZSBjYXVzYWwgREFHIHRoYXQgcHJvZHVjZWQgdGhlIGRhdGEgYXQgdGhhdCBzdGVwLlxuICpcbiAqICMjIEFsZ29yaXRobVxuICpcbiAqIEJGUyBvbiB0aGUgaW1wbGljaXQgZGVwZW5kZW5jeSBncmFwaCB3aGVyZSBlZGdlcyBydW4gZnJvbSByZWFkZXIg4oaSIHdyaXRlci5cbiAqXG4gKiAxLiBMb2NhdGUgc3RhcnRJZCBpbiBjb21taXRMb2cg4oaSIHJvb3Qgbm9kZVxuICogMi4gR2V0IGtleXNSZWFkIGZvciByb290IHZpYSBgZ2V0S2V5c1JlYWRgIGNhbGxiYWNrXG4gKiAzLiBGb3IgZWFjaCBrZXkgcmVhZCwgZmluZCB3aG8gbGFzdCB3cm90ZSBpdCBiZWZvcmUgdGhpcyBzdGVwIOKGkiBwYXJlbnQgY29tbWl0XG4gKiAgICAoXCJ3cm90ZVwiIGlzIHRoZSB3cml0ZXIgcnVsZSBvZiBga2V5UGF0aHMudHNgLCA5LjMzLjA6IGEgcm93IG9uIHRoZSBrZXksIGluc2lkZSBpdCwgb3JcbiAqICAgIGFyb3VuZCBpdCB0aGF0IGNoYW5nZWQgaXQg4oCUIHNvIGEgc3RhZ2UgdGhhdCByZWFkIGBjZmdgIGxpbmtzIHRvIHRoZSBzdWJmbG93IHNlZWQgb3JcbiAqICAgIG1lcmdlLWJhY2sgdGhhdCB3cm90ZSBgY2Zn4pCfYmApXG4gKiA0LiBDcmVhdGUgcGFyZW50IENhdXNhbE5vZGUsIGxpbmsgdG8gcm9vdC5wYXJlbnRzXG4gKiA1LiBFbnF1ZXVlIHBhcmVudC4gUmVwZWF0IHVudGlsIHF1ZXVlIGVtcHR5IG9yIGxpbWl0cyBoaXQuXG4gKlxuICogT3V0cHV0IGlzIGEgKipEQUcqKiAobm90IGEgbGlua2VkIGxpc3QpOiBhIHN0YWdlIHJlYWRpbmcgYGNyZWRpdFNjb3JlYCBBTkQgYGR0aWBcbiAqIGZyb20gZGlmZmVyZW50IHdyaXRlcnMgaGFzIHR3byBwYXJlbnRzLlxuICpcbiAqICMjIFN0YWdlZCBPcHRpbWl6YXRpb25cbiAqXG4gKiBUd28gd3JpdGVyLWxvb2t1cCBzdHJhdGVnaWVzLCBjaG9zZW4gYXV0b21hdGljYWxseSBieSBjb21taXQgbG9nIHNpemU6XG4gKlxuICogfCBTdHJhdGVneSB8IFdoZW4gfCBDb21wbGV4aXR5IHBlciBsb29rdXAgfFxuICogfC0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IExpbmVhciBzY2FuIHwgTiDiiaQgMjU2IHwgTyhOKSDigJQgc2ltcGxlIGJhY2t3YXJkIHNjYW4gfFxuICogfCBSZXZlcnNlIGluZGV4IHwgTiA+IDI1NiB8IE8oSyBsb2cgTikg4oCUIHByZWJ1aWx0IGtleeKGkltpbmRpY2VzXSwgYmluYXJ5IHNlYXJjaCB8XG4gKlxuICogVGhlIHRocmVzaG9sZCAoMjU2KSBpcyBjaG9zZW4gc28gdGhlIE8oTikgYnVpbGQgY29zdCBvZiB0aGUgcmV2ZXJzZSBpbmRleFxuICogaXMgYW1vcnRpemVkIG92ZXIgdGhlIEJGUyB0cmF2ZXJzYWwuIEJlbG93IDI1NiwgbGluZWFyIHNjYW4gd2lucyBiZWNhdXNlXG4gKiB0aGVyZSdzIG5vIGluZGV4IGJ1aWxkIG92ZXJoZWFkLiBUaGUgY29uc3VtZXIgbmV2ZXIgc2VlcyB0aGlzIOKAlCBgY2F1c2FsQ2hhaW4oKWBcbiAqIHBpY2tzIHRoZSByaWdodCBzdHJhdGVneSBpbnRlcm5hbGx5IChsaWtlIGEgcXVlcnkgb3B0aW1pemVyIGNob29zaW5nIGJldHdlZW5cbiAqIHNlcXVlbnRpYWwgc2NhbiB2cyBpbmRleCBzY2FuIGJhc2VkIG9uIHRhYmxlIHNpemUpLlxuICpcbiAqICMjIENvbXBsZXhpdHlcbiAqXG4gKiAtICoqU21hbGwgbG9ncyAoTiDiiaQgMjU2KToqKiBPKFYgw5cgSyDDlyBOKSB0b3RhbC4gVj12aXNpdGVkLCBLPWF2ZyBrZXlzL25vZGUuXG4gKiAtICoqTGFyZ2UgbG9ncyAoTiA+IDI1Nik6KiogTyhOIMOXIFUpIGluZGV4IGJ1aWxkICsgTyhWIMOXIEsgw5cgbG9nIE4pIGxvb2t1cHMuXG4gKiAgIFUgPSB1bmlxdWUga2V5cy4gQW1vcnRpemVkIG92ZXIgYWxsIEJGUyBob3BzLlxuICpcbiAqICMjIFJlZmVyZW5jZXNcbiAqXG4gKiAtIFdlaXNlciwgTS4gKDE5ODQpLiBcIlByb2dyYW0gU2xpY2luZy5cIiBJRUVFIFRTRS5cbiAqIC0gU3JpZGhhcmFuLCBNLiBldCBhbC4gKDIwMDcpLiBcIlRoaW4gU2xpY2luZy5cIiBQTERJLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBjYXVzYWxDaGFpbiwgZmxhdHRlbkNhdXNhbERBRywgZm9ybWF0Q2F1c2FsQ2hhaW4gfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogY29uc3QgZGFnID0gY2F1c2FsQ2hhaW4oY29tbWl0TG9nLCAnZGVjaWRlIzInLCAoaWQpID0+IHJlY29yZGVyLmdldEtleXNSZWFkKGlkKSk7XG4gKiBjb25zdCBmbGF0ID0gZmxhdHRlbkNhdXNhbERBRyhkYWcpOyAgICAgLy8gQkZTLW9yZGVyZWQgZmxhdCBsaXN0XG4gKiBjb25zb2xlLmxvZyhmb3JtYXRDYXVzYWxDaGFpbihkYWcpKTsgICAgIC8vIGh1bWFuLXJlYWRhYmxlXG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBidWlsZENvbW1pdEluZGV4LCBmaW5kTGFzdFdyaXRlciB9IGZyb20gJy4vY29tbWl0TG9nVXRpbHMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWdpc3RlcmVkQ29kZSB9IGZyb20gJy4vaG9uZXN0eS5qcyc7XG5pbXBvcnQgeyBxdWVyeVdvcmssIHJlbGF0aW9uLCB3cml0ZXNPbmx5SW5zaWRlIH0gZnJvbSAnLi9rZXlQYXRocy5qcyc7XG5pbXBvcnQgeyBsb2dNb2RlbCB9IGZyb20gJy4vbG9nTW9kZWwuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUsIFRyYWNlRW50cnksIFVudHJhY2tlZFNvdXJjZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyDilIDilIAgVHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBBIHNpbmdsZSBub2RlIGluIHRoZSBjYXVzYWwgREFHLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXVzYWxOb2RlIHtcbiAgLyoqIFVuaXF1ZSBleGVjdXRpb24gc3RlcCBpZGVudGlmaWVyLiAqL1xuICBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICAvKiogU3RhYmxlIHN0YWdlIGlkZW50aWZpZXIuICovXG4gIHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHN0YWdlIG5hbWUuICovXG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICAvKiogS2V5cyB0aGlzIHN0YWdlIHdyb3RlIChmcm9tIGl0cyBDb21taXRCdW5kbGUudHJhY2UpLiAqL1xuICBrZXlzV3JpdHRlbjogc3RyaW5nW107XG4gIC8qKiBUaGUga2V5IHdob3NlIHJlYWTihpJ3cml0ZSBkZXBlbmRlbmN5IGxpbmtlZCB0aGlzIG5vZGUgdG8gaXRzIGNoaWxkLiBFbXB0eSBmb3IgdGhlIHJvb3QuICovXG4gIGxpbmtlZEJ5OiBzdHJpbmc7XG4gIC8qKiBCRlMgZGVwdGggZnJvbSB0aGUgc3RhcnRpbmcgbm9kZSAoMCA9IHN0YXJ0KS4gKi9cbiAgZGVwdGg6IG51bWJlcjtcbiAgLyoqXG4gICAqIFBhcmVudCBub2RlcyDigJQgc3RhZ2VzIHRoaXMgbm9kZSBkZXBlbmRzIG9uLiBEQUc6IG11bHRpcGxlIHBhcmVudHNcbiAgICogcG9zc2libGUuIEtFUFQgZm9yIGNvbXBhdGliaWxpdHk7IHdpdGggdGhlIGBjb250cm9sRGVwc2Agb3B0aW9uXG4gICAqIChSRkMtMDAzIEQzKSBnb3Zlcm5pbmcgZGVjaWRlcnMgYXBwZWFyIGhlcmUgdG9vLiBGb3IgdHlwZWQva2V5ZWQvXG4gICAqIHdlaWdodGVkIGRldGFpbCB1c2Uge0BsaW5rIHBhcmVudEVkZ2VzfS5cbiAgICovXG4gIHBhcmVudHM6IENhdXNhbE5vZGVbXTtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDMg4oCUIG9uZSBlZGdlIHBlciBkZXBlbmRlbmN5IExJTksgKG5vdCBwZXIgcGFyZW50KTogYSBub2RlXG4gICAqIHJlYWRpbmcgdHdvIGtleXMgZnJvbSB0aGUgc2FtZSB3cml0ZXIgaGFzIE9ORSBlbnRyeSBpbiB7QGxpbmsgcGFyZW50c31cbiAgICogYnV0IFRXTyBgJ2RhdGEnYCBlZGdlcyBoZXJlLiBDb250cm9sIGRlcGVuZGVuY2llcyAodmlhIHRoZVxuICAgKiBgY29udHJvbERlcHNgIG9wdGlvbikgYWRkIGEgYCdjb250cm9sJ2AgZWRnZSB0byB0aGUgZ292ZXJuaW5nIGRlY2lkZXIuXG4gICAqL1xuICBwYXJlbnRFZGdlczogQ2F1c2FsRWRnZVtdO1xuICAvKipcbiAgICogUkZDLTAwMyBEMiBob25lc3R5IG1hcmtlciDigJQgc3RhbXBlZCBmcm9tIHRoZSBzdGFnZSdzXG4gICAqIGBDb21taXRCdW5kbGUudW50cmFja2VkU291cmNlc2AuIFByZXNlbnQgd2hlbiB0aGlzIHN0YWdlIEFMU08gY29uc3VtZWRcbiAgICogdW50cmFja2VkIHJlYWQgcGF0aHMgKGBhcmdzYCAvIGBlbnZgIC8gdW5zaGFkb3dlZCBgc2lsZW50YCByZWFkcyk6IHRoZVxuICAgKiBiYWNrd2FyZCBzbGljZSB0aHJvdWdoIHRoaXMgbm9kZSBtYXkgYmUgaW5jb21wbGV0ZSwgYmVjYXVzZSB0aG9zZSByZWFkc1xuICAgKiBwcm9kdWNlIG5vIHJlYWTihpJ3cml0ZSBlZGdlIHRvIGZvbGxvdy4gYGZvcm1hdENhdXNhbENoYWluYCByZW5kZXJzIHRoaXNcbiAgICogYXMgYSBg4pqgIOKApiBzbGljZSBtYXkgYmUgaW5jb21wbGV0ZSBoZXJlYCBsaW5lLiBBYnNlbnQgd2hlbiB0aGUgc3RhZ2Unc1xuICAgKiByZWFkcyB3ZXJlIGZ1bGx5IHRyYWNrZWQuXG4gICAqXG4gICAqIFJlZ2lzdHJ5IGNvZGU6IGAnaW5jb21wbGV0ZS1zb3VyY2VzJ2AgKGBtZW1vcnkvaG9uZXN0eS50cyDCt1xuICAgKiBIT05FU1RZX0NPREVTYCwgc2VydmVkIG9uIGBmb290cHJpbnRqcy90cmFjZWApIHNheXMgd2hhdCB0aGlzIGZpZWxkXG4gICAqIG1lYW5zLiBUaGUgZmllbGQgY2FycmllcyBubyBgY29kZWAg4oCUIGl0cyB2YWx1ZXMgYXJlIHRoZVxuICAgKiB7QGxpbmsgVW50cmFja2VkU291cmNlfXMuXG4gICAqL1xuICBpbmNvbXBsZXRlU291cmNlcz86IFJlYWRvbmx5QXJyYXk8VW50cmFja2VkU291cmNlPjtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDQgdHJ1bmNhdGlvbiB2aXNpYmlsaXR5IOKAlCBzZXQgb24gdGhlIFJPT1Qgbm9kZSBvbmx5LCBhbmQgb25seVxuICAgKiB3aGVuIGEgbGltaXQgYWN0dWFsbHkgY3V0IHRoZSBzbGljZTogYGJ5RGVwdGhgIHdoZW4gYSBub2RlIGF0IHRoZVxuICAgKiBgbWF4RGVwdGhgIGhvcml6b24gc3RpbGwgaGFkIGVkZ2VzIHRvIGV4cGFuZCwgYGJ5Tm9kZXNgIHdoZW4gdGhlXG4gICAqIGBtYXhOb2Rlc2AgYnVkZ2V0IGJsb2NrZWQgY3JlYXRpbmcgYSBkaXNjb3ZlcmVkIHBhcmVudC4gQWJzZW50IHdoZW4gdGhlXG4gICAqIHNsaWNlIGlzIGNvbXBsZXRlLiBgZm9ybWF0Q2F1c2FsQ2hhaW5gIGFwcGVuZHMgYSBg4pqgIHNsaWNlIHRydW5jYXRlZCDigKZgXG4gICAqIGxpbmUg4oCUIGEgY29uc3VtZXIgbXVzdCBuZXZlciBtaXN0YWtlIGEgdHJ1bmNhdGVkIHNsaWNlIGZvciBhIGZ1bGwgb25lLlxuICAgKiAoVW50aWwgOS40OC4wIGRldiBtb2RlIGFsc28gd2FybmVkIG9uIHRoZSBjb25zb2xlOyB0aGUgZmllbGQgaXMgdGhlXG4gICAqIHNpZ25hbCwgcmVhZCBpdC4pXG4gICAqXG4gICAqIFJlZ2lzdHJ5IGNvZGU6IGAndHJ1bmNhdGVkJ2AgKGBtZW1vcnkvaG9uZXN0eS50cyDCtyBIT05FU1RZX0NPREVTYCwgc2VydmVkXG4gICAqIG9uIGBmb290cHJpbnRqcy90cmFjZWApIHNheXMgd2hhdCB0aGlzIGZpZWxkIG1lYW5zOyB0aGUgZmllbGQgY2FycmllcyBub1xuICAgKiBgY29kZWAuXG4gICAqL1xuICB0cnVuY2F0ZWQ/OiB7IGJ5RGVwdGg6IGJvb2xlYW47IGJ5Tm9kZXM6IGJvb2xlYW4gfTtcbiAgLyoqXG4gICAqIEY0YiAoOS4zMy4wKSDigJQgdGhlIGtleXMgdGhpcyBub2RlIHJlYWQgdGhhdCBOTyBjb21taXQgYmVmb3JlIGl0IHdyb3RlICh1bmRlciB0aGUgd3JpdGVyIHJ1bGUpLCBzbyB0aGVcbiAgICogd2FsayBoYXMgbm8gZWRnZSB0byBmb2xsb3cgZm9yIHRoZW06IHRoZWlyIHZhbHVlIGNhbWUgZnJvbSB0aGUgaW5pdGlhbCBzdGF0ZSwgZnJvemVuIHJ1biBpbnB1dCBvciBhXG4gICAqIGNsb3N1cmUg4oCUIG91dHNpZGUgdGhlIGNvbW1pdCBsb2cuIFRoZSBjb2RlIHNheXMgc28gKGAncHJlLXJ1bi1vcmlnaW4nYCwgcmVnaXN0ZXJlZCBpblxuICAgKiBgbWVtb3J5L2hvbmVzdHkudHMgwrcgSE9ORVNUWV9DT0RFU2ApOyBga2V5c2AgYXJlIGluIHRoZSBvcmRlciB0aGUgd2FsayBtZXQgdGhlbS4gQUJTRU5UIHdoZW4gZXZlcnkga2V5XG4gICAqIHRoZSBub2RlIGV4cGFuZGVkIGhhZCBhIHdyaXRlciwgc28gc3VjaCBhIG5vZGUga2VlcHMgaXRzIDkuMzIuMCBzaGFwZS4gQmVmb3JlIDkuMzMuMCB0aGVzZSByZWFkcyB3ZXJlXG4gICAqIGRyb3BwZWQgd2l0aG91dCBhIHdvcmQuXG4gICAqL1xuICBwcmVSdW5SZWFkcz86IHsgY29kZTogUmVnaXN0ZXJlZENvZGU8J3ByZS1ydW4tb3JpZ2luJz47IGtleXM6IHN0cmluZ1tdIH07XG59XG5cbi8qKlxuICogUkZDLTAwMyBEMyDigJQgYSB0eXBlZCBkZXBlbmRlbmN5IGVkZ2UgZnJvbSBhIGNoaWxkIG5vZGUgdG8gb25lIHBhcmVudC5cbiAqXG4gKiAtIGBraW5kOiAnZGF0YSdgICAgIOKAlCByZWFk4oaSd3JpdGUgZGVwZW5kZW5jeTsgYGtleWAgaXMgdGhlIHN0YXRlIGtleS5cbiAqIC0gYGtpbmQ6ICdjb250cm9sJ2Ag4oCUIHRoZSBwYXJlbnQgaXMgdGhlIGRlY2lkZXIvc2VsZWN0b3Igd2hvc2UgZGVjaXNpb25cbiAqICAgYWxsb3dlZCB0aGUgY2hpbGQgdG8gcnVuOyBga2V5YCBpcyB0aGUgZGVjaWRlKCkgcnVsZSBsYWJlbCB3aGVuIHByZXNlbnQuXG4gKlxuICogYHdlaWdodGAgZGVmYXVsdHMgdG8gMS4wOyB0aGUgYHdlaWdoYCBob29rIChSRkMtMDAzIEQ0KSBjYW4gb3ZlcnJpZGUgaXQuXG4gKiBUaGUgZW5naW5lIGl0c2VsZiBORVZFUiBjb21wdXRlcyB3ZWlnaHRzIOKAlCBzZW1hbnRpY3MgYmVsb25nIHRvIHRoZVxuICogY29uc3VtZXItaW5qZWN0ZWQgd2VpZ2hlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXVzYWxFZGdlIHtcbiAgcGFyZW50OiBDYXVzYWxOb2RlO1xuICBraW5kOiAnZGF0YScgfCAnY29udHJvbCc7XG4gIGtleT86IHN0cmluZztcbiAgd2VpZ2h0OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGNGIgKDkuMzMuMCkg4oCUIHByZXNlbnQgb25seSBvbiBhIGAnZGF0YSdgIGVkZ2Ugd2hvc2UgcGFyZW50IHdyb3RlIGBrZXlgIE9OTFkgdGhyb3VnaCByb3dzIGluc2lkZSBpdFxuICAgKiAoYSBzdWJmbG93J3MgaW5wdXQgc2VlZCwgYW4gb3V0cHV0TWFwcGVyIG1lcmdlLWJhY2ssIGEgZm9yayBjaGlsZCdzIG5hbWVzcGFjZSk6IHRoYXQgd3JpdGUgbWFkZSBwYXJ0XG4gICAqIG9mIHRoZSB2YWx1ZSwgYW5kIGVhcmxpZXIgd3JpdGVycyBtYXkgYWNjb3VudCBmb3IgdGhlIHJlc3QuIFJlZ2lzdGVyZWQgYXMgYCduZXN0ZWQtcm93cydgIGluXG4gICAqIGBtZW1vcnkvaG9uZXN0eS50cyDCtyBIT05FU1RZX0NPREVTYC4gQWJzZW50IGZvciBhIHdyaXRlIG9uIG9yIGFyb3VuZCB0aGUga2V5LCBzbyBhbiBleGFjdCBlZGdlIGtlZXBzXG4gICAqIGl0cyA5LjMyLjAgc2hhcGUuXG4gICAqL1xuICBiYXNpcz86IFJlZ2lzdGVyZWRDb2RlPCduZXN0ZWQtcm93cyc+O1xufVxuXG4vKipcbiAqIFJGQy0wMDMgRDMg4oCUIGEgY29udHJvbCBkZXBlbmRlbmN5IHJlc29sdmVkIGZvciBvbmUgZXhlY3V0aW9uIHN0ZXA6XG4gKiB3aGljaCBkZWNpZGVyL3NlbGVjdG9yIGV4ZWN1dGlvbiBhbGxvd2VkIHRoaXMgc3RhZ2UgdG8gcnVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyb2xEZXBlbmRlbmN5IHtcbiAgLyoqIHJ1bnRpbWVTdGFnZUlkIG9mIHRoZSBnb3Zlcm5pbmcgZGVjaWRlci9zZWxlY3RvciBleGVjdXRpb24gc3RlcC4gKi9cbiAgZGVjaWRlcklkOiBzdHJpbmc7XG4gIC8qKiBUaGUgZGVjaWRlKCkgcnVsZSBsYWJlbCBmb3IgdGhlIGNob3NlbiBicmFuY2gsIHdoZW4gcHJlc2VudC4gKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUkZDLTAwMyBEMyDigJQgY2FsbGJhY2sgcmVzb2x2aW5nIHRoZSBnb3Zlcm5pbmcgZGVjaWRlciBmb3IgYW4gZXhlY3V0aW9uXG4gKiBzdGVwLiBSZXR1cm4gYHVuZGVmaW5lZGAgd2hlbiB0aGUgc3RlcCBpcyBub3QgY29udHJvbC1kZXBlbmRlbnQgb24gYW55XG4gKiByZWNvcmRlZCBkZWNpc2lvbi4gQnVpbGQgb25lIHdpdGggYGNvbnRyb2xEZXBSZWNvcmRlcigpYCBmcm9tXG4gKiBgZm9vdHByaW50anMvdHJhY2VgLCBvciBzdXBwbHkgeW91ciBvd24uXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRyb2xEZXBMb29rdXAgPSAocnVudGltZVN0YWdlSWQ6IHN0cmluZykgPT4gQ29udHJvbERlcGVuZGVuY3kgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUkZDLTAwMyBENCDigJQgY29uc3VtZXItaW5qZWN0ZWQgZWRnZSB3ZWlnaGVyLiBDYWxsZWQgb25jZSBwZXIgY3JlYXRlZFxuICogZWRnZTsgcmV0dXJuIGEgd2VpZ2h0LCBvciBgdW5kZWZpbmVkYCB0byBrZWVwIHRoZSBkZWZhdWx0IDEuMC4gVGhlXG4gKiBFTkdJTkUgbmV2ZXIgY29tcHV0ZXMgd2VpZ2h0cyAoemVybyBuZXcgZGVwZW5kZW5jaWVzIOKAlCBzZW1hbnRpY3MgbGlrZVxuICogZW1iZWRkaW5nIHNpbWlsYXJpdHkgb3IgRkRMIGluZmx1ZW5jZSBiZWxvbmcgdG8gZG93bnN0cmVhbSBsaWJyYXJpZXMsXG4gKiB0aGUgc2FtZSBwbHVnLWluIHBhdHRlcm4gYXMgYE5hcnJhdGl2ZUZvcm1hdHRlcmApLiBXZWlnaHRzIHJlbmRlciBpblxuICogYGZvcm1hdENhdXNhbENoYWluYCBhcyBg4oaQIHZpYSBzeXN0ZW1Qcm9tcHQgKDAuMTgpYC5cbiAqL1xuZXhwb3J0IHR5cGUgRWRnZVdlaWdoZXIgPSAoXG4gIGNoaWxkOiBDYXVzYWxOb2RlLFxuICBwYXJlbnQ6IENhdXNhbE5vZGUsXG4gIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBraW5kOiAnZGF0YScgfCAnY29udHJvbCcsXG4pID0+IG51bWJlciB8IHVuZGVmaW5lZDtcblxuLyoqIE9wdGlvbnMgZm9yIGNhdXNhbENoYWluKCkuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdXNhbENoYWluT3B0aW9ucyB7XG4gIC8qKiBNYXhpbXVtIEJGUyBkZXB0aCAoZGVmYXVsdDogMjApLiBQcmV2ZW50cyBydW5hd2F5IHRyYXZlcnNhbC4gKi9cbiAgbWF4RGVwdGg/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHRvdGFsIG5vZGVzIHRvIHZpc2l0IChkZWZhdWx0OiAxMDApLiBIYXJkIGNhcCBmb3Igc2FmZXR5LiAqL1xuICBtYXhOb2Rlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDMg4oCUIGNvbnRyb2wtZGVwZW5kZW5jZSBsb29rdXAuIFdoZW4gcHJvdmlkZWQsIGV4cGFuZGluZyBhIG5vZGVcbiAgICogQUxTTyBsaW5rcyBhIGAnY29udHJvbCdgIGVkZ2UgdG8gaXRzIGdvdmVybmluZyBkZWNpZGVyIChsYWJlbGVkIGJ5IHRoZVxuICAgKiBkZWNpZGUoKSBydWxlIGxhYmVsIHdoZW4gcHJlc2VudCk7IHRoZSBkZWNpZGVyIG5vZGUgdGhlbiBleHBhbmRzXG4gICAqIG5vcm1hbGx5IHRocm91Z2ggaXRzIG93biBkYXRhIHJlYWRzLCBzbyBjaGFpbnMgbGlrZVxuICAgKiBgc3RhdHVzIOKGkCBbY29udHJvbF0gQ2xhc3NpZnlSaXNrIOKGkCBbZGF0YTogY3JlZGl0U2NvcmVdIFB1bGxCdXJlYXVgXG4gICAqIHJlc29sdmUgZW5kLXRvLWVuZC4gV2l0aG91dCB0aGlzIG9wdGlvbiBiZWhhdmlvciBpcyB1bmNoYW5nZWQuXG4gICAqL1xuICBjb250cm9sRGVwcz86IENvbnRyb2xEZXBMb29rdXA7XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQ0IOKAlCBlZGdlIHdlaWdoZXIuIFN0YW1wcyBgQ2F1c2FsRWRnZS53ZWlnaHRgIGF0IGVkZ2UgY3JlYXRpb247XG4gICAqIGB1bmRlZmluZWRgIChvciBubyB3ZWlnaGVyKSDihpIgMS4wLiBTZWUge0BsaW5rIEVkZ2VXZWlnaGVyfS5cbiAgICovXG4gIHdlaWdoPzogRWRnZVdlaWdoZXI7XG4gIC8qKlxuICAgKiAjUDEg4oCUIGhvdyBhIG5vZGUncyBleHBhbnNpb24gcmVhZC1zZXQgaXMgZGVyaXZlZDpcbiAgICpcbiAgICogLSBgJ3N0YWdlJ2AgKGRlZmF1bHQsIGhpc3RvcmljYWwpIOKAlCBldmVyeSB2aXNpdGVkIG5vZGUgZXhwYW5kcyB0aHJvdWdoXG4gICAqICAgQUxMIG9mIGl0cyBzdGFnZSdzIHJlYWRzIChgZ2V0S2V5c1JlYWRgKS4gQSBzdGFnZSByZWFkaW5nIGBhLGJgIGFuZFxuICAgKiAgIHdyaXRpbmcgYHgseWAgbGlua3MgYm90aCByZWFkcyBhcyBjYXVzZXMgb2YgYm90aCB3cml0ZXMg4oCUIGEgc291bmQgYnV0XG4gICAqICAgY29hcnNlIG92ZXItYXBwcm94aW1hdGlvbi5cbiAgICogLSBgJ3Blci13cml0ZSdgIOKAlCB3aGVuIHRoZSBjb21taXQgbG9nIGNhcnJpZXMgcGVyLXdyaXRlIHJlYWQgcHJvdmVuYW5jZVxuICAgKiAgIChgVHJhY2VFbnRyeS5yZWFkS2V5c2AsIHJlY29yZGVkIHVuZGVyIHRoZSBleGVjdXRvcidzXG4gICAqICAgYHdyaXRlUHJvdmVuYW5jZTogJ3JlYWRzLXByZWZpeCdgIGRpYWwpLCBhIG5vZGUgcmVhY2hlZCB2aWEga2V5IGBrYFxuICAgKiAgIGV4cGFuZHMgdGhyb3VnaCBPTkxZIHRoZSByZWFkcyB0aGF0IHByZWNlZGVkIGl0cyB3cml0ZSBvZiBga2BcbiAgICogICAodGVtcG9yYWwgcHJlZml4KS4gTm9kZXMgbGlua2VkIGxhdGVyIHZpYSBhZGRpdGlvbmFsIGtleXMgYXJlXG4gICAqICAgaW5jcmVtZW50YWxseSByZS1leHBhbmRlZCB3aXRoIGp1c3QgdGhlIG5ldyByZWFkcyAod29ya2xpc3Qg4oCUIHRoZVxuICAgKiAgIHNsaWNlIG9ubHkgZXZlciBHUk9XUyB0b3dhcmQgdGhlIHN0YWdlLWxldmVsIGNlaWxpbmcpLiBIT05FU1RcbiAgICogICBGQUxMQkFDSzogYW55IGxpbmsgd2hvc2UgdHJhY2UgZW50cnkgbGFja3MgYHJlYWRLZXlzYCBleHBhbmRzIHRoYXRcbiAgICogICBub2RlIGF0IHN0YWdlIGxldmVsIOKAlCBtaXhlZCBvciBkaWFsLW9mZiBsb2dzIGRlZ3JhZGUgdG8gYCdzdGFnZSdgXG4gICAqICAgYmVoYXZpb3IgZXhhY3RseSwgbmV2ZXIgdG8gc2lsZW5jZS5cbiAgICovXG4gIGVkZ2VBdHRyaWJ1dGlvbj86ICdzdGFnZScgfCAncGVyLXdyaXRlJztcbiAgLyoqXG4gICAqICNQMSDigJQgdGhlIHdyaXR0ZW4ga2V5cyB0aGF0IGFuY2hvciB0aGUgUk9PVCdzIGV4cGFuc2lvbiB1bmRlclxuICAgKiBgJ3Blci13cml0ZSdgIChlLmcuIGBzbGljZUZvcktleWAgcGFzc2VzIHRoZSBzbGljZWQga2V5LCBzbyB0aGUgcm9vdFxuICAgKiBleHBhbmRzIHRocm91Z2ggdGhlIHJlYWRzIHRoYXQgZmVkIFRIQVQgd3JpdGUsIG5vdCB0aGUgd2hvbGUgc3RhZ2UpLlxuICAgKiBJZ25vcmVkIHVuZGVyIGAnc3RhZ2UnYC4gVW5zZXQg4oaSIHJvb3QgZXhwYW5kcyBhdCBzdGFnZSBsZXZlbC5cbiAgICovXG4gIHJvb3RMaW5rS2V5cz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENhbGxiYWNrIHRoYXQgcmV0dXJucyB0aGUga2V5cyBhIHN0YWdlIHJlYWQgZHVyaW5nIGV4ZWN1dGlvbi5cbiAqIFRoZSBiYWNrdHJhY2tlciBjYWxscyB0aGlzIGZvciBlYWNoIHZpc2l0ZWQgbm9kZSB0byBkZXRlcm1pbmVcbiAqIHdoaWNoIHJlYWTihpJ3cml0ZSBlZGdlcyB0byBmb2xsb3cuXG4gKlxuICogSW1wbGVtZW50b3JzOiBRdWFsaXR5UmVjb3JkZXIgdHJhY2tzIGtleXNSZWFkIHBlciBzdGVwLFxuICogb3IgYnVpbGQgYSBNYXA8cnVudGltZVN0YWdlSWQsIHN0cmluZ1tdPiBmcm9tIFNjb3BlUmVjb3JkZXIub25SZWFkIGV2ZW50cy5cbiAqL1xuZXhwb3J0IHR5cGUgS2V5c1JlYWRMb29rdXAgPSAocnVudGltZVN0YWdlSWQ6IHN0cmluZykgPT4gc3RyaW5nW107XG5cbi8vIOKUgOKUgCBTdGFnZWQgb3B0aW1pemF0aW9uOiB3cml0ZXIgbG9va3VwIHN0cmF0ZWdpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogVGhyZXNob2xkIGZvciBzd2l0Y2hpbmcgZnJvbSBsaW5lYXIgc2NhbiB0byByZXZlcnNlIGluZGV4LlxuICogQmVsb3cgdGhpcywgTyhOKSBzY2FuIGlzIGZhc3RlciAobm8gaW5kZXggYnVpbGQgY29zdCkuXG4gKiBBYm92ZSB0aGlzLCBPKGxvZyBOKSBiaW5hcnkgc2VhcmNoIHdpbnMuXG4gKi9cbmNvbnN0IFJFVkVSU0VfSU5ERVhfVEhSRVNIT0xEID0gMjU2O1xuXG4vKipcbiAqIFdyaXRlciBsb29rdXAgZnVuY3Rpb24gc2lnbmF0dXJlLlxuICogUmV0dXJucyB0aGUgQ29tbWl0QnVuZGxlIHRoYXQgbGFzdCB3cm90ZSBga2V5YCBiZWZvcmUgcG9zaXRpb24gYGJlZm9yZUlkeGAuXG4gKi9cbnR5cGUgV3JpdGVyTG9va3VwID0gKGtleTogc3RyaW5nLCBiZWZvcmVJZHg6IG51bWJlcikgPT4gQ29tbWl0QnVuZGxlIHwgdW5kZWZpbmVkO1xuXG4vKiogU3RyYXRlZ3kgMTogTGluZWFyIHNjYW4g4oCUIE8oTikgcGVyIGxvb2t1cCwgemVybyBzZXR1cCBjb3N0LiAqL1xuZnVuY3Rpb24gbGluZWFyU2Nhbkxvb2t1cChjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdKTogV3JpdGVyTG9va3VwIHtcbiAgcmV0dXJuIChrZXksIGJlZm9yZUlkeCkgPT4gZmluZExhc3RXcml0ZXIoY29tbWl0TG9nLCBrZXksIGJlZm9yZUlkeCk7XG59XG5cbi8qKlxuICogU3RyYXRlZ3kgMjogUmV2ZXJzZSBpbmRleCDigJQgb25lIE8ocm93cykgYnVpbGQsIE8oZGVwdGggKyBsb2cgTikgcGVyIGxvb2t1cC5cbiAqIFRoZSBsb2cncyByZWFkIG1vZGVsIChgbG9nTW9kZWwudHNgOiBhIHBhdGggdHJpZSwgZWFjaCB0b3AtbGV2ZWwga2V5IGZvbGRlZCBhdFxuICogbW9zdCBvbmNlKSBhbnN3ZXJzIHRoZSB3cml0ZXIgcnVsZSDigJQgcm93cyBvbiwgaW5zaWRlIG9yIGFyb3VuZCB0aGUga2V5IOKAlCBieVxuICogYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGxhc3Qgd3JpdGUgb24gb3IgaW5zaWRlIGl0LCB0aGVuIGEgdmVyZGljdCBvbmx5IGZvciB0aGVcbiAqIGFyb3VuZC1jYW5kaWRhdGVzIGFmdGVyIGl0LiBUaGUgc2FtZSBhbnN3ZXIgYGZpbmRMYXN0V3JpdGVyYCBnaXZlcywgc28gdGhlXG4gKiBzdHJhdGVneSBzd2l0Y2ggYmVsb3cgbmV2ZXIgY2hhbmdlcyBhIHNsaWNlLlxuICovXG5mdW5jdGlvbiByZXZlcnNlSW5kZXhMb29rdXAoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSk6IFdyaXRlckxvb2t1cCB7XG4gIGNvbnN0IG1vZGVsID0gbG9nTW9kZWwoY29tbWl0TG9nKTtcbiAgcmV0dXJuIChrZXk6IHN0cmluZywgYmVmb3JlSWR4OiBudW1iZXIpOiBDb21taXRCdW5kbGUgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IGF0ID0gbW9kZWwubGFzdFdyaXRlckJlZm9yZShrZXksIGJlZm9yZUlkeCk7XG4gICAgcmV0dXJuIGF0ID49IDAgPyBjb21taXRMb2dbYXRdIDogdW5kZWZpbmVkO1xuICB9O1xufVxuXG4vKipcbiAqIFRoZSB0cmFjZSBlbnRyaWVzIG9mIGBjb21taXRgIHRoYXQgbWFrZSBpdCBhIHdyaXRlciBvZiBgbGlua0tleWAg4oCUIHRoZSBlbnRyaWVzIHdob3NlIHJlYWRcbiAqIHByZWZpeCAoYFRyYWNlRW50cnkucmVhZEtleXNgKSBhIHBlci13cml0ZSBlZGdlIGV4cGFuZHMgdGhyb3VnaC4gVGhlIEZJUlNUIGVudHJ5IG9uIHRoZSBleGFjdFxuICogcGF0aCB3aGVuIHRoZXJlIGlzIG9uZSAodGhlICNQMSBiZWhhdmlvdXIsIHVuY2hhbmdlZCk7IG90aGVyd2lzZSBldmVyeSBlbnRyeSBpbnNpZGUgb3IgYXJvdW5kXG4gKiB0aGUga2V5ICg5LjMzLjA6IHRoZSBjb21taXQgd3JvdGUgdGhlIGtleSB0aHJvdWdoIGEgbmVzdGVkIHJvdyDigJQgYSBzdWJmbG93IHNlZWQsIGFuXG4gKiBvdXRwdXRNYXBwZXIgbWVyZ2UtYmFjayDigJQgYW5kIGFsbCBvZiB0aG9zZSByb3dzIHdyb3RlIGl0KS5cbiAqL1xuZnVuY3Rpb24gbGlua2luZ0VudHJpZXMoY29tbWl0OiBDb21taXRCdW5kbGUsIGxpbmtLZXk6IHN0cmluZyk6IFRyYWNlRW50cnlbXSB7XG4gIGNvbnN0IGV4YWN0ID0gY29tbWl0LnRyYWNlLmZpbmQoKHQpID0+IHQucGF0aCA9PT0gbGlua0tleSk7XG4gIGlmIChleGFjdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gW2V4YWN0XTtcbiAgcmV0dXJuIGNvbW1pdC50cmFjZS5maWx0ZXIoKHQpID0+IHJlbGF0aW9uKHQucGF0aCwgbGlua0tleSkgIT09IHVuZGVmaW5lZCk7XG59XG5cbi8qKlxuICogU3RhZ2VkIG9wdGltaXphdGlvbjogcGljayB0aGUgcmlnaHQgd3JpdGVyLWxvb2t1cCBzdHJhdGVneSBiYXNlZCBvbiBkYXRhIHNpemUuXG4gKlxuICogTGlrZSBhIGRhdGFiYXNlIHF1ZXJ5IG9wdGltaXplciBjaG9vc2luZyBiZXR3ZWVuIHNlcXVlbnRpYWwgc2NhbiBhbmQgaW5kZXggc2NhbjpcbiAqXG4gKiAtICoqU21hbGwgbG9nICjiiaQgMjU2KToqKiBMaW5lYXIgc2NhbiB3aW5zLiBaZXJvIHNldHVwIGNvc3QsIGdvb2QgY2FjaGUgbG9jYWxpdHkuXG4gKiAgIFRoZSBvdmVyaGVhZCBvZiBidWlsZGluZyBhIHJldmVyc2UgaW5kZXggaXNuJ3Qgd29ydGggaXQgZm9yIHNob3J0IGxvZ3MuXG4gKlxuICogLSAqKkxhcmdlIGxvZyAoPiAyNTYpOioqIFJldmVyc2UgaW5kZXggd2lucy4gTyhOw5dVKSB1cGZyb250IGJ1aWxkIGNvc3QgaXMgYW1vcnRpemVkXG4gKiAgIGFjcm9zcyBhbGwgQkZTIGhvcHMuIEVhY2ggbG9va3VwIGJlY29tZXMgTyhsb2cgTikgdmlhIGJpbmFyeSBzZWFyY2ggaW5zdGVhZCBvZiBPKE4pLlxuICogICBGb3IgYW4gYWdlbnQgbG9vcCB3aXRoIDUwMCBpdGVyYXRpb25zIGFuZCA1IGtleXMgcGVyIGhvcCwgdGhpcyBpcyA1MDDDlzXDl2xvZyg1MDAp4omIMjJLIG9wc1xuICogICB2cyA1MDDDlzXDlzUwMD0xLjI1TSBvcHMgd2l0aCBsaW5lYXIgc2Nhbi5cbiAqXG4gKiBUaGUgY2FsbGVyIG5ldmVyIHNlZXMgdGhpcyDigJQgYGNhdXNhbENoYWluKClgIHBpY2tzIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVdyaXRlckxvb2t1cChjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdKTogV3JpdGVyTG9va3VwIHtcbiAgaWYgKGNvbW1pdExvZy5sZW5ndGggPD0gUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQpIHtcbiAgICByZXR1cm4gbGluZWFyU2Nhbkxvb2t1cChjb21taXRMb2cpO1xuICB9XG4gIHJldHVybiByZXZlcnNlSW5kZXhMb29rdXAoY29tbWl0TG9nKTtcbn1cblxuLy8g4pSA4pSAIENvcmUgYWxnb3JpdGhtIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFJGQy0wMDMgRDI6IHRoZSBgaW5jb21wbGV0ZVNvdXJjZXNgIG5vZGUgZnJhZ21lbnQgZm9yIGEgY29tbWl0IOKAlCBge31gXG4gKiB3aGVuIHRoZSBzdGFnZSBjb25zdW1lZCBubyB1bnRyYWNrZWQgcmVhZCBwYXRocywga2VlcGluZyB0aGUgZmllbGRcbiAqIEFCU0VOVCAobm90IGVtcHR5LWFycmF5LXZhbHVlZCkgZm9yIGZ1bGx5LXRyYWNrZWQgc3RhZ2VzLlxuICovXG5mdW5jdGlvbiBpbmNvbXBsZXRlU291cmNlc0ZyYWdtZW50KGNvbW1pdDogQ29tbWl0QnVuZGxlKTogeyBpbmNvbXBsZXRlU291cmNlcz86IFJlYWRvbmx5QXJyYXk8VW50cmFja2VkU291cmNlPiB9IHtcbiAgaWYgKCFjb21taXQudW50cmFja2VkU291cmNlcyB8fCBjb21taXQudW50cmFja2VkU291cmNlcy5sZW5ndGggPT09IDApIHJldHVybiB7fTtcbiAgcmV0dXJuIHsgaW5jb21wbGV0ZVNvdXJjZXM6IGNvbW1pdC51bnRyYWNrZWRTb3VyY2VzIH07XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGNhdXNhbCBEQUcgcm9vdGVkIGF0IGBzdGFydElkYCBieSB3YWxraW5nIGJhY2t3YXJkc1xuICogdGhyb3VnaCByZWFk4oaSd3JpdGUgZGVwZW5kZW5jaWVzIGluIHRoZSBjb21taXQgbG9nLlxuICpcbiAqIEF1dG9tYXRpY2FsbHkgc2VsZWN0cyB0aGUgb3B0aW1hbCB3cml0ZXIgbG9va3VwIHN0cmF0ZWd5OlxuICogLSBMaW5lYXIgc2NhbiBmb3Igc21hbGwgbG9ncyAo4omkIDI1NiBjb21taXRzKVxuICogLSBSZXZlcnNlIGluZGV4IHdpdGggYmluYXJ5IHNlYXJjaCBmb3IgbGFyZ2UgbG9ncyAoPiAyNTYgY29tbWl0cylcbiAqXG4gKiBQcm9kdWNlcyBhIERBRyAobm90IGEgdHJlZSk6IGlmIHR3byBjaGlsZHJlbiBib3RoIHJlYWQgZnJvbSB0aGUgc2FtZVxuICogcGFyZW50LCB0aGUgcGFyZW50IG5vZGUgaXMgc2hhcmVkIChkZWR1cGVkIGJ5IHJ1bnRpbWVTdGFnZUlkKS5cbiAqXG4gKiBAcGFyYW0gY29tbWl0TG9nICAgT3JkZXJlZCBjb21taXQgYnVuZGxlcyBmcm9tIGV4ZWN1dG9yLmdldFNuYXBzaG90KCkuY29tbWl0TG9nXG4gKiBAcGFyYW0gc3RhcnRJZCAgICAgcnVudGltZVN0YWdlSWQgdG8gc3RhcnQgYmFja3RyYWNraW5nIGZyb21cbiAqIEBwYXJhbSBnZXRLZXlzUmVhZCBDYWxsYmFjayByZXR1cm5pbmcga2V5cyByZWFkIGJ5IGEgZ2l2ZW4gZXhlY3V0aW9uIHN0ZXBcbiAqIEBwYXJhbSBvcHRpb25zICAgICBEZXB0aCBhbmQgbm9kZSBsaW1pdHNcbiAqIEByZXR1cm5zIFJvb3QgQ2F1c2FsTm9kZSB3aXRoIC5wYXJlbnRzIGZvcm1pbmcgdGhlIERBRywgb3IgdW5kZWZpbmVkIGlmIHN0YXJ0SWQgbm90IGZvdW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXVzYWxDaGFpbihcbiAgY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSxcbiAgc3RhcnRJZDogc3RyaW5nLFxuICBnZXRLZXlzUmVhZDogS2V5c1JlYWRMb29rdXAsXG4gIG9wdGlvbnM/OiBDYXVzYWxDaGFpbk9wdGlvbnMsXG4pOiBDYXVzYWxOb2RlIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGJ1aWxkQ2F1c2FsQ2hhaW4oY29tbWl0TG9nLCBzdGFydElkLCBnZXRLZXlzUmVhZCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogSW50ZXJuYWwgc2xpY2UgY29tcG9zaXRpb246IGtlZXAgdGhlIGFjdHVhbCBidW5kbGUgc2VsZWN0ZWQgYnkgdGhlIHdyaXRlclxuICogcXVlcnkgKGluY2x1ZGluZyBhIG5vbmVtcHR5IGNvbnRpbnVhdGlvbikuIFRoaXMgaXMgbm90IGEgcHVibGljIGVudHJ5IHBvaW50LlxuICogVGhlIHJlYWQgcG9zaXRpb24gc3RpbGwgYmVsb25ncyB0byB0aGUgZXhlY3V0aW9uJ3MgZmlyc3QgY29tbWl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2F1c2FsQ2hhaW5Gcm9tQ29tbWl0KFxuICBjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLFxuICB3cml0ZXI6IENvbW1pdEJ1bmRsZSxcbiAgZ2V0S2V5c1JlYWQ6IEtleXNSZWFkTG9va3VwLFxuICBvcHRpb25zPzogQ2F1c2FsQ2hhaW5PcHRpb25zLFxuKTogQ2F1c2FsTm9kZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBidWlsZENhdXNhbENoYWluKGNvbW1pdExvZywgd3JpdGVyLnJ1bnRpbWVTdGFnZUlkLCBnZXRLZXlzUmVhZCwgb3B0aW9ucywgd3JpdGVyKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDYXVzYWxDaGFpbihcbiAgY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSxcbiAgc3RhcnRJZDogc3RyaW5nLFxuICBnZXRLZXlzUmVhZDogS2V5c1JlYWRMb29rdXAsXG4gIG9wdGlvbnM/OiBDYXVzYWxDaGFpbk9wdGlvbnMsXG4gIHNlbGVjdGVkV3JpdGVyPzogQ29tbWl0QnVuZGxlLFxuKTogQ2F1c2FsTm9kZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1heERlcHRoID0gb3B0aW9ucz8ubWF4RGVwdGggPz8gMjA7XG4gIGNvbnN0IG1heE5vZGVzID0gb3B0aW9ucz8ubWF4Tm9kZXMgPz8gMTAwO1xuICBjb25zdCBjb250cm9sRGVwcyA9IG9wdGlvbnM/LmNvbnRyb2xEZXBzO1xuICBjb25zdCB3ZWlnaCA9IG9wdGlvbnM/LndlaWdoO1xuICBjb25zdCBwZXJXcml0ZSA9IG9wdGlvbnM/LmVkZ2VBdHRyaWJ1dGlvbiA9PT0gJ3Blci13cml0ZSc7XG5cbiAgLy8gUkZDLTAwMyBENCDigJQgdHJ1bmNhdGlvbiB2aXNpYmlsaXR5LiBTZXQgb25seSB3aGVuIGEgbGltaXQgYWN0dWFsbHlcbiAgLy8gY3V0cyB0aGUgc2xpY2U7IHN1cmZhY2VkIG9uIHRoZSByb290IGFzIGB0cnVuY2F0ZWRgIHNvIGEgY29uc3VtZXIgY2FuXG4gIC8vIG5ldmVyIG1pc3Rha2UgYSB0cnVuY2F0ZWQgc2xpY2UgZm9yIGEgY29tcGxldGUgb25lLlxuICBsZXQgdHJ1bmNhdGVkQnlEZXB0aCA9IGZhbHNlO1xuICBsZXQgdHJ1bmNhdGVkQnlOb2RlcyA9IGZhbHNlO1xuXG4gIC8vIEEgY29udGludWF0aW9uIG1heSB3cml0ZSBtb3JlIGRhdGEsIGJ1dCBpdCBpcyBub3QgYW5vdGhlciBleGVjdXRpb24gb2ZcbiAgLy8gdGhlIHN0YWdlJ3MgcmVhZHMuIFVzZSB0aGUgc2hhcmVkIEZJUlNULWNvbW1pdCBydWxlIGZvciBldmVyeSByZWFkIGN1dG9mZjtcbiAgLy8ga2VlcCB3cml0ZXIgYnVuZGxlcyBzZXBhcmF0ZWx5IGZvciB0aGVpciB3cml0ZSBtZXRhZGF0YSBhbmQgcmVhZCBwcmVmaXhlcy5cbiAgY29uc3QgaWR4TWFwID0gYnVpbGRDb21taXRJbmRleChjb21taXRMb2cpO1xuICBxdWVyeVdvcmsudW5pdHMgKz0gY29tbWl0TG9nLmxlbmd0aDtcblxuICBjb25zdCBzdGFydElkeCA9IGlkeE1hcC5nZXQoc3RhcnRJZCk7XG4gIGlmIChzdGFydElkeCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHN0YXJ0Q29tbWl0ID0gc2VsZWN0ZWRXcml0ZXIgPz8gY29tbWl0TG9nW3N0YXJ0SWR4XTtcblxuICAvLyBQaWNrIHdyaXRlciBsb29rdXAgc3RyYXRlZ3kgYmFzZWQgb24gbG9nIHNpemVcbiAgY29uc3QgZmluZFdyaXRlciA9IGNyZWF0ZVdyaXRlckxvb2t1cChjb21taXRMb2cpO1xuXG4gIC8vIE5vZGUgZGVkdXAgbWFwOiBydW50aW1lU3RhZ2VJZCDihpIgQ2F1c2FsTm9kZSAoZW5zdXJlcyBEQUcsIG5vdCB0cmVlKVxuICBjb25zdCBub2RlTWFwID0gbmV3IE1hcDxzdHJpbmcsIENhdXNhbE5vZGU+KCk7XG5cbiAgY29uc3Qgcm9vdDogQ2F1c2FsTm9kZSA9IHtcbiAgICBydW50aW1lU3RhZ2VJZDogc3RhcnRJZCxcbiAgICBzdGFnZUlkOiBzdGFydENvbW1pdC5zdGFnZUlkLFxuICAgIHN0YWdlTmFtZTogc3RhcnRDb21taXQuc3RhZ2UsXG4gICAga2V5c1dyaXR0ZW46IHN0YXJ0Q29tbWl0LnRyYWNlLm1hcCgodCkgPT4gdC5wYXRoKSxcbiAgICBsaW5rZWRCeTogJycsXG4gICAgZGVwdGg6IDAsXG4gICAgcGFyZW50czogW10sXG4gICAgcGFyZW50RWRnZXM6IFtdLFxuICAgIC4uLmluY29tcGxldGVTb3VyY2VzRnJhZ21lbnQoc3RhcnRDb21taXQpLFxuICB9O1xuICBub2RlTWFwLnNldChzdGFydElkLCByb290KTtcblxuICAvLyDilIDilIAgI1AxIHBlci13cml0ZSBhdHRyaWJ1dGlvbiBtYWNoaW5lcnkgKGluZXJ0IHVuZGVyICdzdGFnZScpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBleHBhbmRlZFJlYWRzOiBwZXIgbm9kZSwgdGhlIHJlYWRzIGFscmVhZHkgcXVldWVkIGZvciBleHBhbnNpb24g4oCUIGxhdGVcbiAgLy8gbGlua3MgdmlhIGFkZGl0aW9uYWwga2V5cyByZS1lbnF1ZXVlIG9ubHkgdGhlIERFTFRBLCBzbyB0aGUgc2xpY2UgZ3Jvd3NcbiAgLy8gbW9ub3RvbmljYWxseSB0b3dhcmQgdGhlIHN0YWdlLWxldmVsIGNlaWxpbmcgYW5kIHRlcm1pbmF0ZXMgKGVhY2gga2V5XG4gIC8vIGV4cGFuZHMgYXQgbW9zdCBvbmNlIHBlciBub2RlKS4gZnVsbHlFeHBhbmRlZDogbm9kZXMgdGhhdCBmZWxsIGJhY2sgdG9cbiAgLy8gc3RhZ2UgbGV2ZWwgKG5vIHJlYWRLZXlzIG9uIGEgbGlua2luZyBlbnRyeSkg4oCUIG5vdGhpbmcgbGVmdCB0byBhZGQuXG4gIGNvbnN0IGV4cGFuZGVkUmVhZHMgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG4gIGNvbnN0IGZ1bGx5RXhwYW5kZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUmVzb2x2ZSBhIG5vZGUncyBleHBhbnNpb24gcmVhZC1zZXQgZm9yIHRoZSBnaXZlbiBsaW5raW5nIFdSSVRURU4ga2V5cy5cbiAgICogUGVyLXdyaXRlIG1vZGUgd2l0aCBwcm92ZW5hbmNlIHByZXNlbnQg4oaSIHVuaW9uIG9mIHRoZSBsaW5raW5nIHdyaXRlcydcbiAgICogdGVtcG9yYWwtcHJlZml4IGByZWFkS2V5c2AuIEFueSBsaW5raW5nIGVudHJ5IFdJVEhPVVQgYHJlYWRLZXlzYCAob3Igbm9cbiAgICogbGlua0tleXMgYXQgYWxsKSDihpIgaG9uZXN0IHN0YWdlLWxldmVsIGZhbGxiYWNrLCBmbGFnZ2VkIHZpYSB0aGUgc2Vjb25kXG4gICAqIHR1cGxlIG1lbWJlciBzbyB0aGUgY2FsbGVyIG1hcmtzIHRoZSBub2RlIGZ1bGx5IGV4cGFuZGVkLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVhZHNGb3JMaW5rcyhjb21taXQ6IENvbW1pdEJ1bmRsZSwgbGlua0tleXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogW3N0cmluZ1tdLCBib29sZWFuXSB7XG4gICAgaWYgKCFwZXJXcml0ZSB8fCAhbGlua0tleXMgfHwgbGlua0tleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW2dldEtleXNSZWFkKGNvbW1pdC5ydW50aW1lU3RhZ2VJZCksIHRydWVdO1xuICAgIH1cbiAgICBjb25zdCB1bmlvbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgbGlua0tleSBvZiBsaW5rS2V5cykge1xuICAgICAgY29uc3QgZW50cmllcyA9IGxpbmtpbmdFbnRyaWVzKGNvbW1pdCwgbGlua0tleSk7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDAgfHwgZW50cmllcy5zb21lKChlKSA9PiBlLnJlYWRLZXlzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIC8vIE1peGVkL2RpYWwtb2ZmIGxvZyDigJQgZGVncmFkZSBUSElTIG5vZGUgdG8gc3RhZ2UgbGV2ZWwsIGhvbmVzdGx5LlxuICAgICAgICByZXR1cm4gW2dldEtleXNSZWFkKGNvbW1pdC5ydW50aW1lU3RhZ2VJZCksIHRydWVdO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSBmb3IgKGNvbnN0IHJrIG9mIGVudHJ5LnJlYWRLZXlzIGFzIHN0cmluZ1tdKSB1bmlvbi5hZGQocmspO1xuICAgIH1cbiAgICByZXR1cm4gW1suLi51bmlvbl0sIGZhbHNlXTtcbiAgfVxuXG4gIC8vIEJGUy93b3JrbGlzdCBxdWV1ZTogW25vZGUsIGNvbW1pdElkeCwgZGVwdGgsIGtleXNUb0V4cGFuZF1cbiAgY29uc3QgW3Jvb3RSZWFkcywgcm9vdElzRnVsbF0gPSBwZXJXcml0ZVxuICAgID8gcmVhZHNGb3JMaW5rcyhzdGFydENvbW1pdCwgb3B0aW9ucz8ucm9vdExpbmtLZXlzKVxuICAgIDogW2dldEtleXNSZWFkKHN0YXJ0SWQpLCB0cnVlXTtcbiAgZXhwYW5kZWRSZWFkcy5zZXQoc3RhcnRJZCwgbmV3IFNldChyb290UmVhZHMpKTtcbiAgaWYgKHJvb3RJc0Z1bGwpIGZ1bGx5RXhwYW5kZWQuYWRkKHN0YXJ0SWQpO1xuICBjb25zdCBxdWV1ZTogQXJyYXk8W0NhdXNhbE5vZGUsIG51bWJlciwgbnVtYmVyLCBzdHJpbmdbXV0+ID0gW1tyb290LCBzdGFydElkeCwgMCwgcm9vdFJlYWRzXV07XG4gIGxldCB2aXNpdGVkID0gMTtcblxuICAvKipcbiAgICogTGluayBgbm9kZSDihpIgcGFyZW50YCAoY3JlYXRpbmcgKyBlbnF1ZXVlaW5nIHRoZSBwYXJlbnQgd2hlbiBuZXcpLlxuICAgKiBTaGFyZWQgYnkgZGF0YS1lZGdlIGV4cGFuc2lvbiAocmVhZOKGkndyaXRlKSBhbmQgY29udHJvbC1lZGdlIGV4cGFuc2lvblxuICAgKiAoRDMpLiBPbmUgQ2F1c2FsRWRnZSBwZXIgZGlzdGluY3QgKHBhcmVudCwga2luZCwga2V5KSBsaW5rOyBgcGFyZW50c2BcbiAgICoga2VlcHMgaXRzIGhpc3RvcmljYWwgb25lLWVudHJ5LXBlci1wYXJlbnQgZGVkdXAuXG4gICAqL1xuICBmdW5jdGlvbiBsaW5rUGFyZW50KFxuICAgIG5vZGU6IENhdXNhbE5vZGUsXG4gICAgcGFyZW50Q29tbWl0OiBDb21taXRCdW5kbGUsXG4gICAga2luZDogJ2RhdGEnIHwgJ2NvbnRyb2wnLFxuICAgIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGRlcHRoOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmVudElkID0gcGFyZW50Q29tbWl0LnJ1bnRpbWVTdGFnZUlkO1xuICAgIC8vIHRoZSBkZWR1cCBzY2FucyBiZWxvdywgYW5kIHRoZSBwYXJlbnQncyB0cmFjZSB3aGVuIGl0IGlzIG5ldyDigJQgY291bnRlZCBmb3IgdGhlIHNjYWxpbmcgdGVzdFxuICAgIHF1ZXJ5V29yay51bml0cyArPSAxICsgbm9kZS5wYXJlbnRzLmxlbmd0aCArIG5vZGUucGFyZW50RWRnZXMubGVuZ3RoO1xuICAgIC8vICNQMTogdGhlIHBhcmVudCdzIGV4cGFuc2lvbiByZWFkcywgcmVzb2x2ZWQgTEFaSUxZIChvbmx5IGZvciBuZXcgbm9kZXNcbiAgICAvLyBvciBwZXItd3JpdGUgcmUtZXhwYW5zaW9uIOKAlCBkdXBsaWNhdGUgbGlua3MgdW5kZXIgJ3N0YWdlJyBwYXkgbm90aGluZykuXG4gICAgLy8gRGF0YSBsaW5rcyBleHBhbmQgdGhyb3VnaCB0aGUgcmVhZHMgdGhhdCBmZWQgdGhlIHBhcmVudCdzIHdyaXRlIG9mXG4gICAgLy8gYGtleWA7IGNvbnRyb2wgbGlua3MgZXhwYW5kIHRoZSBkZWNpZGVyIGF0IHN0YWdlIGxldmVsIChhIGRlY2lzaW9uXG4gICAgLy8gZGVwZW5kcyBvbiBldmVyeXRoaW5nIGl0IHJlYWQpLlxuICAgIGNvbnN0IHJlc29sdmVMaW5rUmVhZHMgPSAoKTogW3N0cmluZ1tdLCBib29sZWFuXSA9PlxuICAgICAga2luZCA9PT0gJ2RhdGEnXG4gICAgICAgID8gcmVhZHNGb3JMaW5rcyhwYXJlbnRDb21taXQsIGtleSAhPT0gdW5kZWZpbmVkID8gW2tleV0gOiB1bmRlZmluZWQpXG4gICAgICAgIDogW2dldEtleXNSZWFkKHBhcmVudElkKSwgdHJ1ZV07XG5cbiAgICBsZXQgcGFyZW50Tm9kZSA9IG5vZGVNYXAuZ2V0KHBhcmVudElkKTtcbiAgICBpZiAoIXBhcmVudE5vZGUpIHtcbiAgICAgIC8vIE5ldyBub2RlIOKAlCBjcmVhdGUgYW5kIGVucXVldWUgKHJlc3BlY3RpbmcgdGhlIG5vZGUgYnVkZ2V0KVxuICAgICAgaWYgKHZpc2l0ZWQgPj0gbWF4Tm9kZXMpIHtcbiAgICAgICAgdHJ1bmNhdGVkQnlOb2RlcyA9IHRydWU7IC8vIEQ0OiBhIGRpc2NvdmVyZWQgcGFyZW50IHdhcyBkcm9wcGVkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50SWR4ID0gaWR4TWFwLmdldChwYXJlbnRJZCk7XG4gICAgICBpZiAocGFyZW50SWR4ID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgICAgcXVlcnlXb3JrLnVuaXRzICs9IHBhcmVudENvbW1pdC50cmFjZS5sZW5ndGg7XG4gICAgICBwYXJlbnROb2RlID0ge1xuICAgICAgICBydW50aW1lU3RhZ2VJZDogcGFyZW50SWQsXG4gICAgICAgIHN0YWdlSWQ6IHBhcmVudENvbW1pdC5zdGFnZUlkLFxuICAgICAgICBzdGFnZU5hbWU6IHBhcmVudENvbW1pdC5zdGFnZSxcbiAgICAgICAga2V5c1dyaXR0ZW46IHBhcmVudENvbW1pdC50cmFjZS5tYXAoKHQpID0+IHQucGF0aCksXG4gICAgICAgIC8vIGxpbmtlZEJ5IHN0YXlzIGEgREFUQS1rZXkgY29uY2VwdCAoYmFjay1jb21wYXQpIOKAlCBjb250cm9sLWxpbmtlZFxuICAgICAgICAvLyBub2RlcyBjYXJyeSB0aGVpciBsYWJlbCBvbiB0aGUgZWRnZSBpbnN0ZWFkLlxuICAgICAgICBsaW5rZWRCeToga2luZCA9PT0gJ2RhdGEnID8ga2V5ID8/ICcnIDogJycsXG4gICAgICAgIGRlcHRoOiBkZXB0aCArIDEsXG4gICAgICAgIHBhcmVudHM6IFtdLFxuICAgICAgICBwYXJlbnRFZGdlczogW10sXG4gICAgICAgIC4uLmluY29tcGxldGVTb3VyY2VzRnJhZ21lbnQocGFyZW50Q29tbWl0KSxcbiAgICAgIH07XG4gICAgICBub2RlTWFwLnNldChwYXJlbnRJZCwgcGFyZW50Tm9kZSk7XG4gICAgICB2aXNpdGVkKys7XG4gICAgICBjb25zdCBbbGlua1JlYWRzLCBsaW5rSXNGdWxsXSA9IHJlc29sdmVMaW5rUmVhZHMoKTtcbiAgICAgIGV4cGFuZGVkUmVhZHMuc2V0KHBhcmVudElkLCBuZXcgU2V0KGxpbmtSZWFkcykpO1xuICAgICAgaWYgKGxpbmtJc0Z1bGwpIGZ1bGx5RXhwYW5kZWQuYWRkKHBhcmVudElkKTtcbiAgICAgIHF1ZXVlLnB1c2goW3BhcmVudE5vZGUsIHBhcmVudElkeCwgZGVwdGggKyAxLCBsaW5rUmVhZHNdKTtcbiAgICB9IGVsc2UgaWYgKHBlcldyaXRlICYmICFmdWxseUV4cGFuZGVkLmhhcyhwYXJlbnRJZCkpIHtcbiAgICAgIC8vICNQMSB3b3JrbGlzdDogYW4gRVhJU1RJTkcgbm9kZSBsaW5rZWQgdmlhIGFub3RoZXIga2V5IG1heSBvd2UgbW9yZVxuICAgICAgLy8gZXhwYW5zaW9uIOKAlCBlbnF1ZXVlIG9ubHkgdGhlIHJlYWRzIG5vdCB5ZXQgZXhwYW5kZWQgKG1vbm90b25lOyB0aGVcbiAgICAgIC8vIG5vZGUgYnVkZ2V0IGlzIHVudG91Y2hlZCwgbm8gbm9kZSBpcyBjcmVhdGVkKS4gUmUtZXhwYW5zaW9uIGtlZXBzXG4gICAgICAvLyB0aGUgbm9kZSdzIE9SSUdJTkFMIGRlcHRoIHNvIGl0cyBwYXJlbnRzIGdldCBhIGNvbnNpc3RlbnQgZGVwdGgrMS5cbiAgICAgIGNvbnN0IFtsaW5rUmVhZHMsIGxpbmtJc0Z1bGxdID0gcmVzb2x2ZUxpbmtSZWFkcygpO1xuICAgICAgY29uc3QgZXhwYW5kZWQgPSBleHBhbmRlZFJlYWRzLmdldChwYXJlbnRJZCkhO1xuICAgICAgY29uc3QgZGVsdGEgPSBsaW5rUmVhZHMuZmlsdGVyKChrKSA9PiAhZXhwYW5kZWQuaGFzKGspKTtcbiAgICAgIGlmIChsaW5rSXNGdWxsKSBmdWxseUV4cGFuZGVkLmFkZChwYXJlbnRJZCk7XG4gICAgICBpZiAoZGVsdGEubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IGsgb2YgZGVsdGEpIGV4cGFuZGVkLmFkZChrKTtcbiAgICAgICAgY29uc3QgcGFyZW50SWR4ID0gaWR4TWFwLmdldChwYXJlbnRJZCk7XG4gICAgICAgIGlmIChwYXJlbnRJZHggIT09IHVuZGVmaW5lZCkgcXVldWUucHVzaChbcGFyZW50Tm9kZSwgcGFyZW50SWR4LCBwYXJlbnROb2RlLmRlcHRoLCBkZWx0YV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERBRyBtZXJnZTogb25lIHBhcmVudHNbXSBlbnRyeSBwZXIgZGlzdGluY3QgcGFyZW50IChoaXN0b3JpY2FsIHNoYXBlKVxuICAgIGlmICghbm9kZS5wYXJlbnRzLnNvbWUoKHApID0+IHAucnVudGltZVN0YWdlSWQgPT09IHBhcmVudElkKSkge1xuICAgICAgbm9kZS5wYXJlbnRzLnB1c2gocGFyZW50Tm9kZSk7XG4gICAgfVxuICAgIC8vIE9uZSBlZGdlIHBlciBkaXN0aW5jdCAocGFyZW50LCBraW5kLCBrZXkpIGxpbmsuIFRoZSB3ZWlnaGVyIChENClcbiAgICAvLyBzdGFtcHMgdGhlIHdlaWdodCBhdCBjcmVhdGlvbjsgYHVuZGVmaW5lZGAg4oaSIDEuMCDigJQgdGhlIGVuZ2luZSBuZXZlclxuICAgIC8vIGNvbXB1dGVzIHdlaWdodHMgaXRzZWxmLlxuICAgIGlmICghbm9kZS5wYXJlbnRFZGdlcy5zb21lKChlKSA9PiBlLnBhcmVudC5ydW50aW1lU3RhZ2VJZCA9PT0gcGFyZW50SWQgJiYgZS5raW5kID09PSBraW5kICYmIGUua2V5ID09PSBrZXkpKSB7XG4gICAgICAvLyBFcnJvciBpc29sYXRpb24gKHJldmlldyBmaW5kaW5nKTogYSBjb25zdW1lciB3ZWlnaGVyIHRoYXQgdGhyb3dzXG4gICAgICAvLyBtdXN0IGRlZ3JhZGUgdG8gdGhlIGRlZmF1bHQgd2VpZ2h0LCBuZXZlciBjcmFzaCB0aGUgc2xpY2Ug4oCUIHRoZVxuICAgICAgLy8gc2FtZSBjb250cmFjdCBldmVyeSBvdGhlciBjb25zdW1lciBjYWxsYmFjayBpbiB0aGUgbGlicmFyeSBnZXRzLlxuICAgICAgbGV0IHdlaWdodCA9IDEuMDtcbiAgICAgIGlmICh3ZWlnaCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHdlaWdodCA9IHdlaWdoKG5vZGUsIHBhcmVudE5vZGUsIGtleSwga2luZCkgPz8gMS4wO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvKiB3ZWlnaGVyIHRocmV3IOKAlCBrZWVwIDEuMCwgdGhlIHNsaWNlIHN0YXlzIHVzYWJsZSAqL1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBuZXN0ZWQgPSBraW5kID09PSAnZGF0YScgJiYga2V5ICE9PSB1bmRlZmluZWQgJiYgd3JpdGVzT25seUluc2lkZShwYXJlbnRDb21taXQsIGtleSk7XG4gICAgICBub2RlLnBhcmVudEVkZ2VzLnB1c2goe1xuICAgICAgICBwYXJlbnQ6IHBhcmVudE5vZGUsXG4gICAgICAgIGtpbmQsXG4gICAgICAgIGtleSxcbiAgICAgICAgd2VpZ2h0LFxuICAgICAgICAuLi4obmVzdGVkICYmIHsgYmFzaXM6ICduZXN0ZWQtcm93cycgYXMgY29uc3QgfSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IFtub2RlLCBjb21taXRJZHgsIGRlcHRoLCBrZXlzVG9FeHBhbmRdID0gcXVldWUuc2hpZnQoKSE7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IDEgKyBrZXlzVG9FeHBhbmQubGVuZ3RoO1xuXG4gICAgaWYgKGRlcHRoID49IG1heERlcHRoKSB7XG4gICAgICAvLyBENDogb25seSBhIG5vZGUgdGhhdCBzdGlsbCBIQUQgc29tZXRoaW5nIHRvIGV4cGFuZCBjb3VudHMgYXMgYSBjdXRcbiAgICAgIC8vIChhIGxlYWYgYXQgdGhlIGhvcml6b24gdHJ1bmNhdGVzIG5vdGhpbmcpLlxuICAgICAgaWYgKGtleXNUb0V4cGFuZC5sZW5ndGggPiAwIHx8IGNvbnRyb2xEZXBzPy4obm9kZS5ydW50aW1lU3RhZ2VJZCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0cnVuY2F0ZWRCeURlcHRoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIERhdGEgZWRnZXM6IGZvciBlYWNoIGtleSBpbiB0aGlzIGV4cGFuc2lvbidzIHJlYWQtc2V0LCBmaW5kIHdobyB3cm90ZVxuICAgIC8vIGl0LiBVbmRlciAnc3RhZ2UnIHRoaXMgaXMgdGhlIG5vZGUncyBmdWxsIHJlYWQtc2V0IChoaXN0b3JpY2FsXG4gICAgLy8gYmVoYXZpb3IpOyB1bmRlciAncGVyLXdyaXRlJyBpdCBpcyB0aGUgbGlua2luZyB3cml0ZXMnIHRlbXBvcmFsIHByZWZpeFxuICAgIC8vIChvciBhIHdvcmtsaXN0IGRlbHRhIG9uIHJlLWV4cGFuc2lvbikuXG4gICAgY29uc3Qga2V5c1JlYWQgPSBrZXlzVG9FeHBhbmQ7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c1JlYWQpIHtcbiAgICAgIGNvbnN0IHdyaXRlciA9IGZpbmRXcml0ZXIoa2V5LCBjb21taXRJZHgpO1xuICAgICAgaWYgKCF3cml0ZXIpIHtcbiAgICAgICAgLy8gRjRiOiBzYXkgd2h5IHRoZXJlIGlzIG5vIGVkZ2Ug4oCUIG5vIGNvbW1pdCBiZWZvcmUgdGhpcyBub2RlIHdyb3RlIHRoZSBrZXkuXG4gICAgICAgIG5vZGUucHJlUnVuUmVhZHMgPz89IHsgY29kZTogJ3ByZS1ydW4tb3JpZ2luJywga2V5czogW10gfTtcbiAgICAgICAgaWYgKCFub2RlLnByZVJ1blJlYWRzLmtleXMuaW5jbHVkZXMoa2V5KSkgbm9kZS5wcmVSdW5SZWFkcy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsaW5rUGFyZW50KG5vZGUsIHdyaXRlciwgJ2RhdGEnLCBrZXksIGRlcHRoKTtcbiAgICB9XG5cbiAgICAvLyBDb250cm9sIGVkZ2UgKFJGQy0wMDMgRDMpOiBsaW5rIHRoZSBnb3Zlcm5pbmcgZGVjaWRlciwgbGFiZWxlZCBieSB0aGVcbiAgICAvLyBkZWNpZGUoKSBydWxlIGxhYmVsIHdoZW4gcHJlc2VudC4gVGhlIGRlY2lkZXIgbm9kZSB0aGVuIGV4cGFuZHNcbiAgICAvLyBub3JtYWxseSB0aHJvdWdoIGl0cyBvd24gZGF0YSByZWFkcyAoYW5kIGl0cyBvd24gY29udHJvbCBwYXJlbnQpLlxuICAgIGlmIChjb250cm9sRGVwcykge1xuICAgICAgY29uc3QgZGVwID0gY29udHJvbERlcHMobm9kZS5ydW50aW1lU3RhZ2VJZCk7XG4gICAgICBpZiAoZGVwKSB7XG4gICAgICAgIGNvbnN0IGRlY2lkZXJJZHggPSBpZHhNYXAuZ2V0KGRlcC5kZWNpZGVySWQpO1xuICAgICAgICBpZiAoZGVjaWRlcklkeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbGlua1BhcmVudChub2RlLCBjb21taXRMb2dbZGVjaWRlcklkeF0sICdjb250cm9sJywgZGVwLmxhYmVsLCBkZXB0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSRkMtMDAzIEQ0IOKAlCB0cnVuY2F0aW9uIHZpc2liaWxpdHkgb24gdGhlIHJvb3QgKGFic2VudCB3aGVuIGNvbXBsZXRlKS4gSXQgaXMgREFUQSwgYW5kIG9ubHlcbiAgLy8gZGF0YTogYSByZWFkZXIgcmVhZHMgYHJvb3QudHJ1bmNhdGVkYCAoYW5kIGBmb3JtYXRDYXVzYWxDaGFpbmAgcHJpbnRzIGl0KTsgdGhlIHJlY29yZCB3cml0ZXMgbm9cbiAgLy8gY29uc29sZSBsaW5lICh0aGUgZGV2LW1vZGUgd2FybmluZyB3ZW50IGluIEM2IOKAlCB0aGUgcmVjb3JkIGltcG9ydHMgbm90aGluZyBvdXRzaWRlIGl0c2VsZikuXG4gIGlmICh0cnVuY2F0ZWRCeURlcHRoIHx8IHRydW5jYXRlZEJ5Tm9kZXMpIHtcbiAgICByb290LnRydW5jYXRlZCA9IHsgYnlEZXB0aDogdHJ1bmNhdGVkQnlEZXB0aCwgYnlOb2RlczogdHJ1bmNhdGVkQnlOb2RlcyB9O1xuICB9XG5cbiAgcmV0dXJuIHJvb3Q7XG59XG5cbi8vIOKUgOKUgCBVdGlsaXRpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogRmxhdHRlbiB0aGUgY2F1c2FsIERBRyBpbnRvIGEgQkZTLW9yZGVyZWQgbGlzdCBvZiBub2Rlcy5cbiAqIEVhY2ggbm9kZSBhcHBlYXJzIGV4YWN0bHkgb25jZSAoZmlyc3Qgb2NjdXJyZW5jZSBieSBCRlMgb3JkZXIpLlxuICogVXNlZnVsIGZvciBsaW5lYXIgZGlzcGxheSBvciBpdGVyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuQ2F1c2FsREFHKHJvb3Q6IENhdXNhbE5vZGUpOiBDYXVzYWxOb2RlW10ge1xuICBjb25zdCByZXN1bHQ6IENhdXNhbE5vZGVbXSA9IFtdO1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHF1ZXVlOiBDYXVzYWxOb2RlW10gPSBbcm9vdF07XG5cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlID0gcXVldWUuc2hpZnQoKSE7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUucnVudGltZVN0YWdlSWQpKSBjb250aW51ZTtcbiAgICB2aXNpdGVkLmFkZChub2RlLnJ1bnRpbWVTdGFnZUlkKTtcbiAgICByZXN1bHQucHVzaChub2RlKTtcblxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG5vZGUucGFyZW50cykge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhwYXJlbnQucnVudGltZVN0YWdlSWQpKSB7XG4gICAgICAgIHF1ZXVlLnB1c2gocGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZvcm1hdCBhIGNhdXNhbCBEQUcgYXMgaHVtYW4tcmVhZGFibGUgaW5kZW50ZWQgdGV4dC5cbiAqIFNob3dzIHRoZSBkZXBlbmRlbmN5IGNoYWluIHdpdGggZGVwdGggaW5kZW50YXRpb24gYW5kIGxpbmtlZC1ieSBrZXlzLlxuICpcbiAqIFJGQy0wMDMgRDI6IG5vZGVzIHRoYXQgY29uc3VtZWQgdW50cmFja2VkIHJlYWQgcGF0aHMgcmVuZGVyIGFuIGV4dHJhXG4gKiBg4pqgIGFsc28gY29uc3VtZWQg4oCmIOKAlCBzbGljZSBtYXkgYmUgaW5jb21wbGV0ZSBoZXJlYCBsaW5lLCBzbyBhIGNvbnN1bWVyXG4gKiAoaHVtYW4gb3IgTExNKSBkZWJ1Z2dpbmcgZnJvbSB0aGUgc2xpY2UgaXMgVE9MRCB3aGVuIGl0IGlzIGluY29tcGxldGUuXG4gKlxuICogUkZDLTAwMyBEMzogY29udHJvbCBlZGdlcyByZW5kZXIgYXMgYOKGkCBbY29udHJvbDogPHJ1bGUgbGFiZWw+XWBcbiAqIChsYWJlbCBvbWl0dGVkIHdoZW4gdGhlIGRlY2lzaW9uIGNhcnJpZWQgbm9uZSkuIERhdGEgcmVuZGVyaW5nIGlzXG4gKiBieXRlLWlkZW50aWNhbCB0byB0aGUgcHJlLUQzIG91dHB1dCDigJQgYOKGkCB2aWEgPGtleT5gIGZyb20gdGhlIG5vZGUnc1xuICogZGlzY292ZXJ5LXRpbWUgYGxpbmtlZEJ5YC5cbiAqXG4gKiBSRkMtMDAzIEQ0OiBlZGdlIHdlaWdodHMgZnJvbSB0aGUgYHdlaWdoYCBob29rIHJlbmRlciBhcyBhIHN1ZmZpeCDigJRcbiAqIGDihpAgdmlhIHN5c3RlbVByb21wdCAoMC4xOClgIOKAlCBvbmx5IHdoZW4g4omgIDEuMCwgc28gdW53ZWlnaHRlZCBvdXRwdXQgaXNcbiAqIHVuY2hhbmdlZC4gQSB0cnVuY2F0ZWQgc2xpY2UgKHJvb3QudHJ1bmNhdGVkKSBhcHBlbmRzIGEgZmluYWxcbiAqIGDimqAgc2xpY2UgdHJ1bmNhdGVkIOKApmAgbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdENhdXNhbENoYWluKHJvb3Q6IENhdXNhbE5vZGUpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0IHdlaWdodFN1ZmZpeCA9IChlZGdlOiBDYXVzYWxFZGdlIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+XG4gICAgZWRnZSAhPT0gdW5kZWZpbmVkICYmIGVkZ2Uud2VpZ2h0ICE9PSAxID8gYCAoJHtlZGdlLndlaWdodH0pYCA6ICcnO1xuXG4gIGZ1bmN0aW9uIHdhbGsobm9kZTogQ2F1c2FsTm9kZSwgaW5kZW50OiBudW1iZXIsIGVkZ2VzRnJvbUNoaWxkPzogQ2F1c2FsRWRnZVtdKTogdm9pZCB7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUucnVudGltZVN0YWdlSWQpKSB7XG4gICAgICBsaW5lcy5wdXNoKGAkeycgICcucmVwZWF0KGluZGVudCl94oazICR7bm9kZS5ydW50aW1lU3RhZ2VJZH0gKHNlZSBhYm92ZSlgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmlzaXRlZC5hZGQobm9kZS5ydW50aW1lU3RhZ2VJZCk7XG5cbiAgICBjb25zdCBsaW5rUGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG5vZGUubGlua2VkQnkpIHtcbiAgICAgIGNvbnN0IGRhdGFFZGdlID0gZWRnZXNGcm9tQ2hpbGQ/LmZpbmQoKGUpID0+IGUua2luZCA9PT0gJ2RhdGEnKTtcbiAgICAgIGxpbmtQYXJ0cy5wdXNoKGB2aWEgJHtub2RlLmxpbmtlZEJ5fSR7d2VpZ2h0U3VmZml4KGRhdGFFZGdlKX1gKTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbEVkZ2UgPSBlZGdlc0Zyb21DaGlsZD8uZmluZCgoZSkgPT4gZS5raW5kID09PSAnY29udHJvbCcpO1xuICAgIGlmIChjb250cm9sRWRnZSkge1xuICAgICAgbGlua1BhcnRzLnB1c2goYFtjb250cm9sJHtjb250cm9sRWRnZS5rZXkgPyBgOiAke2NvbnRyb2xFZGdlLmtleX1gIDogJyd9XSR7d2VpZ2h0U3VmZml4KGNvbnRyb2xFZGdlKX1gKTtcbiAgICB9XG4gICAgY29uc3QgbGluayA9IGxpbmtQYXJ0cy5sZW5ndGggPiAwID8gYCDihpAgJHtsaW5rUGFydHMuam9pbignIOKGkCAnKX1gIDogJyc7XG5cbiAgICBjb25zdCB3cml0ZXMgPSBub2RlLmtleXNXcml0dGVuLmxlbmd0aCA+IDAgPyBgIFt3cm90ZTogJHtub2RlLmtleXNXcml0dGVuLmpvaW4oJywgJyl9XWAgOiAnJztcbiAgICBsaW5lcy5wdXNoKGAkeycgICcucmVwZWF0KGluZGVudCl9JHtub2RlLnN0YWdlTmFtZX0gKCR7bm9kZS5ydW50aW1lU3RhZ2VJZH0pJHtsaW5rfSR7d3JpdGVzfWApO1xuXG4gICAgaWYgKG5vZGUuaW5jb21wbGV0ZVNvdXJjZXMgJiYgbm9kZS5pbmNvbXBsZXRlU291cmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKFxuICAgICAgICBgJHsnICAnLnJlcGVhdChpbmRlbnQgKyAxKX3imqAgYWxzbyBjb25zdW1lZCAke25vZGUuaW5jb21wbGV0ZVNvdXJjZXMuam9pbignLycpfSDigJQgc2xpY2UgbWF5IGJlIGluY29tcGxldGUgaGVyZWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG5vZGUucGFyZW50cykge1xuICAgICAgd2FsayhcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBpbmRlbnQgKyAxLFxuICAgICAgICBub2RlLnBhcmVudEVkZ2VzLmZpbHRlcigoZSkgPT4gZS5wYXJlbnQgPT09IHBhcmVudCksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHdhbGsocm9vdCwgMCk7XG5cbiAgaWYgKHJvb3QudHJ1bmNhdGVkKSB7XG4gICAgY29uc3QgY2F1c2VzID0gW3Jvb3QudHJ1bmNhdGVkLmJ5RGVwdGggJiYgJ21heERlcHRoIHJlYWNoZWQnLCByb290LnRydW5jYXRlZC5ieU5vZGVzICYmICdtYXhOb2RlcyByZWFjaGVkJ11cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5qb2luKCcsICcpO1xuICAgIGxpbmVzLnB1c2goYOKaoCBzbGljZSB0cnVuY2F0ZWQgKCR7Y2F1c2VzfSkg4oCUIG9sZGVyIGNhdXNlcyBleGlzdCBiZXlvbmQgdGhpcyBob3Jpem9uYCk7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8vIOKUgOKUgCBFeHBvcnRlZCBmb3IgdGVzdGluZyAoaW50ZXJuYWwpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogQGludGVybmFsIEV4cG9zZWQgZm9yIHRlc3RpbmcgdGhlIHN0cmF0ZWd5IHNlbGVjdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBfUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQgPSBSRVZFUlNFX0lOREVYX1RIUkVTSE9MRDtcbiJdfQ==
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* it, every surface hand-rolls the anchor step differently and their answers
|
|
13
13
|
* disagree. The value of this function is that they can't.
|
|
14
14
|
*/
|
|
15
|
-
import {
|
|
15
|
+
import { causalChainFromCommit } from '../memory/backtrack.js';
|
|
16
16
|
import { commitValueAtWithBasis, findLastWriterWithBasis } from '../memory/commitLogUtils.js';
|
|
17
17
|
import { normalisePath } from '../memory/utils.js';
|
|
18
18
|
import { fromInitialStateNote, nestedRowsNote, redactedValueNote } from './keyIndex.js';
|
|
@@ -78,11 +78,13 @@ export function sliceForKey(commitLog, key, keysRead, options) {
|
|
|
78
78
|
// without `TraceEntry.readKeys` (the writeProvenance dial off) fall back
|
|
79
79
|
// to stage-level expansion per node, byte-identically. Consumers can force
|
|
80
80
|
// 'stage' via options.
|
|
81
|
-
|
|
81
|
+
// Preserve this exact writer's metadata/read prefix, even when it is a
|
|
82
|
+
// continuation. Causal expansion separately uses the execution's first commit.
|
|
83
|
+
const root = causalChainFromCommit(commitLog, writer, source.lookup, {
|
|
82
84
|
...options,
|
|
83
85
|
edgeAttribution: options?.edgeAttribution ?? 'per-write',
|
|
84
86
|
rootLinkKeys: options?.rootLinkKeys ?? [normalisedKey],
|
|
85
87
|
});
|
|
86
88
|
return { ...base, writer, root, ...(notes.length > 0 && { notes }) };
|
|
87
89
|
}
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2VGb3JLZXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NsaWNlL3NsaWNlRm9yS2V5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQWdELFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25HLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTlGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRzdEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEdBQWE7SUFDN0MsT0FBTyxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFlRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUN6QixTQUF5QixFQUN6QixHQUFhLEVBQ2IsUUFBeUMsRUFDekMsT0FBNEI7SUFFNUIsTUFBTSxNQUFNLEdBQUcscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0MsTUFBTSxhQUFhLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0MsTUFBTSxJQUFJLEdBQTZFO1FBQ3JGLEdBQUcsRUFBRSxhQUFhO1FBQ2xCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxLQUFLLFNBQVMsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1FBQ3pCLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7S0FDekUsQ0FBQztJQUVGLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUVyRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLHVCQUF1QixDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdGLDBHQUEwRztJQUMxRyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hGLE1BQU0sS0FBSyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDMUYsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osNEdBQTRHO1FBQzVHLE9BQU87WUFDTCxHQUFHLElBQUk7WUFDUCxPQUFPLEVBQUUsZUFBZTtZQUN4QixHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNqRixDQUFDO0lBQ0osQ0FBQztJQUNELDZGQUE2RjtJQUM3RixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDaEgsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDO1FBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzFGLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFN0UseUVBQXlFO0lBQ3pFLG9FQUFvRTtJQUNwRSwwRUFBMEU7SUFDMUUsd0VBQXdFO0lBQ3hFLHVFQUF1RTtJQUN2RSxpRUFBaUU7SUFDakUsRUFBRTtJQUNGLHFFQUFxRTtJQUNyRSwyRUFBMkU7SUFDM0UsMEVBQTBFO0lBQzFFLHlFQUF5RTtJQUN6RSwyRUFBMkU7SUFDM0UsdUJBQXVCO0lBQ3ZCLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFO1FBQ3hFLEdBQUcsT0FBTztRQUNWLGVBQWUsRUFBRSxPQUFPLEVBQUUsZUFBZSxJQUFJLFdBQVc7UUFDeEQsWUFBWSxFQUFFLE9BQU8sRUFBRSxZQUFZLElBQUksQ0FBQyxhQUFhLENBQUM7S0FDdkQsQ0FBRSxDQUFDO0lBQ0osT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ3ZFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHNsaWNlL3NsaWNlRm9yS2V5LnRzIOKAlCB0aGUgdmFyaWFibGUtZmlyc3QgYmFja3dhcmQgc2xpY2UgcXVlcnkuXG4gKlxuICogXCJXaHkgaXMgYGtleWAgd2hhdCBpdCBpcz9cIiDigJQgdGhlIE9ORSBxdWVzdGlvbiBldmVyeSB0cmlhZ2Ugc3VyZmFjZSBhc2tzOlxuICogYSBodW1hbiBjbGlja2luZyBhIGtleSBpbiBleHBsYWluYWJsZS11aSwgYW4gTExNIGNhbGxpbmcgYSBgYmFja3RyYWNrYFxuICogdG9vbCBtaWQtY29udmVyc2F0aW9uLCBhbiBvZmZsaW5lIGF1dG9wc3kgYWdlbnQgb3ZlciBhIHN0b3JlZCBydW4uXG4gKlxuICogV0hZIHRoaXMgaXMgZGVsaWJlcmF0ZWx5IGEgY29tcG9zaXRpb24gYW5kIG5vdCBhIG5ldyBhbGdvcml0aG06XG4gKiBgZmluZExhc3RXcml0ZXJgIGFscmVhZHkgYW5zd2VycyBcIndobyBtYWRlIHRoZSB2YWx1ZSB3aGF0IGl0IGlzXCIgYW5kXG4gKiBgY2F1c2FsQ2hhaW5gIGFscmVhZHkgYW5zd2VycyBcIndoYXQgaW5mbHVlbmNlZCB0aGF0IHN0ZXBcIiAodGhpbiBiYWNrd2FyZFxuICogc2xpY2luZywgV2Vpc2VyIDE5ODQpLiBXaGF0IHdhcyBtaXNzaW5nIGlzIHRoZSBzaGFyZWQgQ09OVFJBQ1Qg4oCUIHdpdGhvdXRcbiAqIGl0LCBldmVyeSBzdXJmYWNlIGhhbmQtcm9sbHMgdGhlIGFuY2hvciBzdGVwIGRpZmZlcmVudGx5IGFuZCB0aGVpciBhbnN3ZXJzXG4gKiBkaXNhZ3JlZS4gVGhlIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdGhhdCB0aGV5IGNhbid0LlxuICovXG5cbmltcG9ydCB7IHR5cGUgQ2F1c2FsQ2hhaW5PcHRpb25zLCB0eXBlIEtleXNSZWFkTG9va3VwLCBjYXVzYWxDaGFpbiB9IGZyb20gJy4uL21lbW9yeS9iYWNrdHJhY2suanMnO1xuaW1wb3J0IHsgY29tbWl0VmFsdWVBdFdpdGhCYXNpcywgZmluZExhc3RXcml0ZXJXaXRoQmFzaXMgfSBmcm9tICcuLi9tZW1vcnkvY29tbWl0TG9nVXRpbHMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUgfSBmcm9tICcuLi9tZW1vcnkvdHlwZXMuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXNlUGF0aCB9IGZyb20gJy4uL21lbW9yeS91dGlscy5qcyc7XG5pbXBvcnQgeyBmcm9tSW5pdGlhbFN0YXRlTm90ZSwgbmVzdGVkUm93c05vdGUsIHJlZGFjdGVkVmFsdWVOb3RlIH0gZnJvbSAnLi9rZXlJbmRleC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlS2V5c1JlYWRTb3VyY2UgfSBmcm9tICcuL2tleXNSZWFkU291cmNlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEtleXNSZWFkU291cmNlLCBTdGF0ZUtleSwgVmFyaWFibGVTbGljZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIE5vcm1hbGlzZSBhIGNvbnN1bWVyLWZhY2luZyB7QGxpbmsgU3RhdGVLZXl9IHRvIHRoZSBlbmdpbmUncyBjYW5vbmljYWxcbiAqIHN0cmluZyBmb3JtICh0aGUgYFRyYWNlRW50cnkucGF0aGAgc3BhY2UpLiBQYXRoIGFycmF5cyBnbyB0aHJvdWdoIHRoZSBzYW1lXG4gKiBub3JtYWxpc2VyIHRoZSBlbmdpbmUgd3JpdGVzIHdpdGgg4oCUIHRoZSBkZWxpbWl0ZXIgbmV2ZXIgbGVha3MgaW50byB0aGVcbiAqIHB1YmxpYyBjb250cmFjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGlzZVN0YXRlS2V5KGtleTogU3RhdGVLZXkpOiBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgPyBrZXkgOiBub3JtYWxpc2VQYXRoKFsuLi5rZXldKTtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBzbGljZUZvcktleX0g4oCUIGNhdXNhbENoYWluJ3Mgb3B0aW9ucyBwbHVzIGFuY2hvcmluZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2xpY2VGb3JLZXlPcHRpb25zIGV4dGVuZHMgQ2F1c2FsQ2hhaW5PcHRpb25zIHtcbiAgLyoqXG4gICAqIEV4Y2x1c2l2ZSBjb21taXQtYXJyYXktaW5kZXggdXBwZXIgYm91bmQ6IHNsaWNlIHRoZSB2YWx1ZSBhcyBpdCBzdG9vZFxuICAgKiBCRUZPUkUgdGhpcyBpZHggKHRpbWUtdHJhdmVsIHRyaWFnZSDigJQgXCJ3aHkgd2FzIGl0IFggYXQgc3RlcCAxMj9cIikuXG4gICAqIFNhbWUgY29udHJhY3QgYXMgYGZpbmRMYXN0V3JpdGVyYCdzIGBiZWZvcmVJZHhgLiBPbWl0IGZvciB0aGUgY3VycmVudFxuICAgKiB2YWx1ZS4gQ2hhaW5lZC10cmlhZ2UgaWRpb206IHRvIHNsaWNlIGF0IGFuIHtAbGluayBFbGVtZW50QmlydGh9LCBwYXNzXG4gICAqIGBiZWZvcmU6IGJpcnRoLmNvbW1pdElkeCArIDFgIChiaXJ0aCBpZHggaXMgaW5jbHVzaXZlLCB0aGlzIGJvdW5kIGlzXG4gICAqIGV4Y2x1c2l2ZSDigJQgdGhlICsxIG1ha2VzIHRoZSBiaXJ0aCBjb21taXQgaXRzZWxmIHRoZSBhbmNob3IpLlxuICAgKi9cbiAgYmVmb3JlPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEJhY2t3YXJkIHNsaWNlIGZvciBvbmUgc3RhdGUga2V5OiBhbmNob3IgYXQgdGhlIGtleSdzIGxhc3Qgd3JpdGVyLCB0aGVuXG4gKiB3YWxrIHJlYWTihpJ3cml0ZSAoYW5kIG9wdGlvbmFsIGNvbnRyb2wpIGRlcGVuZGVuY2llcyB0cmFuc2l0aXZlbHkuXG4gKlxuICogSG9uZXN0LWFic2VuY2UgY29udHJhY3Q6IGEgbWlzc2luZyBzbGljZSBpcyBhIFJFU1VMVCwgbm90IGFuIGVycm9yIOKAlFxuICogYG1pc3Npbmc6ICduZXZlci13cml0dGVuJ2AgdGVsbHMgYSB0cmlhZ2UgdG9vbCAob3IgaXRzIExMTSBjYWxsZXIpIHRoYXRcbiAqIHRoZSB2YWx1ZSBjYW1lIGZyb20gaW5pdGlhbCBzdGF0ZSAvIGZyb3plbiBhcmdzIC8gYSBjbG9zdXJlLCB3aGljaCBpc1xuICogaXRzZWxmIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uIFNlZSB7QGxpbmsgVmFyaWFibGVTbGljZX0g4oCUIGluY2x1ZGluZyBpdHNcbiAqIFNFUklBTElaQVRJT04gV0FSTklORyBiZWZvcmUgeW91IHN0cmluZ2lmeSB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2xpY2VGb3JLZXkoXG4gIGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sXG4gIGtleTogU3RhdGVLZXksXG4gIGtleXNSZWFkOiBLZXlzUmVhZFNvdXJjZSB8IEtleXNSZWFkTG9va3VwLFxuICBvcHRpb25zPzogU2xpY2VGb3JLZXlPcHRpb25zLFxuKTogVmFyaWFibGVTbGljZSB7XG4gIGNvbnN0IHNvdXJjZSA9IHJlc29sdmVLZXlzUmVhZFNvdXJjZShrZXlzUmVhZCk7XG4gIGNvbnN0IG5vcm1hbGlzZWRLZXkgPSBub3JtYWxpc2VTdGF0ZUtleShrZXkpO1xuICBjb25zdCBiYXNlOiBQaWNrPFZhcmlhYmxlU2xpY2UsICdrZXknIHwgJ2JlZm9yZScgfCAna2V5c1JlYWRLaW5kJyB8ICdyZWFkc0NvdmVyYWdlJz4gPSB7XG4gICAga2V5OiBub3JtYWxpc2VkS2V5LFxuICAgIC4uLihvcHRpb25zPy5iZWZvcmUgIT09IHVuZGVmaW5lZCAmJiB7IGJlZm9yZTogb3B0aW9ucy5iZWZvcmUgfSksXG4gICAga2V5c1JlYWRLaW5kOiBzb3VyY2Uua2luZCxcbiAgICAuLi4oc291cmNlLmNvdmVyYWdlICE9PSB1bmRlZmluZWQgJiYgeyByZWFkc0NvdmVyYWdlOiBzb3VyY2UuY292ZXJhZ2UgfSksXG4gIH07XG5cbiAgaWYgKGNvbW1pdExvZy5sZW5ndGggPT09IDApIHJldHVybiB7IC4uLmJhc2UsIG1pc3Npbmc6ICdlbXB0eS1sb2cnIH07XG5cbiAgY29uc3QgeyB3cml0ZXIsIGJhc2lzIH0gPSBmaW5kTGFzdFdyaXRlcldpdGhCYXNpcyhjb21taXRMb2csIG5vcm1hbGlzZWRLZXksIG9wdGlvbnM/LmJlZm9yZSk7XG4gIC8vIEY0Yjogd2hhdCB0aGUgdmFsdWUgYXQgdGhlIHNsaWNlJ3MgcG9pbnQgcmVzdHMgb24sIGZyb20gdGhlIHZhbHVlIHR3aW4g4oCUIGEgcmVkYWN0aW9uLCB0aGUgcHJlLXJ1biBiYXNlLlxuICBjb25zdCBlbmQgPSBNYXRoLm1pbihvcHRpb25zPy5iZWZvcmUgPz8gY29tbWl0TG9nLmxlbmd0aCwgY29tbWl0TG9nLmxlbmd0aCkgLSAxO1xuICBjb25zdCB2YWx1ZSA9IGVuZCA+PSAwID8gY29tbWl0VmFsdWVBdFdpdGhCYXNpcyhjb21taXRMb2csIGVuZCwgbm9ybWFsaXNlZEtleSkuYmFzaXMgOiBbXTtcbiAgaWYgKCF3cml0ZXIpIHtcbiAgICAvLyAnbmV2ZXItd3JpdHRlbicgYWxyZWFkeSBzYXlzIHRoZSB2YWx1ZSBjYW1lIGZyb20gYmVmb3JlIHRoZSBydW47IGEgcmVkYWN0aW9uIHRoYXQgaGlkIHRoZSB3cml0ZSBkb2VzIG5vdC5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uYmFzZSxcbiAgICAgIG1pc3Npbmc6ICduZXZlci13cml0dGVuJyxcbiAgICAgIC4uLih2YWx1ZS5pbmNsdWRlcygncmVkYWN0ZWQnKSAmJiB7IG5vdGVzOiBbcmVkYWN0ZWRWYWx1ZU5vdGUobm9ybWFsaXNlZEtleSldIH0pLFxuICAgIH07XG4gIH1cbiAgLy8gQSB3cml0ZXIgdGhhdCByZWFjaGVkIHRoZSBrZXkgb25seSB0aHJvdWdoIHJvd3MgaW5zaWRlIGl0IG1hZGUgcGFydCBvZiB0aGUgdmFsdWUg4oCUIHNheSBzby5cbiAgY29uc3Qgbm90ZXMgPSBiYXNpcy5pbmNsdWRlcygnbmVzdGVkLXJvd3MnKSA/IFtuZXN0ZWRSb3dzTm90ZShub3JtYWxpc2VkS2V5LCBbY29tbWl0TG9nLmluZGV4T2Yod3JpdGVyKV0pXSA6IFtdO1xuICBpZiAodmFsdWUuaW5jbHVkZXMoJ2Zyb20taW5pdGlhbC1zdGF0ZScpKSBub3Rlcy5wdXNoKGZyb21Jbml0aWFsU3RhdGVOb3RlKG5vcm1hbGlzZWRLZXkpKTtcbiAgaWYgKHZhbHVlLmluY2x1ZGVzKCdyZWRhY3RlZCcpKSBub3Rlcy5wdXNoKHJlZGFjdGVkVmFsdWVOb3RlKG5vcm1hbGlzZWRLZXkpKTtcblxuICAvLyBJTlZBUklBTlQ6IGB3cml0ZXJgIGNhbWUgRlJPTSB0aGlzIGNvbW1pdExvZywgc28gaXRzIHJ1bnRpbWVTdGFnZUlkIGlzXG4gIC8vIGFsd2F5cyBwcmVzZW50IGluIGNhdXNhbENoYWluJ3MgaW5kZXgg4oCUIGNhdXNhbENoYWluIGNhbm5vdCByZXR1cm5cbiAgLy8gdW5kZWZpbmVkIGhlcmUgKGl0IG9ubHkgZG9lcyBmb3IgaWRzIGFic2VudCBmcm9tIHRoZSBsb2cpLiBUaGUgbm9uLW51bGxcbiAgLy8gYXNzZXJ0aW9uIGtlZXBzIHRoZSBWYXJpYWJsZVNsaWNlIGNvbnRyYWN0IGFpcnRpZ2h0OiBgbWlzc2luZ2AgaXMgdGhlXG4gIC8vIE9OTFkgYWJzZW50LXJvb3Qgc3RhdGUuIE9wdGlvbnMgcGFzcyBzdHJhaWdodCB0aHJvdWdoIChjb250cm9sRGVwcyAvXG4gIC8vIHdlaWdoIC8gbWF4RGVwdGggLyBtYXhOb2RlcyBrZWVwIHRoZWlyIGNhdXNhbENoYWluIHNlbWFudGljcykuXG4gIC8vXG4gIC8vIGVkZ2VBdHRyaWJ1dGlvbiBkZWZhdWx0cyB0byAncGVyLXdyaXRlJyBIRVJFICh1bmxpa2UgY2F1c2FsQ2hhaW4nc1xuICAvLyAnc3RhZ2UnIGRlZmF1bHQpOiBhIHZhcmlhYmxlLWZpcnN0IHNsaWNlIGtub3dzIGV4YWN0bHkgd2hpY2ggd3JpdHRlbiBrZXlcbiAgLy8gYW5jaG9ycyB0aGUgcXVlc3Rpb24sIGFuZCBwZXItd3JpdGUgYXR0cmlidXRpb24gaXMgc3RyaWN0bHktc2FmZSDigJQgbG9nc1xuICAvLyB3aXRob3V0IGBUcmFjZUVudHJ5LnJlYWRLZXlzYCAodGhlIHdyaXRlUHJvdmVuYW5jZSBkaWFsIG9mZikgZmFsbCBiYWNrXG4gIC8vIHRvIHN0YWdlLWxldmVsIGV4cGFuc2lvbiBwZXIgbm9kZSwgYnl0ZS1pZGVudGljYWxseS4gQ29uc3VtZXJzIGNhbiBmb3JjZVxuICAvLyAnc3RhZ2UnIHZpYSBvcHRpb25zLlxuICBjb25zdCByb290ID0gY2F1c2FsQ2hhaW4oY29tbWl0TG9nLCB3cml0ZXIucnVudGltZVN0YWdlSWQsIHNvdXJjZS5sb29rdXAsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGVkZ2VBdHRyaWJ1dGlvbjogb3B0aW9ucz8uZWRnZUF0dHJpYnV0aW9uID8/ICdwZXItd3JpdGUnLFxuICAgIHJvb3RMaW5rS2V5czogb3B0aW9ucz8ucm9vdExpbmtLZXlzID8/IFtub3JtYWxpc2VkS2V5XSxcbiAgfSkhO1xuICByZXR1cm4geyAuLi5iYXNlLCB3cml0ZXIsIHJvb3QsIC4uLihub3Rlcy5sZW5ndGggPiAwICYmIHsgbm90ZXMgfSkgfTtcbn1cbiJdfQ==
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2VGb3JLZXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NsaWNlL3NsaWNlRm9yS2V5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQWdELHFCQUFxQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0csT0FBTyxFQUFFLHNCQUFzQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFOUYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHN0Q7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsR0FBYTtJQUM3QyxPQUFPLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDakUsQ0FBQztBQWVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQ3pCLFNBQXlCLEVBQ3pCLEdBQWEsRUFDYixRQUF5QyxFQUN6QyxPQUE0QjtJQUU1QixNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMvQyxNQUFNLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QyxNQUFNLElBQUksR0FBNkU7UUFDckYsR0FBRyxFQUFFLGFBQWE7UUFDbEIsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEtBQUssU0FBUyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoRSxZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDekIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztLQUN6RSxDQUFDO0lBRUYsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBRXJFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsdUJBQXVCLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDN0YsMEdBQTBHO0lBQzFHLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEYsTUFBTSxLQUFLLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxhQUFhLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMxRixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWiw0R0FBNEc7UUFDNUcsT0FBTztZQUNMLEdBQUcsSUFBSTtZQUNQLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ2pGLENBQUM7SUFDSixDQUFDO0lBQ0QsNkZBQTZGO0lBQzdGLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNoSCxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUM7UUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDMUYsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztRQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUU3RSx5RUFBeUU7SUFDekUsb0VBQW9FO0lBQ3BFLDBFQUEwRTtJQUMxRSx3RUFBd0U7SUFDeEUsdUVBQXVFO0lBQ3ZFLGlFQUFpRTtJQUNqRSxFQUFFO0lBQ0YscUVBQXFFO0lBQ3JFLDJFQUEyRTtJQUMzRSwwRUFBMEU7SUFDMUUseUVBQXlFO0lBQ3pFLDJFQUEyRTtJQUMzRSx1QkFBdUI7SUFDdkIsdUVBQXVFO0lBQ3ZFLCtFQUErRTtJQUMvRSxNQUFNLElBQUksR0FBRyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUU7UUFDbkUsR0FBRyxPQUFPO1FBQ1YsZUFBZSxFQUFFLE9BQU8sRUFBRSxlQUFlLElBQUksV0FBVztRQUN4RCxZQUFZLEVBQUUsT0FBTyxFQUFFLFlBQVksSUFBSSxDQUFDLGFBQWEsQ0FBQztLQUN2RCxDQUFFLENBQUM7SUFDSixPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDdkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogc2xpY2Uvc2xpY2VGb3JLZXkudHMg4oCUIHRoZSB2YXJpYWJsZS1maXJzdCBiYWNrd2FyZCBzbGljZSBxdWVyeS5cbiAqXG4gKiBcIldoeSBpcyBga2V5YCB3aGF0IGl0IGlzP1wiIOKAlCB0aGUgT05FIHF1ZXN0aW9uIGV2ZXJ5IHRyaWFnZSBzdXJmYWNlIGFza3M6XG4gKiBhIGh1bWFuIGNsaWNraW5nIGEga2V5IGluIGV4cGxhaW5hYmxlLXVpLCBhbiBMTE0gY2FsbGluZyBhIGBiYWNrdHJhY2tgXG4gKiB0b29sIG1pZC1jb252ZXJzYXRpb24sIGFuIG9mZmxpbmUgYXV0b3BzeSBhZ2VudCBvdmVyIGEgc3RvcmVkIHJ1bi5cbiAqXG4gKiBXSFkgdGhpcyBpcyBkZWxpYmVyYXRlbHkgYSBjb21wb3NpdGlvbiBhbmQgbm90IGEgbmV3IGFsZ29yaXRobTpcbiAqIGBmaW5kTGFzdFdyaXRlcmAgYWxyZWFkeSBhbnN3ZXJzIFwid2hvIG1hZGUgdGhlIHZhbHVlIHdoYXQgaXQgaXNcIiBhbmRcbiAqIGBjYXVzYWxDaGFpbmAgYWxyZWFkeSBhbnN3ZXJzIFwid2hhdCBpbmZsdWVuY2VkIHRoYXQgc3RlcFwiICh0aGluIGJhY2t3YXJkXG4gKiBzbGljaW5nLCBXZWlzZXIgMTk4NCkuIFdoYXQgd2FzIG1pc3NpbmcgaXMgdGhlIHNoYXJlZCBDT05UUkFDVCDigJQgd2l0aG91dFxuICogaXQsIGV2ZXJ5IHN1cmZhY2UgaGFuZC1yb2xscyB0aGUgYW5jaG9yIHN0ZXAgZGlmZmVyZW50bHkgYW5kIHRoZWlyIGFuc3dlcnNcbiAqIGRpc2FncmVlLiBUaGUgdmFsdWUgb2YgdGhpcyBmdW5jdGlvbiBpcyB0aGF0IHRoZXkgY2FuJ3QuXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBDYXVzYWxDaGFpbk9wdGlvbnMsIHR5cGUgS2V5c1JlYWRMb29rdXAsIGNhdXNhbENoYWluRnJvbUNvbW1pdCB9IGZyb20gJy4uL21lbW9yeS9iYWNrdHJhY2suanMnO1xuaW1wb3J0IHsgY29tbWl0VmFsdWVBdFdpdGhCYXNpcywgZmluZExhc3RXcml0ZXJXaXRoQmFzaXMgfSBmcm9tICcuLi9tZW1vcnkvY29tbWl0TG9nVXRpbHMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUgfSBmcm9tICcuLi9tZW1vcnkvdHlwZXMuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXNlUGF0aCB9IGZyb20gJy4uL21lbW9yeS91dGlscy5qcyc7XG5pbXBvcnQgeyBmcm9tSW5pdGlhbFN0YXRlTm90ZSwgbmVzdGVkUm93c05vdGUsIHJlZGFjdGVkVmFsdWVOb3RlIH0gZnJvbSAnLi9rZXlJbmRleC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlS2V5c1JlYWRTb3VyY2UgfSBmcm9tICcuL2tleXNSZWFkU291cmNlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEtleXNSZWFkU291cmNlLCBTdGF0ZUtleSwgVmFyaWFibGVTbGljZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIE5vcm1hbGlzZSBhIGNvbnN1bWVyLWZhY2luZyB7QGxpbmsgU3RhdGVLZXl9IHRvIHRoZSBlbmdpbmUncyBjYW5vbmljYWxcbiAqIHN0cmluZyBmb3JtICh0aGUgYFRyYWNlRW50cnkucGF0aGAgc3BhY2UpLiBQYXRoIGFycmF5cyBnbyB0aHJvdWdoIHRoZSBzYW1lXG4gKiBub3JtYWxpc2VyIHRoZSBlbmdpbmUgd3JpdGVzIHdpdGgg4oCUIHRoZSBkZWxpbWl0ZXIgbmV2ZXIgbGVha3MgaW50byB0aGVcbiAqIHB1YmxpYyBjb250cmFjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGlzZVN0YXRlS2V5KGtleTogU3RhdGVLZXkpOiBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgPyBrZXkgOiBub3JtYWxpc2VQYXRoKFsuLi5rZXldKTtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBzbGljZUZvcktleX0g4oCUIGNhdXNhbENoYWluJ3Mgb3B0aW9ucyBwbHVzIGFuY2hvcmluZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2xpY2VGb3JLZXlPcHRpb25zIGV4dGVuZHMgQ2F1c2FsQ2hhaW5PcHRpb25zIHtcbiAgLyoqXG4gICAqIEV4Y2x1c2l2ZSBjb21taXQtYXJyYXktaW5kZXggdXBwZXIgYm91bmQ6IHNsaWNlIHRoZSB2YWx1ZSBhcyBpdCBzdG9vZFxuICAgKiBCRUZPUkUgdGhpcyBpZHggKHRpbWUtdHJhdmVsIHRyaWFnZSDigJQgXCJ3aHkgd2FzIGl0IFggYXQgc3RlcCAxMj9cIikuXG4gICAqIFNhbWUgY29udHJhY3QgYXMgYGZpbmRMYXN0V3JpdGVyYCdzIGBiZWZvcmVJZHhgLiBPbWl0IGZvciB0aGUgY3VycmVudFxuICAgKiB2YWx1ZS4gQ2hhaW5lZC10cmlhZ2UgaWRpb206IHRvIHNsaWNlIGF0IGFuIHtAbGluayBFbGVtZW50QmlydGh9LCBwYXNzXG4gICAqIGBiZWZvcmU6IGJpcnRoLmNvbW1pdElkeCArIDFgIChiaXJ0aCBpZHggaXMgaW5jbHVzaXZlLCB0aGlzIGJvdW5kIGlzXG4gICAqIGV4Y2x1c2l2ZSDigJQgdGhlICsxIG1ha2VzIHRoZSBiaXJ0aCBjb21taXQgaXRzZWxmIHRoZSBhbmNob3IpLlxuICAgKi9cbiAgYmVmb3JlPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEJhY2t3YXJkIHNsaWNlIGZvciBvbmUgc3RhdGUga2V5OiBhbmNob3IgYXQgdGhlIGtleSdzIGxhc3Qgd3JpdGVyLCB0aGVuXG4gKiB3YWxrIHJlYWTihpJ3cml0ZSAoYW5kIG9wdGlvbmFsIGNvbnRyb2wpIGRlcGVuZGVuY2llcyB0cmFuc2l0aXZlbHkuXG4gKlxuICogSG9uZXN0LWFic2VuY2UgY29udHJhY3Q6IGEgbWlzc2luZyBzbGljZSBpcyBhIFJFU1VMVCwgbm90IGFuIGVycm9yIOKAlFxuICogYG1pc3Npbmc6ICduZXZlci13cml0dGVuJ2AgdGVsbHMgYSB0cmlhZ2UgdG9vbCAob3IgaXRzIExMTSBjYWxsZXIpIHRoYXRcbiAqIHRoZSB2YWx1ZSBjYW1lIGZyb20gaW5pdGlhbCBzdGF0ZSAvIGZyb3plbiBhcmdzIC8gYSBjbG9zdXJlLCB3aGljaCBpc1xuICogaXRzZWxmIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uIFNlZSB7QGxpbmsgVmFyaWFibGVTbGljZX0g4oCUIGluY2x1ZGluZyBpdHNcbiAqIFNFUklBTElaQVRJT04gV0FSTklORyBiZWZvcmUgeW91IHN0cmluZ2lmeSB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2xpY2VGb3JLZXkoXG4gIGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sXG4gIGtleTogU3RhdGVLZXksXG4gIGtleXNSZWFkOiBLZXlzUmVhZFNvdXJjZSB8IEtleXNSZWFkTG9va3VwLFxuICBvcHRpb25zPzogU2xpY2VGb3JLZXlPcHRpb25zLFxuKTogVmFyaWFibGVTbGljZSB7XG4gIGNvbnN0IHNvdXJjZSA9IHJlc29sdmVLZXlzUmVhZFNvdXJjZShrZXlzUmVhZCk7XG4gIGNvbnN0IG5vcm1hbGlzZWRLZXkgPSBub3JtYWxpc2VTdGF0ZUtleShrZXkpO1xuICBjb25zdCBiYXNlOiBQaWNrPFZhcmlhYmxlU2xpY2UsICdrZXknIHwgJ2JlZm9yZScgfCAna2V5c1JlYWRLaW5kJyB8ICdyZWFkc0NvdmVyYWdlJz4gPSB7XG4gICAga2V5OiBub3JtYWxpc2VkS2V5LFxuICAgIC4uLihvcHRpb25zPy5iZWZvcmUgIT09IHVuZGVmaW5lZCAmJiB7IGJlZm9yZTogb3B0aW9ucy5iZWZvcmUgfSksXG4gICAga2V5c1JlYWRLaW5kOiBzb3VyY2Uua2luZCxcbiAgICAuLi4oc291cmNlLmNvdmVyYWdlICE9PSB1bmRlZmluZWQgJiYgeyByZWFkc0NvdmVyYWdlOiBzb3VyY2UuY292ZXJhZ2UgfSksXG4gIH07XG5cbiAgaWYgKGNvbW1pdExvZy5sZW5ndGggPT09IDApIHJldHVybiB7IC4uLmJhc2UsIG1pc3Npbmc6ICdlbXB0eS1sb2cnIH07XG5cbiAgY29uc3QgeyB3cml0ZXIsIGJhc2lzIH0gPSBmaW5kTGFzdFdyaXRlcldpdGhCYXNpcyhjb21taXRMb2csIG5vcm1hbGlzZWRLZXksIG9wdGlvbnM/LmJlZm9yZSk7XG4gIC8vIEY0Yjogd2hhdCB0aGUgdmFsdWUgYXQgdGhlIHNsaWNlJ3MgcG9pbnQgcmVzdHMgb24sIGZyb20gdGhlIHZhbHVlIHR3aW4g4oCUIGEgcmVkYWN0aW9uLCB0aGUgcHJlLXJ1biBiYXNlLlxuICBjb25zdCBlbmQgPSBNYXRoLm1pbihvcHRpb25zPy5iZWZvcmUgPz8gY29tbWl0TG9nLmxlbmd0aCwgY29tbWl0TG9nLmxlbmd0aCkgLSAxO1xuICBjb25zdCB2YWx1ZSA9IGVuZCA+PSAwID8gY29tbWl0VmFsdWVBdFdpdGhCYXNpcyhjb21taXRMb2csIGVuZCwgbm9ybWFsaXNlZEtleSkuYmFzaXMgOiBbXTtcbiAgaWYgKCF3cml0ZXIpIHtcbiAgICAvLyAnbmV2ZXItd3JpdHRlbicgYWxyZWFkeSBzYXlzIHRoZSB2YWx1ZSBjYW1lIGZyb20gYmVmb3JlIHRoZSBydW47IGEgcmVkYWN0aW9uIHRoYXQgaGlkIHRoZSB3cml0ZSBkb2VzIG5vdC5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uYmFzZSxcbiAgICAgIG1pc3Npbmc6ICduZXZlci13cml0dGVuJyxcbiAgICAgIC4uLih2YWx1ZS5pbmNsdWRlcygncmVkYWN0ZWQnKSAmJiB7IG5vdGVzOiBbcmVkYWN0ZWRWYWx1ZU5vdGUobm9ybWFsaXNlZEtleSldIH0pLFxuICAgIH07XG4gIH1cbiAgLy8gQSB3cml0ZXIgdGhhdCByZWFjaGVkIHRoZSBrZXkgb25seSB0aHJvdWdoIHJvd3MgaW5zaWRlIGl0IG1hZGUgcGFydCBvZiB0aGUgdmFsdWUg4oCUIHNheSBzby5cbiAgY29uc3Qgbm90ZXMgPSBiYXNpcy5pbmNsdWRlcygnbmVzdGVkLXJvd3MnKSA/IFtuZXN0ZWRSb3dzTm90ZShub3JtYWxpc2VkS2V5LCBbY29tbWl0TG9nLmluZGV4T2Yod3JpdGVyKV0pXSA6IFtdO1xuICBpZiAodmFsdWUuaW5jbHVkZXMoJ2Zyb20taW5pdGlhbC1zdGF0ZScpKSBub3Rlcy5wdXNoKGZyb21Jbml0aWFsU3RhdGVOb3RlKG5vcm1hbGlzZWRLZXkpKTtcbiAgaWYgKHZhbHVlLmluY2x1ZGVzKCdyZWRhY3RlZCcpKSBub3Rlcy5wdXNoKHJlZGFjdGVkVmFsdWVOb3RlKG5vcm1hbGlzZWRLZXkpKTtcblxuICAvLyBJTlZBUklBTlQ6IGB3cml0ZXJgIGNhbWUgRlJPTSB0aGlzIGNvbW1pdExvZywgc28gaXRzIHJ1bnRpbWVTdGFnZUlkIGlzXG4gIC8vIGFsd2F5cyBwcmVzZW50IGluIGNhdXNhbENoYWluJ3MgaW5kZXgg4oCUIGNhdXNhbENoYWluIGNhbm5vdCByZXR1cm5cbiAgLy8gdW5kZWZpbmVkIGhlcmUgKGl0IG9ubHkgZG9lcyBmb3IgaWRzIGFic2VudCBmcm9tIHRoZSBsb2cpLiBUaGUgbm9uLW51bGxcbiAgLy8gYXNzZXJ0aW9uIGtlZXBzIHRoZSBWYXJpYWJsZVNsaWNlIGNvbnRyYWN0IGFpcnRpZ2h0OiBgbWlzc2luZ2AgaXMgdGhlXG4gIC8vIE9OTFkgYWJzZW50LXJvb3Qgc3RhdGUuIE9wdGlvbnMgcGFzcyBzdHJhaWdodCB0aHJvdWdoIChjb250cm9sRGVwcyAvXG4gIC8vIHdlaWdoIC8gbWF4RGVwdGggLyBtYXhOb2RlcyBrZWVwIHRoZWlyIGNhdXNhbENoYWluIHNlbWFudGljcykuXG4gIC8vXG4gIC8vIGVkZ2VBdHRyaWJ1dGlvbiBkZWZhdWx0cyB0byAncGVyLXdyaXRlJyBIRVJFICh1bmxpa2UgY2F1c2FsQ2hhaW4nc1xuICAvLyAnc3RhZ2UnIGRlZmF1bHQpOiBhIHZhcmlhYmxlLWZpcnN0IHNsaWNlIGtub3dzIGV4YWN0bHkgd2hpY2ggd3JpdHRlbiBrZXlcbiAgLy8gYW5jaG9ycyB0aGUgcXVlc3Rpb24sIGFuZCBwZXItd3JpdGUgYXR0cmlidXRpb24gaXMgc3RyaWN0bHktc2FmZSDigJQgbG9nc1xuICAvLyB3aXRob3V0IGBUcmFjZUVudHJ5LnJlYWRLZXlzYCAodGhlIHdyaXRlUHJvdmVuYW5jZSBkaWFsIG9mZikgZmFsbCBiYWNrXG4gIC8vIHRvIHN0YWdlLWxldmVsIGV4cGFuc2lvbiBwZXIgbm9kZSwgYnl0ZS1pZGVudGljYWxseS4gQ29uc3VtZXJzIGNhbiBmb3JjZVxuICAvLyAnc3RhZ2UnIHZpYSBvcHRpb25zLlxuICAvLyBQcmVzZXJ2ZSB0aGlzIGV4YWN0IHdyaXRlcidzIG1ldGFkYXRhL3JlYWQgcHJlZml4LCBldmVuIHdoZW4gaXQgaXMgYVxuICAvLyBjb250aW51YXRpb24uIENhdXNhbCBleHBhbnNpb24gc2VwYXJhdGVseSB1c2VzIHRoZSBleGVjdXRpb24ncyBmaXJzdCBjb21taXQuXG4gIGNvbnN0IHJvb3QgPSBjYXVzYWxDaGFpbkZyb21Db21taXQoY29tbWl0TG9nLCB3cml0ZXIsIHNvdXJjZS5sb29rdXAsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGVkZ2VBdHRyaWJ1dGlvbjogb3B0aW9ucz8uZWRnZUF0dHJpYnV0aW9uID8/ICdwZXItd3JpdGUnLFxuICAgIHJvb3RMaW5rS2V5czogb3B0aW9ucz8ucm9vdExpbmtLZXlzID8/IFtub3JtYWxpc2VkS2V5XSxcbiAgfSkhO1xuICByZXR1cm4geyAuLi5iYXNlLCB3cml0ZXIsIHJvb3QsIC4uLihub3Rlcy5sZW5ndGggPiAwICYmIHsgbm90ZXMgfSkgfTtcbn1cbiJdfQ==
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
* ```
|
|
59
59
|
*/
|
|
60
60
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
61
|
-
exports._REVERSE_INDEX_THRESHOLD = exports.formatCausalChain = exports.flattenCausalDAG = exports.causalChain = void 0;
|
|
61
|
+
exports._REVERSE_INDEX_THRESHOLD = exports.formatCausalChain = exports.flattenCausalDAG = exports.causalChainFromCommit = exports.causalChain = void 0;
|
|
62
62
|
const commitLogUtils_js_1 = require("./commitLogUtils.js");
|
|
63
63
|
const keyPaths_js_1 = require("./keyPaths.js");
|
|
64
64
|
const logModel_js_1 = require("./logModel.js");
|
|
@@ -151,6 +151,19 @@ function incompleteSourcesFragment(commit) {
|
|
|
151
151
|
* @returns Root CausalNode with .parents forming the DAG, or undefined if startId not found
|
|
152
152
|
*/
|
|
153
153
|
function causalChain(commitLog, startId, getKeysRead, options) {
|
|
154
|
+
return buildCausalChain(commitLog, startId, getKeysRead, options);
|
|
155
|
+
}
|
|
156
|
+
exports.causalChain = causalChain;
|
|
157
|
+
/**
|
|
158
|
+
* Internal slice composition: keep the actual bundle selected by the writer
|
|
159
|
+
* query (including a nonempty continuation). This is not a public entry point.
|
|
160
|
+
* The read position still belongs to the execution's first commit.
|
|
161
|
+
*/
|
|
162
|
+
function causalChainFromCommit(commitLog, writer, getKeysRead, options) {
|
|
163
|
+
return buildCausalChain(commitLog, writer.runtimeStageId, getKeysRead, options, writer);
|
|
164
|
+
}
|
|
165
|
+
exports.causalChainFromCommit = causalChainFromCommit;
|
|
166
|
+
function buildCausalChain(commitLog, startId, getKeysRead, options, selectedWriter) {
|
|
154
167
|
const maxDepth = options?.maxDepth ?? 20;
|
|
155
168
|
const maxNodes = options?.maxNodes ?? 100;
|
|
156
169
|
const controlDeps = options?.controlDeps;
|
|
@@ -161,16 +174,15 @@ function causalChain(commitLog, startId, getKeysRead, options) {
|
|
|
161
174
|
// never mistake a truncated slice for a complete one.
|
|
162
175
|
let truncatedByDepth = false;
|
|
163
176
|
let truncatedByNodes = false;
|
|
164
|
-
//
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
}
|
|
177
|
+
// A continuation may write more data, but it is not another execution of
|
|
178
|
+
// the stage's reads. Use the shared FIRST-commit rule for every read cutoff;
|
|
179
|
+
// keep writer bundles separately for their write metadata and read prefixes.
|
|
180
|
+
const idxMap = (0, commitLogUtils_js_1.buildCommitIndex)(commitLog);
|
|
169
181
|
keyPaths_js_1.queryWork.units += commitLog.length;
|
|
170
182
|
const startIdx = idxMap.get(startId);
|
|
171
183
|
if (startIdx === undefined)
|
|
172
184
|
return undefined;
|
|
173
|
-
const startCommit = commitLog[startIdx];
|
|
185
|
+
const startCommit = selectedWriter ?? commitLog[startIdx];
|
|
174
186
|
// Pick writer lookup strategy based on log size
|
|
175
187
|
const findWriter = createWriterLookup(commitLog);
|
|
176
188
|
// Node dedup map: runtimeStageId → CausalNode (ensures DAG, not tree)
|
|
@@ -374,7 +386,6 @@ function causalChain(commitLog, startId, getKeysRead, options) {
|
|
|
374
386
|
}
|
|
375
387
|
return root;
|
|
376
388
|
}
|
|
377
|
-
exports.causalChain = causalChain;
|
|
378
389
|
// ── Utilities ──────────────────────────────────────────────────────────
|
|
379
390
|
/**
|
|
380
391
|
* Flatten the causal DAG into a BFS-ordered list of nodes.
|
|
@@ -460,4 +471,4 @@ exports.formatCausalChain = formatCausalChain;
|
|
|
460
471
|
// ── Exported for testing (internal) ────────────────────────────────────
|
|
461
472
|
/** @internal Exposed for testing the strategy selection. */
|
|
462
473
|
exports._REVERSE_INDEX_THRESHOLD = REVERSE_INDEX_THRESHOLD;
|
|
463
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3RyYWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvYmFja3RyYWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeURHOzs7QUFFSCwyREFBcUQ7QUFFckQsK0NBQXNFO0FBQ3RFLCtDQUF5QztBQWdNekMsMEVBQTBFO0FBRTFFOzs7O0dBSUc7QUFDSCxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQVFwQyxrRUFBa0U7QUFDbEUsU0FBUyxnQkFBZ0IsQ0FBQyxTQUF5QjtJQUNqRCxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBQSxrQ0FBYyxFQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLFNBQXlCO0lBQ25ELE1BQU0sS0FBSyxHQUFHLElBQUEsc0JBQVEsRUFBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxPQUFPLENBQUMsR0FBVyxFQUFFLFNBQWlCLEVBQTRCLEVBQUU7UUFDbEUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRCxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzdDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxNQUFvQixFQUFFLE9BQWU7SUFDM0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJ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SUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQzthQUN4RyxNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2QsS0FBSyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsTUFBTSw0Q0FBNEMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQXJERCw4Q0FxREM7QUFFRCwwRUFBMEU7QUFFMUUsNERBQTREO0FBQy9DLFFBQUEsd0JBQXdCLEdBQUcsdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGJhY2t0cmFjay50cyDigJQgQmFja3dhcmQgY2F1c2FsIGNoYWluIGFuYWx5c2lzIG9uIHRoZSBjb21taXQgbG9nLlxuICpcbiAqIEltcGxlbWVudHMgKipiYWNrd2FyZCBwcm9ncmFtIHNsaWNpbmcqKiAoV2Vpc2VyIDE5ODQsIHRoaW4tc2xpY2UgdmFyaWFudCk6XG4gKiBnaXZlbiBhIHN0YXJ0aW5nIGV4ZWN1dGlvbiBzdGVwLCB3YWxrIGJhY2t3YXJkcyB0aHJvdWdoIHJlYWTihpJ3cml0ZVxuICogZGVwZW5kZW5jaWVzIHRvIGJ1aWxkIHRoZSBjYXVzYWwgREFHIHRoYXQgcHJvZHVjZWQgdGhlIGRhdGEgYXQgdGhhdCBzdGVwLlxuICpcbiAqICMjIEFsZ29yaXRobVxuICpcbiAqIEJGUyBvbiB0aGUgaW1wbGljaXQgZGVwZW5kZW5jeSBncmFwaCB3aGVyZSBlZGdlcyBydW4gZnJvbSByZWFkZXIg4oaSIHdyaXRlci5cbiAqXG4gKiAxLiBMb2NhdGUgc3RhcnRJZCBpbiBjb21taXRMb2cg4oaSIHJvb3Qgbm9kZVxuICogMi4gR2V0IGtleXNSZWFkIGZvciByb290IHZpYSBgZ2V0S2V5c1JlYWRgIGNhbGxiYWNrXG4gKiAzLiBGb3IgZWFjaCBrZXkgcmVhZCwgZmluZCB3aG8gbGFzdCB3cm90ZSBpdCBiZWZvcmUgdGhpcyBzdGVwIOKGkiBwYXJlbnQgY29tbWl0XG4gKiAgICAoXCJ3cm90ZVwiIGlzIHRoZSB3cml0ZXIgcnVsZSBvZiBga2V5UGF0aHMudHNgLCA5LjMzLjA6IGEgcm93IG9uIHRoZSBrZXksIGluc2lkZSBpdCwgb3JcbiAqICAgIGFyb3VuZCBpdCB0aGF0IGNoYW5nZWQgaXQg4oCUIHNvIGEgc3RhZ2UgdGhhdCByZWFkIGBjZmdgIGxpbmtzIHRvIHRoZSBzdWJmbG93IHNlZWQgb3JcbiAqICAgIG1lcmdlLWJhY2sgdGhhdCB3cm90ZSBgY2Zn4pCfYmApXG4gKiA0LiBDcmVhdGUgcGFyZW50IENhdXNhbE5vZGUsIGxpbmsgdG8gcm9vdC5wYXJlbnRzXG4gKiA1LiBFbnF1ZXVlIHBhcmVudC4gUmVwZWF0IHVudGlsIHF1ZXVlIGVtcHR5IG9yIGxpbWl0cyBoaXQuXG4gKlxuICogT3V0cHV0IGlzIGEgKipEQUcqKiAobm90IGEgbGlua2VkIGxpc3QpOiBhIHN0YWdlIHJlYWRpbmcgYGNyZWRpdFNjb3JlYCBBTkQgYGR0aWBcbiAqIGZyb20gZGlmZmVyZW50IHdyaXRlcnMgaGFzIHR3byBwYXJlbnRzLlxuICpcbiAqICMjIFN0YWdlZCBPcHRpbWl6YXRpb25cbiAqXG4gKiBUd28gd3JpdGVyLWxvb2t1cCBzdHJhdGVnaWVzLCBjaG9zZW4gYXV0b21hdGljYWxseSBieSBjb21taXQgbG9nIHNpemU6XG4gKlxuICogfCBTdHJhdGVneSB8IFdoZW4gfCBDb21wbGV4aXR5IHBlciBsb29rdXAgfFxuICogfC0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IExpbmVhciBzY2FuIHwgTiDiiaQgMjU2IHwgTyhOKSDigJQgc2ltcGxlIGJhY2t3YXJkIHNjYW4gfFxuICogfCBSZXZlcnNlIGluZGV4IHwgTiA+IDI1NiB8IE8oSyBsb2cgTikg4oCUIHByZWJ1aWx0IGtleeKGkltpbmRpY2VzXSwgYmluYXJ5IHNlYXJjaCB8XG4gKlxuICogVGhlIHRocmVzaG9sZCAoMjU2KSBpcyBjaG9zZW4gc28gdGhlIE8oTikgYnVpbGQgY29zdCBvZiB0aGUgcmV2ZXJzZSBpbmRleFxuICogaXMgYW1vcnRpemVkIG92ZXIgdGhlIEJGUyB0cmF2ZXJzYWwuIEJlbG93IDI1NiwgbGluZWFyIHNjYW4gd2lucyBiZWNhdXNlXG4gKiB0aGVyZSdzIG5vIGluZGV4IGJ1aWxkIG92ZXJoZWFkLiBUaGUgY29uc3VtZXIgbmV2ZXIgc2VlcyB0aGlzIOKAlCBgY2F1c2FsQ2hhaW4oKWBcbiAqIHBpY2tzIHRoZSByaWdodCBzdHJhdGVneSBpbnRlcm5hbGx5IChsaWtlIGEgcXVlcnkgb3B0aW1pemVyIGNob29zaW5nIGJldHdlZW5cbiAqIHNlcXVlbnRpYWwgc2NhbiB2cyBpbmRleCBzY2FuIGJhc2VkIG9uIHRhYmxlIHNpemUpLlxuICpcbiAqICMjIENvbXBsZXhpdHlcbiAqXG4gKiAtICoqU21hbGwgbG9ncyAoTiDiiaQgMjU2KToqKiBPKFYgw5cgSyDDlyBOKSB0b3RhbC4gVj12aXNpdGVkLCBLPWF2ZyBrZXlzL25vZGUuXG4gKiAtICoqTGFyZ2UgbG9ncyAoTiA+IDI1Nik6KiogTyhOIMOXIFUpIGluZGV4IGJ1aWxkICsgTyhWIMOXIEsgw5cgbG9nIE4pIGxvb2t1cHMuXG4gKiAgIFUgPSB1bmlxdWUga2V5cy4gQW1vcnRpemVkIG92ZXIgYWxsIEJGUyBob3BzLlxuICpcbiAqICMjIFJlZmVyZW5jZXNcbiAqXG4gKiAtIFdlaXNlciwgTS4gKDE5ODQpLiBcIlByb2dyYW0gU2xpY2luZy5cIiBJRUVFIFRTRS5cbiAqIC0gU3JpZGhhcmFuLCBNLiBldCBhbC4gKDIwMDcpLiBcIlRoaW4gU2xpY2luZy5cIiBQTERJLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBjYXVzYWxDaGFpbiwgZmxhdHRlbkNhdXNhbERBRywgZm9ybWF0Q2F1c2FsQ2hhaW4gfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogY29uc3QgZGFnID0gY2F1c2FsQ2hhaW4oY29tbWl0TG9nLCAnZGVjaWRlIzInLCAoaWQpID0+IHJlY29yZGVyLmdldEtleXNSZWFkKGlkKSk7XG4gKiBjb25zdCBmbGF0ID0gZmxhdHRlbkNhdXNhbERBRyhkYWcpOyAgICAgLy8gQkZTLW9yZGVyZWQgZmxhdCBsaXN0XG4gKiBjb25zb2xlLmxvZyhmb3JtYXRDYXVzYWxDaGFpbihkYWcpKTsgICAgIC8vIGh1bWFuLXJlYWRhYmxlXG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBmaW5kTGFzdFdyaXRlciB9IGZyb20gJy4vY29tbWl0TG9nVXRpbHMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWdpc3RlcmVkQ29kZSB9IGZyb20gJy4vaG9uZXN0eS5qcyc7XG5pbXBvcnQgeyBxdWVyeVdvcmssIHJlbGF0aW9uLCB3cml0ZXNPbmx5SW5zaWRlIH0gZnJvbSAnLi9rZXlQYXRocy5qcyc7XG5pbXBvcnQgeyBsb2dNb2RlbCB9IGZyb20gJy4vbG9nTW9kZWwuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUsIFRyYWNlRW50cnksIFVudHJhY2tlZFNvdXJjZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyDilIDilIAgVHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBBIHNpbmdsZSBub2RlIGluIHRoZSBjYXVzYWwgREFHLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXVzYWxOb2RlIHtcbiAgLyoqIFVuaXF1ZSBleGVjdXRpb24gc3RlcCBpZGVudGlmaWVyLiAqL1xuICBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICAvKiogU3RhYmxlIHN0YWdlIGlkZW50aWZpZXIuICovXG4gIHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHN0YWdlIG5hbWUuICovXG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICAvKiogS2V5cyB0aGlzIHN0YWdlIHdyb3RlIChmcm9tIGl0cyBDb21taXRCdW5kbGUudHJhY2UpLiAqL1xuICBrZXlzV3JpdHRlbjogc3RyaW5nW107XG4gIC8qKiBUaGUga2V5IHdob3NlIHJlYWTihpJ3cml0ZSBkZXBlbmRlbmN5IGxpbmtlZCB0aGlzIG5vZGUgdG8gaXRzIGNoaWxkLiBFbXB0eSBmb3IgdGhlIHJvb3QuICovXG4gIGxpbmtlZEJ5OiBzdHJpbmc7XG4gIC8qKiBCRlMgZGVwdGggZnJvbSB0aGUgc3RhcnRpbmcgbm9kZSAoMCA9IHN0YXJ0KS4gKi9cbiAgZGVwdGg6IG51bWJlcjtcbiAgLyoqXG4gICAqIFBhcmVudCBub2RlcyDigJQgc3RhZ2VzIHRoaXMgbm9kZSBkZXBlbmRzIG9uLiBEQUc6IG11bHRpcGxlIHBhcmVudHNcbiAgICogcG9zc2libGUuIEtFUFQgZm9yIGNvbXBhdGliaWxpdHk7IHdpdGggdGhlIGBjb250cm9sRGVwc2Agb3B0aW9uXG4gICAqIChSRkMtMDAzIEQzKSBnb3Zlcm5pbmcgZGVjaWRlcnMgYXBwZWFyIGhlcmUgdG9vLiBGb3IgdHlwZWQva2V5ZWQvXG4gICAqIHdlaWdodGVkIGRldGFpbCB1c2Uge0BsaW5rIHBhcmVudEVkZ2VzfS5cbiAgICovXG4gIHBhcmVudHM6IENhdXNhbE5vZGVbXTtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDMg4oCUIG9uZSBlZGdlIHBlciBkZXBlbmRlbmN5IExJTksgKG5vdCBwZXIgcGFyZW50KTogYSBub2RlXG4gICAqIHJlYWRpbmcgdHdvIGtleXMgZnJvbSB0aGUgc2FtZSB3cml0ZXIgaGFzIE9ORSBlbnRyeSBpbiB7QGxpbmsgcGFyZW50c31cbiAgICogYnV0IFRXTyBgJ2RhdGEnYCBlZGdlcyBoZXJlLiBDb250cm9sIGRlcGVuZGVuY2llcyAodmlhIHRoZVxuICAgKiBgY29udHJvbERlcHNgIG9wdGlvbikgYWRkIGEgYCdjb250cm9sJ2AgZWRnZSB0byB0aGUgZ292ZXJuaW5nIGRlY2lkZXIuXG4gICAqL1xuICBwYXJlbnRFZGdlczogQ2F1c2FsRWRnZVtdO1xuICAvKipcbiAgICogUkZDLTAwMyBEMiBob25lc3R5IG1hcmtlciDigJQgc3RhbXBlZCBmcm9tIHRoZSBzdGFnZSdzXG4gICAqIGBDb21taXRCdW5kbGUudW50cmFja2VkU291cmNlc2AuIFByZXNlbnQgd2hlbiB0aGlzIHN0YWdlIEFMU08gY29uc3VtZWRcbiAgICogdW50cmFja2VkIHJlYWQgcGF0aHMgKGBhcmdzYCAvIGBlbnZgIC8gdW5zaGFkb3dlZCBgc2lsZW50YCByZWFkcyk6IHRoZVxuICAgKiBiYWNrd2FyZCBzbGljZSB0aHJvdWdoIHRoaXMgbm9kZSBtYXkgYmUgaW5jb21wbGV0ZSwgYmVjYXVzZSB0aG9zZSByZWFkc1xuICAgKiBwcm9kdWNlIG5vIHJlYWTihpJ3cml0ZSBlZGdlIHRvIGZvbGxvdy4gYGZvcm1hdENhdXNhbENoYWluYCByZW5kZXJzIHRoaXNcbiAgICogYXMgYSBg4pqgIOKApiBzbGljZSBtYXkgYmUgaW5jb21wbGV0ZSBoZXJlYCBsaW5lLiBBYnNlbnQgd2hlbiB0aGUgc3RhZ2Unc1xuICAgKiByZWFkcyB3ZXJlIGZ1bGx5IHRyYWNrZWQuXG4gICAqXG4gICAqIFJlZ2lzdHJ5IGNvZGU6IGAnaW5jb21wbGV0ZS1zb3VyY2VzJ2AgKGBtZW1vcnkvaG9uZXN0eS50cyDCt1xuICAgKiBIT05FU1RZX0NPREVTYCwgc2VydmVkIG9uIGBmb290cHJpbnRqcy90cmFjZWApIHNheXMgd2hhdCB0aGlzIGZpZWxkXG4gICAqIG1lYW5zLiBUaGUgZmllbGQgY2FycmllcyBubyBgY29kZWAg4oCUIGl0cyB2YWx1ZXMgYXJlIHRoZVxuICAgKiB7QGxpbmsgVW50cmFja2VkU291cmNlfXMuXG4gICAqL1xuICBpbmNvbXBsZXRlU291cmNlcz86IFJlYWRvbmx5QXJyYXk8VW50cmFja2VkU291cmNlPjtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDQgdHJ1bmNhdGlvbiB2aXNpYmlsaXR5IOKAlCBzZXQgb24gdGhlIFJPT1Qgbm9kZSBvbmx5LCBhbmQgb25seVxuICAgKiB3aGVuIGEgbGltaXQgYWN0dWFsbHkgY3V0IHRoZSBzbGljZTogYGJ5RGVwdGhgIHdoZW4gYSBub2RlIGF0IHRoZVxuICAgKiBgbWF4RGVwdGhgIGhvcml6b24gc3RpbGwgaGFkIGVkZ2VzIHRvIGV4cGFuZCwgYGJ5Tm9kZXNgIHdoZW4gdGhlXG4gICAqIGBtYXhOb2Rlc2AgYnVkZ2V0IGJsb2NrZWQgY3JlYXRpbmcgYSBkaXNjb3ZlcmVkIHBhcmVudC4gQWJzZW50IHdoZW4gdGhlXG4gICAqIHNsaWNlIGlzIGNvbXBsZXRlLiBgZm9ybWF0Q2F1c2FsQ2hhaW5gIGFwcGVuZHMgYSBg4pqgIHNsaWNlIHRydW5jYXRlZCDigKZgXG4gICAqIGxpbmUg4oCUIGEgY29uc3VtZXIgbXVzdCBuZXZlciBtaXN0YWtlIGEgdHJ1bmNhdGVkIHNsaWNlIGZvciBhIGZ1bGwgb25lLlxuICAgKiAoVW50aWwgOS40OC4wIGRldiBtb2RlIGFsc28gd2FybmVkIG9uIHRoZSBjb25zb2xlOyB0aGUgZmllbGQgaXMgdGhlXG4gICAqIHNpZ25hbCwgcmVhZCBpdC4pXG4gICAqXG4gICAqIFJlZ2lzdHJ5IGNvZGU6IGAndHJ1bmNhdGVkJ2AgKGBtZW1vcnkvaG9uZXN0eS50cyDCtyBIT05FU1RZX0NPREVTYCwgc2VydmVkXG4gICAqIG9uIGBmb290cHJpbnRqcy90cmFjZWApIHNheXMgd2hhdCB0aGlzIGZpZWxkIG1lYW5zOyB0aGUgZmllbGQgY2FycmllcyBub1xuICAgKiBgY29kZWAuXG4gICAqL1xuICB0cnVuY2F0ZWQ/OiB7IGJ5RGVwdGg6IGJvb2xlYW47IGJ5Tm9kZXM6IGJvb2xlYW4gfTtcbiAgLyoqXG4gICAqIEY0YiAoOS4zMy4wKSDigJQgdGhlIGtleXMgdGhpcyBub2RlIHJlYWQgdGhhdCBOTyBjb21taXQgYmVmb3JlIGl0IHdyb3RlICh1bmRlciB0aGUgd3JpdGVyIHJ1bGUpLCBzbyB0aGVcbiAgICogd2FsayBoYXMgbm8gZWRnZSB0byBmb2xsb3cgZm9yIHRoZW06IHRoZWlyIHZhbHVlIGNhbWUgZnJvbSB0aGUgaW5pdGlhbCBzdGF0ZSwgZnJvemVuIHJ1biBpbnB1dCBvciBhXG4gICAqIGNsb3N1cmUg4oCUIG91dHNpZGUgdGhlIGNvbW1pdCBsb2cuIFRoZSBjb2RlIHNheXMgc28gKGAncHJlLXJ1bi1vcmlnaW4nYCwgcmVnaXN0ZXJlZCBpblxuICAgKiBgbWVtb3J5L2hvbmVzdHkudHMgwrcgSE9ORVNUWV9DT0RFU2ApOyBga2V5c2AgYXJlIGluIHRoZSBvcmRlciB0aGUgd2FsayBtZXQgdGhlbS4gQUJTRU5UIHdoZW4gZXZlcnkga2V5XG4gICAqIHRoZSBub2RlIGV4cGFuZGVkIGhhZCBhIHdyaXRlciwgc28gc3VjaCBhIG5vZGUga2VlcHMgaXRzIDkuMzIuMCBzaGFwZS4gQmVmb3JlIDkuMzMuMCB0aGVzZSByZWFkcyB3ZXJlXG4gICAqIGRyb3BwZWQgd2l0aG91dCBhIHdvcmQuXG4gICAqL1xuICBwcmVSdW5SZWFkcz86IHsgY29kZTogUmVnaXN0ZXJlZENvZGU8J3ByZS1ydW4tb3JpZ2luJz47IGtleXM6IHN0cmluZ1tdIH07XG59XG5cbi8qKlxuICogUkZDLTAwMyBEMyDigJQgYSB0eXBlZCBkZXBlbmRlbmN5IGVkZ2UgZnJvbSBhIGNoaWxkIG5vZGUgdG8gb25lIHBhcmVudC5cbiAqXG4gKiAtIGBraW5kOiAnZGF0YSdgICAgIOKAlCByZWFk4oaSd3JpdGUgZGVwZW5kZW5jeTsgYGtleWAgaXMgdGhlIHN0YXRlIGtleS5cbiAqIC0gYGtpbmQ6ICdjb250cm9sJ2Ag4oCUIHRoZSBwYXJlbnQgaXMgdGhlIGRlY2lkZXIvc2VsZWN0b3Igd2hvc2UgZGVjaXNpb25cbiAqICAgYWxsb3dlZCB0aGUgY2hpbGQgdG8gcnVuOyBga2V5YCBpcyB0aGUgZGVjaWRlKCkgcnVsZSBsYWJlbCB3aGVuIHByZXNlbnQuXG4gKlxuICogYHdlaWdodGAgZGVmYXVsdHMgdG8gMS4wOyB0aGUgYHdlaWdoYCBob29rIChSRkMtMDAzIEQ0KSBjYW4gb3ZlcnJpZGUgaXQuXG4gKiBUaGUgZW5naW5lIGl0c2VsZiBORVZFUiBjb21wdXRlcyB3ZWlnaHRzIOKAlCBzZW1hbnRpY3MgYmVsb25nIHRvIHRoZVxuICogY29uc3VtZXItaW5qZWN0ZWQgd2VpZ2hlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXVzYWxFZGdlIHtcbiAgcGFyZW50OiBDYXVzYWxOb2RlO1xuICBraW5kOiAnZGF0YScgfCAnY29udHJvbCc7XG4gIGtleT86IHN0cmluZztcbiAgd2VpZ2h0OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGNGIgKDkuMzMuMCkg4oCUIHByZXNlbnQgb25seSBvbiBhIGAnZGF0YSdgIGVkZ2Ugd2hvc2UgcGFyZW50IHdyb3RlIGBrZXlgIE9OTFkgdGhyb3VnaCByb3dzIGluc2lkZSBpdFxuICAgKiAoYSBzdWJmbG93J3MgaW5wdXQgc2VlZCwgYW4gb3V0cHV0TWFwcGVyIG1lcmdlLWJhY2ssIGEgZm9yayBjaGlsZCdzIG5hbWVzcGFjZSk6IHRoYXQgd3JpdGUgbWFkZSBwYXJ0XG4gICAqIG9mIHRoZSB2YWx1ZSwgYW5kIGVhcmxpZXIgd3JpdGVycyBtYXkgYWNjb3VudCBmb3IgdGhlIHJlc3QuIFJlZ2lzdGVyZWQgYXMgYCduZXN0ZWQtcm93cydgIGluXG4gICAqIGBtZW1vcnkvaG9uZXN0eS50cyDCtyBIT05FU1RZX0NPREVTYC4gQWJzZW50IGZvciBhIHdyaXRlIG9uIG9yIGFyb3VuZCB0aGUga2V5LCBzbyBhbiBleGFjdCBlZGdlIGtlZXBzXG4gICAqIGl0cyA5LjMyLjAgc2hhcGUuXG4gICAqL1xuICBiYXNpcz86IFJlZ2lzdGVyZWRDb2RlPCduZXN0ZWQtcm93cyc+O1xufVxuXG4vKipcbiAqIFJGQy0wMDMgRDMg4oCUIGEgY29udHJvbCBkZXBlbmRlbmN5IHJlc29sdmVkIGZvciBvbmUgZXhlY3V0aW9uIHN0ZXA6XG4gKiB3aGljaCBkZWNpZGVyL3NlbGVjdG9yIGV4ZWN1dGlvbiBhbGxvd2VkIHRoaXMgc3RhZ2UgdG8gcnVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyb2xEZXBlbmRlbmN5IHtcbiAgLyoqIHJ1bnRpbWVTdGFnZUlkIG9mIHRoZSBnb3Zlcm5pbmcgZGVjaWRlci9zZWxlY3RvciBleGVjdXRpb24gc3RlcC4gKi9cbiAgZGVjaWRlcklkOiBzdHJpbmc7XG4gIC8qKiBUaGUgZGVjaWRlKCkgcnVsZSBsYWJlbCBmb3IgdGhlIGNob3NlbiBicmFuY2gsIHdoZW4gcHJlc2VudC4gKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUkZDLTAwMyBEMyDigJQgY2FsbGJhY2sgcmVzb2x2aW5nIHRoZSBnb3Zlcm5pbmcgZGVjaWRlciBmb3IgYW4gZXhlY3V0aW9uXG4gKiBzdGVwLiBSZXR1cm4gYHVuZGVmaW5lZGAgd2hlbiB0aGUgc3RlcCBpcyBub3QgY29udHJvbC1kZXBlbmRlbnQgb24gYW55XG4gKiByZWNvcmRlZCBkZWNpc2lvbi4gQnVpbGQgb25lIHdpdGggYGNvbnRyb2xEZXBSZWNvcmRlcigpYCBmcm9tXG4gKiBgZm9vdHByaW50anMvdHJhY2VgLCBvciBzdXBwbHkgeW91ciBvd24uXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRyb2xEZXBMb29rdXAgPSAocnVudGltZVN0YWdlSWQ6IHN0cmluZykgPT4gQ29udHJvbERlcGVuZGVuY3kgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUkZDLTAwMyBENCDigJQgY29uc3VtZXItaW5qZWN0ZWQgZWRnZSB3ZWlnaGVyLiBDYWxsZWQgb25jZSBwZXIgY3JlYXRlZFxuICogZWRnZTsgcmV0dXJuIGEgd2VpZ2h0LCBvciBgdW5kZWZpbmVkYCB0byBrZWVwIHRoZSBkZWZhdWx0IDEuMC4gVGhlXG4gKiBFTkdJTkUgbmV2ZXIgY29tcHV0ZXMgd2VpZ2h0cyAoemVybyBuZXcgZGVwZW5kZW5jaWVzIOKAlCBzZW1hbnRpY3MgbGlrZVxuICogZW1iZWRkaW5nIHNpbWlsYXJpdHkgb3IgRkRMIGluZmx1ZW5jZSBiZWxvbmcgdG8gZG93bnN0cmVhbSBsaWJyYXJpZXMsXG4gKiB0aGUgc2FtZSBwbHVnLWluIHBhdHRlcm4gYXMgYE5hcnJhdGl2ZUZvcm1hdHRlcmApLiBXZWlnaHRzIHJlbmRlciBpblxuICogYGZvcm1hdENhdXNhbENoYWluYCBhcyBg4oaQIHZpYSBzeXN0ZW1Qcm9tcHQgKDAuMTgpYC5cbiAqL1xuZXhwb3J0IHR5cGUgRWRnZVdlaWdoZXIgPSAoXG4gIGNoaWxkOiBDYXVzYWxOb2RlLFxuICBwYXJlbnQ6IENhdXNhbE5vZGUsXG4gIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBraW5kOiAnZGF0YScgfCAnY29udHJvbCcsXG4pID0+IG51bWJlciB8IHVuZGVmaW5lZDtcblxuLyoqIE9wdGlvbnMgZm9yIGNhdXNhbENoYWluKCkuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdXNhbENoYWluT3B0aW9ucyB7XG4gIC8qKiBNYXhpbXVtIEJGUyBkZXB0aCAoZGVmYXVsdDogMjApLiBQcmV2ZW50cyBydW5hd2F5IHRyYXZlcnNhbC4gKi9cbiAgbWF4RGVwdGg/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHRvdGFsIG5vZGVzIHRvIHZpc2l0IChkZWZhdWx0OiAxMDApLiBIYXJkIGNhcCBmb3Igc2FmZXR5LiAqL1xuICBtYXhOb2Rlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDMg4oCUIGNvbnRyb2wtZGVwZW5kZW5jZSBsb29rdXAuIFdoZW4gcHJvdmlkZWQsIGV4cGFuZGluZyBhIG5vZGVcbiAgICogQUxTTyBsaW5rcyBhIGAnY29udHJvbCdgIGVkZ2UgdG8gaXRzIGdvdmVybmluZyBkZWNpZGVyIChsYWJlbGVkIGJ5IHRoZVxuICAgKiBkZWNpZGUoKSBydWxlIGxhYmVsIHdoZW4gcHJlc2VudCk7IHRoZSBkZWNpZGVyIG5vZGUgdGhlbiBleHBhbmRzXG4gICAqIG5vcm1hbGx5IHRocm91Z2ggaXRzIG93biBkYXRhIHJlYWRzLCBzbyBjaGFpbnMgbGlrZVxuICAgKiBgc3RhdHVzIOKGkCBbY29udHJvbF0gQ2xhc3NpZnlSaXNrIOKGkCBbZGF0YTogY3JlZGl0U2NvcmVdIFB1bGxCdXJlYXVgXG4gICAqIHJlc29sdmUgZW5kLXRvLWVuZC4gV2l0aG91dCB0aGlzIG9wdGlvbiBiZWhhdmlvciBpcyB1bmNoYW5nZWQuXG4gICAqL1xuICBjb250cm9sRGVwcz86IENvbnRyb2xEZXBMb29rdXA7XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQ0IOKAlCBlZGdlIHdlaWdoZXIuIFN0YW1wcyBgQ2F1c2FsRWRnZS53ZWlnaHRgIGF0IGVkZ2UgY3JlYXRpb247XG4gICAqIGB1bmRlZmluZWRgIChvciBubyB3ZWlnaGVyKSDihpIgMS4wLiBTZWUge0BsaW5rIEVkZ2VXZWlnaGVyfS5cbiAgICovXG4gIHdlaWdoPzogRWRnZVdlaWdoZXI7XG4gIC8qKlxuICAgKiAjUDEg4oCUIGhvdyBhIG5vZGUncyBleHBhbnNpb24gcmVhZC1zZXQgaXMgZGVyaXZlZDpcbiAgICpcbiAgICogLSBgJ3N0YWdlJ2AgKGRlZmF1bHQsIGhpc3RvcmljYWwpIOKAlCBldmVyeSB2aXNpdGVkIG5vZGUgZXhwYW5kcyB0aHJvdWdoXG4gICAqICAgQUxMIG9mIGl0cyBzdGFnZSdzIHJlYWRzIChgZ2V0S2V5c1JlYWRgKS4gQSBzdGFnZSByZWFkaW5nIGBhLGJgIGFuZFxuICAgKiAgIHdyaXRpbmcgYHgseWAgbGlua3MgYm90aCByZWFkcyBhcyBjYXVzZXMgb2YgYm90aCB3cml0ZXMg4oCUIGEgc291bmQgYnV0XG4gICAqICAgY29hcnNlIG92ZXItYXBwcm94aW1hdGlvbi5cbiAgICogLSBgJ3Blci13cml0ZSdgIOKAlCB3aGVuIHRoZSBjb21taXQgbG9nIGNhcnJpZXMgcGVyLXdyaXRlIHJlYWQgcHJvdmVuYW5jZVxuICAgKiAgIChgVHJhY2VFbnRyeS5yZWFkS2V5c2AsIHJlY29yZGVkIHVuZGVyIHRoZSBleGVjdXRvcidzXG4gICAqICAgYHdyaXRlUHJvdmVuYW5jZTogJ3JlYWRzLXByZWZpeCdgIGRpYWwpLCBhIG5vZGUgcmVhY2hlZCB2aWEga2V5IGBrYFxuICAgKiAgIGV4cGFuZHMgdGhyb3VnaCBPTkxZIHRoZSByZWFkcyB0aGF0IHByZWNlZGVkIGl0cyB3cml0ZSBvZiBga2BcbiAgICogICAodGVtcG9yYWwgcHJlZml4KS4gTm9kZXMgbGlua2VkIGxhdGVyIHZpYSBhZGRpdGlvbmFsIGtleXMgYXJlXG4gICAqICAgaW5jcmVtZW50YWxseSByZS1leHBhbmRlZCB3aXRoIGp1c3QgdGhlIG5ldyByZWFkcyAod29ya2xpc3Qg4oCUIHRoZVxuICAgKiAgIHNsaWNlIG9ubHkgZXZlciBHUk9XUyB0b3dhcmQgdGhlIHN0YWdlLWxldmVsIGNlaWxpbmcpLiBIT05FU1RcbiAgICogICBGQUxMQkFDSzogYW55IGxpbmsgd2hvc2UgdHJhY2UgZW50cnkgbGFja3MgYHJlYWRLZXlzYCBleHBhbmRzIHRoYXRcbiAgICogICBub2RlIGF0IHN0YWdlIGxldmVsIOKAlCBtaXhlZCBvciBkaWFsLW9mZiBsb2dzIGRlZ3JhZGUgdG8gYCdzdGFnZSdgXG4gICAqICAgYmVoYXZpb3IgZXhhY3RseSwgbmV2ZXIgdG8gc2lsZW5jZS5cbiAgICovXG4gIGVkZ2VBdHRyaWJ1dGlvbj86ICdzdGFnZScgfCAncGVyLXdyaXRlJztcbiAgLyoqXG4gICAqICNQMSDigJQgdGhlIHdyaXR0ZW4ga2V5cyB0aGF0IGFuY2hvciB0aGUgUk9PVCdzIGV4cGFuc2lvbiB1bmRlclxuICAgKiBgJ3Blci13cml0ZSdgIChlLmcuIGBzbGljZUZvcktleWAgcGFzc2VzIHRoZSBzbGljZWQga2V5LCBzbyB0aGUgcm9vdFxuICAgKiBleHBhbmRzIHRocm91Z2ggdGhlIHJlYWRzIHRoYXQgZmVkIFRIQVQgd3JpdGUsIG5vdCB0aGUgd2hvbGUgc3RhZ2UpLlxuICAgKiBJZ25vcmVkIHVuZGVyIGAnc3RhZ2UnYC4gVW5zZXQg4oaSIHJvb3QgZXhwYW5kcyBhdCBzdGFnZSBsZXZlbC5cbiAgICovXG4gIHJvb3RMaW5rS2V5cz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENhbGxiYWNrIHRoYXQgcmV0dXJucyB0aGUga2V5cyBhIHN0YWdlIHJlYWQgZHVyaW5nIGV4ZWN1dGlvbi5cbiAqIFRoZSBiYWNrdHJhY2tlciBjYWxscyB0aGlzIGZvciBlYWNoIHZpc2l0ZWQgbm9kZSB0byBkZXRlcm1pbmVcbiAqIHdoaWNoIHJlYWTihpJ3cml0ZSBlZGdlcyB0byBmb2xsb3cuXG4gKlxuICogSW1wbGVtZW50b3JzOiBRdWFsaXR5UmVjb3JkZXIgdHJhY2tzIGtleXNSZWFkIHBlciBzdGVwLFxuICogb3IgYnVpbGQgYSBNYXA8cnVudGltZVN0YWdlSWQsIHN0cmluZ1tdPiBmcm9tIFNjb3BlUmVjb3JkZXIub25SZWFkIGV2ZW50cy5cbiAqL1xuZXhwb3J0IHR5cGUgS2V5c1JlYWRMb29rdXAgPSAocnVudGltZVN0YWdlSWQ6IHN0cmluZykgPT4gc3RyaW5nW107XG5cbi8vIOKUgOKUgCBTdGFnZWQgb3B0aW1pemF0aW9uOiB3cml0ZXIgbG9va3VwIHN0cmF0ZWdpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogVGhyZXNob2xkIGZvciBzd2l0Y2hpbmcgZnJvbSBsaW5lYXIgc2NhbiB0byByZXZlcnNlIGluZGV4LlxuICogQmVsb3cgdGhpcywgTyhOKSBzY2FuIGlzIGZhc3RlciAobm8gaW5kZXggYnVpbGQgY29zdCkuXG4gKiBBYm92ZSB0aGlzLCBPKGxvZyBOKSBiaW5hcnkgc2VhcmNoIHdpbnMuXG4gKi9cbmNvbnN0IFJFVkVSU0VfSU5ERVhfVEhSRVNIT0xEID0gMjU2O1xuXG4vKipcbiAqIFdyaXRlciBsb29rdXAgZnVuY3Rpb24gc2lnbmF0dXJlLlxuICogUmV0dXJucyB0aGUgQ29tbWl0QnVuZGxlIHRoYXQgbGFzdCB3cm90ZSBga2V5YCBiZWZvcmUgcG9zaXRpb24gYGJlZm9yZUlkeGAuXG4gKi9cbnR5cGUgV3JpdGVyTG9va3VwID0gKGtleTogc3RyaW5nLCBiZWZvcmVJZHg6IG51bWJlcikgPT4gQ29tbWl0QnVuZGxlIHwgdW5kZWZpbmVkO1xuXG4vKiogU3RyYXRlZ3kgMTogTGluZWFyIHNjYW4g4oCUIE8oTikgcGVyIGxvb2t1cCwgemVybyBzZXR1cCBjb3N0LiAqL1xuZnVuY3Rpb24gbGluZWFyU2Nhbkxvb2t1cChjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdKTogV3JpdGVyTG9va3VwIHtcbiAgcmV0dXJuIChrZXksIGJlZm9yZUlkeCkgPT4gZmluZExhc3RXcml0ZXIoY29tbWl0TG9nLCBrZXksIGJlZm9yZUlkeCk7XG59XG5cbi8qKlxuICogU3RyYXRlZ3kgMjogUmV2ZXJzZSBpbmRleCDigJQgb25lIE8ocm93cykgYnVpbGQsIE8oZGVwdGggKyBsb2cgTikgcGVyIGxvb2t1cC5cbiAqIFRoZSBsb2cncyByZWFkIG1vZGVsIChgbG9nTW9kZWwudHNgOiBhIHBhdGggdHJpZSwgZWFjaCB0b3AtbGV2ZWwga2V5IGZvbGRlZCBhdFxuICogbW9zdCBvbmNlKSBhbnN3ZXJzIHRoZSB3cml0ZXIgcnVsZSDigJQgcm93cyBvbiwgaW5zaWRlIG9yIGFyb3VuZCB0aGUga2V5IOKAlCBieVxuICogYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGxhc3Qgd3JpdGUgb24gb3IgaW5zaWRlIGl0LCB0aGVuIGEgdmVyZGljdCBvbmx5IGZvciB0aGVcbiAqIGFyb3VuZC1jYW5kaWRhdGVzIGFmdGVyIGl0LiBUaGUgc2FtZSBhbnN3ZXIgYGZpbmRMYXN0V3JpdGVyYCBnaXZlcywgc28gdGhlXG4gKiBzdHJhdGVneSBzd2l0Y2ggYmVsb3cgbmV2ZXIgY2hhbmdlcyBhIHNsaWNlLlxuICovXG5mdW5jdGlvbiByZXZlcnNlSW5kZXhMb29rdXAoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSk6IFdyaXRlckxvb2t1cCB7XG4gIGNvbnN0IG1vZGVsID0gbG9nTW9kZWwoY29tbWl0TG9nKTtcbiAgcmV0dXJuIChrZXk6IHN0cmluZywgYmVmb3JlSWR4OiBudW1iZXIpOiBDb21taXRCdW5kbGUgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IGF0ID0gbW9kZWwubGFzdFdyaXRlckJlZm9yZShrZXksIGJlZm9yZUlkeCk7XG4gICAgcmV0dXJuIGF0ID49IDAgPyBjb21taXRMb2dbYXRdIDogdW5kZWZpbmVkO1xuICB9O1xufVxuXG4vKipcbiAqIFRoZSB0cmFjZSBlbnRyaWVzIG9mIGBjb21taXRgIHRoYXQgbWFrZSBpdCBhIHdyaXRlciBvZiBgbGlua0tleWAg4oCUIHRoZSBlbnRyaWVzIHdob3NlIHJlYWRcbiAqIHByZWZpeCAoYFRyYWNlRW50cnkucmVhZEtleXNgKSBhIHBlci13cml0ZSBlZGdlIGV4cGFuZHMgdGhyb3VnaC4gVGhlIEZJUlNUIGVudHJ5IG9uIHRoZSBleGFjdFxuICogcGF0aCB3aGVuIHRoZXJlIGlzIG9uZSAodGhlICNQMSBiZWhhdmlvdXIsIHVuY2hhbmdlZCk7IG90aGVyd2lzZSBldmVyeSBlbnRyeSBpbnNpZGUgb3IgYXJvdW5kXG4gKiB0aGUga2V5ICg5LjMzLjA6IHRoZSBjb21taXQgd3JvdGUgdGhlIGtleSB0aHJvdWdoIGEgbmVzdGVkIHJvdyDigJQgYSBzdWJmbG93IHNlZWQsIGFuXG4gKiBvdXRwdXRNYXBwZXIgbWVyZ2UtYmFjayDigJQgYW5kIGFsbCBvZiB0aG9zZSByb3dzIHdyb3RlIGl0KS5cbiAqL1xuZnVuY3Rpb24gbGlua2luZ0VudHJpZXMoY29tbWl0OiBDb21taXRCdW5kbGUsIGxpbmtLZXk6IHN0cmluZyk6IFRyYWNlRW50cnlbXSB7XG4gIGNvbnN0IGV4YWN0ID0gY29tbWl0LnRyYWNlLmZpbmQoKHQpID0+IHQucGF0aCA9PT0gbGlua0tleSk7XG4gIGlmIChleGFjdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gW2V4YWN0XTtcbiAgcmV0dXJuIGNvbW1pdC50cmFjZS5maWx0ZXIoKHQpID0+IHJlbGF0aW9uKHQucGF0aCwgbGlua0tleSkgIT09IHVuZGVmaW5lZCk7XG59XG5cbi8qKlxuICogU3RhZ2VkIG9wdGltaXphdGlvbjogcGljayB0aGUgcmlnaHQgd3JpdGVyLWxvb2t1cCBzdHJhdGVneSBiYXNlZCBvbiBkYXRhIHNpemUuXG4gKlxuICogTGlrZSBhIGRhdGFiYXNlIHF1ZXJ5IG9wdGltaXplciBjaG9vc2luZyBiZXR3ZWVuIHNlcXVlbnRpYWwgc2NhbiBhbmQgaW5kZXggc2NhbjpcbiAqXG4gKiAtICoqU21hbGwgbG9nICjiiaQgMjU2KToqKiBMaW5lYXIgc2NhbiB3aW5zLiBaZXJvIHNldHVwIGNvc3QsIGdvb2QgY2FjaGUgbG9jYWxpdHkuXG4gKiAgIFRoZSBvdmVyaGVhZCBvZiBidWlsZGluZyBhIHJldmVyc2UgaW5kZXggaXNuJ3Qgd29ydGggaXQgZm9yIHNob3J0IGxvZ3MuXG4gKlxuICogLSAqKkxhcmdlIGxvZyAoPiAyNTYpOioqIFJldmVyc2UgaW5kZXggd2lucy4gTyhOw5dVKSB1cGZyb250IGJ1aWxkIGNvc3QgaXMgYW1vcnRpemVkXG4gKiAgIGFjcm9zcyBhbGwgQkZTIGhvcHMuIEVhY2ggbG9va3VwIGJlY29tZXMgTyhsb2cgTikgdmlhIGJpbmFyeSBzZWFyY2ggaW5zdGVhZCBvZiBPKE4pLlxuICogICBGb3IgYW4gYWdlbnQgbG9vcCB3aXRoIDUwMCBpdGVyYXRpb25zIGFuZCA1IGtleXMgcGVyIGhvcCwgdGhpcyBpcyA1MDDDlzXDl2xvZyg1MDAp4omIMjJLIG9wc1xuICogICB2cyA1MDDDlzXDlzUwMD0xLjI1TSBvcHMgd2l0aCBsaW5lYXIgc2Nhbi5cbiAqXG4gKiBUaGUgY2FsbGVyIG5ldmVyIHNlZXMgdGhpcyDigJQgYGNhdXNhbENoYWluKClgIHBpY2tzIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVdyaXRlckxvb2t1cChjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdKTogV3JpdGVyTG9va3VwIHtcbiAgaWYgKGNvbW1pdExvZy5sZW5ndGggPD0gUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQpIHtcbiAgICByZXR1cm4gbGluZWFyU2Nhbkxvb2t1cChjb21taXRMb2cpO1xuICB9XG4gIHJldHVybiByZXZlcnNlSW5kZXhMb29rdXAoY29tbWl0TG9nKTtcbn1cblxuLy8g4pSA4pSAIENvcmUgYWxnb3JpdGhtIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFJGQy0wMDMgRDI6IHRoZSBgaW5jb21wbGV0ZVNvdXJjZXNgIG5vZGUgZnJhZ21lbnQgZm9yIGEgY29tbWl0IOKAlCBge31gXG4gKiB3aGVuIHRoZSBzdGFnZSBjb25zdW1lZCBubyB1bnRyYWNrZWQgcmVhZCBwYXRocywga2VlcGluZyB0aGUgZmllbGRcbiAqIEFCU0VOVCAobm90IGVtcHR5LWFycmF5LXZhbHVlZCkgZm9yIGZ1bGx5LXRyYWNrZWQgc3RhZ2VzLlxuICovXG5mdW5jdGlvbiBpbmNvbXBsZXRlU291cmNlc0ZyYWdtZW50KGNvbW1pdDogQ29tbWl0QnVuZGxlKTogeyBpbmNvbXBsZXRlU291cmNlcz86IFJlYWRvbmx5QXJyYXk8VW50cmFja2VkU291cmNlPiB9IHtcbiAgaWYgKCFjb21taXQudW50cmFja2VkU291cmNlcyB8fCBjb21taXQudW50cmFja2VkU291cmNlcy5sZW5ndGggPT09IDApIHJldHVybiB7fTtcbiAgcmV0dXJuIHsgaW5jb21wbGV0ZVNvdXJjZXM6IGNvbW1pdC51bnRyYWNrZWRTb3VyY2VzIH07XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGNhdXNhbCBEQUcgcm9vdGVkIGF0IGBzdGFydElkYCBieSB3YWxraW5nIGJhY2t3YXJkc1xuICogdGhyb3VnaCByZWFk4oaSd3JpdGUgZGVwZW5kZW5jaWVzIGluIHRoZSBjb21taXQgbG9nLlxuICpcbiAqIEF1dG9tYXRpY2FsbHkgc2VsZWN0cyB0aGUgb3B0aW1hbCB3cml0ZXIgbG9va3VwIHN0cmF0ZWd5OlxuICogLSBMaW5lYXIgc2NhbiBmb3Igc21hbGwgbG9ncyAo4omkIDI1NiBjb21taXRzKVxuICogLSBSZXZlcnNlIGluZGV4IHdpdGggYmluYXJ5IHNlYXJjaCBmb3IgbGFyZ2UgbG9ncyAoPiAyNTYgY29tbWl0cylcbiAqXG4gKiBQcm9kdWNlcyBhIERBRyAobm90IGEgdHJlZSk6IGlmIHR3byBjaGlsZHJlbiBib3RoIHJlYWQgZnJvbSB0aGUgc2FtZVxuICogcGFyZW50LCB0aGUgcGFyZW50IG5vZGUgaXMgc2hhcmVkIChkZWR1cGVkIGJ5IHJ1bnRpbWVTdGFnZUlkKS5cbiAqXG4gKiBAcGFyYW0gY29tbWl0TG9nICAgT3JkZXJlZCBjb21taXQgYnVuZGxlcyBmcm9tIGV4ZWN1dG9yLmdldFNuYXBzaG90KCkuY29tbWl0TG9nXG4gKiBAcGFyYW0gc3RhcnRJZCAgICAgcnVudGltZVN0YWdlSWQgdG8gc3RhcnQgYmFja3RyYWNraW5nIGZyb21cbiAqIEBwYXJhbSBnZXRLZXlzUmVhZCBDYWxsYmFjayByZXR1cm5pbmcga2V5cyByZWFkIGJ5IGEgZ2l2ZW4gZXhlY3V0aW9uIHN0ZXBcbiAqIEBwYXJhbSBvcHRpb25zICAgICBEZXB0aCBhbmQgbm9kZSBsaW1pdHNcbiAqIEByZXR1cm5zIFJvb3QgQ2F1c2FsTm9kZSB3aXRoIC5wYXJlbnRzIGZvcm1pbmcgdGhlIERBRywgb3IgdW5kZWZpbmVkIGlmIHN0YXJ0SWQgbm90IGZvdW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXVzYWxDaGFpbihcbiAgY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSxcbiAgc3RhcnRJZDogc3RyaW5nLFxuICBnZXRLZXlzUmVhZDogS2V5c1JlYWRMb29rdXAsXG4gIG9wdGlvbnM/OiBDYXVzYWxDaGFpbk9wdGlvbnMsXG4pOiBDYXVzYWxOb2RlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF4RGVwdGggPSBvcHRpb25zPy5tYXhEZXB0aCA/PyAyMDtcbiAgY29uc3QgbWF4Tm9kZXMgPSBvcHRpb25zPy5tYXhOb2RlcyA/PyAxMDA7XG4gIGNvbnN0IGNvbnRyb2xEZXBzID0gb3B0aW9ucz8uY29udHJvbERlcHM7XG4gIGNvbnN0IHdlaWdoID0gb3B0aW9ucz8ud2VpZ2g7XG4gIGNvbnN0IHBlcldyaXRlID0gb3B0aW9ucz8uZWRnZUF0dHJpYnV0aW9uID09PSAncGVyLXdyaXRlJztcblxuICAvLyBSRkMtMDAzIEQ0IOKAlCB0cnVuY2F0aW9uIHZpc2liaWxpdHkuIFNldCBvbmx5IHdoZW4gYSBsaW1pdCBhY3R1YWxseVxuICAvLyBjdXRzIHRoZSBzbGljZTsgc3VyZmFjZWQgb24gdGhlIHJvb3QgYXMgYHRydW5jYXRlZGAgc28gYSBjb25zdW1lciBjYW5cbiAgLy8gbmV2ZXIgbWlzdGFrZSBhIHRydW5jYXRlZCBzbGljZSBmb3IgYSBjb21wbGV0ZSBvbmUuXG4gIGxldCB0cnVuY2F0ZWRCeURlcHRoID0gZmFsc2U7XG4gIGxldCB0cnVuY2F0ZWRCeU5vZGVzID0gZmFsc2U7XG5cbiAgLy8gQnVpbGQgcG9zaXRpb24gaW5kZXg6IHJ1bnRpbWVTdGFnZUlkIOKGkiBhcnJheSBwb3NpdGlvbiAoTyhuKSBvbmNlKVxuICBjb25zdCBpZHhNYXAgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1pdExvZy5sZW5ndGg7IGkrKykge1xuICAgIGlkeE1hcC5zZXQoY29tbWl0TG9nW2ldLnJ1bnRpbWVTdGFnZUlkLCBpKTtcbiAgfVxuICBxdWVyeVdvcmsudW5pdHMgKz0gY29tbWl0TG9nLmxlbmd0aDtcblxuICBjb25zdCBzdGFydElkeCA9IGlkeE1hcC5nZXQoc3RhcnRJZCk7XG4gIGlmIChzdGFydElkeCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHN0YXJ0Q29tbWl0ID0gY29tbWl0TG9nW3N0YXJ0SWR4XTtcblxuICAvLyBQaWNrIHdyaXRlciBsb29rdXAgc3RyYXRlZ3kgYmFzZWQgb24gbG9nIHNpemVcbiAgY29uc3QgZmluZFdyaXRlciA9IGNyZWF0ZVdyaXRlckxvb2t1cChjb21taXRMb2cpO1xuXG4gIC8vIE5vZGUgZGVkdXAgbWFwOiBydW50aW1lU3RhZ2VJZCDihpIgQ2F1c2FsTm9kZSAoZW5zdXJlcyBEQUcsIG5vdCB0cmVlKVxuICBjb25zdCBub2RlTWFwID0gbmV3IE1hcDxzdHJpbmcsIENhdXNhbE5vZGU+KCk7XG5cbiAgY29uc3Qgcm9vdDogQ2F1c2FsTm9kZSA9IHtcbiAgICBydW50aW1lU3RhZ2VJZDogc3RhcnRJZCxcbiAgICBzdGFnZUlkOiBzdGFydENvbW1pdC5zdGFnZUlkLFxuICAgIHN0YWdlTmFtZTogc3RhcnRDb21taXQuc3RhZ2UsXG4gICAga2V5c1dyaXR0ZW46IHN0YXJ0Q29tbWl0LnRyYWNlLm1hcCgodCkgPT4gdC5wYXRoKSxcbiAgICBsaW5rZWRCeTogJycsXG4gICAgZGVwdGg6IDAsXG4gICAgcGFyZW50czogW10sXG4gICAgcGFyZW50RWRnZXM6IFtdLFxuICAgIC4uLmluY29tcGxldGVTb3VyY2VzRnJhZ21lbnQoc3RhcnRDb21taXQpLFxuICB9O1xuICBub2RlTWFwLnNldChzdGFydElkLCByb290KTtcblxuICAvLyDilIDilIAgI1AxIHBlci13cml0ZSBhdHRyaWJ1dGlvbiBtYWNoaW5lcnkgKGluZXJ0IHVuZGVyICdzdGFnZScpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBleHBhbmRlZFJlYWRzOiBwZXIgbm9kZSwgdGhlIHJlYWRzIGFscmVhZHkgcXVldWVkIGZvciBleHBhbnNpb24g4oCUIGxhdGVcbiAgLy8gbGlua3MgdmlhIGFkZGl0aW9uYWwga2V5cyByZS1lbnF1ZXVlIG9ubHkgdGhlIERFTFRBLCBzbyB0aGUgc2xpY2UgZ3Jvd3NcbiAgLy8gbW9ub3RvbmljYWxseSB0b3dhcmQgdGhlIHN0YWdlLWxldmVsIGNlaWxpbmcgYW5kIHRlcm1pbmF0ZXMgKGVhY2gga2V5XG4gIC8vIGV4cGFuZHMgYXQgbW9zdCBvbmNlIHBlciBub2RlKS4gZnVsbHlFeHBhbmRlZDogbm9kZXMgdGhhdCBmZWxsIGJhY2sgdG9cbiAgLy8gc3RhZ2UgbGV2ZWwgKG5vIHJlYWRLZXlzIG9uIGEgbGlua2luZyBlbnRyeSkg4oCUIG5vdGhpbmcgbGVmdCB0byBhZGQuXG4gIGNvbnN0IGV4cGFuZGVkUmVhZHMgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG4gIGNvbnN0IGZ1bGx5RXhwYW5kZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUmVzb2x2ZSBhIG5vZGUncyBleHBhbnNpb24gcmVhZC1zZXQgZm9yIHRoZSBnaXZlbiBsaW5raW5nIFdSSVRURU4ga2V5cy5cbiAgICogUGVyLXdyaXRlIG1vZGUgd2l0aCBwcm92ZW5hbmNlIHByZXNlbnQg4oaSIHVuaW9uIG9mIHRoZSBsaW5raW5nIHdyaXRlcydcbiAgICogdGVtcG9yYWwtcHJlZml4IGByZWFkS2V5c2AuIEFueSBsaW5raW5nIGVudHJ5IFdJVEhPVVQgYHJlYWRLZXlzYCAob3Igbm9cbiAgICogbGlua0tleXMgYXQgYWxsKSDihpIgaG9uZXN0IHN0YWdlLWxldmVsIGZhbGxiYWNrLCBmbGFnZ2VkIHZpYSB0aGUgc2Vjb25kXG4gICAqIHR1cGxlIG1lbWJlciBzbyB0aGUgY2FsbGVyIG1hcmtzIHRoZSBub2RlIGZ1bGx5IGV4cGFuZGVkLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVhZHNGb3JMaW5rcyhjb21taXQ6IENvbW1pdEJ1bmRsZSwgbGlua0tleXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogW3N0cmluZ1tdLCBib29sZWFuXSB7XG4gICAgaWYgKCFwZXJXcml0ZSB8fCAhbGlua0tleXMgfHwgbGlua0tleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW2dldEtleXNSZWFkKGNvbW1pdC5ydW50aW1lU3RhZ2VJZCksIHRydWVdO1xuICAgIH1cbiAgICBjb25zdCB1bmlvbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgbGlua0tleSBvZiBsaW5rS2V5cykge1xuICAgICAgY29uc3QgZW50cmllcyA9IGxpbmtpbmdFbnRyaWVzKGNvbW1pdCwgbGlua0tleSk7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDAgfHwgZW50cmllcy5zb21lKChlKSA9PiBlLnJlYWRLZXlzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIC8vIE1peGVkL2RpYWwtb2ZmIGxvZyDigJQgZGVncmFkZSBUSElTIG5vZGUgdG8gc3RhZ2UgbGV2ZWwsIGhvbmVzdGx5LlxuICAgICAgICByZXR1cm4gW2dldEtleXNSZWFkKGNvbW1pdC5ydW50aW1lU3RhZ2VJZCksIHRydWVdO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSBmb3IgKGNvbnN0IHJrIG9mIGVudHJ5LnJlYWRLZXlzIGFzIHN0cmluZ1tdKSB1bmlvbi5hZGQocmspO1xuICAgIH1cbiAgICByZXR1cm4gW1suLi51bmlvbl0sIGZhbHNlXTtcbiAgfVxuXG4gIC8vIEJGUy93b3JrbGlzdCBxdWV1ZTogW25vZGUsIGNvbW1pdElkeCwgZGVwdGgsIGtleXNUb0V4cGFuZF1cbiAgY29uc3QgW3Jvb3RSZWFkcywgcm9vdElzRnVsbF0gPSBwZXJXcml0ZVxuICAgID8gcmVhZHNGb3JMaW5rcyhzdGFydENvbW1pdCwgb3B0aW9ucz8ucm9vdExpbmtLZXlzKVxuICAgIDogW2dldEtleXNSZWFkKHN0YXJ0SWQpLCB0cnVlXTtcbiAgZXhwYW5kZWRSZWFkcy5zZXQoc3RhcnRJZCwgbmV3IFNldChyb290UmVhZHMpKTtcbiAgaWYgKHJvb3RJc0Z1bGwpIGZ1bGx5RXhwYW5kZWQuYWRkKHN0YXJ0SWQpO1xuICBjb25zdCBxdWV1ZTogQXJyYXk8W0NhdXNhbE5vZGUsIG51bWJlciwgbnVtYmVyLCBzdHJpbmdbXV0+ID0gW1tyb290LCBzdGFydElkeCwgMCwgcm9vdFJlYWRzXV07XG4gIGxldCB2aXNpdGVkID0gMTtcblxuICAvKipcbiAgICogTGluayBgbm9kZSDihpIgcGFyZW50YCAoY3JlYXRpbmcgKyBlbnF1ZXVlaW5nIHRoZSBwYXJlbnQgd2hlbiBuZXcpLlxuICAgKiBTaGFyZWQgYnkgZGF0YS1lZGdlIGV4cGFuc2lvbiAocmVhZOKGkndyaXRlKSBhbmQgY29udHJvbC1lZGdlIGV4cGFuc2lvblxuICAgKiAoRDMpLiBPbmUgQ2F1c2FsRWRnZSBwZXIgZGlzdGluY3QgKHBhcmVudCwga2luZCwga2V5KSBsaW5rOyBgcGFyZW50c2BcbiAgICoga2VlcHMgaXRzIGhpc3RvcmljYWwgb25lLWVudHJ5LXBlci1wYXJlbnQgZGVkdXAuXG4gICAqL1xuICBmdW5jdGlvbiBsaW5rUGFyZW50KFxuICAgIG5vZGU6IENhdXNhbE5vZGUsXG4gICAgcGFyZW50Q29tbWl0OiBDb21taXRCdW5kbGUsXG4gICAga2luZDogJ2RhdGEnIHwgJ2NvbnRyb2wnLFxuICAgIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGRlcHRoOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmVudElkID0gcGFyZW50Q29tbWl0LnJ1bnRpbWVTdGFnZUlkO1xuICAgIC8vIHRoZSBkZWR1cCBzY2FucyBiZWxvdywgYW5kIHRoZSBwYXJlbnQncyB0cmFjZSB3aGVuIGl0IGlzIG5ldyDigJQgY291bnRlZCBmb3IgdGhlIHNjYWxpbmcgdGVzdFxuICAgIHF1ZXJ5V29yay51bml0cyArPSAxICsgbm9kZS5wYXJlbnRzLmxlbmd0aCArIG5vZGUucGFyZW50RWRnZXMubGVuZ3RoO1xuICAgIC8vICNQMTogdGhlIHBhcmVudCdzIGV4cGFuc2lvbiByZWFkcywgcmVzb2x2ZWQgTEFaSUxZIChvbmx5IGZvciBuZXcgbm9kZXNcbiAgICAvLyBvciBwZXItd3JpdGUgcmUtZXhwYW5zaW9uIOKAlCBkdXBsaWNhdGUgbGlua3MgdW5kZXIgJ3N0YWdlJyBwYXkgbm90aGluZykuXG4gICAgLy8gRGF0YSBsaW5rcyBleHBhbmQgdGhyb3VnaCB0aGUgcmVhZHMgdGhhdCBmZWQgdGhlIHBhcmVudCdzIHdyaXRlIG9mXG4gICAgLy8gYGtleWA7IGNvbnRyb2wgbGlua3MgZXhwYW5kIHRoZSBkZWNpZGVyIGF0IHN0YWdlIGxldmVsIChhIGRlY2lzaW9uXG4gICAgLy8gZGVwZW5kcyBvbiBldmVyeXRoaW5nIGl0IHJlYWQpLlxuICAgIGNvbnN0IHJlc29sdmVMaW5rUmVhZHMgPSAoKTogW3N0cmluZ1tdLCBib29sZWFuXSA9PlxuICAgICAga2luZCA9PT0gJ2RhdGEnXG4gICAgICAgID8gcmVhZHNGb3JMaW5rcyhwYXJlbnRDb21taXQsIGtleSAhPT0gdW5kZWZpbmVkID8gW2tleV0gOiB1bmRlZmluZWQpXG4gICAgICAgIDogW2dldEtleXNSZWFkKHBhcmVudElkKSwgdHJ1ZV07XG5cbiAgICBsZXQgcGFyZW50Tm9kZSA9IG5vZGVNYXAuZ2V0KHBhcmVudElkKTtcbiAgICBpZiAoIXBhcmVudE5vZGUpIHtcbiAgICAgIC8vIE5ldyBub2RlIOKAlCBjcmVhdGUgYW5kIGVucXVldWUgKHJlc3BlY3RpbmcgdGhlIG5vZGUgYnVkZ2V0KVxuICAgICAgaWYgKHZpc2l0ZWQgPj0gbWF4Tm9kZXMpIHtcbiAgICAgICAgdHJ1bmNhdGVkQnlOb2RlcyA9IHRydWU7IC8vIEQ0OiBhIGRpc2NvdmVyZWQgcGFyZW50IHdhcyBkcm9wcGVkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50SWR4ID0gaWR4TWFwLmdldChwYXJlbnRJZCk7XG4gICAgICBpZiAocGFyZW50SWR4ID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgICAgcXVlcnlXb3JrLnVuaXRzICs9IHBhcmVudENvbW1pdC50cmFjZS5sZW5ndGg7XG4gICAgICBwYXJlbnROb2RlID0ge1xuICAgICAgICBydW50aW1lU3RhZ2VJZDogcGFyZW50SWQsXG4gICAgICAgIHN0YWdlSWQ6IHBhcmVudENvbW1pdC5zdGFnZUlkLFxuICAgICAgICBzdGFnZU5hbWU6IHBhcmVudENvbW1pdC5zdGFnZSxcbiAgICAgICAga2V5c1dyaXR0ZW46IHBhcmVudENvbW1pdC50cmFjZS5tYXAoKHQpID0+IHQucGF0aCksXG4gICAgICAgIC8vIGxpbmtlZEJ5IHN0YXlzIGEgREFUQS1rZXkgY29uY2VwdCAoYmFjay1jb21wYXQpIOKAlCBjb250cm9sLWxpbmtlZFxuICAgICAgICAvLyBub2RlcyBjYXJyeSB0aGVpciBsYWJlbCBvbiB0aGUgZWRnZSBpbnN0ZWFkLlxuICAgICAgICBsaW5rZWRCeToga2luZCA9PT0gJ2RhdGEnID8ga2V5ID8/ICcnIDogJycsXG4gICAgICAgIGRlcHRoOiBkZXB0aCArIDEsXG4gICAgICAgIHBhcmVudHM6IFtdLFxuICAgICAgICBwYXJlbnRFZGdlczogW10sXG4gICAgICAgIC4uLmluY29tcGxldGVTb3VyY2VzRnJhZ21lbnQocGFyZW50Q29tbWl0KSxcbiAgICAgIH07XG4gICAgICBub2RlTWFwLnNldChwYXJlbnRJZCwgcGFyZW50Tm9kZSk7XG4gICAgICB2aXNpdGVkKys7XG4gICAgICBjb25zdCBbbGlua1JlYWRzLCBsaW5rSXNGdWxsXSA9IHJlc29sdmVMaW5rUmVhZHMoKTtcbiAgICAgIGV4cGFuZGVkUmVhZHMuc2V0KHBhcmVudElkLCBuZXcgU2V0KGxpbmtSZWFkcykpO1xuICAgICAgaWYgKGxpbmtJc0Z1bGwpIGZ1bGx5RXhwYW5kZWQuYWRkKHBhcmVudElkKTtcbiAgICAgIHF1ZXVlLnB1c2goW3BhcmVudE5vZGUsIHBhcmVudElkeCwgZGVwdGggKyAxLCBsaW5rUmVhZHNdKTtcbiAgICB9IGVsc2UgaWYgKHBlcldyaXRlICYmICFmdWxseUV4cGFuZGVkLmhhcyhwYXJlbnRJZCkpIHtcbiAgICAgIC8vICNQMSB3b3JrbGlzdDogYW4gRVhJU1RJTkcgbm9kZSBsaW5rZWQgdmlhIGFub3RoZXIga2V5IG1heSBvd2UgbW9yZVxuICAgICAgLy8gZXhwYW5zaW9uIOKAlCBlbnF1ZXVlIG9ubHkgdGhlIHJlYWRzIG5vdCB5ZXQgZXhwYW5kZWQgKG1vbm90b25lOyB0aGVcbiAgICAgIC8vIG5vZGUgYnVkZ2V0IGlzIHVudG91Y2hlZCwgbm8gbm9kZSBpcyBjcmVhdGVkKS4gUmUtZXhwYW5zaW9uIGtlZXBzXG4gICAgICAvLyB0aGUgbm9kZSdzIE9SSUdJTkFMIGRlcHRoIHNvIGl0cyBwYXJlbnRzIGdldCBhIGNvbnNpc3RlbnQgZGVwdGgrMS5cbiAgICAgIGNvbnN0IFtsaW5rUmVhZHMsIGxpbmtJc0Z1bGxdID0gcmVzb2x2ZUxpbmtSZWFkcygpO1xuICAgICAgY29uc3QgZXhwYW5kZWQgPSBleHBhbmRlZFJlYWRzLmdldChwYXJlbnRJZCkhO1xuICAgICAgY29uc3QgZGVsdGEgPSBsaW5rUmVhZHMuZmlsdGVyKChrKSA9PiAhZXhwYW5kZWQuaGFzKGspKTtcbiAgICAgIGlmIChsaW5rSXNGdWxsKSBmdWxseUV4cGFuZGVkLmFkZChwYXJlbnRJZCk7XG4gICAgICBpZiAoZGVsdGEubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IGsgb2YgZGVsdGEpIGV4cGFuZGVkLmFkZChrKTtcbiAgICAgICAgY29uc3QgcGFyZW50SWR4ID0gaWR4TWFwLmdldChwYXJlbnRJZCk7XG4gICAgICAgIGlmIChwYXJlbnRJZHggIT09IHVuZGVmaW5lZCkgcXVldWUucHVzaChbcGFyZW50Tm9kZSwgcGFyZW50SWR4LCBwYXJlbnROb2RlLmRlcHRoLCBkZWx0YV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERBRyBtZXJnZTogb25lIHBhcmVudHNbXSBlbnRyeSBwZXIgZGlzdGluY3QgcGFyZW50IChoaXN0b3JpY2FsIHNoYXBlKVxuICAgIGlmICghbm9kZS5wYXJlbnRzLnNvbWUoKHApID0+IHAucnVudGltZVN0YWdlSWQgPT09IHBhcmVudElkKSkge1xuICAgICAgbm9kZS5wYXJlbnRzLnB1c2gocGFyZW50Tm9kZSk7XG4gICAgfVxuICAgIC8vIE9uZSBlZGdlIHBlciBkaXN0aW5jdCAocGFyZW50LCBraW5kLCBrZXkpIGxpbmsuIFRoZSB3ZWlnaGVyIChENClcbiAgICAvLyBzdGFtcHMgdGhlIHdlaWdodCBhdCBjcmVhdGlvbjsgYHVuZGVmaW5lZGAg4oaSIDEuMCDigJQgdGhlIGVuZ2luZSBuZXZlclxuICAgIC8vIGNvbXB1dGVzIHdlaWdodHMgaXRzZWxmLlxuICAgIGlmICghbm9kZS5wYXJlbnRFZGdlcy5zb21lKChlKSA9PiBlLnBhcmVudC5ydW50aW1lU3RhZ2VJZCA9PT0gcGFyZW50SWQgJiYgZS5raW5kID09PSBraW5kICYmIGUua2V5ID09PSBrZXkpKSB7XG4gICAgICAvLyBFcnJvciBpc29sYXRpb24gKHJldmlldyBmaW5kaW5nKTogYSBjb25zdW1lciB3ZWlnaGVyIHRoYXQgdGhyb3dzXG4gICAgICAvLyBtdXN0IGRlZ3JhZGUgdG8gdGhlIGRlZmF1bHQgd2VpZ2h0LCBuZXZlciBjcmFzaCB0aGUgc2xpY2Ug4oCUIHRoZVxuICAgICAgLy8gc2FtZSBjb250cmFjdCBldmVyeSBvdGhlciBjb25zdW1lciBjYWxsYmFjayBpbiB0aGUgbGlicmFyeSBnZXRzLlxuICAgICAgbGV0IHdlaWdodCA9IDEuMDtcbiAgICAgIGlmICh3ZWlnaCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHdlaWdodCA9IHdlaWdoKG5vZGUsIHBhcmVudE5vZGUsIGtleSwga2luZCkgPz8gMS4wO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvKiB3ZWlnaGVyIHRocmV3IOKAlCBrZWVwIDEuMCwgdGhlIHNsaWNlIHN0YXlzIHVzYWJsZSAqL1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBuZXN0ZWQgPSBraW5kID09PSAnZGF0YScgJiYga2V5ICE9PSB1bmRlZmluZWQgJiYgd3JpdGVzT25seUluc2lkZShwYXJlbnRDb21taXQsIGtleSk7XG4gICAgICBub2RlLnBhcmVudEVkZ2VzLnB1c2goe1xuICAgICAgICBwYXJlbnQ6IHBhcmVudE5vZGUsXG4gICAgICAgIGtpbmQsXG4gICAgICAgIGtleSxcbiAgICAgICAgd2VpZ2h0LFxuICAgICAgICAuLi4obmVzdGVkICYmIHsgYmFzaXM6ICduZXN0ZWQtcm93cycgYXMgY29uc3QgfSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IFtub2RlLCBjb21taXRJZHgsIGRlcHRoLCBrZXlzVG9FeHBhbmRdID0gcXVldWUuc2hpZnQoKSE7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IDEgKyBrZXlzVG9FeHBhbmQubGVuZ3RoO1xuXG4gICAgaWYgKGRlcHRoID49IG1heERlcHRoKSB7XG4gICAgICAvLyBENDogb25seSBhIG5vZGUgdGhhdCBzdGlsbCBIQUQgc29tZXRoaW5nIHRvIGV4cGFuZCBjb3VudHMgYXMgYSBjdXRcbiAgICAgIC8vIChhIGxlYWYgYXQgdGhlIGhvcml6b24gdHJ1bmNhdGVzIG5vdGhpbmcpLlxuICAgICAgaWYgKGtleXNUb0V4cGFuZC5sZW5ndGggPiAwIHx8IGNvbnRyb2xEZXBzPy4obm9kZS5ydW50aW1lU3RhZ2VJZCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0cnVuY2F0ZWRCeURlcHRoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIERhdGEgZWRnZXM6IGZvciBlYWNoIGtleSBpbiB0aGlzIGV4cGFuc2lvbidzIHJlYWQtc2V0LCBmaW5kIHdobyB3cm90ZVxuICAgIC8vIGl0LiBVbmRlciAnc3RhZ2UnIHRoaXMgaXMgdGhlIG5vZGUncyBmdWxsIHJlYWQtc2V0IChoaXN0b3JpY2FsXG4gICAgLy8gYmVoYXZpb3IpOyB1bmRlciAncGVyLXdyaXRlJyBpdCBpcyB0aGUgbGlua2luZyB3cml0ZXMnIHRlbXBvcmFsIHByZWZpeFxuICAgIC8vIChvciBhIHdvcmtsaXN0IGRlbHRhIG9uIHJlLWV4cGFuc2lvbikuXG4gICAgY29uc3Qga2V5c1JlYWQgPSBrZXlzVG9FeHBhbmQ7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c1JlYWQpIHtcbiAgICAgIGNvbnN0IHdyaXRlciA9IGZpbmRXcml0ZXIoa2V5LCBjb21taXRJZHgpO1xuICAgICAgaWYgKCF3cml0ZXIpIHtcbiAgICAgICAgLy8gRjRiOiBzYXkgd2h5IHRoZXJlIGlzIG5vIGVkZ2Ug4oCUIG5vIGNvbW1pdCBiZWZvcmUgdGhpcyBub2RlIHdyb3RlIHRoZSBrZXkuXG4gICAgICAgIG5vZGUucHJlUnVuUmVhZHMgPz89IHsgY29kZTogJ3ByZS1ydW4tb3JpZ2luJywga2V5czogW10gfTtcbiAgICAgICAgaWYgKCFub2RlLnByZVJ1blJlYWRzLmtleXMuaW5jbHVkZXMoa2V5KSkgbm9kZS5wcmVSdW5SZWFkcy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsaW5rUGFyZW50KG5vZGUsIHdyaXRlciwgJ2RhdGEnLCBrZXksIGRlcHRoKTtcbiAgICB9XG5cbiAgICAvLyBDb250cm9sIGVkZ2UgKFJGQy0wMDMgRDMpOiBsaW5rIHRoZSBnb3Zlcm5pbmcgZGVjaWRlciwgbGFiZWxlZCBieSB0aGVcbiAgICAvLyBkZWNpZGUoKSBydWxlIGxhYmVsIHdoZW4gcHJlc2VudC4gVGhlIGRlY2lkZXIgbm9kZSB0aGVuIGV4cGFuZHNcbiAgICAvLyBub3JtYWxseSB0aHJvdWdoIGl0cyBvd24gZGF0YSByZWFkcyAoYW5kIGl0cyBvd24gY29udHJvbCBwYXJlbnQpLlxuICAgIGlmIChjb250cm9sRGVwcykge1xuICAgICAgY29uc3QgZGVwID0gY29udHJvbERlcHMobm9kZS5ydW50aW1lU3RhZ2VJZCk7XG4gICAgICBpZiAoZGVwKSB7XG4gICAgICAgIGNvbnN0IGRlY2lkZXJJZHggPSBpZHhNYXAuZ2V0KGRlcC5kZWNpZGVySWQpO1xuICAgICAgICBpZiAoZGVjaWRlcklkeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbGlua1BhcmVudChub2RlLCBjb21taXRMb2dbZGVjaWRlcklkeF0sICdjb250cm9sJywgZGVwLmxhYmVsLCBkZXB0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSRkMtMDAzIEQ0IOKAlCB0cnVuY2F0aW9uIHZpc2liaWxpdHkgb24gdGhlIHJvb3QgKGFic2VudCB3aGVuIGNvbXBsZXRlKS4gSXQgaXMgREFUQSwgYW5kIG9ubHlcbiAgLy8gZGF0YTogYSByZWFkZXIgcmVhZHMgYHJvb3QudHJ1bmNhdGVkYCAoYW5kIGBmb3JtYXRDYXVzYWxDaGFpbmAgcHJpbnRzIGl0KTsgdGhlIHJlY29yZCB3cml0ZXMgbm9cbiAgLy8gY29uc29sZSBsaW5lICh0aGUgZGV2LW1vZGUgd2FybmluZyB3ZW50IGluIEM2IOKAlCB0aGUgcmVjb3JkIGltcG9ydHMgbm90aGluZyBvdXRzaWRlIGl0c2VsZikuXG4gIGlmICh0cnVuY2F0ZWRCeURlcHRoIHx8IHRydW5jYXRlZEJ5Tm9kZXMpIHtcbiAgICByb290LnRydW5jYXRlZCA9IHsgYnlEZXB0aDogdHJ1bmNhdGVkQnlEZXB0aCwgYnlOb2RlczogdHJ1bmNhdGVkQnlOb2RlcyB9O1xuICB9XG5cbiAgcmV0dXJuIHJvb3Q7XG59XG5cbi8vIOKUgOKUgCBVdGlsaXRpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogRmxhdHRlbiB0aGUgY2F1c2FsIERBRyBpbnRvIGEgQkZTLW9yZGVyZWQgbGlzdCBvZiBub2Rlcy5cbiAqIEVhY2ggbm9kZSBhcHBlYXJzIGV4YWN0bHkgb25jZSAoZmlyc3Qgb2NjdXJyZW5jZSBieSBCRlMgb3JkZXIpLlxuICogVXNlZnVsIGZvciBsaW5lYXIgZGlzcGxheSBvciBpdGVyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuQ2F1c2FsREFHKHJvb3Q6IENhdXNhbE5vZGUpOiBDYXVzYWxOb2RlW10ge1xuICBjb25zdCByZXN1bHQ6IENhdXNhbE5vZGVbXSA9IFtdO1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHF1ZXVlOiBDYXVzYWxOb2RlW10gPSBbcm9vdF07XG5cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlID0gcXVldWUuc2hpZnQoKSE7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUucnVudGltZVN0YWdlSWQpKSBjb250aW51ZTtcbiAgICB2aXNpdGVkLmFkZChub2RlLnJ1bnRpbWVTdGFnZUlkKTtcbiAgICByZXN1bHQucHVzaChub2RlKTtcblxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG5vZGUucGFyZW50cykge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhwYXJlbnQucnVudGltZVN0YWdlSWQpKSB7XG4gICAgICAgIHF1ZXVlLnB1c2gocGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZvcm1hdCBhIGNhdXNhbCBEQUcgYXMgaHVtYW4tcmVhZGFibGUgaW5kZW50ZWQgdGV4dC5cbiAqIFNob3dzIHRoZSBkZXBlbmRlbmN5IGNoYWluIHdpdGggZGVwdGggaW5kZW50YXRpb24gYW5kIGxpbmtlZC1ieSBrZXlzLlxuICpcbiAqIFJGQy0wMDMgRDI6IG5vZGVzIHRoYXQgY29uc3VtZWQgdW50cmFja2VkIHJlYWQgcGF0aHMgcmVuZGVyIGFuIGV4dHJhXG4gKiBg4pqgIGFsc28gY29uc3VtZWQg4oCmIOKAlCBzbGljZSBtYXkgYmUgaW5jb21wbGV0ZSBoZXJlYCBsaW5lLCBzbyBhIGNvbnN1bWVyXG4gKiAoaHVtYW4gb3IgTExNKSBkZWJ1Z2dpbmcgZnJvbSB0aGUgc2xpY2UgaXMgVE9MRCB3aGVuIGl0IGlzIGluY29tcGxldGUuXG4gKlxuICogUkZDLTAwMyBEMzogY29udHJvbCBlZGdlcyByZW5kZXIgYXMgYOKGkCBbY29udHJvbDogPHJ1bGUgbGFiZWw+XWBcbiAqIChsYWJlbCBvbWl0dGVkIHdoZW4gdGhlIGRlY2lzaW9uIGNhcnJpZWQgbm9uZSkuIERhdGEgcmVuZGVyaW5nIGlzXG4gKiBieXRlLWlkZW50aWNhbCB0byB0aGUgcHJlLUQzIG91dHB1dCDigJQgYOKGkCB2aWEgPGtleT5gIGZyb20gdGhlIG5vZGUnc1xuICogZGlzY292ZXJ5LXRpbWUgYGxpbmtlZEJ5YC5cbiAqXG4gKiBSRkMtMDAzIEQ0OiBlZGdlIHdlaWdodHMgZnJvbSB0aGUgYHdlaWdoYCBob29rIHJlbmRlciBhcyBhIHN1ZmZpeCDigJRcbiAqIGDihpAgdmlhIHN5c3RlbVByb21wdCAoMC4xOClgIOKAlCBvbmx5IHdoZW4g4omgIDEuMCwgc28gdW53ZWlnaHRlZCBvdXRwdXQgaXNcbiAqIHVuY2hhbmdlZC4gQSB0cnVuY2F0ZWQgc2xpY2UgKHJvb3QudHJ1bmNhdGVkKSBhcHBlbmRzIGEgZmluYWxcbiAqIGDimqAgc2xpY2UgdHJ1bmNhdGVkIOKApmAgbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdENhdXNhbENoYWluKHJvb3Q6IENhdXNhbE5vZGUpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0IHdlaWdodFN1ZmZpeCA9IChlZGdlOiBDYXVzYWxFZGdlIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+XG4gICAgZWRnZSAhPT0gdW5kZWZpbmVkICYmIGVkZ2Uud2VpZ2h0ICE9PSAxID8gYCAoJHtlZGdlLndlaWdodH0pYCA6ICcnO1xuXG4gIGZ1bmN0aW9uIHdhbGsobm9kZTogQ2F1c2FsTm9kZSwgaW5kZW50OiBudW1iZXIsIGVkZ2VzRnJvbUNoaWxkPzogQ2F1c2FsRWRnZVtdKTogdm9pZCB7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUucnVudGltZVN0YWdlSWQpKSB7XG4gICAgICBsaW5lcy5wdXNoKGAkeycgICcucmVwZWF0KGluZGVudCl94oazICR7bm9kZS5ydW50aW1lU3RhZ2VJZH0gKHNlZSBhYm92ZSlgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmlzaXRlZC5hZGQobm9kZS5ydW50aW1lU3RhZ2VJZCk7XG5cbiAgICBjb25zdCBsaW5rUGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG5vZGUubGlua2VkQnkpIHtcbiAgICAgIGNvbnN0IGRhdGFFZGdlID0gZWRnZXNGcm9tQ2hpbGQ/LmZpbmQoKGUpID0+IGUua2luZCA9PT0gJ2RhdGEnKTtcbiAgICAgIGxpbmtQYXJ0cy5wdXNoKGB2aWEgJHtub2RlLmxpbmtlZEJ5fSR7d2VpZ2h0U3VmZml4KGRhdGFFZGdlKX1gKTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbEVkZ2UgPSBlZGdlc0Zyb21DaGlsZD8uZmluZCgoZSkgPT4gZS5raW5kID09PSAnY29udHJvbCcpO1xuICAgIGlmIChjb250cm9sRWRnZSkge1xuICAgICAgbGlua1BhcnRzLnB1c2goYFtjb250cm9sJHtjb250cm9sRWRnZS5rZXkgPyBgOiAke2NvbnRyb2xFZGdlLmtleX1gIDogJyd9XSR7d2VpZ2h0U3VmZml4KGNvbnRyb2xFZGdlKX1gKTtcbiAgICB9XG4gICAgY29uc3QgbGluayA9IGxpbmtQYXJ0cy5sZW5ndGggPiAwID8gYCDihpAgJHtsaW5rUGFydHMuam9pbignIOKGkCAnKX1gIDogJyc7XG5cbiAgICBjb25zdCB3cml0ZXMgPSBub2RlLmtleXNXcml0dGVuLmxlbmd0aCA+IDAgPyBgIFt3cm90ZTogJHtub2RlLmtleXNXcml0dGVuLmpvaW4oJywgJyl9XWAgOiAnJztcbiAgICBsaW5lcy5wdXNoKGAkeycgICcucmVwZWF0KGluZGVudCl9JHtub2RlLnN0YWdlTmFtZX0gKCR7bm9kZS5ydW50aW1lU3RhZ2VJZH0pJHtsaW5rfSR7d3JpdGVzfWApO1xuXG4gICAgaWYgKG5vZGUuaW5jb21wbGV0ZVNvdXJjZXMgJiYgbm9kZS5pbmNvbXBsZXRlU291cmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKFxuICAgICAgICBgJHsnICAnLnJlcGVhdChpbmRlbnQgKyAxKX3imqAgYWxzbyBjb25zdW1lZCAke25vZGUuaW5jb21wbGV0ZVNvdXJjZXMuam9pbignLycpfSDigJQgc2xpY2UgbWF5IGJlIGluY29tcGxldGUgaGVyZWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG5vZGUucGFyZW50cykge1xuICAgICAgd2FsayhcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBpbmRlbnQgKyAxLFxuICAgICAgICBub2RlLnBhcmVudEVkZ2VzLmZpbHRlcigoZSkgPT4gZS5wYXJlbnQgPT09IHBhcmVudCksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHdhbGsocm9vdCwgMCk7XG5cbiAgaWYgKHJvb3QudHJ1bmNhdGVkKSB7XG4gICAgY29uc3QgY2F1c2VzID0gW3Jvb3QudHJ1bmNhdGVkLmJ5RGVwdGggJiYgJ21heERlcHRoIHJlYWNoZWQnLCByb290LnRydW5jYXRlZC5ieU5vZGVzICYmICdtYXhOb2RlcyByZWFjaGVkJ11cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5qb2luKCcsICcpO1xuICAgIGxpbmVzLnB1c2goYOKaoCBzbGljZSB0cnVuY2F0ZWQgKCR7Y2F1c2VzfSkg4oCUIG9sZGVyIGNhdXNlcyBleGlzdCBiZXlvbmQgdGhpcyBob3Jpem9uYCk7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8vIOKUgOKUgCBFeHBvcnRlZCBmb3IgdGVzdGluZyAoaW50ZXJuYWwpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogQGludGVybmFsIEV4cG9zZWQgZm9yIHRlc3RpbmcgdGhlIHN0cmF0ZWd5IHNlbGVjdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBfUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQgPSBSRVZFUlNFX0lOREVYX1RIUkVTSE9MRDtcbiJdfQ==
|
|
474
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3RyYWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvYmFja3RyYWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeURHOzs7QUFFSCwyREFBdUU7QUFFdkUsK0NBQXNFO0FBQ3RFLCtDQUF5QztBQWdNekMsMEVBQTBFO0FBRTFFOzs7O0dBSUc7QUFDSCxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQVFwQyxrRUFBa0U7QUFDbEUsU0FBUyxnQkFBZ0IsQ0FBQyxTQUF5QjtJQUNqRCxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBQSxrQ0FBYyxFQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLFNBQXlCO0lBQ25ELE1BQU0sS0FBSyxHQUFHLElBQUEsc0JBQVEsRUFBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxPQUFPLENBQUMsR0FBVyxFQUFFLFNBQWlCLEVBQTRCLEVBQUU7UUFDbEUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRCxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzdDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxNQUFvQixFQUFFLE9BQWU7SUFDM0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJ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QUFFLENBQUM7WUFDbEMsSUFBSSxDQUNGLE1BQU0sRUFDTixNQUFNLEdBQUcsQ0FBQyxFQUNWLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUNwRCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRWQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQzthQUN4RyxNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2QsS0FBSyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsTUFBTSw0Q0FBNEMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQXJERCw4Q0FxREM7QUFFRCwwRUFBMEU7QUFFMUUsNERBQTREO0FBQy9DLFFBQUEsd0JBQXdCLEdBQUcsdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGJhY2t0cmFjay50cyDigJQgQmFja3dhcmQgY2F1c2FsIGNoYWluIGFuYWx5c2lzIG9uIHRoZSBjb21taXQgbG9nLlxuICpcbiAqIEltcGxlbWVudHMgKipiYWNrd2FyZCBwcm9ncmFtIHNsaWNpbmcqKiAoV2Vpc2VyIDE5ODQsIHRoaW4tc2xpY2UgdmFyaWFudCk6XG4gKiBnaXZlbiBhIHN0YXJ0aW5nIGV4ZWN1dGlvbiBzdGVwLCB3YWxrIGJhY2t3YXJkcyB0aHJvdWdoIHJlYWTihpJ3cml0ZVxuICogZGVwZW5kZW5jaWVzIHRvIGJ1aWxkIHRoZSBjYXVzYWwgREFHIHRoYXQgcHJvZHVjZWQgdGhlIGRhdGEgYXQgdGhhdCBzdGVwLlxuICpcbiAqICMjIEFsZ29yaXRobVxuICpcbiAqIEJGUyBvbiB0aGUgaW1wbGljaXQgZGVwZW5kZW5jeSBncmFwaCB3aGVyZSBlZGdlcyBydW4gZnJvbSByZWFkZXIg4oaSIHdyaXRlci5cbiAqXG4gKiAxLiBMb2NhdGUgc3RhcnRJZCBpbiBjb21taXRMb2cg4oaSIHJvb3Qgbm9kZVxuICogMi4gR2V0IGtleXNSZWFkIGZvciByb290IHZpYSBgZ2V0S2V5c1JlYWRgIGNhbGxiYWNrXG4gKiAzLiBGb3IgZWFjaCBrZXkgcmVhZCwgZmluZCB3aG8gbGFzdCB3cm90ZSBpdCBiZWZvcmUgdGhpcyBzdGVwIOKGkiBwYXJlbnQgY29tbWl0XG4gKiAgICAoXCJ3cm90ZVwiIGlzIHRoZSB3cml0ZXIgcnVsZSBvZiBga2V5UGF0aHMudHNgLCA5LjMzLjA6IGEgcm93IG9uIHRoZSBrZXksIGluc2lkZSBpdCwgb3JcbiAqICAgIGFyb3VuZCBpdCB0aGF0IGNoYW5nZWQgaXQg4oCUIHNvIGEgc3RhZ2UgdGhhdCByZWFkIGBjZmdgIGxpbmtzIHRvIHRoZSBzdWJmbG93IHNlZWQgb3JcbiAqICAgIG1lcmdlLWJhY2sgdGhhdCB3cm90ZSBgY2Zn4pCfYmApXG4gKiA0LiBDcmVhdGUgcGFyZW50IENhdXNhbE5vZGUsIGxpbmsgdG8gcm9vdC5wYXJlbnRzXG4gKiA1LiBFbnF1ZXVlIHBhcmVudC4gUmVwZWF0IHVudGlsIHF1ZXVlIGVtcHR5IG9yIGxpbWl0cyBoaXQuXG4gKlxuICogT3V0cHV0IGlzIGEgKipEQUcqKiAobm90IGEgbGlua2VkIGxpc3QpOiBhIHN0YWdlIHJlYWRpbmcgYGNyZWRpdFNjb3JlYCBBTkQgYGR0aWBcbiAqIGZyb20gZGlmZmVyZW50IHdyaXRlcnMgaGFzIHR3byBwYXJlbnRzLlxuICpcbiAqICMjIFN0YWdlZCBPcHRpbWl6YXRpb25cbiAqXG4gKiBUd28gd3JpdGVyLWxvb2t1cCBzdHJhdGVnaWVzLCBjaG9zZW4gYXV0b21hdGljYWxseSBieSBjb21taXQgbG9nIHNpemU6XG4gKlxuICogfCBTdHJhdGVneSB8IFdoZW4gfCBDb21wbGV4aXR5IHBlciBsb29rdXAgfFxuICogfC0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IExpbmVhciBzY2FuIHwgTiDiiaQgMjU2IHwgTyhOKSDigJQgc2ltcGxlIGJhY2t3YXJkIHNjYW4gfFxuICogfCBSZXZlcnNlIGluZGV4IHwgTiA+IDI1NiB8IE8oSyBsb2cgTikg4oCUIHByZWJ1aWx0IGtleeKGkltpbmRpY2VzXSwgYmluYXJ5IHNlYXJjaCB8XG4gKlxuICogVGhlIHRocmVzaG9sZCAoMjU2KSBpcyBjaG9zZW4gc28gdGhlIE8oTikgYnVpbGQgY29zdCBvZiB0aGUgcmV2ZXJzZSBpbmRleFxuICogaXMgYW1vcnRpemVkIG92ZXIgdGhlIEJGUyB0cmF2ZXJzYWwuIEJlbG93IDI1NiwgbGluZWFyIHNjYW4gd2lucyBiZWNhdXNlXG4gKiB0aGVyZSdzIG5vIGluZGV4IGJ1aWxkIG92ZXJoZWFkLiBUaGUgY29uc3VtZXIgbmV2ZXIgc2VlcyB0aGlzIOKAlCBgY2F1c2FsQ2hhaW4oKWBcbiAqIHBpY2tzIHRoZSByaWdodCBzdHJhdGVneSBpbnRlcm5hbGx5IChsaWtlIGEgcXVlcnkgb3B0aW1pemVyIGNob29zaW5nIGJldHdlZW5cbiAqIHNlcXVlbnRpYWwgc2NhbiB2cyBpbmRleCBzY2FuIGJhc2VkIG9uIHRhYmxlIHNpemUpLlxuICpcbiAqICMjIENvbXBsZXhpdHlcbiAqXG4gKiAtICoqU21hbGwgbG9ncyAoTiDiiaQgMjU2KToqKiBPKFYgw5cgSyDDlyBOKSB0b3RhbC4gVj12aXNpdGVkLCBLPWF2ZyBrZXlzL25vZGUuXG4gKiAtICoqTGFyZ2UgbG9ncyAoTiA+IDI1Nik6KiogTyhOIMOXIFUpIGluZGV4IGJ1aWxkICsgTyhWIMOXIEsgw5cgbG9nIE4pIGxvb2t1cHMuXG4gKiAgIFUgPSB1bmlxdWUga2V5cy4gQW1vcnRpemVkIG92ZXIgYWxsIEJGUyBob3BzLlxuICpcbiAqICMjIFJlZmVyZW5jZXNcbiAqXG4gKiAtIFdlaXNlciwgTS4gKDE5ODQpLiBcIlByb2dyYW0gU2xpY2luZy5cIiBJRUVFIFRTRS5cbiAqIC0gU3JpZGhhcmFuLCBNLiBldCBhbC4gKDIwMDcpLiBcIlRoaW4gU2xpY2luZy5cIiBQTERJLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBjYXVzYWxDaGFpbiwgZmxhdHRlbkNhdXNhbERBRywgZm9ybWF0Q2F1c2FsQ2hhaW4gfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogY29uc3QgZGFnID0gY2F1c2FsQ2hhaW4oY29tbWl0TG9nLCAnZGVjaWRlIzInLCAoaWQpID0+IHJlY29yZGVyLmdldEtleXNSZWFkKGlkKSk7XG4gKiBjb25zdCBmbGF0ID0gZmxhdHRlbkNhdXNhbERBRyhkYWcpOyAgICAgLy8gQkZTLW9yZGVyZWQgZmxhdCBsaXN0XG4gKiBjb25zb2xlLmxvZyhmb3JtYXRDYXVzYWxDaGFpbihkYWcpKTsgICAgIC8vIGh1bWFuLXJlYWRhYmxlXG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBidWlsZENvbW1pdEluZGV4LCBmaW5kTGFzdFdyaXRlciB9IGZyb20gJy4vY29tbWl0TG9nVXRpbHMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWdpc3RlcmVkQ29kZSB9IGZyb20gJy4vaG9uZXN0eS5qcyc7XG5pbXBvcnQgeyBxdWVyeVdvcmssIHJlbGF0aW9uLCB3cml0ZXNPbmx5SW5zaWRlIH0gZnJvbSAnLi9rZXlQYXRocy5qcyc7XG5pbXBvcnQgeyBsb2dNb2RlbCB9IGZyb20gJy4vbG9nTW9kZWwuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUsIFRyYWNlRW50cnksIFVudHJhY2tlZFNvdXJjZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyDilIDilIAgVHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBBIHNpbmdsZSBub2RlIGluIHRoZSBjYXVzYWwgREFHLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXVzYWxOb2RlIHtcbiAgLyoqIFVuaXF1ZSBleGVjdXRpb24gc3RlcCBpZGVudGlmaWVyLiAqL1xuICBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICAvKiogU3RhYmxlIHN0YWdlIGlkZW50aWZpZXIuICovXG4gIHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHN0YWdlIG5hbWUuICovXG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICAvKiogS2V5cyB0aGlzIHN0YWdlIHdyb3RlIChmcm9tIGl0cyBDb21taXRCdW5kbGUudHJhY2UpLiAqL1xuICBrZXlzV3JpdHRlbjogc3RyaW5nW107XG4gIC8qKiBUaGUga2V5IHdob3NlIHJlYWTihpJ3cml0ZSBkZXBlbmRlbmN5IGxpbmtlZCB0aGlzIG5vZGUgdG8gaXRzIGNoaWxkLiBFbXB0eSBmb3IgdGhlIHJvb3QuICovXG4gIGxpbmtlZEJ5OiBzdHJpbmc7XG4gIC8qKiBCRlMgZGVwdGggZnJvbSB0aGUgc3RhcnRpbmcgbm9kZSAoMCA9IHN0YXJ0KS4gKi9cbiAgZGVwdGg6IG51bWJlcjtcbiAgLyoqXG4gICAqIFBhcmVudCBub2RlcyDigJQgc3RhZ2VzIHRoaXMgbm9kZSBkZXBlbmRzIG9uLiBEQUc6IG11bHRpcGxlIHBhcmVudHNcbiAgICogcG9zc2libGUuIEtFUFQgZm9yIGNvbXBhdGliaWxpdHk7IHdpdGggdGhlIGBjb250cm9sRGVwc2Agb3B0aW9uXG4gICAqIChSRkMtMDAzIEQzKSBnb3Zlcm5pbmcgZGVjaWRlcnMgYXBwZWFyIGhlcmUgdG9vLiBGb3IgdHlwZWQva2V5ZWQvXG4gICAqIHdlaWdodGVkIGRldGFpbCB1c2Uge0BsaW5rIHBhcmVudEVkZ2VzfS5cbiAgICovXG4gIHBhcmVudHM6IENhdXNhbE5vZGVbXTtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDMg4oCUIG9uZSBlZGdlIHBlciBkZXBlbmRlbmN5IExJTksgKG5vdCBwZXIgcGFyZW50KTogYSBub2RlXG4gICAqIHJlYWRpbmcgdHdvIGtleXMgZnJvbSB0aGUgc2FtZSB3cml0ZXIgaGFzIE9ORSBlbnRyeSBpbiB7QGxpbmsgcGFyZW50c31cbiAgICogYnV0IFRXTyBgJ2RhdGEnYCBlZGdlcyBoZXJlLiBDb250cm9sIGRlcGVuZGVuY2llcyAodmlhIHRoZVxuICAgKiBgY29udHJvbERlcHNgIG9wdGlvbikgYWRkIGEgYCdjb250cm9sJ2AgZWRnZSB0byB0aGUgZ292ZXJuaW5nIGRlY2lkZXIuXG4gICAqL1xuICBwYXJlbnRFZGdlczogQ2F1c2FsRWRnZVtdO1xuICAvKipcbiAgICogUkZDLTAwMyBEMiBob25lc3R5IG1hcmtlciDigJQgc3RhbXBlZCBmcm9tIHRoZSBzdGFnZSdzXG4gICAqIGBDb21taXRCdW5kbGUudW50cmFja2VkU291cmNlc2AuIFByZXNlbnQgd2hlbiB0aGlzIHN0YWdlIEFMU08gY29uc3VtZWRcbiAgICogdW50cmFja2VkIHJlYWQgcGF0aHMgKGBhcmdzYCAvIGBlbnZgIC8gdW5zaGFkb3dlZCBgc2lsZW50YCByZWFkcyk6IHRoZVxuICAgKiBiYWNrd2FyZCBzbGljZSB0aHJvdWdoIHRoaXMgbm9kZSBtYXkgYmUgaW5jb21wbGV0ZSwgYmVjYXVzZSB0aG9zZSByZWFkc1xuICAgKiBwcm9kdWNlIG5vIHJlYWTihpJ3cml0ZSBlZGdlIHRvIGZvbGxvdy4gYGZvcm1hdENhdXNhbENoYWluYCByZW5kZXJzIHRoaXNcbiAgICogYXMgYSBg4pqgIOKApiBzbGljZSBtYXkgYmUgaW5jb21wbGV0ZSBoZXJlYCBsaW5lLiBBYnNlbnQgd2hlbiB0aGUgc3RhZ2Unc1xuICAgKiByZWFkcyB3ZXJlIGZ1bGx5IHRyYWNrZWQuXG4gICAqXG4gICAqIFJlZ2lzdHJ5IGNvZGU6IGAnaW5jb21wbGV0ZS1zb3VyY2VzJ2AgKGBtZW1vcnkvaG9uZXN0eS50cyDCt1xuICAgKiBIT05FU1RZX0NPREVTYCwgc2VydmVkIG9uIGBmb290cHJpbnRqcy90cmFjZWApIHNheXMgd2hhdCB0aGlzIGZpZWxkXG4gICAqIG1lYW5zLiBUaGUgZmllbGQgY2FycmllcyBubyBgY29kZWAg4oCUIGl0cyB2YWx1ZXMgYXJlIHRoZVxuICAgKiB7QGxpbmsgVW50cmFja2VkU291cmNlfXMuXG4gICAqL1xuICBpbmNvbXBsZXRlU291cmNlcz86IFJlYWRvbmx5QXJyYXk8VW50cmFja2VkU291cmNlPjtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDQgdHJ1bmNhdGlvbiB2aXNpYmlsaXR5IOKAlCBzZXQgb24gdGhlIFJPT1Qgbm9kZSBvbmx5LCBhbmQgb25seVxuICAgKiB3aGVuIGEgbGltaXQgYWN0dWFsbHkgY3V0IHRoZSBzbGljZTogYGJ5RGVwdGhgIHdoZW4gYSBub2RlIGF0IHRoZVxuICAgKiBgbWF4RGVwdGhgIGhvcml6b24gc3RpbGwgaGFkIGVkZ2VzIHRvIGV4cGFuZCwgYGJ5Tm9kZXNgIHdoZW4gdGhlXG4gICAqIGBtYXhOb2Rlc2AgYnVkZ2V0IGJsb2NrZWQgY3JlYXRpbmcgYSBkaXNjb3ZlcmVkIHBhcmVudC4gQWJzZW50IHdoZW4gdGhlXG4gICAqIHNsaWNlIGlzIGNvbXBsZXRlLiBgZm9ybWF0Q2F1c2FsQ2hhaW5gIGFwcGVuZHMgYSBg4pqgIHNsaWNlIHRydW5jYXRlZCDigKZgXG4gICAqIGxpbmUg4oCUIGEgY29uc3VtZXIgbXVzdCBuZXZlciBtaXN0YWtlIGEgdHJ1bmNhdGVkIHNsaWNlIGZvciBhIGZ1bGwgb25lLlxuICAgKiAoVW50aWwgOS40OC4wIGRldiBtb2RlIGFsc28gd2FybmVkIG9uIHRoZSBjb25zb2xlOyB0aGUgZmllbGQgaXMgdGhlXG4gICAqIHNpZ25hbCwgcmVhZCBpdC4pXG4gICAqXG4gICAqIFJlZ2lzdHJ5IGNvZGU6IGAndHJ1bmNhdGVkJ2AgKGBtZW1vcnkvaG9uZXN0eS50cyDCtyBIT05FU1RZX0NPREVTYCwgc2VydmVkXG4gICAqIG9uIGBmb290cHJpbnRqcy90cmFjZWApIHNheXMgd2hhdCB0aGlzIGZpZWxkIG1lYW5zOyB0aGUgZmllbGQgY2FycmllcyBub1xuICAgKiBgY29kZWAuXG4gICAqL1xuICB0cnVuY2F0ZWQ/OiB7IGJ5RGVwdGg6IGJvb2xlYW47IGJ5Tm9kZXM6IGJvb2xlYW4gfTtcbiAgLyoqXG4gICAqIEY0YiAoOS4zMy4wKSDigJQgdGhlIGtleXMgdGhpcyBub2RlIHJlYWQgdGhhdCBOTyBjb21taXQgYmVmb3JlIGl0IHdyb3RlICh1bmRlciB0aGUgd3JpdGVyIHJ1bGUpLCBzbyB0aGVcbiAgICogd2FsayBoYXMgbm8gZWRnZSB0byBmb2xsb3cgZm9yIHRoZW06IHRoZWlyIHZhbHVlIGNhbWUgZnJvbSB0aGUgaW5pdGlhbCBzdGF0ZSwgZnJvemVuIHJ1biBpbnB1dCBvciBhXG4gICAqIGNsb3N1cmUg4oCUIG91dHNpZGUgdGhlIGNvbW1pdCBsb2cuIFRoZSBjb2RlIHNheXMgc28gKGAncHJlLXJ1bi1vcmlnaW4nYCwgcmVnaXN0ZXJlZCBpblxuICAgKiBgbWVtb3J5L2hvbmVzdHkudHMgwrcgSE9ORVNUWV9DT0RFU2ApOyBga2V5c2AgYXJlIGluIHRoZSBvcmRlciB0aGUgd2FsayBtZXQgdGhlbS4gQUJTRU5UIHdoZW4gZXZlcnkga2V5XG4gICAqIHRoZSBub2RlIGV4cGFuZGVkIGhhZCBhIHdyaXRlciwgc28gc3VjaCBhIG5vZGUga2VlcHMgaXRzIDkuMzIuMCBzaGFwZS4gQmVmb3JlIDkuMzMuMCB0aGVzZSByZWFkcyB3ZXJlXG4gICAqIGRyb3BwZWQgd2l0aG91dCBhIHdvcmQuXG4gICAqL1xuICBwcmVSdW5SZWFkcz86IHsgY29kZTogUmVnaXN0ZXJlZENvZGU8J3ByZS1ydW4tb3JpZ2luJz47IGtleXM6IHN0cmluZ1tdIH07XG59XG5cbi8qKlxuICogUkZDLTAwMyBEMyDigJQgYSB0eXBlZCBkZXBlbmRlbmN5IGVkZ2UgZnJvbSBhIGNoaWxkIG5vZGUgdG8gb25lIHBhcmVudC5cbiAqXG4gKiAtIGBraW5kOiAnZGF0YSdgICAgIOKAlCByZWFk4oaSd3JpdGUgZGVwZW5kZW5jeTsgYGtleWAgaXMgdGhlIHN0YXRlIGtleS5cbiAqIC0gYGtpbmQ6ICdjb250cm9sJ2Ag4oCUIHRoZSBwYXJlbnQgaXMgdGhlIGRlY2lkZXIvc2VsZWN0b3Igd2hvc2UgZGVjaXNpb25cbiAqICAgYWxsb3dlZCB0aGUgY2hpbGQgdG8gcnVuOyBga2V5YCBpcyB0aGUgZGVjaWRlKCkgcnVsZSBsYWJlbCB3aGVuIHByZXNlbnQuXG4gKlxuICogYHdlaWdodGAgZGVmYXVsdHMgdG8gMS4wOyB0aGUgYHdlaWdoYCBob29rIChSRkMtMDAzIEQ0KSBjYW4gb3ZlcnJpZGUgaXQuXG4gKiBUaGUgZW5naW5lIGl0c2VsZiBORVZFUiBjb21wdXRlcyB3ZWlnaHRzIOKAlCBzZW1hbnRpY3MgYmVsb25nIHRvIHRoZVxuICogY29uc3VtZXItaW5qZWN0ZWQgd2VpZ2hlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXVzYWxFZGdlIHtcbiAgcGFyZW50OiBDYXVzYWxOb2RlO1xuICBraW5kOiAnZGF0YScgfCAnY29udHJvbCc7XG4gIGtleT86IHN0cmluZztcbiAgd2VpZ2h0OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGNGIgKDkuMzMuMCkg4oCUIHByZXNlbnQgb25seSBvbiBhIGAnZGF0YSdgIGVkZ2Ugd2hvc2UgcGFyZW50IHdyb3RlIGBrZXlgIE9OTFkgdGhyb3VnaCByb3dzIGluc2lkZSBpdFxuICAgKiAoYSBzdWJmbG93J3MgaW5wdXQgc2VlZCwgYW4gb3V0cHV0TWFwcGVyIG1lcmdlLWJhY2ssIGEgZm9yayBjaGlsZCdzIG5hbWVzcGFjZSk6IHRoYXQgd3JpdGUgbWFkZSBwYXJ0XG4gICAqIG9mIHRoZSB2YWx1ZSwgYW5kIGVhcmxpZXIgd3JpdGVycyBtYXkgYWNjb3VudCBmb3IgdGhlIHJlc3QuIFJlZ2lzdGVyZWQgYXMgYCduZXN0ZWQtcm93cydgIGluXG4gICAqIGBtZW1vcnkvaG9uZXN0eS50cyDCtyBIT05FU1RZX0NPREVTYC4gQWJzZW50IGZvciBhIHdyaXRlIG9uIG9yIGFyb3VuZCB0aGUga2V5LCBzbyBhbiBleGFjdCBlZGdlIGtlZXBzXG4gICAqIGl0cyA5LjMyLjAgc2hhcGUuXG4gICAqL1xuICBiYXNpcz86IFJlZ2lzdGVyZWRDb2RlPCduZXN0ZWQtcm93cyc+O1xufVxuXG4vKipcbiAqIFJGQy0wMDMgRDMg4oCUIGEgY29udHJvbCBkZXBlbmRlbmN5IHJlc29sdmVkIGZvciBvbmUgZXhlY3V0aW9uIHN0ZXA6XG4gKiB3aGljaCBkZWNpZGVyL3NlbGVjdG9yIGV4ZWN1dGlvbiBhbGxvd2VkIHRoaXMgc3RhZ2UgdG8gcnVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyb2xEZXBlbmRlbmN5IHtcbiAgLyoqIHJ1bnRpbWVTdGFnZUlkIG9mIHRoZSBnb3Zlcm5pbmcgZGVjaWRlci9zZWxlY3RvciBleGVjdXRpb24gc3RlcC4gKi9cbiAgZGVjaWRlcklkOiBzdHJpbmc7XG4gIC8qKiBUaGUgZGVjaWRlKCkgcnVsZSBsYWJlbCBmb3IgdGhlIGNob3NlbiBicmFuY2gsIHdoZW4gcHJlc2VudC4gKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUkZDLTAwMyBEMyDigJQgY2FsbGJhY2sgcmVzb2x2aW5nIHRoZSBnb3Zlcm5pbmcgZGVjaWRlciBmb3IgYW4gZXhlY3V0aW9uXG4gKiBzdGVwLiBSZXR1cm4gYHVuZGVmaW5lZGAgd2hlbiB0aGUgc3RlcCBpcyBub3QgY29udHJvbC1kZXBlbmRlbnQgb24gYW55XG4gKiByZWNvcmRlZCBkZWNpc2lvbi4gQnVpbGQgb25lIHdpdGggYGNvbnRyb2xEZXBSZWNvcmRlcigpYCBmcm9tXG4gKiBgZm9vdHByaW50anMvdHJhY2VgLCBvciBzdXBwbHkgeW91ciBvd24uXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRyb2xEZXBMb29rdXAgPSAocnVudGltZVN0YWdlSWQ6IHN0cmluZykgPT4gQ29udHJvbERlcGVuZGVuY3kgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUkZDLTAwMyBENCDigJQgY29uc3VtZXItaW5qZWN0ZWQgZWRnZSB3ZWlnaGVyLiBDYWxsZWQgb25jZSBwZXIgY3JlYXRlZFxuICogZWRnZTsgcmV0dXJuIGEgd2VpZ2h0LCBvciBgdW5kZWZpbmVkYCB0byBrZWVwIHRoZSBkZWZhdWx0IDEuMC4gVGhlXG4gKiBFTkdJTkUgbmV2ZXIgY29tcHV0ZXMgd2VpZ2h0cyAoemVybyBuZXcgZGVwZW5kZW5jaWVzIOKAlCBzZW1hbnRpY3MgbGlrZVxuICogZW1iZWRkaW5nIHNpbWlsYXJpdHkgb3IgRkRMIGluZmx1ZW5jZSBiZWxvbmcgdG8gZG93bnN0cmVhbSBsaWJyYXJpZXMsXG4gKiB0aGUgc2FtZSBwbHVnLWluIHBhdHRlcm4gYXMgYE5hcnJhdGl2ZUZvcm1hdHRlcmApLiBXZWlnaHRzIHJlbmRlciBpblxuICogYGZvcm1hdENhdXNhbENoYWluYCBhcyBg4oaQIHZpYSBzeXN0ZW1Qcm9tcHQgKDAuMTgpYC5cbiAqL1xuZXhwb3J0IHR5cGUgRWRnZVdlaWdoZXIgPSAoXG4gIGNoaWxkOiBDYXVzYWxOb2RlLFxuICBwYXJlbnQ6IENhdXNhbE5vZGUsXG4gIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBraW5kOiAnZGF0YScgfCAnY29udHJvbCcsXG4pID0+IG51bWJlciB8IHVuZGVmaW5lZDtcblxuLyoqIE9wdGlvbnMgZm9yIGNhdXNhbENoYWluKCkuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdXNhbENoYWluT3B0aW9ucyB7XG4gIC8qKiBNYXhpbXVtIEJGUyBkZXB0aCAoZGVmYXVsdDogMjApLiBQcmV2ZW50cyBydW5hd2F5IHRyYXZlcnNhbC4gKi9cbiAgbWF4RGVwdGg/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHRvdGFsIG5vZGVzIHRvIHZpc2l0IChkZWZhdWx0OiAxMDApLiBIYXJkIGNhcCBmb3Igc2FmZXR5LiAqL1xuICBtYXhOb2Rlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDMg4oCUIGNvbnRyb2wtZGVwZW5kZW5jZSBsb29rdXAuIFdoZW4gcHJvdmlkZWQsIGV4cGFuZGluZyBhIG5vZGVcbiAgICogQUxTTyBsaW5rcyBhIGAnY29udHJvbCdgIGVkZ2UgdG8gaXRzIGdvdmVybmluZyBkZWNpZGVyIChsYWJlbGVkIGJ5IHRoZVxuICAgKiBkZWNpZGUoKSBydWxlIGxhYmVsIHdoZW4gcHJlc2VudCk7IHRoZSBkZWNpZGVyIG5vZGUgdGhlbiBleHBhbmRzXG4gICAqIG5vcm1hbGx5IHRocm91Z2ggaXRzIG93biBkYXRhIHJlYWRzLCBzbyBjaGFpbnMgbGlrZVxuICAgKiBgc3RhdHVzIOKGkCBbY29udHJvbF0gQ2xhc3NpZnlSaXNrIOKGkCBbZGF0YTogY3JlZGl0U2NvcmVdIFB1bGxCdXJlYXVgXG4gICAqIHJlc29sdmUgZW5kLXRvLWVuZC4gV2l0aG91dCB0aGlzIG9wdGlvbiBiZWhhdmlvciBpcyB1bmNoYW5nZWQuXG4gICAqL1xuICBjb250cm9sRGVwcz86IENvbnRyb2xEZXBMb29rdXA7XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQ0IOKAlCBlZGdlIHdlaWdoZXIuIFN0YW1wcyBgQ2F1c2FsRWRnZS53ZWlnaHRgIGF0IGVkZ2UgY3JlYXRpb247XG4gICAqIGB1bmRlZmluZWRgIChvciBubyB3ZWlnaGVyKSDihpIgMS4wLiBTZWUge0BsaW5rIEVkZ2VXZWlnaGVyfS5cbiAgICovXG4gIHdlaWdoPzogRWRnZVdlaWdoZXI7XG4gIC8qKlxuICAgKiAjUDEg4oCUIGhvdyBhIG5vZGUncyBleHBhbnNpb24gcmVhZC1zZXQgaXMgZGVyaXZlZDpcbiAgICpcbiAgICogLSBgJ3N0YWdlJ2AgKGRlZmF1bHQsIGhpc3RvcmljYWwpIOKAlCBldmVyeSB2aXNpdGVkIG5vZGUgZXhwYW5kcyB0aHJvdWdoXG4gICAqICAgQUxMIG9mIGl0cyBzdGFnZSdzIHJlYWRzIChgZ2V0S2V5c1JlYWRgKS4gQSBzdGFnZSByZWFkaW5nIGBhLGJgIGFuZFxuICAgKiAgIHdyaXRpbmcgYHgseWAgbGlua3MgYm90aCByZWFkcyBhcyBjYXVzZXMgb2YgYm90aCB3cml0ZXMg4oCUIGEgc291bmQgYnV0XG4gICAqICAgY29hcnNlIG92ZXItYXBwcm94aW1hdGlvbi5cbiAgICogLSBgJ3Blci13cml0ZSdgIOKAlCB3aGVuIHRoZSBjb21taXQgbG9nIGNhcnJpZXMgcGVyLXdyaXRlIHJlYWQgcHJvdmVuYW5jZVxuICAgKiAgIChgVHJhY2VFbnRyeS5yZWFkS2V5c2AsIHJlY29yZGVkIHVuZGVyIHRoZSBleGVjdXRvcidzXG4gICAqICAgYHdyaXRlUHJvdmVuYW5jZTogJ3JlYWRzLXByZWZpeCdgIGRpYWwpLCBhIG5vZGUgcmVhY2hlZCB2aWEga2V5IGBrYFxuICAgKiAgIGV4cGFuZHMgdGhyb3VnaCBPTkxZIHRoZSByZWFkcyB0aGF0IHByZWNlZGVkIGl0cyB3cml0ZSBvZiBga2BcbiAgICogICAodGVtcG9yYWwgcHJlZml4KS4gTm9kZXMgbGlua2VkIGxhdGVyIHZpYSBhZGRpdGlvbmFsIGtleXMgYXJlXG4gICAqICAgaW5jcmVtZW50YWxseSByZS1leHBhbmRlZCB3aXRoIGp1c3QgdGhlIG5ldyByZWFkcyAod29ya2xpc3Qg4oCUIHRoZVxuICAgKiAgIHNsaWNlIG9ubHkgZXZlciBHUk9XUyB0b3dhcmQgdGhlIHN0YWdlLWxldmVsIGNlaWxpbmcpLiBIT05FU1RcbiAgICogICBGQUxMQkFDSzogYW55IGxpbmsgd2hvc2UgdHJhY2UgZW50cnkgbGFja3MgYHJlYWRLZXlzYCBleHBhbmRzIHRoYXRcbiAgICogICBub2RlIGF0IHN0YWdlIGxldmVsIOKAlCBtaXhlZCBvciBkaWFsLW9mZiBsb2dzIGRlZ3JhZGUgdG8gYCdzdGFnZSdgXG4gICAqICAgYmVoYXZpb3IgZXhhY3RseSwgbmV2ZXIgdG8gc2lsZW5jZS5cbiAgICovXG4gIGVkZ2VBdHRyaWJ1dGlvbj86ICdzdGFnZScgfCAncGVyLXdyaXRlJztcbiAgLyoqXG4gICAqICNQMSDigJQgdGhlIHdyaXR0ZW4ga2V5cyB0aGF0IGFuY2hvciB0aGUgUk9PVCdzIGV4cGFuc2lvbiB1bmRlclxuICAgKiBgJ3Blci13cml0ZSdgIChlLmcuIGBzbGljZUZvcktleWAgcGFzc2VzIHRoZSBzbGljZWQga2V5LCBzbyB0aGUgcm9vdFxuICAgKiBleHBhbmRzIHRocm91Z2ggdGhlIHJlYWRzIHRoYXQgZmVkIFRIQVQgd3JpdGUsIG5vdCB0aGUgd2hvbGUgc3RhZ2UpLlxuICAgKiBJZ25vcmVkIHVuZGVyIGAnc3RhZ2UnYC4gVW5zZXQg4oaSIHJvb3QgZXhwYW5kcyBhdCBzdGFnZSBsZXZlbC5cbiAgICovXG4gIHJvb3RMaW5rS2V5cz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENhbGxiYWNrIHRoYXQgcmV0dXJucyB0aGUga2V5cyBhIHN0YWdlIHJlYWQgZHVyaW5nIGV4ZWN1dGlvbi5cbiAqIFRoZSBiYWNrdHJhY2tlciBjYWxscyB0aGlzIGZvciBlYWNoIHZpc2l0ZWQgbm9kZSB0byBkZXRlcm1pbmVcbiAqIHdoaWNoIHJlYWTihpJ3cml0ZSBlZGdlcyB0byBmb2xsb3cuXG4gKlxuICogSW1wbGVtZW50b3JzOiBRdWFsaXR5UmVjb3JkZXIgdHJhY2tzIGtleXNSZWFkIHBlciBzdGVwLFxuICogb3IgYnVpbGQgYSBNYXA8cnVudGltZVN0YWdlSWQsIHN0cmluZ1tdPiBmcm9tIFNjb3BlUmVjb3JkZXIub25SZWFkIGV2ZW50cy5cbiAqL1xuZXhwb3J0IHR5cGUgS2V5c1JlYWRMb29rdXAgPSAocnVudGltZVN0YWdlSWQ6IHN0cmluZykgPT4gc3RyaW5nW107XG5cbi8vIOKUgOKUgCBTdGFnZWQgb3B0aW1pemF0aW9uOiB3cml0ZXIgbG9va3VwIHN0cmF0ZWdpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogVGhyZXNob2xkIGZvciBzd2l0Y2hpbmcgZnJvbSBsaW5lYXIgc2NhbiB0byByZXZlcnNlIGluZGV4LlxuICogQmVsb3cgdGhpcywgTyhOKSBzY2FuIGlzIGZhc3RlciAobm8gaW5kZXggYnVpbGQgY29zdCkuXG4gKiBBYm92ZSB0aGlzLCBPKGxvZyBOKSBiaW5hcnkgc2VhcmNoIHdpbnMuXG4gKi9cbmNvbnN0IFJFVkVSU0VfSU5ERVhfVEhSRVNIT0xEID0gMjU2O1xuXG4vKipcbiAqIFdyaXRlciBsb29rdXAgZnVuY3Rpb24gc2lnbmF0dXJlLlxuICogUmV0dXJucyB0aGUgQ29tbWl0QnVuZGxlIHRoYXQgbGFzdCB3cm90ZSBga2V5YCBiZWZvcmUgcG9zaXRpb24gYGJlZm9yZUlkeGAuXG4gKi9cbnR5cGUgV3JpdGVyTG9va3VwID0gKGtleTogc3RyaW5nLCBiZWZvcmVJZHg6IG51bWJlcikgPT4gQ29tbWl0QnVuZGxlIHwgdW5kZWZpbmVkO1xuXG4vKiogU3RyYXRlZ3kgMTogTGluZWFyIHNjYW4g4oCUIE8oTikgcGVyIGxvb2t1cCwgemVybyBzZXR1cCBjb3N0LiAqL1xuZnVuY3Rpb24gbGluZWFyU2Nhbkxvb2t1cChjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdKTogV3JpdGVyTG9va3VwIHtcbiAgcmV0dXJuIChrZXksIGJlZm9yZUlkeCkgPT4gZmluZExhc3RXcml0ZXIoY29tbWl0TG9nLCBrZXksIGJlZm9yZUlkeCk7XG59XG5cbi8qKlxuICogU3RyYXRlZ3kgMjogUmV2ZXJzZSBpbmRleCDigJQgb25lIE8ocm93cykgYnVpbGQsIE8oZGVwdGggKyBsb2cgTikgcGVyIGxvb2t1cC5cbiAqIFRoZSBsb2cncyByZWFkIG1vZGVsIChgbG9nTW9kZWwudHNgOiBhIHBhdGggdHJpZSwgZWFjaCB0b3AtbGV2ZWwga2V5IGZvbGRlZCBhdFxuICogbW9zdCBvbmNlKSBhbnN3ZXJzIHRoZSB3cml0ZXIgcnVsZSDigJQgcm93cyBvbiwgaW5zaWRlIG9yIGFyb3VuZCB0aGUga2V5IOKAlCBieVxuICogYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGxhc3Qgd3JpdGUgb24gb3IgaW5zaWRlIGl0LCB0aGVuIGEgdmVyZGljdCBvbmx5IGZvciB0aGVcbiAqIGFyb3VuZC1jYW5kaWRhdGVzIGFmdGVyIGl0LiBUaGUgc2FtZSBhbnN3ZXIgYGZpbmRMYXN0V3JpdGVyYCBnaXZlcywgc28gdGhlXG4gKiBzdHJhdGVneSBzd2l0Y2ggYmVsb3cgbmV2ZXIgY2hhbmdlcyBhIHNsaWNlLlxuICovXG5mdW5jdGlvbiByZXZlcnNlSW5kZXhMb29rdXAoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSk6IFdyaXRlckxvb2t1cCB7XG4gIGNvbnN0IG1vZGVsID0gbG9nTW9kZWwoY29tbWl0TG9nKTtcbiAgcmV0dXJuIChrZXk6IHN0cmluZywgYmVmb3JlSWR4OiBudW1iZXIpOiBDb21taXRCdW5kbGUgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IGF0ID0gbW9kZWwubGFzdFdyaXRlckJlZm9yZShrZXksIGJlZm9yZUlkeCk7XG4gICAgcmV0dXJuIGF0ID49IDAgPyBjb21taXRMb2dbYXRdIDogdW5kZWZpbmVkO1xuICB9O1xufVxuXG4vKipcbiAqIFRoZSB0cmFjZSBlbnRyaWVzIG9mIGBjb21taXRgIHRoYXQgbWFrZSBpdCBhIHdyaXRlciBvZiBgbGlua0tleWAg4oCUIHRoZSBlbnRyaWVzIHdob3NlIHJlYWRcbiAqIHByZWZpeCAoYFRyYWNlRW50cnkucmVhZEtleXNgKSBhIHBlci13cml0ZSBlZGdlIGV4cGFuZHMgdGhyb3VnaC4gVGhlIEZJUlNUIGVudHJ5IG9uIHRoZSBleGFjdFxuICogcGF0aCB3aGVuIHRoZXJlIGlzIG9uZSAodGhlICNQMSBiZWhhdmlvdXIsIHVuY2hhbmdlZCk7IG90aGVyd2lzZSBldmVyeSBlbnRyeSBpbnNpZGUgb3IgYXJvdW5kXG4gKiB0aGUga2V5ICg5LjMzLjA6IHRoZSBjb21taXQgd3JvdGUgdGhlIGtleSB0aHJvdWdoIGEgbmVzdGVkIHJvdyDigJQgYSBzdWJmbG93IHNlZWQsIGFuXG4gKiBvdXRwdXRNYXBwZXIgbWVyZ2UtYmFjayDigJQgYW5kIGFsbCBvZiB0aG9zZSByb3dzIHdyb3RlIGl0KS5cbiAqL1xuZnVuY3Rpb24gbGlua2luZ0VudHJpZXMoY29tbWl0OiBDb21taXRCdW5kbGUsIGxpbmtLZXk6IHN0cmluZyk6IFRyYWNlRW50cnlbXSB7XG4gIGNvbnN0IGV4YWN0ID0gY29tbWl0LnRyYWNlLmZpbmQoKHQpID0+IHQucGF0aCA9PT0gbGlua0tleSk7XG4gIGlmIChleGFjdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gW2V4YWN0XTtcbiAgcmV0dXJuIGNvbW1pdC50cmFjZS5maWx0ZXIoKHQpID0+IHJlbGF0aW9uKHQucGF0aCwgbGlua0tleSkgIT09IHVuZGVmaW5lZCk7XG59XG5cbi8qKlxuICogU3RhZ2VkIG9wdGltaXphdGlvbjogcGljayB0aGUgcmlnaHQgd3JpdGVyLWxvb2t1cCBzdHJhdGVneSBiYXNlZCBvbiBkYXRhIHNpemUuXG4gKlxuICogTGlrZSBhIGRhdGFiYXNlIHF1ZXJ5IG9wdGltaXplciBjaG9vc2luZyBiZXR3ZWVuIHNlcXVlbnRpYWwgc2NhbiBhbmQgaW5kZXggc2NhbjpcbiAqXG4gKiAtICoqU21hbGwgbG9nICjiiaQgMjU2KToqKiBMaW5lYXIgc2NhbiB3aW5zLiBaZXJvIHNldHVwIGNvc3QsIGdvb2QgY2FjaGUgbG9jYWxpdHkuXG4gKiAgIFRoZSBvdmVyaGVhZCBvZiBidWlsZGluZyBhIHJldmVyc2UgaW5kZXggaXNuJ3Qgd29ydGggaXQgZm9yIHNob3J0IGxvZ3MuXG4gKlxuICogLSAqKkxhcmdlIGxvZyAoPiAyNTYpOioqIFJldmVyc2UgaW5kZXggd2lucy4gTyhOw5dVKSB1cGZyb250IGJ1aWxkIGNvc3QgaXMgYW1vcnRpemVkXG4gKiAgIGFjcm9zcyBhbGwgQkZTIGhvcHMuIEVhY2ggbG9va3VwIGJlY29tZXMgTyhsb2cgTikgdmlhIGJpbmFyeSBzZWFyY2ggaW5zdGVhZCBvZiBPKE4pLlxuICogICBGb3IgYW4gYWdlbnQgbG9vcCB3aXRoIDUwMCBpdGVyYXRpb25zIGFuZCA1IGtleXMgcGVyIGhvcCwgdGhpcyBpcyA1MDDDlzXDl2xvZyg1MDAp4omIMjJLIG9wc1xuICogICB2cyA1MDDDlzXDlzUwMD0xLjI1TSBvcHMgd2l0aCBsaW5lYXIgc2Nhbi5cbiAqXG4gKiBUaGUgY2FsbGVyIG5ldmVyIHNlZXMgdGhpcyDigJQgYGNhdXNhbENoYWluKClgIHBpY2tzIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVdyaXRlckxvb2t1cChjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdKTogV3JpdGVyTG9va3VwIHtcbiAgaWYgKGNvbW1pdExvZy5sZW5ndGggPD0gUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQpIHtcbiAgICByZXR1cm4gbGluZWFyU2Nhbkxvb2t1cChjb21taXRMb2cpO1xuICB9XG4gIHJldHVybiByZXZlcnNlSW5kZXhMb29rdXAoY29tbWl0TG9nKTtcbn1cblxuLy8g4pSA4pSAIENvcmUgYWxnb3JpdGhtIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFJGQy0wMDMgRDI6IHRoZSBgaW5jb21wbGV0ZVNvdXJjZXNgIG5vZGUgZnJhZ21lbnQgZm9yIGEgY29tbWl0IOKAlCBge31gXG4gKiB3aGVuIHRoZSBzdGFnZSBjb25zdW1lZCBubyB1bnRyYWNrZWQgcmVhZCBwYXRocywga2VlcGluZyB0aGUgZmllbGRcbiAqIEFCU0VOVCAobm90IGVtcHR5LWFycmF5LXZhbHVlZCkgZm9yIGZ1bGx5LXRyYWNrZWQgc3RhZ2VzLlxuICovXG5mdW5jdGlvbiBpbmNvbXBsZXRlU291cmNlc0ZyYWdtZW50KGNvbW1pdDogQ29tbWl0QnVuZGxlKTogeyBpbmNvbXBsZXRlU291cmNlcz86IFJlYWRvbmx5QXJyYXk8VW50cmFja2VkU291cmNlPiB9IHtcbiAgaWYgKCFjb21taXQudW50cmFja2VkU291cmNlcyB8fCBjb21taXQudW50cmFja2VkU291cmNlcy5sZW5ndGggPT09IDApIHJldHVybiB7fTtcbiAgcmV0dXJuIHsgaW5jb21wbGV0ZVNvdXJjZXM6IGNvbW1pdC51bnRyYWNrZWRTb3VyY2VzIH07XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGNhdXNhbCBEQUcgcm9vdGVkIGF0IGBzdGFydElkYCBieSB3YWxraW5nIGJhY2t3YXJkc1xuICogdGhyb3VnaCByZWFk4oaSd3JpdGUgZGVwZW5kZW5jaWVzIGluIHRoZSBjb21taXQgbG9nLlxuICpcbiAqIEF1dG9tYXRpY2FsbHkgc2VsZWN0cyB0aGUgb3B0aW1hbCB3cml0ZXIgbG9va3VwIHN0cmF0ZWd5OlxuICogLSBMaW5lYXIgc2NhbiBmb3Igc21hbGwgbG9ncyAo4omkIDI1NiBjb21taXRzKVxuICogLSBSZXZlcnNlIGluZGV4IHdpdGggYmluYXJ5IHNlYXJjaCBmb3IgbGFyZ2UgbG9ncyAoPiAyNTYgY29tbWl0cylcbiAqXG4gKiBQcm9kdWNlcyBhIERBRyAobm90IGEgdHJlZSk6IGlmIHR3byBjaGlsZHJlbiBib3RoIHJlYWQgZnJvbSB0aGUgc2FtZVxuICogcGFyZW50LCB0aGUgcGFyZW50IG5vZGUgaXMgc2hhcmVkIChkZWR1cGVkIGJ5IHJ1bnRpbWVTdGFnZUlkKS5cbiAqXG4gKiBAcGFyYW0gY29tbWl0TG9nICAgT3JkZXJlZCBjb21taXQgYnVuZGxlcyBmcm9tIGV4ZWN1dG9yLmdldFNuYXBzaG90KCkuY29tbWl0TG9nXG4gKiBAcGFyYW0gc3RhcnRJZCAgICAgcnVudGltZVN0YWdlSWQgdG8gc3RhcnQgYmFja3RyYWNraW5nIGZyb21cbiAqIEBwYXJhbSBnZXRLZXlzUmVhZCBDYWxsYmFjayByZXR1cm5pbmcga2V5cyByZWFkIGJ5IGEgZ2l2ZW4gZXhlY3V0aW9uIHN0ZXBcbiAqIEBwYXJhbSBvcHRpb25zICAgICBEZXB0aCBhbmQgbm9kZSBsaW1pdHNcbiAqIEByZXR1cm5zIFJvb3QgQ2F1c2FsTm9kZSB3aXRoIC5wYXJlbnRzIGZvcm1pbmcgdGhlIERBRywgb3IgdW5kZWZpbmVkIGlmIHN0YXJ0SWQgbm90IGZvdW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXVzYWxDaGFpbihcbiAgY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSxcbiAgc3RhcnRJZDogc3RyaW5nLFxuICBnZXRLZXlzUmVhZDogS2V5c1JlYWRMb29rdXAsXG4gIG9wdGlvbnM/OiBDYXVzYWxDaGFpbk9wdGlvbnMsXG4pOiBDYXVzYWxOb2RlIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGJ1aWxkQ2F1c2FsQ2hhaW4oY29tbWl0TG9nLCBzdGFydElkLCBnZXRLZXlzUmVhZCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogSW50ZXJuYWwgc2xpY2UgY29tcG9zaXRpb246IGtlZXAgdGhlIGFjdHVhbCBidW5kbGUgc2VsZWN0ZWQgYnkgdGhlIHdyaXRlclxuICogcXVlcnkgKGluY2x1ZGluZyBhIG5vbmVtcHR5IGNvbnRpbnVhdGlvbikuIFRoaXMgaXMgbm90IGEgcHVibGljIGVudHJ5IHBvaW50LlxuICogVGhlIHJlYWQgcG9zaXRpb24gc3RpbGwgYmVsb25ncyB0byB0aGUgZXhlY3V0aW9uJ3MgZmlyc3QgY29tbWl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2F1c2FsQ2hhaW5Gcm9tQ29tbWl0KFxuICBjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLFxuICB3cml0ZXI6IENvbW1pdEJ1bmRsZSxcbiAgZ2V0S2V5c1JlYWQ6IEtleXNSZWFkTG9va3VwLFxuICBvcHRpb25zPzogQ2F1c2FsQ2hhaW5PcHRpb25zLFxuKTogQ2F1c2FsTm9kZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBidWlsZENhdXNhbENoYWluKGNvbW1pdExvZywgd3JpdGVyLnJ1bnRpbWVTdGFnZUlkLCBnZXRLZXlzUmVhZCwgb3B0aW9ucywgd3JpdGVyKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDYXVzYWxDaGFpbihcbiAgY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSxcbiAgc3RhcnRJZDogc3RyaW5nLFxuICBnZXRLZXlzUmVhZDogS2V5c1JlYWRMb29rdXAsXG4gIG9wdGlvbnM/OiBDYXVzYWxDaGFpbk9wdGlvbnMsXG4gIHNlbGVjdGVkV3JpdGVyPzogQ29tbWl0QnVuZGxlLFxuKTogQ2F1c2FsTm9kZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1heERlcHRoID0gb3B0aW9ucz8ubWF4RGVwdGggPz8gMjA7XG4gIGNvbnN0IG1heE5vZGVzID0gb3B0aW9ucz8ubWF4Tm9kZXMgPz8gMTAwO1xuICBjb25zdCBjb250cm9sRGVwcyA9IG9wdGlvbnM/LmNvbnRyb2xEZXBzO1xuICBjb25zdCB3ZWlnaCA9IG9wdGlvbnM/LndlaWdoO1xuICBjb25zdCBwZXJXcml0ZSA9IG9wdGlvbnM/LmVkZ2VBdHRyaWJ1dGlvbiA9PT0gJ3Blci13cml0ZSc7XG5cbiAgLy8gUkZDLTAwMyBENCDigJQgdHJ1bmNhdGlvbiB2aXNpYmlsaXR5LiBTZXQgb25seSB3aGVuIGEgbGltaXQgYWN0dWFsbHlcbiAgLy8gY3V0cyB0aGUgc2xpY2U7IHN1cmZhY2VkIG9uIHRoZSByb290IGFzIGB0cnVuY2F0ZWRgIHNvIGEgY29uc3VtZXIgY2FuXG4gIC8vIG5ldmVyIG1pc3Rha2UgYSB0cnVuY2F0ZWQgc2xpY2UgZm9yIGEgY29tcGxldGUgb25lLlxuICBsZXQgdHJ1bmNhdGVkQnlEZXB0aCA9IGZhbHNlO1xuICBsZXQgdHJ1bmNhdGVkQnlOb2RlcyA9IGZhbHNlO1xuXG4gIC8vIEEgY29udGludWF0aW9uIG1heSB3cml0ZSBtb3JlIGRhdGEsIGJ1dCBpdCBpcyBub3QgYW5vdGhlciBleGVjdXRpb24gb2ZcbiAgLy8gdGhlIHN0YWdlJ3MgcmVhZHMuIFVzZSB0aGUgc2hhcmVkIEZJUlNULWNvbW1pdCBydWxlIGZvciBldmVyeSByZWFkIGN1dG9mZjtcbiAgLy8ga2VlcCB3cml0ZXIgYnVuZGxlcyBzZXBhcmF0ZWx5IGZvciB0aGVpciB3cml0ZSBtZXRhZGF0YSBhbmQgcmVhZCBwcmVmaXhlcy5cbiAgY29uc3QgaWR4TWFwID0gYnVpbGRDb21taXRJbmRleChjb21taXRMb2cpO1xuICBxdWVyeVdvcmsudW5pdHMgKz0gY29tbWl0TG9nLmxlbmd0aDtcblxuICBjb25zdCBzdGFydElkeCA9IGlkeE1hcC5nZXQoc3RhcnRJZCk7XG4gIGlmIChzdGFydElkeCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHN0YXJ0Q29tbWl0ID0gc2VsZWN0ZWRXcml0ZXIgPz8gY29tbWl0TG9nW3N0YXJ0SWR4XTtcblxuICAvLyBQaWNrIHdyaXRlciBsb29rdXAgc3RyYXRlZ3kgYmFzZWQgb24gbG9nIHNpemVcbiAgY29uc3QgZmluZFdyaXRlciA9IGNyZWF0ZVdyaXRlckxvb2t1cChjb21taXRMb2cpO1xuXG4gIC8vIE5vZGUgZGVkdXAgbWFwOiBydW50aW1lU3RhZ2VJZCDihpIgQ2F1c2FsTm9kZSAoZW5zdXJlcyBEQUcsIG5vdCB0cmVlKVxuICBjb25zdCBub2RlTWFwID0gbmV3IE1hcDxzdHJpbmcsIENhdXNhbE5vZGU+KCk7XG5cbiAgY29uc3Qgcm9vdDogQ2F1c2FsTm9kZSA9IHtcbiAgICBydW50aW1lU3RhZ2VJZDogc3RhcnRJZCxcbiAgICBzdGFnZUlkOiBzdGFydENvbW1pdC5zdGFnZUlkLFxuICAgIHN0YWdlTmFtZTogc3RhcnRDb21taXQuc3RhZ2UsXG4gICAga2V5c1dyaXR0ZW46IHN0YXJ0Q29tbWl0LnRyYWNlLm1hcCgodCkgPT4gdC5wYXRoKSxcbiAgICBsaW5rZWRCeTogJycsXG4gICAgZGVwdGg6IDAsXG4gICAgcGFyZW50czogW10sXG4gICAgcGFyZW50RWRnZXM6IFtdLFxuICAgIC4uLmluY29tcGxldGVTb3VyY2VzRnJhZ21lbnQoc3RhcnRDb21taXQpLFxuICB9O1xuICBub2RlTWFwLnNldChzdGFydElkLCByb290KTtcblxuICAvLyDilIDilIAgI1AxIHBlci13cml0ZSBhdHRyaWJ1dGlvbiBtYWNoaW5lcnkgKGluZXJ0IHVuZGVyICdzdGFnZScpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBleHBhbmRlZFJlYWRzOiBwZXIgbm9kZSwgdGhlIHJlYWRzIGFscmVhZHkgcXVldWVkIGZvciBleHBhbnNpb24g4oCUIGxhdGVcbiAgLy8gbGlua3MgdmlhIGFkZGl0aW9uYWwga2V5cyByZS1lbnF1ZXVlIG9ubHkgdGhlIERFTFRBLCBzbyB0aGUgc2xpY2UgZ3Jvd3NcbiAgLy8gbW9ub3RvbmljYWxseSB0b3dhcmQgdGhlIHN0YWdlLWxldmVsIGNlaWxpbmcgYW5kIHRlcm1pbmF0ZXMgKGVhY2gga2V5XG4gIC8vIGV4cGFuZHMgYXQgbW9zdCBvbmNlIHBlciBub2RlKS4gZnVsbHlFeHBhbmRlZDogbm9kZXMgdGhhdCBmZWxsIGJhY2sgdG9cbiAgLy8gc3RhZ2UgbGV2ZWwgKG5vIHJlYWRLZXlzIG9uIGEgbGlua2luZyBlbnRyeSkg4oCUIG5vdGhpbmcgbGVmdCB0byBhZGQuXG4gIGNvbnN0IGV4cGFuZGVkUmVhZHMgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG4gIGNvbnN0IGZ1bGx5RXhwYW5kZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUmVzb2x2ZSBhIG5vZGUncyBleHBhbnNpb24gcmVhZC1zZXQgZm9yIHRoZSBnaXZlbiBsaW5raW5nIFdSSVRURU4ga2V5cy5cbiAgICogUGVyLXdyaXRlIG1vZGUgd2l0aCBwcm92ZW5hbmNlIHByZXNlbnQg4oaSIHVuaW9uIG9mIHRoZSBsaW5raW5nIHdyaXRlcydcbiAgICogdGVtcG9yYWwtcHJlZml4IGByZWFkS2V5c2AuIEFueSBsaW5raW5nIGVudHJ5IFdJVEhPVVQgYHJlYWRLZXlzYCAob3Igbm9cbiAgICogbGlua0tleXMgYXQgYWxsKSDihpIgaG9uZXN0IHN0YWdlLWxldmVsIGZhbGxiYWNrLCBmbGFnZ2VkIHZpYSB0aGUgc2Vjb25kXG4gICAqIHR1cGxlIG1lbWJlciBzbyB0aGUgY2FsbGVyIG1hcmtzIHRoZSBub2RlIGZ1bGx5IGV4cGFuZGVkLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVhZHNGb3JMaW5rcyhjb21taXQ6IENvbW1pdEJ1bmRsZSwgbGlua0tleXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogW3N0cmluZ1tdLCBib29sZWFuXSB7XG4gICAgaWYgKCFwZXJXcml0ZSB8fCAhbGlua0tleXMgfHwgbGlua0tleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW2dldEtleXNSZWFkKGNvbW1pdC5ydW50aW1lU3RhZ2VJZCksIHRydWVdO1xuICAgIH1cbiAgICBjb25zdCB1bmlvbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgbGlua0tleSBvZiBsaW5rS2V5cykge1xuICAgICAgY29uc3QgZW50cmllcyA9IGxpbmtpbmdFbnRyaWVzKGNvbW1pdCwgbGlua0tleSk7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDAgfHwgZW50cmllcy5zb21lKChlKSA9PiBlLnJlYWRLZXlzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIC8vIE1peGVkL2RpYWwtb2ZmIGxvZyDigJQgZGVncmFkZSBUSElTIG5vZGUgdG8gc3RhZ2UgbGV2ZWwsIGhvbmVzdGx5LlxuICAgICAgICByZXR1cm4gW2dldEtleXNSZWFkKGNvbW1pdC5ydW50aW1lU3RhZ2VJZCksIHRydWVdO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSBmb3IgKGNvbnN0IHJrIG9mIGVudHJ5LnJlYWRLZXlzIGFzIHN0cmluZ1tdKSB1bmlvbi5hZGQocmspO1xuICAgIH1cbiAgICByZXR1cm4gW1suLi51bmlvbl0sIGZhbHNlXTtcbiAgfVxuXG4gIC8vIEJGUy93b3JrbGlzdCBxdWV1ZTogW25vZGUsIGNvbW1pdElkeCwgZGVwdGgsIGtleXNUb0V4cGFuZF1cbiAgY29uc3QgW3Jvb3RSZWFkcywgcm9vdElzRnVsbF0gPSBwZXJXcml0ZVxuICAgID8gcmVhZHNGb3JMaW5rcyhzdGFydENvbW1pdCwgb3B0aW9ucz8ucm9vdExpbmtLZXlzKVxuICAgIDogW2dldEtleXNSZWFkKHN0YXJ0SWQpLCB0cnVlXTtcbiAgZXhwYW5kZWRSZWFkcy5zZXQoc3RhcnRJZCwgbmV3IFNldChyb290UmVhZHMpKTtcbiAgaWYgKHJvb3RJc0Z1bGwpIGZ1bGx5RXhwYW5kZWQuYWRkKHN0YXJ0SWQpO1xuICBjb25zdCBxdWV1ZTogQXJyYXk8W0NhdXNhbE5vZGUsIG51bWJlciwgbnVtYmVyLCBzdHJpbmdbXV0+ID0gW1tyb290LCBzdGFydElkeCwgMCwgcm9vdFJlYWRzXV07XG4gIGxldCB2aXNpdGVkID0gMTtcblxuICAvKipcbiAgICogTGluayBgbm9kZSDihpIgcGFyZW50YCAoY3JlYXRpbmcgKyBlbnF1ZXVlaW5nIHRoZSBwYXJlbnQgd2hlbiBuZXcpLlxuICAgKiBTaGFyZWQgYnkgZGF0YS1lZGdlIGV4cGFuc2lvbiAocmVhZOKGkndyaXRlKSBhbmQgY29udHJvbC1lZGdlIGV4cGFuc2lvblxuICAgKiAoRDMpLiBPbmUgQ2F1c2FsRWRnZSBwZXIgZGlzdGluY3QgKHBhcmVudCwga2luZCwga2V5KSBsaW5rOyBgcGFyZW50c2BcbiAgICoga2VlcHMgaXRzIGhpc3RvcmljYWwgb25lLWVudHJ5LXBlci1wYXJlbnQgZGVkdXAuXG4gICAqL1xuICBmdW5jdGlvbiBsaW5rUGFyZW50KFxuICAgIG5vZGU6IENhdXNhbE5vZGUsXG4gICAgcGFyZW50Q29tbWl0OiBDb21taXRCdW5kbGUsXG4gICAga2luZDogJ2RhdGEnIHwgJ2NvbnRyb2wnLFxuICAgIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGRlcHRoOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmVudElkID0gcGFyZW50Q29tbWl0LnJ1bnRpbWVTdGFnZUlkO1xuICAgIC8vIHRoZSBkZWR1cCBzY2FucyBiZWxvdywgYW5kIHRoZSBwYXJlbnQncyB0cmFjZSB3aGVuIGl0IGlzIG5ldyDigJQgY291bnRlZCBmb3IgdGhlIHNjYWxpbmcgdGVzdFxuICAgIHF1ZXJ5V29yay51bml0cyArPSAxICsgbm9kZS5wYXJlbnRzLmxlbmd0aCArIG5vZGUucGFyZW50RWRnZXMubGVuZ3RoO1xuICAgIC8vICNQMTogdGhlIHBhcmVudCdzIGV4cGFuc2lvbiByZWFkcywgcmVzb2x2ZWQgTEFaSUxZIChvbmx5IGZvciBuZXcgbm9kZXNcbiAgICAvLyBvciBwZXItd3JpdGUgcmUtZXhwYW5zaW9uIOKAlCBkdXBsaWNhdGUgbGlua3MgdW5kZXIgJ3N0YWdlJyBwYXkgbm90aGluZykuXG4gICAgLy8gRGF0YSBsaW5rcyBleHBhbmQgdGhyb3VnaCB0aGUgcmVhZHMgdGhhdCBmZWQgdGhlIHBhcmVudCdzIHdyaXRlIG9mXG4gICAgLy8gYGtleWA7IGNvbnRyb2wgbGlua3MgZXhwYW5kIHRoZSBkZWNpZGVyIGF0IHN0YWdlIGxldmVsIChhIGRlY2lzaW9uXG4gICAgLy8gZGVwZW5kcyBvbiBldmVyeXRoaW5nIGl0IHJlYWQpLlxuICAgIGNvbnN0IHJlc29sdmVMaW5rUmVhZHMgPSAoKTogW3N0cmluZ1tdLCBib29sZWFuXSA9PlxuICAgICAga2luZCA9PT0gJ2RhdGEnXG4gICAgICAgID8gcmVhZHNGb3JMaW5rcyhwYXJlbnRDb21taXQsIGtleSAhPT0gdW5kZWZpbmVkID8gW2tleV0gOiB1bmRlZmluZWQpXG4gICAgICAgIDogW2dldEtleXNSZWFkKHBhcmVudElkKSwgdHJ1ZV07XG5cbiAgICBsZXQgcGFyZW50Tm9kZSA9IG5vZGVNYXAuZ2V0KHBhcmVudElkKTtcbiAgICBpZiAoIXBhcmVudE5vZGUpIHtcbiAgICAgIC8vIE5ldyBub2RlIOKAlCBjcmVhdGUgYW5kIGVucXVldWUgKHJlc3BlY3RpbmcgdGhlIG5vZGUgYnVkZ2V0KVxuICAgICAgaWYgKHZpc2l0ZWQgPj0gbWF4Tm9kZXMpIHtcbiAgICAgICAgdHJ1bmNhdGVkQnlOb2RlcyA9IHRydWU7IC8vIEQ0OiBhIGRpc2NvdmVyZWQgcGFyZW50IHdhcyBkcm9wcGVkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50SWR4ID0gaWR4TWFwLmdldChwYXJlbnRJZCk7XG4gICAgICBpZiAocGFyZW50SWR4ID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgICAgcXVlcnlXb3JrLnVuaXRzICs9IHBhcmVudENvbW1pdC50cmFjZS5sZW5ndGg7XG4gICAgICBwYXJlbnROb2RlID0ge1xuICAgICAgICBydW50aW1lU3RhZ2VJZDogcGFyZW50SWQsXG4gICAgICAgIHN0YWdlSWQ6IHBhcmVudENvbW1pdC5zdGFnZUlkLFxuICAgICAgICBzdGFnZU5hbWU6IHBhcmVudENvbW1pdC5zdGFnZSxcbiAgICAgICAga2V5c1dyaXR0ZW46IHBhcmVudENvbW1pdC50cmFjZS5tYXAoKHQpID0+IHQucGF0aCksXG4gICAgICAgIC8vIGxpbmtlZEJ5IHN0YXlzIGEgREFUQS1rZXkgY29uY2VwdCAoYmFjay1jb21wYXQpIOKAlCBjb250cm9sLWxpbmtlZFxuICAgICAgICAvLyBub2RlcyBjYXJyeSB0aGVpciBsYWJlbCBvbiB0aGUgZWRnZSBpbnN0ZWFkLlxuICAgICAgICBsaW5rZWRCeToga2luZCA9PT0gJ2RhdGEnID8ga2V5ID8/ICcnIDogJycsXG4gICAgICAgIGRlcHRoOiBkZXB0aCArIDEsXG4gICAgICAgIHBhcmVudHM6IFtdLFxuICAgICAgICBwYXJlbnRFZGdlczogW10sXG4gICAgICAgIC4uLmluY29tcGxldGVTb3VyY2VzRnJhZ21lbnQocGFyZW50Q29tbWl0KSxcbiAgICAgIH07XG4gICAgICBub2RlTWFwLnNldChwYXJlbnRJZCwgcGFyZW50Tm9kZSk7XG4gICAgICB2aXNpdGVkKys7XG4gICAgICBjb25zdCBbbGlua1JlYWRzLCBsaW5rSXNGdWxsXSA9IHJlc29sdmVMaW5rUmVhZHMoKTtcbiAgICAgIGV4cGFuZGVkUmVhZHMuc2V0KHBhcmVudElkLCBuZXcgU2V0KGxpbmtSZWFkcykpO1xuICAgICAgaWYgKGxpbmtJc0Z1bGwpIGZ1bGx5RXhwYW5kZWQuYWRkKHBhcmVudElkKTtcbiAgICAgIHF1ZXVlLnB1c2goW3BhcmVudE5vZGUsIHBhcmVudElkeCwgZGVwdGggKyAxLCBsaW5rUmVhZHNdKTtcbiAgICB9IGVsc2UgaWYgKHBlcldyaXRlICYmICFmdWxseUV4cGFuZGVkLmhhcyhwYXJlbnRJZCkpIHtcbiAgICAgIC8vICNQMSB3b3JrbGlzdDogYW4gRVhJU1RJTkcgbm9kZSBsaW5rZWQgdmlhIGFub3RoZXIga2V5IG1heSBvd2UgbW9yZVxuICAgICAgLy8gZXhwYW5zaW9uIOKAlCBlbnF1ZXVlIG9ubHkgdGhlIHJlYWRzIG5vdCB5ZXQgZXhwYW5kZWQgKG1vbm90b25lOyB0aGVcbiAgICAgIC8vIG5vZGUgYnVkZ2V0IGlzIHVudG91Y2hlZCwgbm8gbm9kZSBpcyBjcmVhdGVkKS4gUmUtZXhwYW5zaW9uIGtlZXBzXG4gICAgICAvLyB0aGUgbm9kZSdzIE9SSUdJTkFMIGRlcHRoIHNvIGl0cyBwYXJlbnRzIGdldCBhIGNvbnNpc3RlbnQgZGVwdGgrMS5cbiAgICAgIGNvbnN0IFtsaW5rUmVhZHMsIGxpbmtJc0Z1bGxdID0gcmVzb2x2ZUxpbmtSZWFkcygpO1xuICAgICAgY29uc3QgZXhwYW5kZWQgPSBleHBhbmRlZFJlYWRzLmdldChwYXJlbnRJZCkhO1xuICAgICAgY29uc3QgZGVsdGEgPSBsaW5rUmVhZHMuZmlsdGVyKChrKSA9PiAhZXhwYW5kZWQuaGFzKGspKTtcbiAgICAgIGlmIChsaW5rSXNGdWxsKSBmdWxseUV4cGFuZGVkLmFkZChwYXJlbnRJZCk7XG4gICAgICBpZiAoZGVsdGEubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IGsgb2YgZGVsdGEpIGV4cGFuZGVkLmFkZChrKTtcbiAgICAgICAgY29uc3QgcGFyZW50SWR4ID0gaWR4TWFwLmdldChwYXJlbnRJZCk7XG4gICAgICAgIGlmIChwYXJlbnRJZHggIT09IHVuZGVmaW5lZCkgcXVldWUucHVzaChbcGFyZW50Tm9kZSwgcGFyZW50SWR4LCBwYXJlbnROb2RlLmRlcHRoLCBkZWx0YV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERBRyBtZXJnZTogb25lIHBhcmVudHNbXSBlbnRyeSBwZXIgZGlzdGluY3QgcGFyZW50IChoaXN0b3JpY2FsIHNoYXBlKVxuICAgIGlmICghbm9kZS5wYXJlbnRzLnNvbWUoKHApID0+IHAucnVudGltZVN0YWdlSWQgPT09IHBhcmVudElkKSkge1xuICAgICAgbm9kZS5wYXJlbnRzLnB1c2gocGFyZW50Tm9kZSk7XG4gICAgfVxuICAgIC8vIE9uZSBlZGdlIHBlciBkaXN0aW5jdCAocGFyZW50LCBraW5kLCBrZXkpIGxpbmsuIFRoZSB3ZWlnaGVyIChENClcbiAgICAvLyBzdGFtcHMgdGhlIHdlaWdodCBhdCBjcmVhdGlvbjsgYHVuZGVmaW5lZGAg4oaSIDEuMCDigJQgdGhlIGVuZ2luZSBuZXZlclxuICAgIC8vIGNvbXB1dGVzIHdlaWdodHMgaXRzZWxmLlxuICAgIGlmICghbm9kZS5wYXJlbnRFZGdlcy5zb21lKChlKSA9PiBlLnBhcmVudC5ydW50aW1lU3RhZ2VJZCA9PT0gcGFyZW50SWQgJiYgZS5raW5kID09PSBraW5kICYmIGUua2V5ID09PSBrZXkpKSB7XG4gICAgICAvLyBFcnJvciBpc29sYXRpb24gKHJldmlldyBmaW5kaW5nKTogYSBjb25zdW1lciB3ZWlnaGVyIHRoYXQgdGhyb3dzXG4gICAgICAvLyBtdXN0IGRlZ3JhZGUgdG8gdGhlIGRlZmF1bHQgd2VpZ2h0LCBuZXZlciBjcmFzaCB0aGUgc2xpY2Ug4oCUIHRoZVxuICAgICAgLy8gc2FtZSBjb250cmFjdCBldmVyeSBvdGhlciBjb25zdW1lciBjYWxsYmFjayBpbiB0aGUgbGlicmFyeSBnZXRzLlxuICAgICAgbGV0IHdlaWdodCA9IDEuMDtcbiAgICAgIGlmICh3ZWlnaCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHdlaWdodCA9IHdlaWdoKG5vZGUsIHBhcmVudE5vZGUsIGtleSwga2luZCkgPz8gMS4wO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvKiB3ZWlnaGVyIHRocmV3IOKAlCBrZWVwIDEuMCwgdGhlIHNsaWNlIHN0YXlzIHVzYWJsZSAqL1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBuZXN0ZWQgPSBraW5kID09PSAnZGF0YScgJiYga2V5ICE9PSB1bmRlZmluZWQgJiYgd3JpdGVzT25seUluc2lkZShwYXJlbnRDb21taXQsIGtleSk7XG4gICAgICBub2RlLnBhcmVudEVkZ2VzLnB1c2goe1xuICAgICAgICBwYXJlbnQ6IHBhcmVudE5vZGUsXG4gICAgICAgIGtpbmQsXG4gICAgICAgIGtleSxcbiAgICAgICAgd2VpZ2h0LFxuICAgICAgICAuLi4obmVzdGVkICYmIHsgYmFzaXM6ICduZXN0ZWQtcm93cycgYXMgY29uc3QgfSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IFtub2RlLCBjb21taXRJZHgsIGRlcHRoLCBrZXlzVG9FeHBhbmRdID0gcXVldWUuc2hpZnQoKSE7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IDEgKyBrZXlzVG9FeHBhbmQubGVuZ3RoO1xuXG4gICAgaWYgKGRlcHRoID49IG1heERlcHRoKSB7XG4gICAgICAvLyBENDogb25seSBhIG5vZGUgdGhhdCBzdGlsbCBIQUQgc29tZXRoaW5nIHRvIGV4cGFuZCBjb3VudHMgYXMgYSBjdXRcbiAgICAgIC8vIChhIGxlYWYgYXQgdGhlIGhvcml6b24gdHJ1bmNhdGVzIG5vdGhpbmcpLlxuICAgICAgaWYgKGtleXNUb0V4cGFuZC5sZW5ndGggPiAwIHx8IGNvbnRyb2xEZXBzPy4obm9kZS5ydW50aW1lU3RhZ2VJZCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0cnVuY2F0ZWRCeURlcHRoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIERhdGEgZWRnZXM6IGZvciBlYWNoIGtleSBpbiB0aGlzIGV4cGFuc2lvbidzIHJlYWQtc2V0LCBmaW5kIHdobyB3cm90ZVxuICAgIC8vIGl0LiBVbmRlciAnc3RhZ2UnIHRoaXMgaXMgdGhlIG5vZGUncyBmdWxsIHJlYWQtc2V0IChoaXN0b3JpY2FsXG4gICAgLy8gYmVoYXZpb3IpOyB1bmRlciAncGVyLXdyaXRlJyBpdCBpcyB0aGUgbGlua2luZyB3cml0ZXMnIHRlbXBvcmFsIHByZWZpeFxuICAgIC8vIChvciBhIHdvcmtsaXN0IGRlbHRhIG9uIHJlLWV4cGFuc2lvbikuXG4gICAgY29uc3Qga2V5c1JlYWQgPSBrZXlzVG9FeHBhbmQ7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c1JlYWQpIHtcbiAgICAgIGNvbnN0IHdyaXRlciA9IGZpbmRXcml0ZXIoa2V5LCBjb21taXRJZHgpO1xuICAgICAgaWYgKCF3cml0ZXIpIHtcbiAgICAgICAgLy8gRjRiOiBzYXkgd2h5IHRoZXJlIGlzIG5vIGVkZ2Ug4oCUIG5vIGNvbW1pdCBiZWZvcmUgdGhpcyBub2RlIHdyb3RlIHRoZSBrZXkuXG4gICAgICAgIG5vZGUucHJlUnVuUmVhZHMgPz89IHsgY29kZTogJ3ByZS1ydW4tb3JpZ2luJywga2V5czogW10gfTtcbiAgICAgICAgaWYgKCFub2RlLnByZVJ1blJlYWRzLmtleXMuaW5jbHVkZXMoa2V5KSkgbm9kZS5wcmVSdW5SZWFkcy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsaW5rUGFyZW50KG5vZGUsIHdyaXRlciwgJ2RhdGEnLCBrZXksIGRlcHRoKTtcbiAgICB9XG5cbiAgICAvLyBDb250cm9sIGVkZ2UgKFJGQy0wMDMgRDMpOiBsaW5rIHRoZSBnb3Zlcm5pbmcgZGVjaWRlciwgbGFiZWxlZCBieSB0aGVcbiAgICAvLyBkZWNpZGUoKSBydWxlIGxhYmVsIHdoZW4gcHJlc2VudC4gVGhlIGRlY2lkZXIgbm9kZSB0aGVuIGV4cGFuZHNcbiAgICAvLyBub3JtYWxseSB0aHJvdWdoIGl0cyBvd24gZGF0YSByZWFkcyAoYW5kIGl0cyBvd24gY29udHJvbCBwYXJlbnQpLlxuICAgIGlmIChjb250cm9sRGVwcykge1xuICAgICAgY29uc3QgZGVwID0gY29udHJvbERlcHMobm9kZS5ydW50aW1lU3RhZ2VJZCk7XG4gICAgICBpZiAoZGVwKSB7XG4gICAgICAgIGNvbnN0IGRlY2lkZXJJZHggPSBpZHhNYXAuZ2V0KGRlcC5kZWNpZGVySWQpO1xuICAgICAgICBpZiAoZGVjaWRlcklkeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbGlua1BhcmVudChub2RlLCBjb21taXRMb2dbZGVjaWRlcklkeF0sICdjb250cm9sJywgZGVwLmxhYmVsLCBkZXB0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSRkMtMDAzIEQ0IOKAlCB0cnVuY2F0aW9uIHZpc2liaWxpdHkgb24gdGhlIHJvb3QgKGFic2VudCB3aGVuIGNvbXBsZXRlKS4gSXQgaXMgREFUQSwgYW5kIG9ubHlcbiAgLy8gZGF0YTogYSByZWFkZXIgcmVhZHMgYHJvb3QudHJ1bmNhdGVkYCAoYW5kIGBmb3JtYXRDYXVzYWxDaGFpbmAgcHJpbnRzIGl0KTsgdGhlIHJlY29yZCB3cml0ZXMgbm9cbiAgLy8gY29uc29sZSBsaW5lICh0aGUgZGV2LW1vZGUgd2FybmluZyB3ZW50IGluIEM2IOKAlCB0aGUgcmVjb3JkIGltcG9ydHMgbm90aGluZyBvdXRzaWRlIGl0c2VsZikuXG4gIGlmICh0cnVuY2F0ZWRCeURlcHRoIHx8IHRydW5jYXRlZEJ5Tm9kZXMpIHtcbiAgICByb290LnRydW5jYXRlZCA9IHsgYnlEZXB0aDogdHJ1bmNhdGVkQnlEZXB0aCwgYnlOb2RlczogdHJ1bmNhdGVkQnlOb2RlcyB9O1xuICB9XG5cbiAgcmV0dXJuIHJvb3Q7XG59XG5cbi8vIOKUgOKUgCBVdGlsaXRpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogRmxhdHRlbiB0aGUgY2F1c2FsIERBRyBpbnRvIGEgQkZTLW9yZGVyZWQgbGlzdCBvZiBub2Rlcy5cbiAqIEVhY2ggbm9kZSBhcHBlYXJzIGV4YWN0bHkgb25jZSAoZmlyc3Qgb2NjdXJyZW5jZSBieSBCRlMgb3JkZXIpLlxuICogVXNlZnVsIGZvciBsaW5lYXIgZGlzcGxheSBvciBpdGVyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuQ2F1c2FsREFHKHJvb3Q6IENhdXNhbE5vZGUpOiBDYXVzYWxOb2RlW10ge1xuICBjb25zdCByZXN1bHQ6IENhdXNhbE5vZGVbXSA9IFtdO1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHF1ZXVlOiBDYXVzYWxOb2RlW10gPSBbcm9vdF07XG5cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlID0gcXVldWUuc2hpZnQoKSE7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUucnVudGltZVN0YWdlSWQpKSBjb250aW51ZTtcbiAgICB2aXNpdGVkLmFkZChub2RlLnJ1bnRpbWVTdGFnZUlkKTtcbiAgICByZXN1bHQucHVzaChub2RlKTtcblxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG5vZGUucGFyZW50cykge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhwYXJlbnQucnVudGltZVN0YWdlSWQpKSB7XG4gICAgICAgIHF1ZXVlLnB1c2gocGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZvcm1hdCBhIGNhdXNhbCBEQUcgYXMgaHVtYW4tcmVhZGFibGUgaW5kZW50ZWQgdGV4dC5cbiAqIFNob3dzIHRoZSBkZXBlbmRlbmN5IGNoYWluIHdpdGggZGVwdGggaW5kZW50YXRpb24gYW5kIGxpbmtlZC1ieSBrZXlzLlxuICpcbiAqIFJGQy0wMDMgRDI6IG5vZGVzIHRoYXQgY29uc3VtZWQgdW50cmFja2VkIHJlYWQgcGF0aHMgcmVuZGVyIGFuIGV4dHJhXG4gKiBg4pqgIGFsc28gY29uc3VtZWQg4oCmIOKAlCBzbGljZSBtYXkgYmUgaW5jb21wbGV0ZSBoZXJlYCBsaW5lLCBzbyBhIGNvbnN1bWVyXG4gKiAoaHVtYW4gb3IgTExNKSBkZWJ1Z2dpbmcgZnJvbSB0aGUgc2xpY2UgaXMgVE9MRCB3aGVuIGl0IGlzIGluY29tcGxldGUuXG4gKlxuICogUkZDLTAwMyBEMzogY29udHJvbCBlZGdlcyByZW5kZXIgYXMgYOKGkCBbY29udHJvbDogPHJ1bGUgbGFiZWw+XWBcbiAqIChsYWJlbCBvbWl0dGVkIHdoZW4gdGhlIGRlY2lzaW9uIGNhcnJpZWQgbm9uZSkuIERhdGEgcmVuZGVyaW5nIGlzXG4gKiBieXRlLWlkZW50aWNhbCB0byB0aGUgcHJlLUQzIG91dHB1dCDigJQgYOKGkCB2aWEgPGtleT5gIGZyb20gdGhlIG5vZGUnc1xuICogZGlzY292ZXJ5LXRpbWUgYGxpbmtlZEJ5YC5cbiAqXG4gKiBSRkMtMDAzIEQ0OiBlZGdlIHdlaWdodHMgZnJvbSB0aGUgYHdlaWdoYCBob29rIHJlbmRlciBhcyBhIHN1ZmZpeCDigJRcbiAqIGDihpAgdmlhIHN5c3RlbVByb21wdCAoMC4xOClgIOKAlCBvbmx5IHdoZW4g4omgIDEuMCwgc28gdW53ZWlnaHRlZCBvdXRwdXQgaXNcbiAqIHVuY2hhbmdlZC4gQSB0cnVuY2F0ZWQgc2xpY2UgKHJvb3QudHJ1bmNhdGVkKSBhcHBlbmRzIGEgZmluYWxcbiAqIGDimqAgc2xpY2UgdHJ1bmNhdGVkIOKApmAgbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdENhdXNhbENoYWluKHJvb3Q6IENhdXNhbE5vZGUpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0IHdlaWdodFN1ZmZpeCA9IChlZGdlOiBDYXVzYWxFZGdlIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+XG4gICAgZWRnZSAhPT0gdW5kZWZpbmVkICYmIGVkZ2Uud2VpZ2h0ICE9PSAxID8gYCAoJHtlZGdlLndlaWdodH0pYCA6ICcnO1xuXG4gIGZ1bmN0aW9uIHdhbGsobm9kZTogQ2F1c2FsTm9kZSwgaW5kZW50OiBudW1iZXIsIGVkZ2VzRnJvbUNoaWxkPzogQ2F1c2FsRWRnZVtdKTogdm9pZCB7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUucnVudGltZVN0YWdlSWQpKSB7XG4gICAgICBsaW5lcy5wdXNoKGAkeycgICcucmVwZWF0KGluZGVudCl94oazICR7bm9kZS5ydW50aW1lU3RhZ2VJZH0gKHNlZSBhYm92ZSlgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmlzaXRlZC5hZGQobm9kZS5ydW50aW1lU3RhZ2VJZCk7XG5cbiAgICBjb25zdCBsaW5rUGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG5vZGUubGlua2VkQnkpIHtcbiAgICAgIGNvbnN0IGRhdGFFZGdlID0gZWRnZXNGcm9tQ2hpbGQ/LmZpbmQoKGUpID0+IGUua2luZCA9PT0gJ2RhdGEnKTtcbiAgICAgIGxpbmtQYXJ0cy5wdXNoKGB2aWEgJHtub2RlLmxpbmtlZEJ5fSR7d2VpZ2h0U3VmZml4KGRhdGFFZGdlKX1gKTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbEVkZ2UgPSBlZGdlc0Zyb21DaGlsZD8uZmluZCgoZSkgPT4gZS5raW5kID09PSAnY29udHJvbCcpO1xuICAgIGlmIChjb250cm9sRWRnZSkge1xuICAgICAgbGlua1BhcnRzLnB1c2goYFtjb250cm9sJHtjb250cm9sRWRnZS5rZXkgPyBgOiAke2NvbnRyb2xFZGdlLmtleX1gIDogJyd9XSR7d2VpZ2h0U3VmZml4KGNvbnRyb2xFZGdlKX1gKTtcbiAgICB9XG4gICAgY29uc3QgbGluayA9IGxpbmtQYXJ0cy5sZW5ndGggPiAwID8gYCDihpAgJHtsaW5rUGFydHMuam9pbignIOKGkCAnKX1gIDogJyc7XG5cbiAgICBjb25zdCB3cml0ZXMgPSBub2RlLmtleXNXcml0dGVuLmxlbmd0aCA+IDAgPyBgIFt3cm90ZTogJHtub2RlLmtleXNXcml0dGVuLmpvaW4oJywgJyl9XWAgOiAnJztcbiAgICBsaW5lcy5wdXNoKGAkeycgICcucmVwZWF0KGluZGVudCl9JHtub2RlLnN0YWdlTmFtZX0gKCR7bm9kZS5ydW50aW1lU3RhZ2VJZH0pJHtsaW5rfSR7d3JpdGVzfWApO1xuXG4gICAgaWYgKG5vZGUuaW5jb21wbGV0ZVNvdXJjZXMgJiYgbm9kZS5pbmNvbXBsZXRlU291cmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKFxuICAgICAgICBgJHsnICAnLnJlcGVhdChpbmRlbnQgKyAxKX3imqAgYWxzbyBjb25zdW1lZCAke25vZGUuaW5jb21wbGV0ZVNvdXJjZXMuam9pbignLycpfSDigJQgc2xpY2UgbWF5IGJlIGluY29tcGxldGUgaGVyZWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG5vZGUucGFyZW50cykge1xuICAgICAgd2FsayhcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBpbmRlbnQgKyAxLFxuICAgICAgICBub2RlLnBhcmVudEVkZ2VzLmZpbHRlcigoZSkgPT4gZS5wYXJlbnQgPT09IHBhcmVudCksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHdhbGsocm9vdCwgMCk7XG5cbiAgaWYgKHJvb3QudHJ1bmNhdGVkKSB7XG4gICAgY29uc3QgY2F1c2VzID0gW3Jvb3QudHJ1bmNhdGVkLmJ5RGVwdGggJiYgJ21heERlcHRoIHJlYWNoZWQnLCByb290LnRydW5jYXRlZC5ieU5vZGVzICYmICdtYXhOb2RlcyByZWFjaGVkJ11cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5qb2luKCcsICcpO1xuICAgIGxpbmVzLnB1c2goYOKaoCBzbGljZSB0cnVuY2F0ZWQgKCR7Y2F1c2VzfSkg4oCUIG9sZGVyIGNhdXNlcyBleGlzdCBiZXlvbmQgdGhpcyBob3Jpem9uYCk7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8vIOKUgOKUgCBFeHBvcnRlZCBmb3IgdGVzdGluZyAoaW50ZXJuYWwpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogQGludGVybmFsIEV4cG9zZWQgZm9yIHRlc3RpbmcgdGhlIHN0cmF0ZWd5IHNlbGVjdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBfUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQgPSBSRVZFUlNFX0lOREVYX1RIUkVTSE9MRDtcbiJdfQ==
|
|
@@ -82,7 +82,9 @@ function sliceForKey(commitLog, key, keysRead, options) {
|
|
|
82
82
|
// without `TraceEntry.readKeys` (the writeProvenance dial off) fall back
|
|
83
83
|
// to stage-level expansion per node, byte-identically. Consumers can force
|
|
84
84
|
// 'stage' via options.
|
|
85
|
-
|
|
85
|
+
// Preserve this exact writer's metadata/read prefix, even when it is a
|
|
86
|
+
// continuation. Causal expansion separately uses the execution's first commit.
|
|
87
|
+
const root = (0, backtrack_js_1.causalChainFromCommit)(commitLog, writer, source.lookup, {
|
|
86
88
|
...options,
|
|
87
89
|
edgeAttribution: options?.edgeAttribution ?? 'per-write',
|
|
88
90
|
rootLinkKeys: options?.rootLinkKeys ?? [normalisedKey],
|
|
@@ -90,4 +92,4 @@ function sliceForKey(commitLog, key, keysRead, options) {
|
|
|
90
92
|
return { ...base, writer, root, ...(notes.length > 0 && { notes }) };
|
|
91
93
|
}
|
|
92
94
|
exports.sliceForKey = sliceForKey;
|
|
93
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2VGb3JLZXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3NsaWNlL3NsaWNlRm9yS2V5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7OztHQWFHOzs7QUFFSCx5REFBbUc7QUFDbkcsbUVBQThGO0FBRTlGLGlEQUFtRDtBQUNuRCwrQ0FBd0Y7QUFDeEYsNkRBQTZEO0FBRzdEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsR0FBYTtJQUM3QyxPQUFPLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFBLHdCQUFhLEVBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUZELDhDQUVDO0FBZUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBZ0IsV0FBVyxDQUN6QixTQUF5QixFQUN6QixHQUFhLEVBQ2IsUUFBeUMsRUFDekMsT0FBNEI7SUFFNUIsTUFBTSxNQUFNLEdBQUcsSUFBQSwwQ0FBcUIsRUFBQyxRQUFRLENBQUMsQ0FBQztJQUMvQyxNQUFNLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QyxNQUFNLElBQUksR0FBNkU7UUFDckYsR0FBRyxFQUFFLGFBQWE7UUFDbEIsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEtBQUssU0FBUyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoRSxZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDekIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztLQUN6RSxDQUFDO0lBRUYsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBRXJFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBQSwyQ0FBdUIsRUFBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM3RiwwR0FBMEc7SUFDMUcsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoRixNQUFNLEtBQUssR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLDBDQUFzQixFQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDMUYsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osNEdBQTRHO1FBQzVHLE9BQU87WUFDTCxHQUFHLElBQUk7WUFDUCxPQUFPLEVBQUUsZUFBZTtZQUN4QixHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLElBQUEsK0JBQWlCLEVBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ2pGLENBQUM7SUFDSixDQUFDO0lBQ0QsNkZBQTZGO0lBQzdGLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBQSw0QkFBYyxFQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNoSCxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUM7UUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUEsa0NBQW9CLEVBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUMxRixJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFBLCtCQUFpQixFQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFN0UseUVBQXlFO0lBQ3pFLG9FQUFvRTtJQUNwRSwwRUFBMEU7SUFDMUUsd0VBQXdFO0lBQ3hFLHVFQUF1RTtJQUN2RSxpRUFBaUU7SUFDakUsRUFBRTtJQUNGLHFFQUFxRTtJQUNyRSwyRUFBMkU7SUFDM0UsMEVBQTBFO0lBQzFFLHlFQUF5RTtJQUN6RSwyRUFBMkU7SUFDM0UsdUJBQXVCO0lBQ3ZCLE1BQU0sSUFBSSxHQUFHLElBQUEsMEJBQVcsRUFBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFO1FBQ3hFLEdBQUcsT0FBTztRQUNWLGVBQWUsRUFBRSxPQUFPLEVBQUUsZUFBZSxJQUFJLFdBQVc7UUFDeEQsWUFBWSxFQUFFLE9BQU8sRUFBRSxZQUFZLElBQUksQ0FBQyxhQUFhLENBQUM7S0FDdkQsQ0FBRSxDQUFDO0lBQ0osT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ3ZFLENBQUM7QUFyREQsa0NBcURDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzbGljZS9zbGljZUZvcktleS50cyDigJQgdGhlIHZhcmlhYmxlLWZpcnN0IGJhY2t3YXJkIHNsaWNlIHF1ZXJ5LlxuICpcbiAqIFwiV2h5IGlzIGBrZXlgIHdoYXQgaXQgaXM/XCIg4oCUIHRoZSBPTkUgcXVlc3Rpb24gZXZlcnkgdHJpYWdlIHN1cmZhY2UgYXNrczpcbiAqIGEgaHVtYW4gY2xpY2tpbmcgYSBrZXkgaW4gZXhwbGFpbmFibGUtdWksIGFuIExMTSBjYWxsaW5nIGEgYGJhY2t0cmFja2BcbiAqIHRvb2wgbWlkLWNvbnZlcnNhdGlvbiwgYW4gb2ZmbGluZSBhdXRvcHN5IGFnZW50IG92ZXIgYSBzdG9yZWQgcnVuLlxuICpcbiAqIFdIWSB0aGlzIGlzIGRlbGliZXJhdGVseSBhIGNvbXBvc2l0aW9uIGFuZCBub3QgYSBuZXcgYWxnb3JpdGhtOlxuICogYGZpbmRMYXN0V3JpdGVyYCBhbHJlYWR5IGFuc3dlcnMgXCJ3aG8gbWFkZSB0aGUgdmFsdWUgd2hhdCBpdCBpc1wiIGFuZFxuICogYGNhdXNhbENoYWluYCBhbHJlYWR5IGFuc3dlcnMgXCJ3aGF0IGluZmx1ZW5jZWQgdGhhdCBzdGVwXCIgKHRoaW4gYmFja3dhcmRcbiAqIHNsaWNpbmcsIFdlaXNlciAxOTg0KS4gV2hhdCB3YXMgbWlzc2luZyBpcyB0aGUgc2hhcmVkIENPTlRSQUNUIOKAlCB3aXRob3V0XG4gKiBpdCwgZXZlcnkgc3VyZmFjZSBoYW5kLXJvbGxzIHRoZSBhbmNob3Igc3RlcCBkaWZmZXJlbnRseSBhbmQgdGhlaXIgYW5zd2Vyc1xuICogZGlzYWdyZWUuIFRoZSB2YWx1ZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRoYXQgdGhleSBjYW4ndC5cbiAqL1xuXG5pbXBvcnQgeyB0eXBlIENhdXNhbENoYWluT3B0aW9ucywgdHlwZSBLZXlzUmVhZExvb2t1cCwgY2F1c2FsQ2hhaW4gfSBmcm9tICcuLi9tZW1vcnkvYmFja3RyYWNrLmpzJztcbmltcG9ydCB7IGNvbW1pdFZhbHVlQXRXaXRoQmFzaXMsIGZpbmRMYXN0V3JpdGVyV2l0aEJhc2lzIH0gZnJvbSAnLi4vbWVtb3J5L2NvbW1pdExvZ1V0aWxzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlIH0gZnJvbSAnLi4vbWVtb3J5L3R5cGVzLmpzJztcbmltcG9ydCB7IG5vcm1hbGlzZVBhdGggfSBmcm9tICcuLi9tZW1vcnkvdXRpbHMuanMnO1xuaW1wb3J0IHsgZnJvbUluaXRpYWxTdGF0ZU5vdGUsIG5lc3RlZFJvd3NOb3RlLCByZWRhY3RlZFZhbHVlTm90ZSB9IGZyb20gJy4va2V5SW5kZXguanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUtleXNSZWFkU291cmNlIH0gZnJvbSAnLi9rZXlzUmVhZFNvdXJjZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBLZXlzUmVhZFNvdXJjZSwgU3RhdGVLZXksIFZhcmlhYmxlU2xpY2UgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqXG4gKiBOb3JtYWxpc2UgYSBjb25zdW1lci1mYWNpbmcge0BsaW5rIFN0YXRlS2V5fSB0byB0aGUgZW5naW5lJ3MgY2Fub25pY2FsXG4gKiBzdHJpbmcgZm9ybSAodGhlIGBUcmFjZUVudHJ5LnBhdGhgIHNwYWNlKS4gUGF0aCBhcnJheXMgZ28gdGhyb3VnaCB0aGUgc2FtZVxuICogbm9ybWFsaXNlciB0aGUgZW5naW5lIHdyaXRlcyB3aXRoIOKAlCB0aGUgZGVsaW1pdGVyIG5ldmVyIGxlYWtzIGludG8gdGhlXG4gKiBwdWJsaWMgY29udHJhY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpc2VTdGF0ZUtleShrZXk6IFN0YXRlS2V5KTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnID8ga2V5IDogbm9ybWFsaXNlUGF0aChbLi4ua2V5XSk7XG59XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgc2xpY2VGb3JLZXl9IOKAlCBjYXVzYWxDaGFpbidzIG9wdGlvbnMgcGx1cyBhbmNob3JpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIFNsaWNlRm9yS2V5T3B0aW9ucyBleHRlbmRzIENhdXNhbENoYWluT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBFeGNsdXNpdmUgY29tbWl0LWFycmF5LWluZGV4IHVwcGVyIGJvdW5kOiBzbGljZSB0aGUgdmFsdWUgYXMgaXQgc3Rvb2RcbiAgICogQkVGT1JFIHRoaXMgaWR4ICh0aW1lLXRyYXZlbCB0cmlhZ2Ug4oCUIFwid2h5IHdhcyBpdCBYIGF0IHN0ZXAgMTI/XCIpLlxuICAgKiBTYW1lIGNvbnRyYWN0IGFzIGBmaW5kTGFzdFdyaXRlcmAncyBgYmVmb3JlSWR4YC4gT21pdCBmb3IgdGhlIGN1cnJlbnRcbiAgICogdmFsdWUuIENoYWluZWQtdHJpYWdlIGlkaW9tOiB0byBzbGljZSBhdCBhbiB7QGxpbmsgRWxlbWVudEJpcnRofSwgcGFzc1xuICAgKiBgYmVmb3JlOiBiaXJ0aC5jb21taXRJZHggKyAxYCAoYmlydGggaWR4IGlzIGluY2x1c2l2ZSwgdGhpcyBib3VuZCBpc1xuICAgKiBleGNsdXNpdmUg4oCUIHRoZSArMSBtYWtlcyB0aGUgYmlydGggY29tbWl0IGl0c2VsZiB0aGUgYW5jaG9yKS5cbiAgICovXG4gIGJlZm9yZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBCYWNrd2FyZCBzbGljZSBmb3Igb25lIHN0YXRlIGtleTogYW5jaG9yIGF0IHRoZSBrZXkncyBsYXN0IHdyaXRlciwgdGhlblxuICogd2FsayByZWFk4oaSd3JpdGUgKGFuZCBvcHRpb25hbCBjb250cm9sKSBkZXBlbmRlbmNpZXMgdHJhbnNpdGl2ZWx5LlxuICpcbiAqIEhvbmVzdC1hYnNlbmNlIGNvbnRyYWN0OiBhIG1pc3Npbmcgc2xpY2UgaXMgYSBSRVNVTFQsIG5vdCBhbiBlcnJvciDigJRcbiAqIGBtaXNzaW5nOiAnbmV2ZXItd3JpdHRlbidgIHRlbGxzIGEgdHJpYWdlIHRvb2wgKG9yIGl0cyBMTE0gY2FsbGVyKSB0aGF0XG4gKiB0aGUgdmFsdWUgY2FtZSBmcm9tIGluaXRpYWwgc3RhdGUgLyBmcm96ZW4gYXJncyAvIGEgY2xvc3VyZSwgd2hpY2ggaXNcbiAqIGl0c2VsZiBkaWFnbm9zdGljIGluZm9ybWF0aW9uLiBTZWUge0BsaW5rIFZhcmlhYmxlU2xpY2V9IOKAlCBpbmNsdWRpbmcgaXRzXG4gKiBTRVJJQUxJWkFUSU9OIFdBUk5JTkcgYmVmb3JlIHlvdSBzdHJpbmdpZnkgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlRm9yS2V5KFxuICBjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLFxuICBrZXk6IFN0YXRlS2V5LFxuICBrZXlzUmVhZDogS2V5c1JlYWRTb3VyY2UgfCBLZXlzUmVhZExvb2t1cCxcbiAgb3B0aW9ucz86IFNsaWNlRm9yS2V5T3B0aW9ucyxcbik6IFZhcmlhYmxlU2xpY2Uge1xuICBjb25zdCBzb3VyY2UgPSByZXNvbHZlS2V5c1JlYWRTb3VyY2Uoa2V5c1JlYWQpO1xuICBjb25zdCBub3JtYWxpc2VkS2V5ID0gbm9ybWFsaXNlU3RhdGVLZXkoa2V5KTtcbiAgY29uc3QgYmFzZTogUGljazxWYXJpYWJsZVNsaWNlLCAna2V5JyB8ICdiZWZvcmUnIHwgJ2tleXNSZWFkS2luZCcgfCAncmVhZHNDb3ZlcmFnZSc+ID0ge1xuICAgIGtleTogbm9ybWFsaXNlZEtleSxcbiAgICAuLi4ob3B0aW9ucz8uYmVmb3JlICE9PSB1bmRlZmluZWQgJiYgeyBiZWZvcmU6IG9wdGlvbnMuYmVmb3JlIH0pLFxuICAgIGtleXNSZWFkS2luZDogc291cmNlLmtpbmQsXG4gICAgLi4uKHNvdXJjZS5jb3ZlcmFnZSAhPT0gdW5kZWZpbmVkICYmIHsgcmVhZHNDb3ZlcmFnZTogc291cmNlLmNvdmVyYWdlIH0pLFxuICB9O1xuXG4gIGlmIChjb21taXRMb2cubGVuZ3RoID09PSAwKSByZXR1cm4geyAuLi5iYXNlLCBtaXNzaW5nOiAnZW1wdHktbG9nJyB9O1xuXG4gIGNvbnN0IHsgd3JpdGVyLCBiYXNpcyB9ID0gZmluZExhc3RXcml0ZXJXaXRoQmFzaXMoY29tbWl0TG9nLCBub3JtYWxpc2VkS2V5LCBvcHRpb25zPy5iZWZvcmUpO1xuICAvLyBGNGI6IHdoYXQgdGhlIHZhbHVlIGF0IHRoZSBzbGljZSdzIHBvaW50IHJlc3RzIG9uLCBmcm9tIHRoZSB2YWx1ZSB0d2luIOKAlCBhIHJlZGFjdGlvbiwgdGhlIHByZS1ydW4gYmFzZS5cbiAgY29uc3QgZW5kID0gTWF0aC5taW4ob3B0aW9ucz8uYmVmb3JlID8/IGNvbW1pdExvZy5sZW5ndGgsIGNvbW1pdExvZy5sZW5ndGgpIC0gMTtcbiAgY29uc3QgdmFsdWUgPSBlbmQgPj0gMCA/IGNvbW1pdFZhbHVlQXRXaXRoQmFzaXMoY29tbWl0TG9nLCBlbmQsIG5vcm1hbGlzZWRLZXkpLmJhc2lzIDogW107XG4gIGlmICghd3JpdGVyKSB7XG4gICAgLy8gJ25ldmVyLXdyaXR0ZW4nIGFscmVhZHkgc2F5cyB0aGUgdmFsdWUgY2FtZSBmcm9tIGJlZm9yZSB0aGUgcnVuOyBhIHJlZGFjdGlvbiB0aGF0IGhpZCB0aGUgd3JpdGUgZG9lcyBub3QuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmJhc2UsXG4gICAgICBtaXNzaW5nOiAnbmV2ZXItd3JpdHRlbicsXG4gICAgICAuLi4odmFsdWUuaW5jbHVkZXMoJ3JlZGFjdGVkJykgJiYgeyBub3RlczogW3JlZGFjdGVkVmFsdWVOb3RlKG5vcm1hbGlzZWRLZXkpXSB9KSxcbiAgICB9O1xuICB9XG4gIC8vIEEgd3JpdGVyIHRoYXQgcmVhY2hlZCB0aGUga2V5IG9ubHkgdGhyb3VnaCByb3dzIGluc2lkZSBpdCBtYWRlIHBhcnQgb2YgdGhlIHZhbHVlIOKAlCBzYXkgc28uXG4gIGNvbnN0IG5vdGVzID0gYmFzaXMuaW5jbHVkZXMoJ25lc3RlZC1yb3dzJykgPyBbbmVzdGVkUm93c05vdGUobm9ybWFsaXNlZEtleSwgW2NvbW1pdExvZy5pbmRleE9mKHdyaXRlcildKV0gOiBbXTtcbiAgaWYgKHZhbHVlLmluY2x1ZGVzKCdmcm9tLWluaXRpYWwtc3RhdGUnKSkgbm90ZXMucHVzaChmcm9tSW5pdGlhbFN0YXRlTm90ZShub3JtYWxpc2VkS2V5KSk7XG4gIGlmICh2YWx1ZS5pbmNsdWRlcygncmVkYWN0ZWQnKSkgbm90ZXMucHVzaChyZWRhY3RlZFZhbHVlTm90ZShub3JtYWxpc2VkS2V5KSk7XG5cbiAgLy8gSU5WQVJJQU5UOiBgd3JpdGVyYCBjYW1lIEZST00gdGhpcyBjb21taXRMb2csIHNvIGl0cyBydW50aW1lU3RhZ2VJZCBpc1xuICAvLyBhbHdheXMgcHJlc2VudCBpbiBjYXVzYWxDaGFpbidzIGluZGV4IOKAlCBjYXVzYWxDaGFpbiBjYW5ub3QgcmV0dXJuXG4gIC8vIHVuZGVmaW5lZCBoZXJlIChpdCBvbmx5IGRvZXMgZm9yIGlkcyBhYnNlbnQgZnJvbSB0aGUgbG9nKS4gVGhlIG5vbi1udWxsXG4gIC8vIGFzc2VydGlvbiBrZWVwcyB0aGUgVmFyaWFibGVTbGljZSBjb250cmFjdCBhaXJ0aWdodDogYG1pc3NpbmdgIGlzIHRoZVxuICAvLyBPTkxZIGFic2VudC1yb290IHN0YXRlLiBPcHRpb25zIHBhc3Mgc3RyYWlnaHQgdGhyb3VnaCAoY29udHJvbERlcHMgL1xuICAvLyB3ZWlnaCAvIG1heERlcHRoIC8gbWF4Tm9kZXMga2VlcCB0aGVpciBjYXVzYWxDaGFpbiBzZW1hbnRpY3MpLlxuICAvL1xuICAvLyBlZGdlQXR0cmlidXRpb24gZGVmYXVsdHMgdG8gJ3Blci13cml0ZScgSEVSRSAodW5saWtlIGNhdXNhbENoYWluJ3NcbiAgLy8gJ3N0YWdlJyBkZWZhdWx0KTogYSB2YXJpYWJsZS1maXJzdCBzbGljZSBrbm93cyBleGFjdGx5IHdoaWNoIHdyaXR0ZW4ga2V5XG4gIC8vIGFuY2hvcnMgdGhlIHF1ZXN0aW9uLCBhbmQgcGVyLXdyaXRlIGF0dHJpYnV0aW9uIGlzIHN0cmljdGx5LXNhZmUg4oCUIGxvZ3NcbiAgLy8gd2l0aG91dCBgVHJhY2VFbnRyeS5yZWFkS2V5c2AgKHRoZSB3cml0ZVByb3ZlbmFuY2UgZGlhbCBvZmYpIGZhbGwgYmFja1xuICAvLyB0byBzdGFnZS1sZXZlbCBleHBhbnNpb24gcGVyIG5vZGUsIGJ5dGUtaWRlbnRpY2FsbHkuIENvbnN1bWVycyBjYW4gZm9yY2VcbiAgLy8gJ3N0YWdlJyB2aWEgb3B0aW9ucy5cbiAgY29uc3Qgcm9vdCA9IGNhdXNhbENoYWluKGNvbW1pdExvZywgd3JpdGVyLnJ1bnRpbWVTdGFnZUlkLCBzb3VyY2UubG9va3VwLCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBlZGdlQXR0cmlidXRpb246IG9wdGlvbnM/LmVkZ2VBdHRyaWJ1dGlvbiA/PyAncGVyLXdyaXRlJyxcbiAgICByb290TGlua0tleXM6IG9wdGlvbnM/LnJvb3RMaW5rS2V5cyA/PyBbbm9ybWFsaXNlZEtleV0sXG4gIH0pITtcbiAgcmV0dXJuIHsgLi4uYmFzZSwgd3JpdGVyLCByb290LCAuLi4obm90ZXMubGVuZ3RoID4gMCAmJiB7IG5vdGVzIH0pIH07XG59XG4iXX0=
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2VGb3JLZXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3NsaWNlL3NsaWNlRm9yS2V5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7OztHQWFHOzs7QUFFSCx5REFBNkc7QUFDN0csbUVBQThGO0FBRTlGLGlEQUFtRDtBQUNuRCwrQ0FBd0Y7QUFDeEYsNkRBQTZEO0FBRzdEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsR0FBYTtJQUM3QyxPQUFPLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFBLHdCQUFhLEVBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUZELDhDQUVDO0FBZUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBZ0IsV0FBVyxDQUN6QixTQUF5QixFQUN6QixHQUFhLEVBQ2IsUUFBeUMsRUFDekMsT0FBNEI7SUFFNUIsTUFBTSxNQUFNLEdBQUcsSUFBQSwwQ0FBcUIsRUFBQyxRQUFRLENBQUMsQ0FBQztJQUMvQyxNQUFNLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QyxNQUFNLElBQUksR0FBNkU7UUFDckYsR0FBRyxFQUFFLGFBQWE7UUFDbEIsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEtBQUssU0FBUyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoRSxZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDekIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztLQUN6RSxDQUFDO0lBRUYsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBRXJFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBQSwyQ0FBdUIsRUFBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM3RiwwR0FBMEc7SUFDMUcsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoRixNQUFNLEtBQUssR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLDBDQUFzQixFQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDMUYsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osNEdBQTRHO1FBQzVHLE9BQU87WUFDTCxHQUFHLElBQUk7WUFDUCxPQUFPLEVBQUUsZUFBZTtZQUN4QixHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLElBQUEsK0JBQWlCLEVBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ2pGLENBQUM7SUFDSixDQUFDO0lBQ0QsNkZBQTZGO0lBQzdGLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBQSw0QkFBYyxFQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNoSCxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUM7UUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUEsa0NBQW9CLEVBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUMxRixJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFBLCtCQUFpQixFQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFN0UseUVBQXlFO0lBQ3pFLG9FQUFvRTtJQUNwRSwwRUFBMEU7SUFDMUUsd0VBQXdFO0lBQ3hFLHVFQUF1RTtJQUN2RSxpRUFBaUU7SUFDakUsRUFBRTtJQUNGLHFFQUFxRTtJQUNyRSwyRUFBMkU7SUFDM0UsMEVBQTBFO0lBQzFFLHlFQUF5RTtJQUN6RSwyRUFBMkU7SUFDM0UsdUJBQXVCO0lBQ3ZCLHVFQUF1RTtJQUN2RSwrRUFBK0U7SUFDL0UsTUFBTSxJQUFJLEdBQUcsSUFBQSxvQ0FBcUIsRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUU7UUFDbkUsR0FBRyxPQUFPO1FBQ1YsZUFBZSxFQUFFLE9BQU8sRUFBRSxlQUFlLElBQUksV0FBVztRQUN4RCxZQUFZLEVBQUUsT0FBTyxFQUFFLFlBQVksSUFBSSxDQUFDLGFBQWEsQ0FBQztLQUN2RCxDQUFFLENBQUM7SUFDSixPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDdkUsQ0FBQztBQXZERCxrQ0F1REMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHNsaWNlL3NsaWNlRm9yS2V5LnRzIOKAlCB0aGUgdmFyaWFibGUtZmlyc3QgYmFja3dhcmQgc2xpY2UgcXVlcnkuXG4gKlxuICogXCJXaHkgaXMgYGtleWAgd2hhdCBpdCBpcz9cIiDigJQgdGhlIE9ORSBxdWVzdGlvbiBldmVyeSB0cmlhZ2Ugc3VyZmFjZSBhc2tzOlxuICogYSBodW1hbiBjbGlja2luZyBhIGtleSBpbiBleHBsYWluYWJsZS11aSwgYW4gTExNIGNhbGxpbmcgYSBgYmFja3RyYWNrYFxuICogdG9vbCBtaWQtY29udmVyc2F0aW9uLCBhbiBvZmZsaW5lIGF1dG9wc3kgYWdlbnQgb3ZlciBhIHN0b3JlZCBydW4uXG4gKlxuICogV0hZIHRoaXMgaXMgZGVsaWJlcmF0ZWx5IGEgY29tcG9zaXRpb24gYW5kIG5vdCBhIG5ldyBhbGdvcml0aG06XG4gKiBgZmluZExhc3RXcml0ZXJgIGFscmVhZHkgYW5zd2VycyBcIndobyBtYWRlIHRoZSB2YWx1ZSB3aGF0IGl0IGlzXCIgYW5kXG4gKiBgY2F1c2FsQ2hhaW5gIGFscmVhZHkgYW5zd2VycyBcIndoYXQgaW5mbHVlbmNlZCB0aGF0IHN0ZXBcIiAodGhpbiBiYWNrd2FyZFxuICogc2xpY2luZywgV2Vpc2VyIDE5ODQpLiBXaGF0IHdhcyBtaXNzaW5nIGlzIHRoZSBzaGFyZWQgQ09OVFJBQ1Qg4oCUIHdpdGhvdXRcbiAqIGl0LCBldmVyeSBzdXJmYWNlIGhhbmQtcm9sbHMgdGhlIGFuY2hvciBzdGVwIGRpZmZlcmVudGx5IGFuZCB0aGVpciBhbnN3ZXJzXG4gKiBkaXNhZ3JlZS4gVGhlIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdGhhdCB0aGV5IGNhbid0LlxuICovXG5cbmltcG9ydCB7IHR5cGUgQ2F1c2FsQ2hhaW5PcHRpb25zLCB0eXBlIEtleXNSZWFkTG9va3VwLCBjYXVzYWxDaGFpbkZyb21Db21taXQgfSBmcm9tICcuLi9tZW1vcnkvYmFja3RyYWNrLmpzJztcbmltcG9ydCB7IGNvbW1pdFZhbHVlQXRXaXRoQmFzaXMsIGZpbmRMYXN0V3JpdGVyV2l0aEJhc2lzIH0gZnJvbSAnLi4vbWVtb3J5L2NvbW1pdExvZ1V0aWxzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlIH0gZnJvbSAnLi4vbWVtb3J5L3R5cGVzLmpzJztcbmltcG9ydCB7IG5vcm1hbGlzZVBhdGggfSBmcm9tICcuLi9tZW1vcnkvdXRpbHMuanMnO1xuaW1wb3J0IHsgZnJvbUluaXRpYWxTdGF0ZU5vdGUsIG5lc3RlZFJvd3NOb3RlLCByZWRhY3RlZFZhbHVlTm90ZSB9IGZyb20gJy4va2V5SW5kZXguanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUtleXNSZWFkU291cmNlIH0gZnJvbSAnLi9rZXlzUmVhZFNvdXJjZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBLZXlzUmVhZFNvdXJjZSwgU3RhdGVLZXksIFZhcmlhYmxlU2xpY2UgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqXG4gKiBOb3JtYWxpc2UgYSBjb25zdW1lci1mYWNpbmcge0BsaW5rIFN0YXRlS2V5fSB0byB0aGUgZW5naW5lJ3MgY2Fub25pY2FsXG4gKiBzdHJpbmcgZm9ybSAodGhlIGBUcmFjZUVudHJ5LnBhdGhgIHNwYWNlKS4gUGF0aCBhcnJheXMgZ28gdGhyb3VnaCB0aGUgc2FtZVxuICogbm9ybWFsaXNlciB0aGUgZW5naW5lIHdyaXRlcyB3aXRoIOKAlCB0aGUgZGVsaW1pdGVyIG5ldmVyIGxlYWtzIGludG8gdGhlXG4gKiBwdWJsaWMgY29udHJhY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpc2VTdGF0ZUtleShrZXk6IFN0YXRlS2V5KTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnID8ga2V5IDogbm9ybWFsaXNlUGF0aChbLi4ua2V5XSk7XG59XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgc2xpY2VGb3JLZXl9IOKAlCBjYXVzYWxDaGFpbidzIG9wdGlvbnMgcGx1cyBhbmNob3JpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIFNsaWNlRm9yS2V5T3B0aW9ucyBleHRlbmRzIENhdXNhbENoYWluT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBFeGNsdXNpdmUgY29tbWl0LWFycmF5LWluZGV4IHVwcGVyIGJvdW5kOiBzbGljZSB0aGUgdmFsdWUgYXMgaXQgc3Rvb2RcbiAgICogQkVGT1JFIHRoaXMgaWR4ICh0aW1lLXRyYXZlbCB0cmlhZ2Ug4oCUIFwid2h5IHdhcyBpdCBYIGF0IHN0ZXAgMTI/XCIpLlxuICAgKiBTYW1lIGNvbnRyYWN0IGFzIGBmaW5kTGFzdFdyaXRlcmAncyBgYmVmb3JlSWR4YC4gT21pdCBmb3IgdGhlIGN1cnJlbnRcbiAgICogdmFsdWUuIENoYWluZWQtdHJpYWdlIGlkaW9tOiB0byBzbGljZSBhdCBhbiB7QGxpbmsgRWxlbWVudEJpcnRofSwgcGFzc1xuICAgKiBgYmVmb3JlOiBiaXJ0aC5jb21taXRJZHggKyAxYCAoYmlydGggaWR4IGlzIGluY2x1c2l2ZSwgdGhpcyBib3VuZCBpc1xuICAgKiBleGNsdXNpdmUg4oCUIHRoZSArMSBtYWtlcyB0aGUgYmlydGggY29tbWl0IGl0c2VsZiB0aGUgYW5jaG9yKS5cbiAgICovXG4gIGJlZm9yZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBCYWNrd2FyZCBzbGljZSBmb3Igb25lIHN0YXRlIGtleTogYW5jaG9yIGF0IHRoZSBrZXkncyBsYXN0IHdyaXRlciwgdGhlblxuICogd2FsayByZWFk4oaSd3JpdGUgKGFuZCBvcHRpb25hbCBjb250cm9sKSBkZXBlbmRlbmNpZXMgdHJhbnNpdGl2ZWx5LlxuICpcbiAqIEhvbmVzdC1hYnNlbmNlIGNvbnRyYWN0OiBhIG1pc3Npbmcgc2xpY2UgaXMgYSBSRVNVTFQsIG5vdCBhbiBlcnJvciDigJRcbiAqIGBtaXNzaW5nOiAnbmV2ZXItd3JpdHRlbidgIHRlbGxzIGEgdHJpYWdlIHRvb2wgKG9yIGl0cyBMTE0gY2FsbGVyKSB0aGF0XG4gKiB0aGUgdmFsdWUgY2FtZSBmcm9tIGluaXRpYWwgc3RhdGUgLyBmcm96ZW4gYXJncyAvIGEgY2xvc3VyZSwgd2hpY2ggaXNcbiAqIGl0c2VsZiBkaWFnbm9zdGljIGluZm9ybWF0aW9uLiBTZWUge0BsaW5rIFZhcmlhYmxlU2xpY2V9IOKAlCBpbmNsdWRpbmcgaXRzXG4gKiBTRVJJQUxJWkFUSU9OIFdBUk5JTkcgYmVmb3JlIHlvdSBzdHJpbmdpZnkgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlRm9yS2V5KFxuICBjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLFxuICBrZXk6IFN0YXRlS2V5LFxuICBrZXlzUmVhZDogS2V5c1JlYWRTb3VyY2UgfCBLZXlzUmVhZExvb2t1cCxcbiAgb3B0aW9ucz86IFNsaWNlRm9yS2V5T3B0aW9ucyxcbik6IFZhcmlhYmxlU2xpY2Uge1xuICBjb25zdCBzb3VyY2UgPSByZXNvbHZlS2V5c1JlYWRTb3VyY2Uoa2V5c1JlYWQpO1xuICBjb25zdCBub3JtYWxpc2VkS2V5ID0gbm9ybWFsaXNlU3RhdGVLZXkoa2V5KTtcbiAgY29uc3QgYmFzZTogUGljazxWYXJpYWJsZVNsaWNlLCAna2V5JyB8ICdiZWZvcmUnIHwgJ2tleXNSZWFkS2luZCcgfCAncmVhZHNDb3ZlcmFnZSc+ID0ge1xuICAgIGtleTogbm9ybWFsaXNlZEtleSxcbiAgICAuLi4ob3B0aW9ucz8uYmVmb3JlICE9PSB1bmRlZmluZWQgJiYgeyBiZWZvcmU6IG9wdGlvbnMuYmVmb3JlIH0pLFxuICAgIGtleXNSZWFkS2luZDogc291cmNlLmtpbmQsXG4gICAgLi4uKHNvdXJjZS5jb3ZlcmFnZSAhPT0gdW5kZWZpbmVkICYmIHsgcmVhZHNDb3ZlcmFnZTogc291cmNlLmNvdmVyYWdlIH0pLFxuICB9O1xuXG4gIGlmIChjb21taXRMb2cubGVuZ3RoID09PSAwKSByZXR1cm4geyAuLi5iYXNlLCBtaXNzaW5nOiAnZW1wdHktbG9nJyB9O1xuXG4gIGNvbnN0IHsgd3JpdGVyLCBiYXNpcyB9ID0gZmluZExhc3RXcml0ZXJXaXRoQmFzaXMoY29tbWl0TG9nLCBub3JtYWxpc2VkS2V5LCBvcHRpb25zPy5iZWZvcmUpO1xuICAvLyBGNGI6IHdoYXQgdGhlIHZhbHVlIGF0IHRoZSBzbGljZSdzIHBvaW50IHJlc3RzIG9uLCBmcm9tIHRoZSB2YWx1ZSB0d2luIOKAlCBhIHJlZGFjdGlvbiwgdGhlIHByZS1ydW4gYmFzZS5cbiAgY29uc3QgZW5kID0gTWF0aC5taW4ob3B0aW9ucz8uYmVmb3JlID8/IGNvbW1pdExvZy5sZW5ndGgsIGNvbW1pdExvZy5sZW5ndGgpIC0gMTtcbiAgY29uc3QgdmFsdWUgPSBlbmQgPj0gMCA/IGNvbW1pdFZhbHVlQXRXaXRoQmFzaXMoY29tbWl0TG9nLCBlbmQsIG5vcm1hbGlzZWRLZXkpLmJhc2lzIDogW107XG4gIGlmICghd3JpdGVyKSB7XG4gICAgLy8gJ25ldmVyLXdyaXR0ZW4nIGFscmVhZHkgc2F5cyB0aGUgdmFsdWUgY2FtZSBmcm9tIGJlZm9yZSB0aGUgcnVuOyBhIHJlZGFjdGlvbiB0aGF0IGhpZCB0aGUgd3JpdGUgZG9lcyBub3QuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmJhc2UsXG4gICAgICBtaXNzaW5nOiAnbmV2ZXItd3JpdHRlbicsXG4gICAgICAuLi4odmFsdWUuaW5jbHVkZXMoJ3JlZGFjdGVkJykgJiYgeyBub3RlczogW3JlZGFjdGVkVmFsdWVOb3RlKG5vcm1hbGlzZWRLZXkpXSB9KSxcbiAgICB9O1xuICB9XG4gIC8vIEEgd3JpdGVyIHRoYXQgcmVhY2hlZCB0aGUga2V5IG9ubHkgdGhyb3VnaCByb3dzIGluc2lkZSBpdCBtYWRlIHBhcnQgb2YgdGhlIHZhbHVlIOKAlCBzYXkgc28uXG4gIGNvbnN0IG5vdGVzID0gYmFzaXMuaW5jbHVkZXMoJ25lc3RlZC1yb3dzJykgPyBbbmVzdGVkUm93c05vdGUobm9ybWFsaXNlZEtleSwgW2NvbW1pdExvZy5pbmRleE9mKHdyaXRlcildKV0gOiBbXTtcbiAgaWYgKHZhbHVlLmluY2x1ZGVzKCdmcm9tLWluaXRpYWwtc3RhdGUnKSkgbm90ZXMucHVzaChmcm9tSW5pdGlhbFN0YXRlTm90ZShub3JtYWxpc2VkS2V5KSk7XG4gIGlmICh2YWx1ZS5pbmNsdWRlcygncmVkYWN0ZWQnKSkgbm90ZXMucHVzaChyZWRhY3RlZFZhbHVlTm90ZShub3JtYWxpc2VkS2V5KSk7XG5cbiAgLy8gSU5WQVJJQU5UOiBgd3JpdGVyYCBjYW1lIEZST00gdGhpcyBjb21taXRMb2csIHNvIGl0cyBydW50aW1lU3RhZ2VJZCBpc1xuICAvLyBhbHdheXMgcHJlc2VudCBpbiBjYXVzYWxDaGFpbidzIGluZGV4IOKAlCBjYXVzYWxDaGFpbiBjYW5ub3QgcmV0dXJuXG4gIC8vIHVuZGVmaW5lZCBoZXJlIChpdCBvbmx5IGRvZXMgZm9yIGlkcyBhYnNlbnQgZnJvbSB0aGUgbG9nKS4gVGhlIG5vbi1udWxsXG4gIC8vIGFzc2VydGlvbiBrZWVwcyB0aGUgVmFyaWFibGVTbGljZSBjb250cmFjdCBhaXJ0aWdodDogYG1pc3NpbmdgIGlzIHRoZVxuICAvLyBPTkxZIGFic2VudC1yb290IHN0YXRlLiBPcHRpb25zIHBhc3Mgc3RyYWlnaHQgdGhyb3VnaCAoY29udHJvbERlcHMgL1xuICAvLyB3ZWlnaCAvIG1heERlcHRoIC8gbWF4Tm9kZXMga2VlcCB0aGVpciBjYXVzYWxDaGFpbiBzZW1hbnRpY3MpLlxuICAvL1xuICAvLyBlZGdlQXR0cmlidXRpb24gZGVmYXVsdHMgdG8gJ3Blci13cml0ZScgSEVSRSAodW5saWtlIGNhdXNhbENoYWluJ3NcbiAgLy8gJ3N0YWdlJyBkZWZhdWx0KTogYSB2YXJpYWJsZS1maXJzdCBzbGljZSBrbm93cyBleGFjdGx5IHdoaWNoIHdyaXR0ZW4ga2V5XG4gIC8vIGFuY2hvcnMgdGhlIHF1ZXN0aW9uLCBhbmQgcGVyLXdyaXRlIGF0dHJpYnV0aW9uIGlzIHN0cmljdGx5LXNhZmUg4oCUIGxvZ3NcbiAgLy8gd2l0aG91dCBgVHJhY2VFbnRyeS5yZWFkS2V5c2AgKHRoZSB3cml0ZVByb3ZlbmFuY2UgZGlhbCBvZmYpIGZhbGwgYmFja1xuICAvLyB0byBzdGFnZS1sZXZlbCBleHBhbnNpb24gcGVyIG5vZGUsIGJ5dGUtaWRlbnRpY2FsbHkuIENvbnN1bWVycyBjYW4gZm9yY2VcbiAgLy8gJ3N0YWdlJyB2aWEgb3B0aW9ucy5cbiAgLy8gUHJlc2VydmUgdGhpcyBleGFjdCB3cml0ZXIncyBtZXRhZGF0YS9yZWFkIHByZWZpeCwgZXZlbiB3aGVuIGl0IGlzIGFcbiAgLy8gY29udGludWF0aW9uLiBDYXVzYWwgZXhwYW5zaW9uIHNlcGFyYXRlbHkgdXNlcyB0aGUgZXhlY3V0aW9uJ3MgZmlyc3QgY29tbWl0LlxuICBjb25zdCByb290ID0gY2F1c2FsQ2hhaW5Gcm9tQ29tbWl0KGNvbW1pdExvZywgd3JpdGVyLCBzb3VyY2UubG9va3VwLCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBlZGdlQXR0cmlidXRpb246IG9wdGlvbnM/LmVkZ2VBdHRyaWJ1dGlvbiA/PyAncGVyLXdyaXRlJyxcbiAgICByb290TGlua0tleXM6IG9wdGlvbnM/LnJvb3RMaW5rS2V5cyA/PyBbbm9ybWFsaXNlZEtleV0sXG4gIH0pITtcbiAgcmV0dXJuIHsgLi4uYmFzZSwgd3JpdGVyLCByb290LCAuLi4obm90ZXMubGVuZ3RoID4gMCAmJiB7IG5vdGVzIH0pIH07XG59XG4iXX0=
|
|
@@ -257,6 +257,12 @@ export type KeysReadLookup = (runtimeStageId: string) => string[];
|
|
|
257
257
|
* @returns Root CausalNode with .parents forming the DAG, or undefined if startId not found
|
|
258
258
|
*/
|
|
259
259
|
export declare function causalChain(commitLog: CommitBundle[], startId: string, getKeysRead: KeysReadLookup, options?: CausalChainOptions): CausalNode | undefined;
|
|
260
|
+
/**
|
|
261
|
+
* Internal slice composition: keep the actual bundle selected by the writer
|
|
262
|
+
* query (including a nonempty continuation). This is not a public entry point.
|
|
263
|
+
* The read position still belongs to the execution's first commit.
|
|
264
|
+
*/
|
|
265
|
+
export declare function causalChainFromCommit(commitLog: CommitBundle[], writer: CommitBundle, getKeysRead: KeysReadLookup, options?: CausalChainOptions): CausalNode | undefined;
|
|
260
266
|
/**
|
|
261
267
|
* Flatten the causal DAG into a BFS-ordered list of nodes.
|
|
262
268
|
* Each node appears exactly once (first occurrence by BFS order).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "footprintjs",
|
|
3
|
-
"version": "9.48.
|
|
3
|
+
"version": "9.48.4",
|
|
4
4
|
"description": "Explainable backend flows — automatic causal traces, decision evidence, and MCP tool generation for AI agents",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Sanjay Krishna Anbalagan",
|
|
@@ -52,6 +52,7 @@
|
|
|
52
52
|
"check:dup-types": "node scripts/check-dup-types.mjs",
|
|
53
53
|
"check:layering": "node scripts/check-layering.mjs",
|
|
54
54
|
"check:record-tests": "node scripts/record-tests.mjs --check",
|
|
55
|
+
"check:record-freeze": "node scripts/check-record-freeze.mjs",
|
|
55
56
|
"check:trace-ready": "node scripts/trace-ready.mjs --check-e1",
|
|
56
57
|
"trace:ready": "node scripts/trace-ready.mjs",
|
|
57
58
|
"check:doc-snippets": "node scripts/check-doc-snippets.mjs",
|
|
@@ -219,6 +220,7 @@
|
|
|
219
220
|
"markdown-it": "^14.3.1",
|
|
220
221
|
"prettier": "^2.8.1",
|
|
221
222
|
"publint": "^0.3.0",
|
|
223
|
+
"semver": "^7.8.5",
|
|
222
224
|
"typedoc": "^0.28.17",
|
|
223
225
|
"typescript": "~5.4.5",
|
|
224
226
|
"vitest": "^4.0.18",
|